@@ -1479,3 +1479,189 @@ entry:
14791479 %cmp = icmp ne i32 %popcnt , 1
14801480 ret i1 %cmp
14811481}
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 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