8000 [RISCV][test] Add tests for subtraction if above threshold · llvm/llvm-project@e6e0f5f · GitHub
[go: up one dir, main page]

Skip to content

Commit e6e0f5f

Browse files
committed
[RISCV][test] Add tests for subtraction if above threshold
1 parent 1d2f5ea commit e6e0f5f

File tree

2 files changed

+346
-37
lines changed

2 files changed

+346
-37
lines changed

llvm/test/CodeGen/RISCV/rv32zbb.ll

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 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

Comments
 (0)
0