xref: /llvm-project/llvm/test/CodeGen/RISCV/lack-of-signed-truncation-check.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
19c377c53SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
29c377c53SCraig Topper; RUN: llc -mtriple=riscv32-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,RV32,RV32I
39c377c53SCraig Topper; RUN: llc -mtriple=riscv64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64I
49c377c53SCraig Topper; RUN: llc -mtriple=riscv32-unknown-linux-gnu -mattr=+zbb < %s | FileCheck %s --check-prefixes=CHECK,RV32,RV32ZBB
59c377c53SCraig Topper; RUN: llc -mtriple=riscv64-unknown-linux-gnu -mattr=+zbb < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64ZBB
69c377c53SCraig Topper
79c377c53SCraig Topper; https://bugs.llvm.org/show_bug.cgi?id=38149
89c377c53SCraig Topper
99c377c53SCraig Topper; We are truncating from wider width, and then sign-extending
109c377c53SCraig Topper; back to the original width. Then we inequality-comparing orig and src.
119c377c53SCraig Topper; If they don't match, then we had signed truncation during truncation.
129c377c53SCraig Topper
139c377c53SCraig Topper; This can be expressed in a several ways in IR:
149c377c53SCraig Topper;   trunc + sext + icmp ne <- not canonical
159c377c53SCraig Topper;   shl   + ashr + icmp ne
169c377c53SCraig Topper;   add          + icmp ult/ule
179c377c53SCraig Topper;   add          + icmp uge/ugt
189c377c53SCraig Topper; However only the simplest form (with two shifts) gets lowered best.
199c377c53SCraig Topper
209c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
219c377c53SCraig Topper; shl + ashr + icmp ne
229c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
239c377c53SCraig Topper
249c377c53SCraig Topperdefine i1 @shifts_necmp_i16_i8(i16 %x) nounwind {
259c377c53SCraig Topper; RV32I-LABEL: shifts_necmp_i16_i8:
269c377c53SCraig Topper; RV32I:       # %bb.0:
275bc99fb5SCraig Topper; RV32I-NEXT:    slli a1, a0, 16
289c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 24
29*9122c523SPengcheng Wang; RV32I-NEXT:    srli a1, a1, 16
305bc99fb5SCraig Topper; RV32I-NEXT:    srai a0, a0, 8
315bc99fb5SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
325bc99fb5SCraig Topper; RV32I-NEXT:    xor a0, a0, a1
339c377c53SCraig Topper; RV32I-NEXT:    snez a0, a0
349c377c53SCraig Topper; RV32I-NEXT:    ret
359c377c53SCraig Topper;
369c377c53SCraig Topper; RV64I-LABEL: shifts_necmp_i16_i8:
379c377c53SCraig Topper; RV64I:       # %bb.0:
385bc99fb5SCraig Topper; RV64I-NEXT:    slli a1, a0, 48
399c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 56
40*9122c523SPengcheng Wang; RV64I-NEXT:    srli a1, a1, 48
415bc99fb5SCraig Topper; RV64I-NEXT:    srai a0, a0, 8
425bc99fb5SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
435bc99fb5SCraig Topper; RV64I-NEXT:    xor a0, a0, a1
449c377c53SCraig Topper; RV64I-NEXT:    snez a0, a0
459c377c53SCraig Topper; RV64I-NEXT:    ret
469c377c53SCraig Topper;
479c377c53SCraig Topper; RV32ZBB-LABEL: shifts_necmp_i16_i8:
489c377c53SCraig Topper; RV32ZBB:       # %bb.0:
499c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a1, a0
509c377c53SCraig Topper; RV32ZBB-NEXT:    sext.b a0, a0
519c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
529c377c53SCraig Topper; RV32ZBB-NEXT:    xor a0, a0, a1
539c377c53SCraig Topper; RV32ZBB-NEXT:    snez a0, a0
549c377c53SCraig Topper; RV32ZBB-NEXT:    ret
559c377c53SCraig Topper;
569c377c53SCraig Topper; RV64ZBB-LABEL: shifts_necmp_i16_i8:
579c377c53SCraig Topper; RV64ZBB:       # %bb.0:
589c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a1, a0
599c377c53SCraig Topper; RV64ZBB-NEXT:    sext.b a0, a0
609c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
619c377c53SCraig Topper; RV64ZBB-NEXT:    xor a0, a0, a1
629c377c53SCraig Topper; RV64ZBB-NEXT:    snez a0, a0
639c377c53SCraig Topper; RV64ZBB-NEXT:    ret
649c377c53SCraig Topper  %tmp0 = shl i16 %x, 8 ; 16-8
659c377c53SCraig Topper  %tmp1 = ashr exact i16 %tmp0, 8 ; 16-8
669c377c53SCraig Topper  %tmp2 = icmp ne i16 %tmp1, %x
679c377c53SCraig Topper  ret i1 %tmp2
689c377c53SCraig Topper}
699c377c53SCraig Topper
709c377c53SCraig Topperdefine i1 @shifts_necmp_i32_i16(i32 %x) nounwind {
719c377c53SCraig Topper; RV32I-LABEL: shifts_necmp_i32_i16:
729c377c53SCraig Topper; RV32I:       # %bb.0:
739c377c53SCraig Topper; RV32I-NEXT:    slli a1, a0, 16
749c377c53SCraig Topper; RV32I-NEXT:    srai a1, a1, 16
759c377c53SCraig Topper; RV32I-NEXT:    xor a0, a1, a0
769c377c53SCraig Topper; RV32I-NEXT:    snez a0, a0
779c377c53SCraig Topper; RV32I-NEXT:    ret
789c377c53SCraig Topper;
799c377c53SCraig Topper; RV64I-LABEL: shifts_necmp_i32_i16:
809c377c53SCraig Topper; RV64I:       # %bb.0:
819c377c53SCraig Topper; RV64I-NEXT:    sext.w a1, a0
829c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
839c377c53SCraig Topper; RV64I-NEXT:    srai a0, a0, 48
849c377c53SCraig Topper; RV64I-NEXT:    xor a0, a0, a1
859c377c53SCraig Topper; RV64I-NEXT:    snez a0, a0
869c377c53SCraig Topper; RV64I-NEXT:    ret
879c377c53SCraig Topper;
889c377c53SCraig Topper; RV32ZBB-LABEL: shifts_necmp_i32_i16:
899c377c53SCraig Topper; RV32ZBB:       # %bb.0:
909c377c53SCraig Topper; RV32ZBB-NEXT:    sext.h a1, a0
919c377c53SCraig Topper; RV32ZBB-NEXT:    xor a0, a1, a0
929c377c53SCraig Topper; RV32ZBB-NEXT:    snez a0, a0
939c377c53SCraig Topper; RV32ZBB-NEXT:    ret
949c377c53SCraig Topper;
959c377c53SCraig Topper; RV64ZBB-LABEL: shifts_necmp_i32_i16:
969c377c53SCraig Topper; RV64ZBB:       # %bb.0:
979c377c53SCraig Topper; RV64ZBB-NEXT:    sext.w a1, a0
989c377c53SCraig Topper; RV64ZBB-NEXT:    sext.h a0, a0
999c377c53SCraig Topper; RV64ZBB-NEXT:    xor a0, a0, a1
1009c377c53SCraig Topper; RV64ZBB-NEXT:    snez a0, a0
1019c377c53SCraig Topper; RV64ZBB-NEXT:    ret
1029c377c53SCraig Topper  %tmp0 = shl i32 %x, 16 ; 32-16
1039c377c53SCraig Topper  %tmp1 = ashr exact i32 %tmp0, 16 ; 32-16
1049c377c53SCraig Topper  %tmp2 = icmp ne i32 %tmp1, %x
1059c377c53SCraig Topper  ret i1 %tmp2
1069c377c53SCraig Topper}
1079c377c53SCraig Topper
1089c377c53SCraig Topperdefine i1 @shifts_necmp_i32_i8(i32 %x) nounwind {
1099c377c53SCraig Topper; RV32I-LABEL: shifts_necmp_i32_i8:
1109c377c53SCraig Topper; RV32I:       # %bb.0:
1119c377c53SCraig Topper; RV32I-NEXT:    slli a1, a0, 24
1129c377c53SCraig Topper; RV32I-NEXT:    srai a1, a1, 24
1139c377c53SCraig Topper; RV32I-NEXT:    xor a0, a1, a0
1149c377c53SCraig Topper; RV32I-NEXT:    snez a0, a0
1159c377c53SCraig Topper; RV32I-NEXT:    ret
1169c377c53SCraig Topper;
1179c377c53SCraig Topper; RV64I-LABEL: shifts_necmp_i32_i8:
1189c377c53SCraig Topper; RV64I:       # %bb.0:
1199c377c53SCraig Topper; RV64I-NEXT:    sext.w a1, a0
1209c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 56
1219c377c53SCraig Topper; RV64I-NEXT:    srai a0, a0, 56
1229c377c53SCraig Topper; RV64I-NEXT:    xor a0, a0, a1
1239c377c53SCraig Topper; RV64I-NEXT:    snez a0, a0
1249c377c53SCraig Topper; RV64I-NEXT:    ret
1259c377c53SCraig Topper;
1269c377c53SCraig Topper; RV32ZBB-LABEL: shifts_necmp_i32_i8:
1279c377c53SCraig Topper; RV32ZBB:       # %bb.0:
1289c377c53SCraig Topper; RV32ZBB-NEXT:    sext.b a1, a0
1299c377c53SCraig Topper; RV32ZBB-NEXT:    xor a0, a1, a0
1309c377c53SCraig Topper; RV32ZBB-NEXT:    snez a0, a0
1319c377c53SCraig Topper; RV32ZBB-NEXT:    ret
1329c377c53SCraig Topper;
1339c377c53SCraig Topper; RV64ZBB-LABEL: shifts_necmp_i32_i8:
1349c377c53SCraig Topper; RV64ZBB:       # %bb.0:
1359c377c53SCraig Topper; RV64ZBB-NEXT:    sext.w a1, a0
1369c377c53SCraig Topper; RV64ZBB-NEXT:    sext.b a0, a0
1379c377c53SCraig Topper; RV64ZBB-NEXT:    xor a0, a0, a1
1389c377c53SCraig Topper; RV64ZBB-NEXT:    snez a0, a0
1399c377c53SCraig Topper; RV64ZBB-NEXT:    ret
1409c377c53SCraig Topper  %tmp0 = shl i32 %x, 24 ; 32-8
1419c377c53SCraig Topper  %tmp1 = ashr exact i32 %tmp0, 24 ; 32-8
1429c377c53SCraig Topper  %tmp2 = icmp ne i32 %tmp1, %x
1439c377c53SCraig Topper  ret i1 %tmp2
1449c377c53SCraig Topper}
1459c377c53SCraig Topper
1469c377c53SCraig Topperdefine i1 @shifts_necmp_i64_i32(i64 %x) nounwind {
1479c377c53SCraig Topper; RV32-LABEL: shifts_necmp_i64_i32:
1489c377c53SCraig Topper; RV32:       # %bb.0:
1499c377c53SCraig Topper; RV32-NEXT:    srai a0, a0, 31
1509c377c53SCraig Topper; RV32-NEXT:    xor a0, a0, a1
1519c377c53SCraig Topper; RV32-NEXT:    snez a0, a0
1529c377c53SCraig Topper; RV32-NEXT:    ret
1539c377c53SCraig Topper;
1549c377c53SCraig Topper; RV64-LABEL: shifts_necmp_i64_i32:
1559c377c53SCraig Topper; RV64:       # %bb.0:
1569c377c53SCraig Topper; RV64-NEXT:    sext.w a1, a0
1579c377c53SCraig Topper; RV64-NEXT:    xor a0, a1, a0
1589c377c53SCraig Topper; RV64-NEXT:    snez a0, a0
1599c377c53SCraig Topper; RV64-NEXT:    ret
1609c377c53SCraig Topper  %tmp0 = shl i64 %x, 32 ; 64-32
1619c377c53SCraig Topper  %tmp1 = ashr exact i64 %tmp0, 32 ; 64-32
1629c377c53SCraig Topper  %tmp2 = icmp ne i64 %tmp1, %x
1639c377c53SCraig Topper  ret i1 %tmp2
1649c377c53SCraig Topper}
1659c377c53SCraig Topper
1669c377c53SCraig Topperdefine i1 @shifts_necmp_i64_i16(i64 %x) nounwind {
1679c377c53SCraig Topper; RV32I-LABEL: shifts_necmp_i64_i16:
1689c377c53SCraig Topper; RV32I:       # %bb.0:
1699c377c53SCraig Topper; RV32I-NEXT:    slli a2, a0, 16
1709c377c53SCraig Topper; RV32I-NEXT:    srai a3, a2, 16
1719c377c53SCraig Topper; RV32I-NEXT:    srai a2, a2, 31
1729c377c53SCraig Topper; RV32I-NEXT:    xor a1, a2, a1
1739c377c53SCraig Topper; RV32I-NEXT:    xor a0, a3, a0
1749c377c53SCraig Topper; RV32I-NEXT:    or a0, a0, a1
1759c377c53SCraig Topper; RV32I-NEXT:    snez a0, a0
1769c377c53SCraig Topper; RV32I-NEXT:    ret
1779c377c53SCraig Topper;
1789c377c53SCraig Topper; RV64I-LABEL: shifts_necmp_i64_i16:
1799c377c53SCraig Topper; RV64I:       # %bb.0:
1809c377c53SCraig Topper; RV64I-NEXT:    slli a1, a0, 48
1819c377c53SCraig Topper; RV64I-NEXT:    srai a1, a1, 48
1829c377c53SCraig Topper; RV64I-NEXT:    xor a0, a1, a0
1839c377c53SCraig Topper; RV64I-NEXT:    snez a0, a0
1849c377c53SCraig Topper; RV64I-NEXT:    ret
1859c377c53SCraig Topper;
1869c377c53SCraig Topper; RV32ZBB-LABEL: shifts_necmp_i64_i16:
1879c377c53SCraig Topper; RV32ZBB:       # %bb.0:
1889c377c53SCraig Topper; RV32ZBB-NEXT:    sext.h a2, a0
1899c377c53SCraig Topper; RV32ZBB-NEXT:    srai a3, a2, 31
1909c377c53SCraig Topper; RV32ZBB-NEXT:    xor a0, a2, a0
1919c377c53SCraig Topper; RV32ZBB-NEXT:    xor a1, a3, a1
1929c377c53SCraig Topper; RV32ZBB-NEXT:    or a0, a0, a1
1939c377c53SCraig Topper; RV32ZBB-NEXT:    snez a0, a0
1949c377c53SCraig Topper; RV32ZBB-NEXT:    ret
1959c377c53SCraig Topper;
1969c377c53SCraig Topper; RV64ZBB-LABEL: shifts_necmp_i64_i16:
1979c377c53SCraig Topper; RV64ZBB:       # %bb.0:
1989c377c53SCraig Topper; RV64ZBB-NEXT:    sext.h a1, a0
1999c377c53SCraig Topper; RV64ZBB-NEXT:    xor a0, a1, a0
2009c377c53SCraig Topper; RV64ZBB-NEXT:    snez a0, a0
2019c377c53SCraig Topper; RV64ZBB-NEXT:    ret
2029c377c53SCraig Topper  %tmp0 = shl i64 %x, 48 ; 64-16
2039c377c53SCraig Topper  %tmp1 = ashr exact i64 %tmp0, 48 ; 64-16
2049c377c53SCraig Topper  %tmp2 = icmp ne i64 %tmp1, %x
2059c377c53SCraig Topper  ret i1 %tmp2
2069c377c53SCraig Topper}
2079c377c53SCraig Topper
2089c377c53SCraig Topperdefine i1 @shifts_necmp_i64_i8(i64 %x) nounwind {
2099c377c53SCraig Topper; RV32I-LABEL: shifts_necmp_i64_i8:
2109c377c53SCraig Topper; RV32I:       # %bb.0:
2119c377c53SCraig Topper; RV32I-NEXT:    slli a2, a0, 24
2129c377c53SCraig Topper; RV32I-NEXT:    srai a3, a2, 24
2139c377c53SCraig Topper; RV32I-NEXT:    srai a2, a2, 31
2149c377c53SCraig Topper; RV32I-NEXT:    xor a1, a2, a1
2159c377c53SCraig Topper; RV32I-NEXT:    xor a0, a3, a0
2169c377c53SCraig Topper; RV32I-NEXT:    or a0, a0, a1
2179c377c53SCraig Topper; RV32I-NEXT:    snez a0, a0
2189c377c53SCraig Topper; RV32I-NEXT:    ret
2199c377c53SCraig Topper;
2209c377c53SCraig Topper; RV64I-LABEL: shifts_necmp_i64_i8:
2219c377c53SCraig Topper; RV64I:       # %bb.0:
2229c377c53SCraig Topper; RV64I-NEXT:    slli a1, a0, 56
2239c377c53SCraig Topper; RV64I-NEXT:    srai a1, a1, 56
2249c377c53SCraig Topper; RV64I-NEXT:    xor a0, a1, a0
2259c377c53SCraig Topper; RV64I-NEXT:    snez a0, a0
2269c377c53SCraig Topper; RV64I-NEXT:    ret
2279c377c53SCraig Topper;
2289c377c53SCraig Topper; RV32ZBB-LABEL: shifts_necmp_i64_i8:
2299c377c53SCraig Topper; RV32ZBB:       # %bb.0:
2309c377c53SCraig Topper; RV32ZBB-NEXT:    sext.b a2, a0
2319c377c53SCraig Topper; RV32ZBB-NEXT:    srai a3, a2, 31
2329c377c53SCraig Topper; RV32ZBB-NEXT:    xor a0, a2, a0
2339c377c53SCraig Topper; RV32ZBB-NEXT:    xor a1, a3, a1
2349c377c53SCraig Topper; RV32ZBB-NEXT:    or a0, a0, a1
2359c377c53SCraig Topper; RV32ZBB-NEXT:    snez a0, a0
2369c377c53SCraig Topper; RV32ZBB-NEXT:    ret
2379c377c53SCraig Topper;
2389c377c53SCraig Topper; RV64ZBB-LABEL: shifts_necmp_i64_i8:
2399c377c53SCraig Topper; RV64ZBB:       # %bb.0:
2409c377c53SCraig Topper; RV64ZBB-NEXT:    sext.b a1, a0
2419c377c53SCraig Topper; RV64ZBB-NEXT:    xor a0, a1, a0
2429c377c53SCraig Topper; RV64ZBB-NEXT:    snez a0, a0
2439c377c53SCraig Topper; RV64ZBB-NEXT:    ret
2449c377c53SCraig Topper  %tmp0 = shl i64 %x, 56 ; 64-8
2459c377c53SCraig Topper  %tmp1 = ashr exact i64 %tmp0, 56 ; 64-8
2469c377c53SCraig Topper  %tmp2 = icmp ne i64 %tmp1, %x
2479c377c53SCraig Topper  ret i1 %tmp2
2489c377c53SCraig Topper}
2499c377c53SCraig Topper
2509c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
2519c377c53SCraig Topper; add + icmp ult
2529c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
2539c377c53SCraig Topper
2549c377c53SCraig Topperdefine i1 @add_ultcmp_i16_i8(i16 %x) nounwind {
2557d40ea85SCraig Topper; RV32I-LABEL: add_ultcmp_i16_i8:
2567d40ea85SCraig Topper; RV32I:       # %bb.0:
2577d40ea85SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
2587d40ea85SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
2597d40ea85SCraig Topper; RV32I-NEXT:    addi a0, a0, -128
2607d40ea85SCraig Topper; RV32I-NEXT:    srli a0, a0, 8
2617d40ea85SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 255
2627d40ea85SCraig Topper; RV32I-NEXT:    ret
2639c377c53SCraig Topper;
2647d40ea85SCraig Topper; RV64I-LABEL: add_ultcmp_i16_i8:
2657d40ea85SCraig Topper; RV64I:       # %bb.0:
2667d40ea85SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
2677d40ea85SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
2687d40ea85SCraig Topper; RV64I-NEXT:    addi a0, a0, -128
2697d40ea85SCraig Topper; RV64I-NEXT:    srli a0, a0, 8
2707d40ea85SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 255
2717d40ea85SCraig Topper; RV64I-NEXT:    ret
2727d40ea85SCraig Topper;
2737d40ea85SCraig Topper; RV32ZBB-LABEL: add_ultcmp_i16_i8:
2747d40ea85SCraig Topper; RV32ZBB:       # %bb.0:
2757d40ea85SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
2767d40ea85SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, -128
2777d40ea85SCraig Topper; RV32ZBB-NEXT:    srli a0, a0, 8
2787d40ea85SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 255
2797d40ea85SCraig Topper; RV32ZBB-NEXT:    ret
2807d40ea85SCraig Topper;
2817d40ea85SCraig Topper; RV64ZBB-LABEL: add_ultcmp_i16_i8:
2827d40ea85SCraig Topper; RV64ZBB:       # %bb.0:
2837d40ea85SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
2847d40ea85SCraig Topper; RV64ZBB-NEXT:    addi a0, a0, -128
2857d40ea85SCraig Topper; RV64ZBB-NEXT:    srli a0, a0, 8
2867d40ea85SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 255
2877d40ea85SCraig Topper; RV64ZBB-NEXT:    ret
2889c377c53SCraig Topper  %tmp0 = add i16 %x, -128 ; ~0U << (8-1)
2899c377c53SCraig Topper  %tmp1 = icmp ult i16 %tmp0, -256 ; ~0U << 8
2909c377c53SCraig Topper  ret i1 %tmp1
2919c377c53SCraig Topper}
2929c377c53SCraig Topper
2939c377c53SCraig Topperdefine i1 @add_ultcmp_i32_i16(i32 %x) nounwind {
29462e6082dSCraig Topper; RV32I-LABEL: add_ultcmp_i32_i16:
29562e6082dSCraig Topper; RV32I:       # %bb.0:
29662e6082dSCraig Topper; RV32I-NEXT:    lui a1, 1048568
29762e6082dSCraig Topper; RV32I-NEXT:    add a0, a0, a1
29862e6082dSCraig Topper; RV32I-NEXT:    lui a1, 1048560
29962e6082dSCraig Topper; RV32I-NEXT:    sltu a0, a0, a1
30062e6082dSCraig Topper; RV32I-NEXT:    ret
3019c377c53SCraig Topper;
30262e6082dSCraig Topper; RV64I-LABEL: add_ultcmp_i32_i16:
30362e6082dSCraig Topper; RV64I:       # %bb.0:
30462e6082dSCraig Topper; RV64I-NEXT:    lui a1, 1048568
30562e6082dSCraig Topper; RV64I-NEXT:    addw a0, a0, a1
30662e6082dSCraig Topper; RV64I-NEXT:    lui a1, 1048560
30762e6082dSCraig Topper; RV64I-NEXT:    sltu a0, a0, a1
30862e6082dSCraig Topper; RV64I-NEXT:    ret
30962e6082dSCraig Topper;
31062e6082dSCraig Topper; RV32ZBB-LABEL: add_ultcmp_i32_i16:
31162e6082dSCraig Topper; RV32ZBB:       # %bb.0:
31262e6082dSCraig Topper; RV32ZBB-NEXT:    sext.h a1, a0
31362e6082dSCraig Topper; RV32ZBB-NEXT:    xor a0, a1, a0
31462e6082dSCraig Topper; RV32ZBB-NEXT:    snez a0, a0
31562e6082dSCraig Topper; RV32ZBB-NEXT:    ret
31662e6082dSCraig Topper;
31762e6082dSCraig Topper; RV64ZBB-LABEL: add_ultcmp_i32_i16:
31862e6082dSCraig Topper; RV64ZBB:       # %bb.0:
31962e6082dSCraig Topper; RV64ZBB-NEXT:    sext.w a1, a0
32062e6082dSCraig Topper; RV64ZBB-NEXT:    sext.h a0, a0
32162e6082dSCraig Topper; RV64ZBB-NEXT:    xor a0, a0, a1
32262e6082dSCraig Topper; RV64ZBB-NEXT:    snez a0, a0
32362e6082dSCraig Topper; RV64ZBB-NEXT:    ret
3249c377c53SCraig Topper  %tmp0 = add i32 %x, -32768 ; ~0U << (16-1)
3259c377c53SCraig Topper  %tmp1 = icmp ult i32 %tmp0, -65536 ; ~0U << 16
3269c377c53SCraig Topper  ret i1 %tmp1
3279c377c53SCraig Topper}
3289c377c53SCraig Topper
3299c377c53SCraig Topperdefine i1 @add_ultcmp_i32_i8(i32 %x) nounwind {
3309c377c53SCraig Topper; RV32-LABEL: add_ultcmp_i32_i8:
3319c377c53SCraig Topper; RV32:       # %bb.0:
3329c377c53SCraig Topper; RV32-NEXT:    addi a0, a0, -128
3339c377c53SCraig Topper; RV32-NEXT:    sltiu a0, a0, -256
3349c377c53SCraig Topper; RV32-NEXT:    ret
3359c377c53SCraig Topper;
3369c377c53SCraig Topper; RV64-LABEL: add_ultcmp_i32_i8:
3379c377c53SCraig Topper; RV64:       # %bb.0:
3389c377c53SCraig Topper; RV64-NEXT:    addiw a0, a0, -128
3399c377c53SCraig Topper; RV64-NEXT:    sltiu a0, a0, -256
3409c377c53SCraig Topper; RV64-NEXT:    ret
3419c377c53SCraig Topper  %tmp0 = add i32 %x, -128 ; ~0U << (8-1)
3429c377c53SCraig Topper  %tmp1 = icmp ult i32 %tmp0, -256 ; ~0U << 8
3439c377c53SCraig Topper  ret i1 %tmp1
3449c377c53SCraig Topper}
3459c377c53SCraig Topper
3469c377c53SCraig Topperdefine i1 @add_ultcmp_i64_i32(i64 %x) nounwind {
3479c377c53SCraig Topper; RV32-LABEL: add_ultcmp_i64_i32:
3489c377c53SCraig Topper; RV32:       # %bb.0:
34962e6082dSCraig Topper; RV32-NEXT:    srai a0, a0, 31
35062e6082dSCraig Topper; RV32-NEXT:    xor a0, a0, a1
3519c377c53SCraig Topper; RV32-NEXT:    snez a0, a0
3529c377c53SCraig Topper; RV32-NEXT:    ret
3539c377c53SCraig Topper;
3549c377c53SCraig Topper; RV64-LABEL: add_ultcmp_i64_i32:
3559c377c53SCraig Topper; RV64:       # %bb.0:
35662e6082dSCraig Topper; RV64-NEXT:    sext.w a1, a0
35762e6082dSCraig Topper; RV64-NEXT:    xor a0, a1, a0
35862e6082dSCraig Topper; RV64-NEXT:    snez a0, a0
3599c377c53SCraig Topper; RV64-NEXT:    ret
3609c377c53SCraig Topper  %tmp0 = add i64 %x, -2147483648 ; ~0U << (32-1)
3619c377c53SCraig Topper  %tmp1 = icmp ult i64 %tmp0, -4294967296 ; ~0U << 32
3629c377c53SCraig Topper  ret i1 %tmp1
3639c377c53SCraig Topper}
3649c377c53SCraig Topper
3659c377c53SCraig Topperdefine i1 @add_ultcmp_i64_i16(i64 %x) nounwind {
36662e6082dSCraig Topper; RV32I-LABEL: add_ultcmp_i64_i16:
36762e6082dSCraig Topper; RV32I:       # %bb.0:
36862e6082dSCraig Topper; RV32I-NEXT:    lui a2, 1048568
36962e6082dSCraig Topper; RV32I-NEXT:    add a2, a0, a2
37062e6082dSCraig Topper; RV32I-NEXT:    sltu a0, a2, a0
37162e6082dSCraig Topper; RV32I-NEXT:    add a0, a1, a0
372af161ffcSYingwei Zheng; RV32I-NEXT:    lui a1, 1048560
373af161ffcSYingwei Zheng; RV32I-NEXT:    sltu a1, a2, a1
374af161ffcSYingwei Zheng; RV32I-NEXT:    snez a0, a0
375af161ffcSYingwei Zheng; RV32I-NEXT:    or a0, a1, a0
37662e6082dSCraig Topper; RV32I-NEXT:    ret
3779c377c53SCraig Topper;
37862e6082dSCraig Topper; RV64I-LABEL: add_ultcmp_i64_i16:
37962e6082dSCraig Topper; RV64I:       # %bb.0:
38062e6082dSCraig Topper; RV64I-NEXT:    lui a1, 1048568
38162e6082dSCraig Topper; RV64I-NEXT:    add a0, a0, a1
38262e6082dSCraig Topper; RV64I-NEXT:    lui a1, 1048560
38362e6082dSCraig Topper; RV64I-NEXT:    sltu a0, a0, a1
38462e6082dSCraig Topper; RV64I-NEXT:    ret
38562e6082dSCraig Topper;
38662e6082dSCraig Topper; RV32ZBB-LABEL: add_ultcmp_i64_i16:
38762e6082dSCraig Topper; RV32ZBB:       # %bb.0:
38862e6082dSCraig Topper; RV32ZBB-NEXT:    sext.h a2, a0
38962e6082dSCraig Topper; RV32ZBB-NEXT:    xor a0, a2, a0
39062e6082dSCraig Topper; RV32ZBB-NEXT:    srai a2, a2, 31
39162e6082dSCraig Topper; RV32ZBB-NEXT:    xor a1, a2, a1
39262e6082dSCraig Topper; RV32ZBB-NEXT:    or a0, a0, a1
39362e6082dSCraig Topper; RV32ZBB-NEXT:    snez a0, a0
39462e6082dSCraig Topper; RV32ZBB-NEXT:    ret
39562e6082dSCraig Topper;
39662e6082dSCraig Topper; RV64ZBB-LABEL: add_ultcmp_i64_i16:
39762e6082dSCraig Topper; RV64ZBB:       # %bb.0:
39862e6082dSCraig Topper; RV64ZBB-NEXT:    sext.h a1, a0
39962e6082dSCraig Topper; RV64ZBB-NEXT:    xor a0, a1, a0
40062e6082dSCraig Topper; RV64ZBB-NEXT:    snez a0, a0
40162e6082dSCraig Topper; RV64ZBB-NEXT:    ret
4029c377c53SCraig Topper  %tmp0 = add i64 %x, -32768 ; ~0U << (16-1)
4039c377c53SCraig Topper  %tmp1 = icmp ult i64 %tmp0, -65536 ; ~0U << 16
4049c377c53SCraig Topper  ret i1 %tmp1
4059c377c53SCraig Topper}
4069c377c53SCraig Topper
4079c377c53SCraig Topperdefine i1 @add_ultcmp_i64_i8(i64 %x) nounwind {
408e5532fb4SYingwei Zheng; RV32I-LABEL: add_ultcmp_i64_i8:
409e5532fb4SYingwei Zheng; RV32I:       # %bb.0:
410e5532fb4SYingwei Zheng; RV32I-NEXT:    addi a2, a0, -128
411e5532fb4SYingwei Zheng; RV32I-NEXT:    sltu a0, a2, a0
412e5532fb4SYingwei Zheng; RV32I-NEXT:    add a0, a1, a0
413af161ffcSYingwei Zheng; RV32I-NEXT:    snez a0, a0
414af161ffcSYingwei Zheng; RV32I-NEXT:    sltiu a1, a2, -256
415af161ffcSYingwei Zheng; RV32I-NEXT:    or a0, a1, a0
416e5532fb4SYingwei Zheng; RV32I-NEXT:    ret
4179c377c53SCraig Topper;
4189c377c53SCraig Topper; RV64-LABEL: add_ultcmp_i64_i8:
4199c377c53SCraig Topper; RV64:       # %bb.0:
4209c377c53SCraig Topper; RV64-NEXT:    addi a0, a0, -128
4219c377c53SCraig Topper; RV64-NEXT:    sltiu a0, a0, -256
4229c377c53SCraig Topper; RV64-NEXT:    ret
423e5532fb4SYingwei Zheng;
424e5532fb4SYingwei Zheng; RV32ZBB-LABEL: add_ultcmp_i64_i8:
425e5532fb4SYingwei Zheng; RV32ZBB:       # %bb.0:
426e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    sext.b a2, a0
427e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    xor a0, a2, a0
428e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    srai a2, a2, 31
429e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    xor a1, a2, a1
430e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    or a0, a0, a1
431e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    snez a0, a0
432e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    ret
4339c377c53SCraig Topper  %tmp0 = add i64 %x, -128 ; ~0U << (8-1)
4349c377c53SCraig Topper  %tmp1 = icmp ult i64 %tmp0, -256 ; ~0U << 8
4359c377c53SCraig Topper  ret i1 %tmp1
4369c377c53SCraig Topper}
4379c377c53SCraig Topper
4389c377c53SCraig Topper; Slightly more canonical variant
4399c377c53SCraig Topperdefine i1 @add_ulecmp_i16_i8(i16 %x) nounwind {
4407d40ea85SCraig Topper; RV32I-LABEL: add_ulecmp_i16_i8:
4417d40ea85SCraig Topper; RV32I:       # %bb.0:
4427d40ea85SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
4437d40ea85SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
4447d40ea85SCraig Topper; RV32I-NEXT:    addi a0, a0, -128
4457d40ea85SCraig Topper; RV32I-NEXT:    srli a0, a0, 8
4467d40ea85SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 255
4477d40ea85SCraig Topper; RV32I-NEXT:    ret
4489c377c53SCraig Topper;
4497d40ea85SCraig Topper; RV64I-LABEL: add_ulecmp_i16_i8:
4507d40ea85SCraig Topper; RV64I:       # %bb.0:
4517d40ea85SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
4527d40ea85SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
4537d40ea85SCraig Topper; RV64I-NEXT:    addi a0, a0, -128
4547d40ea85SCraig Topper; RV64I-NEXT:    srli a0, a0, 8
4557d40ea85SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 255
4567d40ea85SCraig Topper; RV64I-NEXT:    ret
4577d40ea85SCraig Topper;
4587d40ea85SCraig Topper; RV32ZBB-LABEL: add_ulecmp_i16_i8:
4597d40ea85SCraig Topper; RV32ZBB:       # %bb.0:
4607d40ea85SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
4617d40ea85SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, -128
4627d40ea85SCraig Topper; RV32ZBB-NEXT:    srli a0, a0, 8
4637d40ea85SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 255
4647d40ea85SCraig Topper; RV32ZBB-NEXT:    ret
4657d40ea85SCraig Topper;
4667d40ea85SCraig Topper; RV64ZBB-LABEL: add_ulecmp_i16_i8:
4677d40ea85SCraig Topper; RV64ZBB:       # %bb.0:
4687d40ea85SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
4697d40ea85SCraig Topper; RV64ZBB-NEXT:    addi a0, a0, -128
4707d40ea85SCraig Topper; RV64ZBB-NEXT:    srli a0, a0, 8
4717d40ea85SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 255
4727d40ea85SCraig Topper; RV64ZBB-NEXT:    ret
4739c377c53SCraig Topper  %tmp0 = add i16 %x, -128 ; ~0U << (8-1)
4749c377c53SCraig Topper  %tmp1 = icmp ule i16 %tmp0, -257 ; ~0U << 8 - 1
4759c377c53SCraig Topper  ret i1 %tmp1
4769c377c53SCraig Topper}
4779c377c53SCraig Topper
4789c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
4799c377c53SCraig Topper; add + icmp uge
4809c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
4819c377c53SCraig Topper
4829c377c53SCraig Topperdefine i1 @add_ugecmp_i16_i8(i16 %x) nounwind {
4839c377c53SCraig Topper; RV32I-LABEL: add_ugecmp_i16_i8:
4849c377c53SCraig Topper; RV32I:       # %bb.0:
4859c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 128
4869c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
4879c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
4889c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 256
4899c377c53SCraig Topper; RV32I-NEXT:    xori a0, a0, 1
4909c377c53SCraig Topper; RV32I-NEXT:    ret
4919c377c53SCraig Topper;
4929c377c53SCraig Topper; RV64I-LABEL: add_ugecmp_i16_i8:
4939c377c53SCraig Topper; RV64I:       # %bb.0:
49486240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 128
4959c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
4969c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
4979c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 256
4989c377c53SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
4999c377c53SCraig Topper; RV64I-NEXT:    ret
5009c377c53SCraig Topper;
5019c377c53SCraig Topper; RV32ZBB-LABEL: add_ugecmp_i16_i8:
5029c377c53SCraig Topper; RV32ZBB:       # %bb.0:
5039c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 128
5049c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
5059c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 256
5069c377c53SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
5079c377c53SCraig Topper; RV32ZBB-NEXT:    ret
5089c377c53SCraig Topper;
5099c377c53SCraig Topper; RV64ZBB-LABEL: add_ugecmp_i16_i8:
5109c377c53SCraig Topper; RV64ZBB:       # %bb.0:
51186240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 128
5129c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
5139c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 256
5149c377c53SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
5159c377c53SCraig Topper; RV64ZBB-NEXT:    ret
5169c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
5179c377c53SCraig Topper  %tmp1 = icmp uge i16 %tmp0, 256 ; 1U << 8
5189c377c53SCraig Topper  ret i1 %tmp1
5199c377c53SCraig Topper}
5209c377c53SCraig Topper
5219c377c53SCraig Topperdefine i1 @add_ugecmp_i32_i16(i32 %x) nounwind {
52262e6082dSCraig Topper; RV32I-LABEL: add_ugecmp_i32_i16:
52362e6082dSCraig Topper; RV32I:       # %bb.0:
52462e6082dSCraig Topper; RV32I-NEXT:    lui a1, 8
52562e6082dSCraig Topper; RV32I-NEXT:    add a0, a0, a1
52662e6082dSCraig Topper; RV32I-NEXT:    srli a0, a0, 16
52762e6082dSCraig Topper; RV32I-NEXT:    snez a0, a0
52862e6082dSCraig Topper; RV32I-NEXT:    ret
5299c377c53SCraig Topper;
53062e6082dSCraig Topper; RV64I-LABEL: add_ugecmp_i32_i16:
53162e6082dSCraig Topper; RV64I:       # %bb.0:
53262e6082dSCraig Topper; RV64I-NEXT:    lui a1, 8
53362e6082dSCraig Topper; RV64I-NEXT:    add a0, a0, a1
53462e6082dSCraig Topper; RV64I-NEXT:    srliw a0, a0, 16
53562e6082dSCraig Topper; RV64I-NEXT:    snez a0, a0
53662e6082dSCraig Topper; RV64I-NEXT:    ret
53762e6082dSCraig Topper;
53862e6082dSCraig Topper; RV32ZBB-LABEL: add_ugecmp_i32_i16:
53962e6082dSCraig Topper; RV32ZBB:       # %bb.0:
54062e6082dSCraig Topper; RV32ZBB-NEXT:    sext.h a1, a0
54162e6082dSCraig Topper; RV32ZBB-NEXT:    xor a0, a1, a0
54262e6082dSCraig Topper; RV32ZBB-NEXT:    snez a0, a0
54362e6082dSCraig Topper; RV32ZBB-NEXT:    ret
54462e6082dSCraig Topper;
54562e6082dSCraig Topper; RV64ZBB-LABEL: add_ugecmp_i32_i16:
54662e6082dSCraig Topper; RV64ZBB:       # %bb.0:
54762e6082dSCraig Topper; RV64ZBB-NEXT:    sext.w a1, a0
54862e6082dSCraig Topper; RV64ZBB-NEXT:    sext.h a0, a0
54962e6082dSCraig Topper; RV64ZBB-NEXT:    xor a0, a0, a1
55062e6082dSCraig Topper; RV64ZBB-NEXT:    snez a0, a0
55162e6082dSCraig Topper; RV64ZBB-NEXT:    ret
5529c377c53SCraig Topper  %tmp0 = add i32 %x, 32768 ; 1U << (16-1)
5539c377c53SCraig Topper  %tmp1 = icmp uge i32 %tmp0, 65536 ; 1U << 16
5549c377c53SCraig Topper  ret i1 %tmp1
5559c377c53SCraig Topper}
5569c377c53SCraig Topper
5579c377c53SCraig Topperdefine i1 @add_ugecmp_i32_i8(i32 %x) nounwind {
5589c377c53SCraig Topper; RV32-LABEL: add_ugecmp_i32_i8:
5599c377c53SCraig Topper; RV32:       # %bb.0:
5609c377c53SCraig Topper; RV32-NEXT:    addi a0, a0, 128
5619c377c53SCraig Topper; RV32-NEXT:    sltiu a0, a0, 256
5629c377c53SCraig Topper; RV32-NEXT:    xori a0, a0, 1
5639c377c53SCraig Topper; RV32-NEXT:    ret
5649c377c53SCraig Topper;
5659c377c53SCraig Topper; RV64-LABEL: add_ugecmp_i32_i8:
5669c377c53SCraig Topper; RV64:       # %bb.0:
5679c377c53SCraig Topper; RV64-NEXT:    addiw a0, a0, 128
5689c377c53SCraig Topper; RV64-NEXT:    sltiu a0, a0, 256
5699c377c53SCraig Topper; RV64-NEXT:    xori a0, a0, 1
5709c377c53SCraig Topper; RV64-NEXT:    ret
5719c377c53SCraig Topper  %tmp0 = add i32 %x, 128 ; 1U << (8-1)
5729c377c53SCraig Topper  %tmp1 = icmp uge i32 %tmp0, 256 ; 1U << 8
5739c377c53SCraig Topper  ret i1 %tmp1
5749c377c53SCraig Topper}
5759c377c53SCraig Topper
5769c377c53SCraig Topperdefine i1 @add_ugecmp_i64_i32(i64 %x) nounwind {
5779c377c53SCraig Topper; RV32-LABEL: add_ugecmp_i64_i32:
5789c377c53SCraig Topper; RV32:       # %bb.0:
57962e6082dSCraig Topper; RV32-NEXT:    srai a0, a0, 31
58062e6082dSCraig Topper; RV32-NEXT:    xor a0, a0, a1
5819c377c53SCraig Topper; RV32-NEXT:    snez a0, a0
5829c377c53SCraig Topper; RV32-NEXT:    ret
5839c377c53SCraig Topper;
5849c377c53SCraig Topper; RV64-LABEL: add_ugecmp_i64_i32:
5859c377c53SCraig Topper; RV64:       # %bb.0:
58662e6082dSCraig Topper; RV64-NEXT:    sext.w a1, a0
58762e6082dSCraig Topper; RV64-NEXT:    xor a0, a1, a0
5889c377c53SCraig Topper; RV64-NEXT:    snez a0, a0
5899c377c53SCraig Topper; RV64-NEXT:    ret
5909c377c53SCraig Topper  %tmp0 = add i64 %x, 2147483648 ; 1U << (32-1)
5919c377c53SCraig Topper  %tmp1 = icmp uge i64 %tmp0, 4294967296 ; 1U << 32
5929c377c53SCraig Topper  ret i1 %tmp1
5939c377c53SCraig Topper}
5949c377c53SCraig Topper
5959c377c53SCraig Topperdefine i1 @add_ugecmp_i64_i16(i64 %x) nounwind {
59662e6082dSCraig Topper; RV32I-LABEL: add_ugecmp_i64_i16:
59762e6082dSCraig Topper; RV32I:       # %bb.0:
59862e6082dSCraig Topper; RV32I-NEXT:    lui a2, 8
59962e6082dSCraig Topper; RV32I-NEXT:    add a2, a0, a2
60062e6082dSCraig Topper; RV32I-NEXT:    sltu a0, a2, a0
60162e6082dSCraig Topper; RV32I-NEXT:    add a0, a1, a0
60262e6082dSCraig Topper; RV32I-NEXT:    srli a2, a2, 16
60362e6082dSCraig Topper; RV32I-NEXT:    or a0, a0, a2
60462e6082dSCraig Topper; RV32I-NEXT:    snez a0, a0
60562e6082dSCraig Topper; RV32I-NEXT:    ret
6069c377c53SCraig Topper;
60762e6082dSCraig Topper; RV64I-LABEL: add_ugecmp_i64_i16:
60862e6082dSCraig Topper; RV64I:       # %bb.0:
60962e6082dSCraig Topper; RV64I-NEXT:    lui a1, 8
61062e6082dSCraig Topper; RV64I-NEXT:    add a0, a0, a1
61162e6082dSCraig Topper; RV64I-NEXT:    srli a0, a0, 16
61262e6082dSCraig Topper; RV64I-NEXT:    snez a0, a0
61362e6082dSCraig Topper; RV64I-NEXT:    ret
61462e6082dSCraig Topper;
61562e6082dSCraig Topper; RV32ZBB-LABEL: add_ugecmp_i64_i16:
61662e6082dSCraig Topper; RV32ZBB:       # %bb.0:
61762e6082dSCraig Topper; RV32ZBB-NEXT:    sext.h a2, a0
61862e6082dSCraig Topper; RV32ZBB-NEXT:    xor a0, a2, a0
61962e6082dSCraig Topper; RV32ZBB-NEXT:    srai a2, a2, 31
62062e6082dSCraig Topper; RV32ZBB-NEXT:    xor a1, a2, a1
62162e6082dSCraig Topper; RV32ZBB-NEXT:    or a0, a0, a1
62262e6082dSCraig Topper; RV32ZBB-NEXT:    snez a0, a0
62362e6082dSCraig Topper; RV32ZBB-NEXT:    ret
62462e6082dSCraig Topper;
62562e6082dSCraig Topper; RV64ZBB-LABEL: add_ugecmp_i64_i16:
62662e6082dSCraig Topper; RV64ZBB:       # %bb.0:
62762e6082dSCraig Topper; RV64ZBB-NEXT:    sext.h a1, a0
62862e6082dSCraig Topper; RV64ZBB-NEXT:    xor a0, a1, a0
62962e6082dSCraig Topper; RV64ZBB-NEXT:    snez a0, a0
63062e6082dSCraig Topper; RV64ZBB-NEXT:    ret
6319c377c53SCraig Topper  %tmp0 = add i64 %x, 32768 ; 1U << (16-1)
6329c377c53SCraig Topper  %tmp1 = icmp uge i64 %tmp0, 65536 ; 1U << 16
6339c377c53SCraig Topper  ret i1 %tmp1
6349c377c53SCraig Topper}
6359c377c53SCraig Topper
6369c377c53SCraig Topperdefine i1 @add_ugecmp_i64_i8(i64 %x) nounwind {
637e5532fb4SYingwei Zheng; RV32I-LABEL: add_ugecmp_i64_i8:
638e5532fb4SYingwei Zheng; RV32I:       # %bb.0:
639e5532fb4SYingwei Zheng; RV32I-NEXT:    addi a2, a0, 128
640e5532fb4SYingwei Zheng; RV32I-NEXT:    sltu a0, a2, a0
641*9122c523SPengcheng Wang; RV32I-NEXT:    sltiu a2, a2, 256
642af161ffcSYingwei Zheng; RV32I-NEXT:    add a0, a1, a0
643af161ffcSYingwei Zheng; RV32I-NEXT:    snez a0, a0
644*9122c523SPengcheng Wang; RV32I-NEXT:    xori a1, a2, 1
645af161ffcSYingwei Zheng; RV32I-NEXT:    or a0, a1, a0
646e5532fb4SYingwei Zheng; RV32I-NEXT:    ret
6479c377c53SCraig Topper;
6489c377c53SCraig Topper; RV64-LABEL: add_ugecmp_i64_i8:
6499c377c53SCraig Topper; RV64:       # %bb.0:
6509c377c53SCraig Topper; RV64-NEXT:    addi a0, a0, 128
6519c377c53SCraig Topper; RV64-NEXT:    sltiu a0, a0, 256
6529c377c53SCraig Topper; RV64-NEXT:    xori a0, a0, 1
6539c377c53SCraig Topper; RV64-NEXT:    ret
654e5532fb4SYingwei Zheng;
655e5532fb4SYingwei Zheng; RV32ZBB-LABEL: add_ugecmp_i64_i8:
656e5532fb4SYingwei Zheng; RV32ZBB:       # %bb.0:
657e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    sext.b a2, a0
658e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    xor a0, a2, a0
659e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    srai a2, a2, 31
660e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    xor a1, a2, a1
661e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    or a0, a0, a1
662e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    snez a0, a0
663e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    ret
6649c377c53SCraig Topper  %tmp0 = add i64 %x, 128 ; 1U << (8-1)
6659c377c53SCraig Topper  %tmp1 = icmp uge i64 %tmp0, 256 ; 1U << 8
6669c377c53SCraig Topper  ret i1 %tmp1
6679c377c53SCraig Topper}
6689c377c53SCraig Topper
6699c377c53SCraig Topper; Slightly more canonical variant
6709c377c53SCraig Topperdefine i1 @add_ugtcmp_i16_i8(i16 %x) nounwind {
6719c377c53SCraig Topper; RV32I-LABEL: add_ugtcmp_i16_i8:
6729c377c53SCraig Topper; RV32I:       # %bb.0:
6739c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 128
6749c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
6759c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
6769c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 256
6779c377c53SCraig Topper; RV32I-NEXT:    xori a0, a0, 1
6789c377c53SCraig Topper; RV32I-NEXT:    ret
6799c377c53SCraig Topper;
6809c377c53SCraig Topper; RV64I-LABEL: add_ugtcmp_i16_i8:
6819c377c53SCraig Topper; RV64I:       # %bb.0:
68286240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 128
6839c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
6849c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
6859c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 256
6869c377c53SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
6879c377c53SCraig Topper; RV64I-NEXT:    ret
6889c377c53SCraig Topper;
6899c377c53SCraig Topper; RV32ZBB-LABEL: add_ugtcmp_i16_i8:
6909c377c53SCraig Topper; RV32ZBB:       # %bb.0:
6919c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 128
6929c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
6939c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 256
6949c377c53SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
6959c377c53SCraig Topper; RV32ZBB-NEXT:    ret
6969c377c53SCraig Topper;
6979c377c53SCraig Topper; RV64ZBB-LABEL: add_ugtcmp_i16_i8:
6989c377c53SCraig Topper; RV64ZBB:       # %bb.0:
69986240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 128
7009c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
7019c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 256
7029c377c53SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
7039c377c53SCraig Topper; RV64ZBB-NEXT:    ret
7049c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
7059c377c53SCraig Topper  %tmp1 = icmp ugt i16 %tmp0, 255 ; (1U << 8) - 1
7069c377c53SCraig Topper  ret i1 %tmp1
7079c377c53SCraig Topper}
7089c377c53SCraig Topper
7099c377c53SCraig Topper; Negative tests
7109c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
7119c377c53SCraig Topper
7129c377c53SCraig Topper; Adding not a constant
7139c377c53SCraig Topperdefine i1 @add_ugecmp_bad_i16_i8_add(i16 %x, i16 %y) nounwind {
7149c377c53SCraig Topper; RV32I-LABEL: add_ugecmp_bad_i16_i8_add:
7159c377c53SCraig Topper; RV32I:       # %bb.0:
7169c377c53SCraig Topper; RV32I-NEXT:    add a0, a0, a1
7179c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
7189c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
7199c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 256
7209c377c53SCraig Topper; RV32I-NEXT:    xori a0, a0, 1
7219c377c53SCraig Topper; RV32I-NEXT:    ret
7229c377c53SCraig Topper;
7239c377c53SCraig Topper; RV64I-LABEL: add_ugecmp_bad_i16_i8_add:
7249c377c53SCraig Topper; RV64I:       # %bb.0:
7259c377c53SCraig Topper; RV64I-NEXT:    add a0, a0, a1
7269c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
7279c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
7289c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 256
7299c377c53SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
7309c377c53SCraig Topper; RV64I-NEXT:    ret
7319c377c53SCraig Topper;
7329c377c53SCraig Topper; RV32ZBB-LABEL: add_ugecmp_bad_i16_i8_add:
7339c377c53SCraig Topper; RV32ZBB:       # %bb.0:
7349c377c53SCraig Topper; RV32ZBB-NEXT:    add a0, a0, a1
7359c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
7369c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 256
7379c377c53SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
7389c377c53SCraig Topper; RV32ZBB-NEXT:    ret
7399c377c53SCraig Topper;
7409c377c53SCraig Topper; RV64ZBB-LABEL: add_ugecmp_bad_i16_i8_add:
7419c377c53SCraig Topper; RV64ZBB:       # %bb.0:
7429c377c53SCraig Topper; RV64ZBB-NEXT:    add a0, a0, a1
7439c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
7449c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 256
7459c377c53SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
7469c377c53SCraig Topper; RV64ZBB-NEXT:    ret
7479c377c53SCraig Topper  %tmp0 = add i16 %x, %y
7489c377c53SCraig Topper  %tmp1 = icmp uge i16 %tmp0, 256 ; 1U << 8
7499c377c53SCraig Topper  ret i1 %tmp1
7509c377c53SCraig Topper}
7519c377c53SCraig Topper
7529c377c53SCraig Topper; Comparing not with a constant
7539c377c53SCraig Topperdefine i1 @add_ugecmp_bad_i16_i8_cmp(i16 %x, i16 %y) nounwind {
7549c377c53SCraig Topper; RV32I-LABEL: add_ugecmp_bad_i16_i8_cmp:
7559c377c53SCraig Topper; RV32I:       # %bb.0:
7569c377c53SCraig Topper; RV32I-NEXT:    lui a2, 16
757*9122c523SPengcheng Wang; RV32I-NEXT:    addi a0, a0, 128
7589c377c53SCraig Topper; RV32I-NEXT:    addi a2, a2, -1
7599c377c53SCraig Topper; RV32I-NEXT:    and a1, a1, a2
7609c377c53SCraig Topper; RV32I-NEXT:    and a0, a0, a2
7619c377c53SCraig Topper; RV32I-NEXT:    sltu a0, a0, a1
7629c377c53SCraig Topper; RV32I-NEXT:    xori a0, a0, 1
7639c377c53SCraig Topper; RV32I-NEXT:    ret
7649c377c53SCraig Topper;
7659c377c53SCraig Topper; RV64I-LABEL: add_ugecmp_bad_i16_i8_cmp:
7669c377c53SCraig Topper; RV64I:       # %bb.0:
7679c377c53SCraig Topper; RV64I-NEXT:    lui a2, 16
768*9122c523SPengcheng Wang; RV64I-NEXT:    addi a0, a0, 128
7699c377c53SCraig Topper; RV64I-NEXT:    addiw a2, a2, -1
7709c377c53SCraig Topper; RV64I-NEXT:    and a1, a1, a2
7719c377c53SCraig Topper; RV64I-NEXT:    and a0, a0, a2
7729c377c53SCraig Topper; RV64I-NEXT:    sltu a0, a0, a1
7739c377c53SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
7749c377c53SCraig Topper; RV64I-NEXT:    ret
7759c377c53SCraig Topper;
7769c377c53SCraig Topper; RV32ZBB-LABEL: add_ugecmp_bad_i16_i8_cmp:
7779c377c53SCraig Topper; RV32ZBB:       # %bb.0:
7789c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a1, a1
7799c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 128
7809c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
7819c377c53SCraig Topper; RV32ZBB-NEXT:    sltu a0, a0, a1
7829c377c53SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
7839c377c53SCraig Topper; RV32ZBB-NEXT:    ret
7849c377c53SCraig Topper;
7859c377c53SCraig Topper; RV64ZBB-LABEL: add_ugecmp_bad_i16_i8_cmp:
7869c377c53SCraig Topper; RV64ZBB:       # %bb.0:
7879c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a1, a1
78886240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 128
7899c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
7909c377c53SCraig Topper; RV64ZBB-NEXT:    sltu a0, a0, a1
7919c377c53SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
7929c377c53SCraig Topper; RV64ZBB-NEXT:    ret
7939c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
7949c377c53SCraig Topper  %tmp1 = icmp uge i16 %tmp0, %y
7959c377c53SCraig Topper  ret i1 %tmp1
7969c377c53SCraig Topper}
7979c377c53SCraig Topper
7989c377c53SCraig Topper; Second constant is not larger than the first one
7999c377c53SCraig Topperdefine i1 @add_ugecmp_bad_i8_i16(i16 %x) nounwind {
8009c377c53SCraig Topper; RV32I-LABEL: add_ugecmp_bad_i8_i16:
8019c377c53SCraig Topper; RV32I:       # %bb.0:
8029c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 128
8039c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
8049c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
8059c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 128
8069c377c53SCraig Topper; RV32I-NEXT:    xori a0, a0, 1
8079c377c53SCraig Topper; RV32I-NEXT:    ret
8089c377c53SCraig Topper;
8099c377c53SCraig Topper; RV64I-LABEL: add_ugecmp_bad_i8_i16:
8109c377c53SCraig Topper; RV64I:       # %bb.0:
81186240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 128
8129c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
8139c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
8149c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 128
8159c377c53SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
8169c377c53SCraig Topper; RV64I-NEXT:    ret
8179c377c53SCraig Topper;
8189c377c53SCraig Topper; RV32ZBB-LABEL: add_ugecmp_bad_i8_i16:
8199c377c53SCraig Topper; RV32ZBB:       # %bb.0:
8209c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 128
8219c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
8229c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 128
8239c377c53SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
8249c377c53SCraig Topper; RV32ZBB-NEXT:    ret
8259c377c53SCraig Topper;
8269c377c53SCraig Topper; RV64ZBB-LABEL: add_ugecmp_bad_i8_i16:
8279c377c53SCraig Topper; RV64ZBB:       # %bb.0:
82886240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 128
8299c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
8309c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 128
8319c377c53SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
8329c377c53SCraig Topper; RV64ZBB-NEXT:    ret
8339c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
8349c377c53SCraig Topper  %tmp1 = icmp uge i16 %tmp0, 128 ; 1U << (8-1)
8359c377c53SCraig Topper  ret i1 %tmp1
8369c377c53SCraig Topper}
8379c377c53SCraig Topper
8389c377c53SCraig Topper; First constant is not power of two
8399c377c53SCraig Topperdefine i1 @add_ugecmp_bad_i16_i8_c0notpoweroftwo(i16 %x) nounwind {
8409c377c53SCraig Topper; RV32I-LABEL: add_ugecmp_bad_i16_i8_c0notpoweroftwo:
8419c377c53SCraig Topper; RV32I:       # %bb.0:
8429c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 192
8439c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
8449c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
8459c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 256
8469c377c53SCraig Topper; RV32I-NEXT:    xori a0, a0, 1
8479c377c53SCraig Topper; RV32I-NEXT:    ret
8489c377c53SCraig Topper;
8499c377c53SCraig Topper; RV64I-LABEL: add_ugecmp_bad_i16_i8_c0notpoweroftwo:
8509c377c53SCraig Topper; RV64I:       # %bb.0:
85186240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 192
8529c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
8539c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
8549c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 256
8559c377c53SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
8569c377c53SCraig Topper; RV64I-NEXT:    ret
8579c377c53SCraig Topper;
8589c377c53SCraig Topper; RV32ZBB-LABEL: add_ugecmp_bad_i16_i8_c0notpoweroftwo:
8599c377c53SCraig Topper; RV32ZBB:       # %bb.0:
8609c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 192
8619c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
8629c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 256
8639c377c53SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
8649c377c53SCraig Topper; RV32ZBB-NEXT:    ret
8659c377c53SCraig Topper;
8669c377c53SCraig Topper; RV64ZBB-LABEL: add_ugecmp_bad_i16_i8_c0notpoweroftwo:
8679c377c53SCraig Topper; RV64ZBB:       # %bb.0:
86886240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 192
8699c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
8709c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 256
8719c377c53SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
8729c377c53SCraig Topper; RV64ZBB-NEXT:    ret
8739c377c53SCraig Topper  %tmp0 = add i16 %x, 192 ; (1U << (8-1)) + (1U << (8-1-1))
8749c377c53SCraig Topper  %tmp1 = icmp uge i16 %tmp0, 256 ; 1U << 8
8759c377c53SCraig Topper  ret i1 %tmp1
8769c377c53SCraig Topper}
8779c377c53SCraig Topper
8789c377c53SCraig Topper; Second constant is not power of two
8799c377c53SCraig Topperdefine i1 @add_ugecmp_bad_i16_i8_c1notpoweroftwo(i16 %x) nounwind {
8809c377c53SCraig Topper; RV32I-LABEL: add_ugecmp_bad_i16_i8_c1notpoweroftwo:
8819c377c53SCraig Topper; RV32I:       # %bb.0:
8829c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 128
8839c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
8849c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
8859c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 768
8869c377c53SCraig Topper; RV32I-NEXT:    xori a0, a0, 1
8879c377c53SCraig Topper; RV32I-NEXT:    ret
8889c377c53SCraig Topper;
8899c377c53SCraig Topper; RV64I-LABEL: add_ugecmp_bad_i16_i8_c1notpoweroftwo:
8909c377c53SCraig Topper; RV64I:       # %bb.0:
89186240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 128
8929c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
8939c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
8949c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 768
8959c377c53SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
8969c377c53SCraig Topper; RV64I-NEXT:    ret
8979c377c53SCraig Topper;
8989c377c53SCraig Topper; RV32ZBB-LABEL: add_ugecmp_bad_i16_i8_c1notpoweroftwo:
8999c377c53SCraig Topper; RV32ZBB:       # %bb.0:
9009c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 128
9019c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
9029c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 768
9039c377c53SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
9049c377c53SCraig Topper; RV32ZBB-NEXT:    ret
9059c377c53SCraig Topper;
9069c377c53SCraig Topper; RV64ZBB-LABEL: add_ugecmp_bad_i16_i8_c1notpoweroftwo:
9079c377c53SCraig Topper; RV64ZBB:       # %bb.0:
90886240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 128
9099c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
9109c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 768
9119c377c53SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
9129c377c53SCraig Topper; RV64ZBB-NEXT:    ret
9139c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
9149c377c53SCraig Topper  %tmp1 = icmp uge i16 %tmp0, 768 ; (1U << 8)) + (1U << (8+1))
9159c377c53SCraig Topper  ret i1 %tmp1
9169c377c53SCraig Topper}
9179c377c53SCraig Topper
9189c377c53SCraig Topper; Magic check fails, 64 << 1 != 256
9199c377c53SCraig Topperdefine i1 @add_ugecmp_bad_i16_i8_magic(i16 %x) nounwind {
9209c377c53SCraig Topper; RV32I-LABEL: add_ugecmp_bad_i16_i8_magic:
9219c377c53SCraig Topper; RV32I:       # %bb.0:
9229c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 64
9239c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
9249c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
9259c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 256
9269c377c53SCraig Topper; RV32I-NEXT:    xori a0, a0, 1
9279c377c53SCraig Topper; RV32I-NEXT:    ret
9289c377c53SCraig Topper;
9299c377c53SCraig Topper; RV64I-LABEL: add_ugecmp_bad_i16_i8_magic:
9309c377c53SCraig Topper; RV64I:       # %bb.0:
93186240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 64
9329c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
9339c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
9349c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 256
9359c377c53SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
9369c377c53SCraig Topper; RV64I-NEXT:    ret
9379c377c53SCraig Topper;
9389c377c53SCraig Topper; RV32ZBB-LABEL: add_ugecmp_bad_i16_i8_magic:
9399c377c53SCraig Topper; RV32ZBB:       # %bb.0:
9409c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 64
9419c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
9429c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 256
9439c377c53SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
9449c377c53SCraig Topper; RV32ZBB-NEXT:    ret
9459c377c53SCraig Topper;
9469c377c53SCraig Topper; RV64ZBB-LABEL: add_ugecmp_bad_i16_i8_magic:
9479c377c53SCraig Topper; RV64ZBB:       # %bb.0:
94886240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 64
9499c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
9509c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 256
9519c377c53SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
9529c377c53SCraig Topper; RV64ZBB-NEXT:    ret
9539c377c53SCraig Topper  %tmp0 = add i16 %x, 64 ; 1U << (8-1-1)
9549c377c53SCraig Topper  %tmp1 = icmp uge i16 %tmp0, 256 ; 1U << 8
9559c377c53SCraig Topper  ret i1 %tmp1
9569c377c53SCraig Topper}
9579c377c53SCraig Topper
9589c377c53SCraig Topper; Bad 'destination type'
9599c377c53SCraig Topperdefine i1 @add_ugecmp_bad_i16_i4(i16 %x) nounwind {
9609c377c53SCraig Topper; RV32I-LABEL: add_ugecmp_bad_i16_i4:
9619c377c53SCraig Topper; RV32I:       # %bb.0:
9629c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 8
9639c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
9649c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
9659c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 16
9669c377c53SCraig Topper; RV32I-NEXT:    xori a0, a0, 1
9679c377c53SCraig Topper; RV32I-NEXT:    ret
9689c377c53SCraig Topper;
9699c377c53SCraig Topper; RV64I-LABEL: add_ugecmp_bad_i16_i4:
9709c377c53SCraig Topper; RV64I:       # %bb.0:
97186240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 8
9729c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
9739c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
9749c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 16
9759c377c53SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
9769c377c53SCraig Topper; RV64I-NEXT:    ret
9779c377c53SCraig Topper;
9789c377c53SCraig Topper; RV32ZBB-LABEL: add_ugecmp_bad_i16_i4:
9799c377c53SCraig Topper; RV32ZBB:       # %bb.0:
9809c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 8
9819c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
9829c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 16
9839c377c53SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
9849c377c53SCraig Topper; RV32ZBB-NEXT:    ret
9859c377c53SCraig Topper;
9869c377c53SCraig Topper; RV64ZBB-LABEL: add_ugecmp_bad_i16_i4:
9879c377c53SCraig Topper; RV64ZBB:       # %bb.0:
98886240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 8
9899c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
9909c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 16
9919c377c53SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
9929c377c53SCraig Topper; RV64ZBB-NEXT:    ret
9939c377c53SCraig Topper  %tmp0 = add i16 %x, 8 ; 1U << (4-1)
9949c377c53SCraig Topper  %tmp1 = icmp uge i16 %tmp0, 16 ; 1U << 4
9959c377c53SCraig Topper  ret i1 %tmp1
9969c377c53SCraig Topper}
9979c377c53SCraig Topper
9989c377c53SCraig Topper; Bad storage type
9999c377c53SCraig Topperdefine i1 @add_ugecmp_bad_i24_i8(i24 %x) nounwind {
10009c377c53SCraig Topper; RV32-LABEL: add_ugecmp_bad_i24_i8:
10019c377c53SCraig Topper; RV32:       # %bb.0:
10029c377c53SCraig Topper; RV32-NEXT:    addi a0, a0, 128
10039c377c53SCraig Topper; RV32-NEXT:    slli a0, a0, 8
10049c377c53SCraig Topper; RV32-NEXT:    srli a0, a0, 8
10059c377c53SCraig Topper; RV32-NEXT:    sltiu a0, a0, 256
10069c377c53SCraig Topper; RV32-NEXT:    xori a0, a0, 1
10079c377c53SCraig Topper; RV32-NEXT:    ret
10089c377c53SCraig Topper;
10099c377c53SCraig Topper; RV64-LABEL: add_ugecmp_bad_i24_i8:
10109c377c53SCraig Topper; RV64:       # %bb.0:
101186240751SPhilip Reames; RV64-NEXT:    addi a0, a0, 128
10129c377c53SCraig Topper; RV64-NEXT:    slli a0, a0, 40
10139c377c53SCraig Topper; RV64-NEXT:    srli a0, a0, 40
10149c377c53SCraig Topper; RV64-NEXT:    sltiu a0, a0, 256
10159c377c53SCraig Topper; RV64-NEXT:    xori a0, a0, 1
10169c377c53SCraig Topper; RV64-NEXT:    ret
10179c377c53SCraig Topper  %tmp0 = add i24 %x, 128 ; 1U << (8-1)
10189c377c53SCraig Topper  %tmp1 = icmp uge i24 %tmp0, 256 ; 1U << 8
10199c377c53SCraig Topper  ret i1 %tmp1
10209c377c53SCraig Topper}
10219c377c53SCraig Topper
10229c377c53SCraig Topper; Slightly more canonical variant
10239c377c53SCraig Topperdefine i1 @add_ugtcmp_bad_i16_i8(i16 %x) nounwind {
10249c377c53SCraig Topper; CHECK-LABEL: add_ugtcmp_bad_i16_i8:
10259c377c53SCraig Topper; CHECK:       # %bb.0:
10269c377c53SCraig Topper; CHECK-NEXT:    li a0, 0
10279c377c53SCraig Topper; CHECK-NEXT:    ret
10289c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
10299c377c53SCraig Topper  %tmp1 = icmp ugt i16 %tmp0, -1 ; when we +1 it, it will wrap to 0
10309c377c53SCraig Topper  ret i1 %tmp1
10319c377c53SCraig Topper}
1032