@@ -1682,15 +1682,23 @@ entry:
16821682}
16831683
16841684define i8 @sub_if_uge_i8 (i8 %x , i8 %y ) {
1685- ; CHECK-LABEL: sub_if_uge_i8:
1686- ; CHECK: # %bb.0:
1687- ; CHECK-NEXT: zext.b a2, a1
1688- ; CHECK-NEXT: zext.b a3, a0
1689- ; CHECK-NEXT: sltu a2, a3, a2
1690- ; CHECK-NEXT: addi a2, a2, -1
1691- ; CHECK-NEXT: and a1, a2, a1
1692- ; CHECK-NEXT: sub a0, a0, a1
1693- ; CHECK-NEXT: ret
1685+ ; RV64I-LABEL: sub_if_uge_i8:
1686+ ; RV64I: # %bb.0:
1687+ ; RV64I-NEXT: zext.b a2, a1
1688+ ; RV64I-NEXT: zext.b a3, a0
1689+ ; RV64I-NEXT: sltu a2, a3, a2
1690+ ; RV64I-NEXT: addi a2, a2, -1
1691+ ; RV64I-NEXT: and a1, a2, a1
1692+ ; RV64I-NEXT: sub a0, a0, a1
1693+ ; RV64I-NEXT: ret
1694+ ;
1695+ ; RV64ZBB-LABEL: sub_if_uge_i8:
1696+ ; RV64ZBB: # %bb.0:
1697+ ; RV64ZBB-NEXT: zext.b a2, a0
1698+ ; RV64ZBB-NEXT: subw a0, a0, a1
1699+ ; RV64ZBB-NEXT: zext.b a0, a0
1700+ ; RV64ZBB-NEXT: minu a0, a2, a0
1701+ ; RV64ZBB-NEXT: ret
16941702 %cmp = icmp ult i8 %x , %y
16951703 %select = select i1 %cmp , i8 0 , i8 %y
16961704 %sub = sub nuw i8 %x , %select
@@ -1712,12 +1720,10 @@ define i16 @sub_if_uge_i16(i16 %x, i16 %y) {
17121720;
17131721; RV64ZBB-LABEL: sub_if_uge_i16:
17141722; RV64ZBB: # %bb.0:
1715- ; RV64ZBB-NEXT: zext.h a2, a1
1716- ; RV64ZBB-NEXT: zext.h a3, a0
1717- ; RV64ZBB-NEXT: sltu a2, a3, a2
1718- ; RV64ZBB-NEXT: addi a2, a2, -1
1719- ; RV64ZBB-NEXT: and a1, a2, a1
1720- ; RV64ZBB-NEXT: sub a0, a0, a1
1723+ ; RV64ZBB-NEXT: zext.h a2, a0
1724+ ; RV64ZBB-NEXT: subw a0, a0, a1
1725+ ; RV64ZBB-NEXT: zext.h a0, a0
1726+ ; RV64ZBB-NEXT: minu a0, a2, a0
17211727; RV64ZBB-NEXT: ret
17221728 %cmp = icmp ult i16 %x , %y
17231729 %select = select i1 %cmp , i16 0 , i16 %y
@@ -1726,29 +1732,42 @@ define i16 @sub_if_uge_i16(i16 %x, i16 %y) {
17261732}
17271733
17281734define i32 @sub_if_uge_i32 (i32 %x , i32 %y ) {
1729- ; CHECK-LABEL: sub_if_uge_i32:
1730- ; CHECK: # %bb.0:
1731- ; CHECK-NEXT: sext.w a2, a1
1732- ; CHECK-NEXT: sext.w a3, a0
1733- ; CHECK-NEXT: sltu a2, a3, a2
1734- ; CHECK-NEXT: addi a2, a2, -1
1735- ; CHECK-NEXT: and a1, a2, a1
1736- ; CHECK-NEXT: subw a0, a0, a1
1737- ; CHECK-NEXT: ret
1735+ ; RV64I-LABEL: sub_if_uge_i32:
1736+ ; RV64I: # %bb.0:
1737+ ; RV64I-NEXT: sext.w a2, a1
1738+ ; RV64I-NEXT: sext.w a3, a0
1739+ ; RV64I-NEXT: sltu a2, a3, a2
1740+ ; RV64I-NEXT: addi a2, a2, -1
1741+ ; RV64I-NEXT: and a1, a2, a1
1742+ ; RV64I-NEXT: subw a0, a0, a1
1743+ ; RV64I-NEXT: ret
1744+ ;
1745+ ; RV64ZBB-LABEL: sub_if_uge_i32:
1746+ ; RV64ZBB: # %bb.0:
1747+ ; RV64ZBB-NEXT: sext.w a2, a0
1748+ ; RV64ZBB-NEXT: subw a0, a0, a1
1749+ ; RV64ZBB-NEXT: minu a0, a2, a0
1750+ ; RV64ZBB-NEXT: ret
17381751 %cmp = icmp ult i32 %x , %y
17391752 %select = select i1 %cmp , i32 0 , i32 %y
17401753 %sub = sub nuw i32 %x , %select
17411754 ret i32 %sub
17421755}
17431756
17441757define i64 @sub_if_uge_i64 (i64 %x , i64 %y ) {
1745- ; CHECK-LABEL: sub_if_uge_i64:
1746- ; CHECK: # %bb.0:
1747- ; CHECK-NEXT: sltu a2, a0, a1
1748- ; CHECK-NEXT: addi a2, a2, -1
1749- ; CHECK-NEXT: and a1, a2, a1
1750- ; CHECK-NEXT: sub a0, a0, a1
1751- ; CHECK-NEXT: ret
1758+ ; RV64I-LABEL: sub_if_uge_i64:
1759+ ; RV64I: # %bb.0:
1760+ ; RV64I-NEXT: sltu a2, a0, a1
1761+ ; RV64I-NEXT: addi a2, a2, -1
1762+ ; RV64I-NEXT: and a1, a2, a1
1763+ ; RV64I-NEXT: sub a0, a0, a1
1764+ ; RV64I-NEXT: ret
1765+ ;
1766+ ; RV64ZBB-LABEL: sub_if_uge_i64:
1767+ ; RV64ZBB: # %bb.0:
1768+ ; RV64ZBB-NEXT: sub a1, a0, a1
1769+ ; RV64ZBB-NEXT: minu a0, a0, a1
1770+ ; RV64ZBB-NEXT: ret
17521771 %cmp = icmp ult i64 %x , %y
17531772 %select = select i1 %cmp , i64 0 , i64 %y
17541773 %sub = sub nuw i64 %x , %select
@@ -1798,27 +1817,70 @@ define i32 @sub_if_uge_multiuse_select_i32(i32 %x, i32 %y) {
17981817}
17991818
18001819define i32 @sub_if_uge_multiuse_cmp_i32 (i32 %x , i32 %y ) {
1801- ; CHECK-LABEL: sub_if_uge_multiuse_cmp_i32:
1802- ; CHECK: # %bb.0:
1803- ; CHECK-NEXT: sext.w a2, a1
1804- ; CHECK-NEXT: sext.w a3, a0
1805- ; CHECK-NEXT: sltu a4, a3, a2
1806- ; CHECK-NEXT: addi a4, a4, -1
1807- ; CHECK-NEXT: and a1, a4, a1
1808- ; CHECK-NEXT: subw a0, a0, a1
1809- ; CHECK-NEXT: bltu a3, a2, .LBB68_2
1810- ; CHECK-NEXT: # %bb.1:
1811- ; CHECK-NEXT: li a1, 4
1812- ; CHECK-NEXT: sllw a0, a0, a1
1813- ; CHECK-NEXT: ret
1814- ; CHECK-NEXT: .LBB68_2:
1815- ; CHECK-NEXT: li a1, 2
1816- ; CHECK-NEXT: sllw a0, a0, a1
1817- ; CHECK-NEXT: ret
1820+ ; RV64I-LABEL: sub_if_uge_multiuse_cmp_i32:
1821+ ; RV64I: # %bb.0:
1822+ ; RV64I-NEXT: sext.w a2, a1
1823+ ; RV64I-NEXT: sext.w a3, a0
1824+ ; RV64I-NEXT: sltu a4, a3, a2
1825+ ; RV64I-NEXT: addi a4, a4, -1
1826+ ; RV64I-NEXT: and a1, a4, a1
1827+ ; RV64I-NEXT: subw a0, a0, a1
1828+ ; RV64I-NEXT: bltu a3, a2, .LBB68_2
1829+ ; RV64I-NEXT: # %bb.1:
1830+ ; RV64I-NEXT: li a1, 4
1831+ ; RV64I-NEXT: sllw a0, a0, a1
1832+ ; RV64I-NEXT: ret
1833+ ; RV64I-NEXT: .LBB68_2:
1834+ ; RV64I-NEXT: li a1, 2
1835+ ; RV64I-NEXT: sllw a0, a0, a1
1836+ ; RV64I-NEXT: ret
1837+ ;
1838+ ; RV64ZBB-LABEL: sub_if_uge_multiuse_cmp_i32:
1839+ ; RV64ZBB: # %bb.0:
1840+ ; RV64ZBB-NEXT: sext.w a2, a1
1841+ ; RV64ZBB-NEXT: sext.w a3, a0
1842+ ; RV64ZBB-NEXT: subw a0, a0, a1
1843+ ; RV64ZBB-NEXT: minu a0, a3, a0
1844+ ; RV64ZBB-NEXT: bltu a3, a2, .LBB68_2
1845+ ; RV64ZBB-NEXT: # %bb.1:
1846+ ; RV64ZBB-NEXT: li a1, 4
1847+ ; RV64ZBB-NEXT: sllw a0, a0, a1
1848+ ; RV64ZBB-NEXT: ret
1849+ ; RV64ZBB-NEXT: .LBB68_2:
1850+ ; RV64ZBB-NEXT: li a1, 2
1851+ ; RV64ZBB-NEXT: sllw a0, a0, a1
1852+ ; RV64ZBB-NEXT: ret
18181853 %cmp = icmp ult i32 %x , %y
18191854 %select = select i1 %cmp , i32 0 , i32 %y
18201855 %sub = sub nuw i32 %x , %select
18211856 %select2 = select i1 %cmp , i32 2 , i32 4
18221857 %shl = shl i32 %sub , %select2
18231858 ret i32 %shl
18241859}
1860+
1861+ define i32 @sub_if_uge_multiuse_cmp_store_i32 (i32 signext %x , i32 signext %y , ptr %z ) {
1862+ ; RV64I-LABEL: sub_if_uge_multiuse_cmp_store_i32:
1863+ ; RV64I: # %bb.0:
1864+ ; RV64I-NEXT: sltu a3, a0, a1
1865+ ; RV64I-NEXT: xori a4, a3, 1
1866+ ; RV64I-NEXT: addi a3, a3, -1
1867+ ; RV64I-NEXT: and a1, a3, a1
1868+ ; RV64I-NEXT: subw a0, a0, a1
1869+ ; RV64I-NEXT: sw a4, 0(a2)
1870+ ; RV64I-NEXT: ret
1871+ ;
1872+ ; RV64ZBB-LABEL: sub_if_uge_multiuse_cmp_store_i32:
1873+ ; RV64ZBB: # %bb.0:
1874+ ; RV64ZBB-NEXT: sltu a3, a0, a1
1875+ ; RV64ZBB-NEXT: subw a1, a0, a1
1876+ ; RV64ZBB-NEXT: xori a3, a3, 1
1877+ ; RV64ZBB-NEXT: minu a0, a0, a1
1878+ ; RV64ZBB-NEXT: sw a3, 0(a2)
1879+ ; RV64ZBB-NEXT: ret
1880+ %cmp = icmp uge i32 %x , %y
1881+ %conv = zext i1 %cmp to i32
1882+ store i32 %conv , ptr %z , align 4
1883+ %select = select i1 %cmp , i32 %y , i32 0
1884+ %sub = sub nuw i32 %x , %select
1885+ ret i32 %sub
1886+ }
0 commit comments