@@ -1479,3 +1479,189 @@ entry:
1479
1479
%cmp = icmp ne i32 %popcnt , 1
1480
1480
ret i1 %cmp
1481
1481
}
1482
+
1483
+ define i8 @sub_if_uge_i8 (i8 %x , i8 %y ) {
1484
+ ; CHECK-LABEL: sub_if_uge_i8:
1485
+ ; CHECK: # %bb.0:
1486
+ ; CHECK-NEXT: zext.b a2, a1
1487
+ ; CHECK-NEXT: zext.b a3, a0
1488
+ ; CHECK-NEXT: sltu a2, a3, a2
1489
+ ; CHECK-NEXT: addi a2, a2, -1
1490
+ ; CHECK-NEXT: and a1, a2, a1
1491
+ ; CHECK-NEXT: sub a0, a0, a1
1492
+ ; CHECK-NEXT: ret
1493
+ %cmp = icmp ult i8 %x , %y
1494
+ %select = select i1 %cmp , i8 0 , i8 %y
1495
+ %sub = sub nuw i8 %x , %select
1496
+ ret i8 %sub
1497
+ }
1498
+
1499
+ define i16 @sub_if_uge_i16 (i16 %x , i16 %y ) {
1500
+ ; RV32I-LABEL: sub_if_uge_i16:
1501
+ ; RV32I: # %bb.0:
1502
+ ; RV32I-NEXT: lui a2, 16
1503
+ ; RV32I-NEXT: addi a2, a2, -1
1504
+ ; RV32I-NEXT: and a3, a1, a2
1505
+ ; RV32I-NEXT: and a2, a0, a2
1506
+ ; RV32I-NEXT: sltu a2, a2, a3
1507
+ ; RV32I-NEXT: addi a2, a2, -1
1508
+ ; RV32I-NEXT: and a1, a2, a1
1509
+ ; RV32I-NEXT: sub a0, a0, a1
1510
+ ; RV32I-NEXT: ret
1511
+ ;
1512
+ ; RV32ZBB-LABEL: sub_if_uge_i16:
1513
+ ; RV32ZBB: # %bb.0:
1514
+ ; RV32ZBB-NEXT: zext.h a2, a1
1515
+ ; RV32ZBB-NEXT: zext.h a3, a0
1516
+ ; RV32ZBB-NEXT: sltu a2, a3, a2
1517
+ ; RV32ZBB-NEXT: addi a2, a2, -1
1518
+ ; RV32ZBB-NEXT: and a1, a2, a1
1519
+ ; RV32ZBB-NEXT: sub a0, a0, a1
1520
+ ; RV32ZBB-NEXT: ret
1521
+ %cmp = icmp ult i16 %x , %y
1522
+ %select = select i1 %cmp , i16 0 , i16 %y
1523
+ %sub = sub nuw i16 %x , %select
1524
+ ret i16 %sub
1525
+ }
1526
+
1527
+ define i32 @sub_if_uge_i32 (i32 %x , i32 %y ) {
1528
+ ; CHECK-LABEL: sub_if_uge_i32:
1529
+ ; CHECK: # %bb.0:
1530
+ ; CHECK-NEXT: sltu a2, a0, a1
1531
+ ; CHECK-NEXT: addi a2, a2, -1
1532
+ ; CHECK-NEXT: and a1, a2, a1
1533
+ ; CHECK-NEXT: sub a0, a0, a1
1534
+ ; CHECK-NEXT: ret
1535
+ %cmp = icmp ult i32 %x , %y
1536
+ %select = select i1 %cmp , i32 0 , i32 %y
1537
+ %sub = sub nuw
10000
i32 %x , %select
1538
+ ret i32 %sub
1539
+ }
1540
+
1541
+ define i64 @sub_if_uge_i64 (i64 %x , i64 %y ) {
1542
+ ; CHECK-LABEL: sub_if_uge_i64:
1543
+ ; CHECK: # %bb.0:
1544
+ ; CHECK-NEXT: beq a1, a3, .LBB52_2
1545
+ ; CHECK-NEXT: # %bb.1:
1546
+ ; CHECK-NEXT: sltu a4, a1, a3
1547
+ ; CHECK-NEXT: j .LBB52_3
1548
+ ; CHECK-NEXT: .LBB52_2:
1549
+ ; CHECK-NEXT: sltu a4, a0, a2
1550
+ ; CHECK-NEXT: .LBB52_3:
1551
+ ; CHECK-NEXT: addi a4, a4, -1
1552
+ ; CHECK-NEXT: and a3, a4, a3
1553
+ ; CHECK-NEXT: and a2, a4, a2
1554
+ ; CHECK-NEXT: sltu a4, a0, a2
1555
+ ; CHECK-NEXT: sub a1, a1, a3
1556
+ ; CHECK-NEXT: sub a1, a1, a4
1557
+ ; CHECK-NEXT: sub a0, a0, a2
1558
+ ; CHECK-NEXT: ret
1559
+ %cmp = icmp ult i64 %x , %y
1560
+ %select = select i1 %cmp , i64 0 , i64 %y
1561
+ %sub = sub nuw i64 %x , %select
1562
+ ret i64 %sub
1563
+ }
1564
+
1565
+ define i128 @sub_if_uge_i128 (i128 %x , i128 %y ) {
1566
+ ; CHECK-LABEL: sub_if_uge_i128:
1567
+ ; CHECK: # %bb.0:
1568
+ ; CHECK-NEXT: lw a7, 4(a2)
1569
+ ; CHECK-NEXT: lw a6, 8(a2)
1570
+ ; CHECK-NEXT: lw t0, 12(a2)
1571
+ ; CHECK-NEXT: lw a4, 12(a1)
1572
+ ; CHECK-NEXT: lw a3, 4(a1)
1573
+ ; CHECK-NEXT: lw a5, 8(a1)
1574
+ ; CHECK-NEXT: beq a4, t0, .LBB53_2
1575
+ ; CHECK-NEXT: # %bb.1:
1576
+ ; CHECK-NEXT: sltu t1, a4, t0
1577
+ ; CHECK-NEXT: j .LBB53_3
1578
+ ; CHECK-NEXT: .LBB53_2:
1579
+ ; CHECK-NEXT: sltu t1, a5, a6
1580
+ ; CHECK-NEXT: .LBB53_3:
1581
+ ; CHECK-NEXT: lw a2, 0(a2)
1582
+ ; CHECK-NEXT: lw a1, 0(a1)
1583
+ ; CHECK-NEXT: beq a3, a7, .LBB53_5
1584
+ ; CHECK-NEXT: # %bb.4:
1585
+ ; CHECK-NEXT: sltu t2, a3, a7
1586
+ ; CHECK-NEXT: j .LBB53_6
1587
+ ; CHECK-NEXT: .LBB53_5:
1588
+ ; CHECK-NEXT: sltu t2, a1, a2
1589
+ ; CHECK-NEXT: .LBB53_6:
1590
+ ; CHECK-NEXT: xor t3, a4, t0
1591
+ ; CHECK-NEXT: xor t4, a5, a6
1592
+ ; CHECK-NEXT: or t3, t4, t3
1593
+ ; CHECK-NEXT: beqz t3, .LBB53_8
1594
+ ; CHECK-NEXT: # %bb.7:
1595
+ ; CHECK-NEXT: mv t2, t1
1596
+ ; CHECK-NEXT: .LBB53_8:
1597
+ ; CHECK-NEXT: addi t2, t2, -1
1598
+ ; CHECK-NEXT: and t1, t2, t0
1599
+ ; CHECK-NEXT: and t0, t2, a2
1600
+ ; CHECK-NEXT: and a7, t2, a7
1601
+; CHECK-NEXT: sltu a2, a1, t0
1602
+ ; CHECK-NEXT: and t2, t2, a6
1603
+ ; CHECK-NEXT: mv a6, a2
1604
+ ; CHECK-NEXT: beq a3, a7, .LBB53_10
1605
+ ; CHECK-NEXT: # %bb.9:
1606
+ ; CHECK-NEXT: sltu a6, a3, a7
1607
+ ; CHECK-NEXT: .LBB53_10:
1608
+ ; CHECK-NEXT: sub t3, a5, t2
1609
+ ; CHECK-NEXT: sltu a5, a5, t2
1610
+ ; CHECK-NEXT: sub a4, a4, t1
1611
+ ; CHECK-NEXT: sub a3, a3, a7
1612
+ ; CHECK-NEXT: sub a1, a1, t0
1613
+ ; CHECK-NEXT: sltu a7, t3, a6
1614
+ ; CHECK-NEXT: sub a4, a4, a5
1615
+ ; CHECK-NEXT: sub a5, t3, a6
1616
+ ; CHECK-NEXT: sub a3, a3, a2
1617
+ ; CHECK-NEXT: sub a2, a4, a7
1618
+ ; CHECK-NEXT: sw a1, 0(a0)
1619
+ ; CHECK-NEXT: sw a3, 4(a0)
1620
+ ; CHECK-NEXT: sw a5, 8(a0)
1621
+ ; CHECK-NEXT: sw a2, 12(a0)
1622
+ ; CHECK-NEXT: ret
1623
+ %cmp = icmp ult i128 %x , %y
1624
+ %select = select i1 %cmp , i128 0 , i128 %y
1625
+ %sub = sub nuw i128 %x , %select
1626
+ ret i128 %sub
1627
+ }
1628
+
1629
+ define i32 @sub_if_uge_multiuse_select_i32 (i32 %x , i32 %y ) {
1630
+ ; CHECK-LABEL: sub_if_uge_multiuse_select_i32:
1631
+ ; CHECK: # %bb.0:
1632
+ ; CHECK-NEXT: sltu a2, a0, a1
1633
+ ; CHECK-NEXT: addi a2, a2, -1
1634
+ ; CHECK-NEXT: and a1, a2, a1
1635
+ ; CHECK-NEXT: sub a0, a0, a1
1636
+ ; CHECK-NEXT: sll a0, a0, a1
1637
+ ; CHECK-NEXT: ret
1638
+ %cmp = icmp ult i32 %x , %y
1639
+ %select = select i1 %cmp , i32 0 , i32 %y
1640
+ %sub = sub nuw i32 %x , %select
1641
+ %shl = shl i32 %sub , %select
1642
+ ret i32 %shl
1643
+ }
1644
+
1645
+ define i32 @sub_if_uge_multiuse_cmp_i32 (i32 %x , i32 %y ) {
1646
+ ; CHECK-LABEL: sub_if_uge_multiuse_cmp_i32:
1647
+ ; CHECK: # %bb.0:
1648
+ ; CHECK-NEXT: sltu a2, a0, a1
1649
+ ; CHECK-NEXT: addi a2, a2, -1
1650
+ ; CHECK-NEXT: and a2, a2, a1
1651
+ ; CHECK-NEXT: sub a2, a0, a2
1652
+ ; CHECK-NEXT: bltu a0, a1, .LBB55_2
1653
+ ; CHECK-NEXT: # %bb.1:
1654
+ ; CHECK-NEXT: li a0, 4
1655
+ ; CHECK-NEXT: sll a0, a2, a0
1656
+ ; CHECK-NEXT: ret
1657
+ ; CHECK-NEXT: .LBB55_2:
1658
+ ; CHECK-NEXT: li a0, 2
1659
+ ; CHECK-NEXT: sll a0, a2, a0
1660
+ ; CHECK-NEXT: ret
1661
+ %cmp = icmp ult i32 %x , %y
1662
+ %select = select i1 %cmp , i32 0 , i32 %y
1663
+ %sub = sub nuw i32 %x , %select
1664
+ %select2 = select i1 %cmp , i32 2 , i32 4
1665
+ %shl = shl i32 %sub , %select2
1666
+ ret i32 %shl
1667
+ }
0 commit comments