xref: /llvm-project/llvm/test/CodeGen/RISCV/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 equality-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 eq <- not canonical
159c377c53SCraig Topper;   shl   + ashr + icmp eq
169c377c53SCraig Topper;   add          + icmp uge/ugt
179c377c53SCraig Topper;   add          + icmp ult/ule
189c377c53SCraig Topper; However only the simplest form (with two shifts) gets lowered best.
199c377c53SCraig Topper
209c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
219c377c53SCraig Topper; shl + ashr + icmp eq
229c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
239c377c53SCraig Topper
249c377c53SCraig Topperdefine i1 @shifts_eqcmp_i16_i8(i16 %x) nounwind {
259c377c53SCraig Topper; RV32I-LABEL: shifts_eqcmp_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:    seqz a0, a0
349c377c53SCraig Topper; RV32I-NEXT:    ret
359c377c53SCraig Topper;
369c377c53SCraig Topper; RV64I-LABEL: shifts_eqcmp_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:    seqz a0, a0
459c377c53SCraig Topper; RV64I-NEXT:    ret
469c377c53SCraig Topper;
479c377c53SCraig Topper; RV32ZBB-LABEL: shifts_eqcmp_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:    seqz a0, a0
549c377c53SCraig Topper; RV32ZBB-NEXT:    ret
559c377c53SCraig Topper;
569c377c53SCraig Topper; RV64ZBB-LABEL: shifts_eqcmp_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:    seqz 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 eq i16 %tmp1, %x
679c377c53SCraig Topper  ret i1 %tmp2
689c377c53SCraig Topper}
699c377c53SCraig Topper
709c377c53SCraig Topperdefine i1 @shifts_eqcmp_i32_i16(i32 %x) nounwind {
719c377c53SCraig Topper; RV32I-LABEL: shifts_eqcmp_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:    seqz a0, a0
779c377c53SCraig Topper; RV32I-NEXT:    ret
789c377c53SCraig Topper;
799c377c53SCraig Topper; RV64I-LABEL: shifts_eqcmp_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:    seqz a0, a0
869c377c53SCraig Topper; RV64I-NEXT:    ret
879c377c53SCraig Topper;
889c377c53SCraig Topper; RV32ZBB-LABEL: shifts_eqcmp_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:    seqz a0, a0
939c377c53SCraig Topper; RV32ZBB-NEXT:    ret
949c377c53SCraig Topper;
959c377c53SCraig Topper; RV64ZBB-LABEL: shifts_eqcmp_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:    seqz 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 eq i32 %tmp1, %x
1059c377c53SCraig Topper  ret i1 %tmp2
1069c377c53SCraig Topper}
1079c377c53SCraig Topper
1089c377c53SCraig Topperdefine i1 @shifts_eqcmp_i32_i8(i32 %x) nounwind {
1099c377c53SCraig Topper; RV32I-LABEL: shifts_eqcmp_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:    seqz a0, a0
1159c377c53SCraig Topper; RV32I-NEXT:    ret
1169c377c53SCraig Topper;
1179c377c53SCraig Topper; RV64I-LABEL: shifts_eqcmp_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:    seqz a0, a0
1249c377c53SCraig Topper; RV64I-NEXT:    ret
1259c377c53SCraig Topper;
1269c377c53SCraig Topper; RV32ZBB-LABEL: shifts_eqcmp_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:    seqz a0, a0
1319c377c53SCraig Topper; RV32ZBB-NEXT:    ret
1329c377c53SCraig Topper;
1339c377c53SCraig Topper; RV64ZBB-LABEL: shifts_eqcmp_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:    seqz 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 eq i32 %tmp1, %x
1439c377c53SCraig Topper  ret i1 %tmp2
1449c377c53SCraig Topper}
1459c377c53SCraig Topper
1469c377c53SCraig Topperdefine i1 @shifts_eqcmp_i64_i32(i64 %x) nounwind {
1479c377c53SCraig Topper; RV32-LABEL: shifts_eqcmp_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:    seqz a0, a0
1529c377c53SCraig Topper; RV32-NEXT:    ret
1539c377c53SCraig Topper;
1549c377c53SCraig Topper; RV64-LABEL: shifts_eqcmp_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:    seqz 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 eq i64 %tmp1, %x
1639c377c53SCraig Topper  ret i1 %tmp2
1649c377c53SCraig Topper}
1659c377c53SCraig Topper
1669c377c53SCraig Topperdefine i1 @shifts_eqcmp_i64_i16(i64 %x) nounwind {
1679c377c53SCraig Topper; RV32I-LABEL: shifts_eqcmp_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:    seqz a0, a0
1769c377c53SCraig Topper; RV32I-NEXT:    ret
1779c377c53SCraig Topper;
1789c377c53SCraig Topper; RV64I-LABEL: shifts_eqcmp_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:    seqz a0, a0
1849c377c53SCraig Topper; RV64I-NEXT:    ret
1859c377c53SCraig Topper;
1869c377c53SCraig Topper; RV32ZBB-LABEL: shifts_eqcmp_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:    seqz a0, a0
1949c377c53SCraig Topper; RV32ZBB-NEXT:    ret
1959c377c53SCraig Topper;
1969c377c53SCraig Topper; RV64ZBB-LABEL: shifts_eqcmp_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:    seqz 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 eq i64 %tmp1, %x
2059c377c53SCraig Topper  ret i1 %tmp2
2069c377c53SCraig Topper}
2079c377c53SCraig Topper
2089c377c53SCraig Topperdefine i1 @shifts_eqcmp_i64_i8(i64 %x) nounwind {
2099c377c53SCraig Topper; RV32I-LABEL: shifts_eqcmp_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:    seqz a0, a0
2189c377c53SCraig Topper; RV32I-NEXT:    ret
2199c377c53SCraig Topper;
2209c377c53SCraig Topper; RV64I-LABEL: shifts_eqcmp_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:    seqz a0, a0
2269c377c53SCraig Topper; RV64I-NEXT:    ret
2279c377c53SCraig Topper;
2289c377c53SCraig Topper; RV32ZBB-LABEL: shifts_eqcmp_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:    seqz a0, a0
2369c377c53SCraig Topper; RV32ZBB-NEXT:    ret
2379c377c53SCraig Topper;
2389c377c53SCraig Topper; RV64ZBB-LABEL: shifts_eqcmp_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:    seqz 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 eq i64 %tmp1, %x
2479c377c53SCraig Topper  ret i1 %tmp2
2489c377c53SCraig Topper}
2499c377c53SCraig Topper
2509c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
2519c377c53SCraig Topper; add + icmp uge
2529c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
2539c377c53SCraig Topper
2549c377c53SCraig Topperdefine i1 @add_ugecmp_i16_i8(i16 %x) nounwind {
2557d40ea85SCraig Topper; RV32I-LABEL: add_ugecmp_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:    xori a0, a0, 1
2637d40ea85SCraig Topper; RV32I-NEXT:    ret
2649c377c53SCraig Topper;
2657d40ea85SCraig Topper; RV64I-LABEL: add_ugecmp_i16_i8:
2667d40ea85SCraig Topper; RV64I:       # %bb.0:
2677d40ea85SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
2687d40ea85SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
2697d40ea85SCraig Topper; RV64I-NEXT:    addi a0, a0, -128
2707d40ea85SCraig Topper; RV64I-NEXT:    srli a0, a0, 8
2717d40ea85SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 255
2727d40ea85SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
2737d40ea85SCraig Topper; RV64I-NEXT:    ret
2747d40ea85SCraig Topper;
2757d40ea85SCraig Topper; RV32ZBB-LABEL: add_ugecmp_i16_i8:
2767d40ea85SCraig Topper; RV32ZBB:       # %bb.0:
2777d40ea85SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
2787d40ea85SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, -128
2797d40ea85SCraig Topper; RV32ZBB-NEXT:    srli a0, a0, 8
2807d40ea85SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 255
2817d40ea85SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
2827d40ea85SCraig Topper; RV32ZBB-NEXT:    ret
2837d40ea85SCraig Topper;
2847d40ea85SCraig Topper; RV64ZBB-LABEL: add_ugecmp_i16_i8:
2857d40ea85SCraig Topper; RV64ZBB:       # %bb.0:
2867d40ea85SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
2877d40ea85SCraig Topper; RV64ZBB-NEXT:    addi a0, a0, -128
2887d40ea85SCraig Topper; RV64ZBB-NEXT:    srli a0, a0, 8
2897d40ea85SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 255
2907d40ea85SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
2917d40ea85SCraig Topper; RV64ZBB-NEXT:    ret
2929c377c53SCraig Topper  %tmp0 = add i16 %x, -128 ; ~0U << (8-1)
2939c377c53SCraig Topper  %tmp1 = icmp uge i16 %tmp0, -256 ; ~0U << 8
2949c377c53SCraig Topper  ret i1 %tmp1
2959c377c53SCraig Topper}
2969c377c53SCraig Topper
2979c377c53SCraig Topperdefine i1 @add_ugecmp_i32_i16_i8(i16 %xx) nounwind {
2989c377c53SCraig Topper; RV32I-LABEL: add_ugecmp_i32_i16_i8:
2999c377c53SCraig Topper; RV32I:       # %bb.0:
3009c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
3019c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
3029c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, -128
3039c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, -256
3049c377c53SCraig Topper; RV32I-NEXT:    xori a0, a0, 1
3059c377c53SCraig Topper; RV32I-NEXT:    ret
3069c377c53SCraig Topper;
3079c377c53SCraig Topper; RV64I-LABEL: add_ugecmp_i32_i16_i8:
3089c377c53SCraig Topper; RV64I:       # %bb.0:
3099c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
3109c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
3119c377c53SCraig Topper; RV64I-NEXT:    addi a0, a0, -128
3129c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, -256
3139c377c53SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
3149c377c53SCraig Topper; RV64I-NEXT:    ret
3159c377c53SCraig Topper;
3169c377c53SCraig Topper; RV32ZBB-LABEL: add_ugecmp_i32_i16_i8:
3179c377c53SCraig Topper; RV32ZBB:       # %bb.0:
3189c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
3199c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, -128
3209c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, -256
3219c377c53SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
3229c377c53SCraig Topper; RV32ZBB-NEXT:    ret
3239c377c53SCraig Topper;
3249c377c53SCraig Topper; RV64ZBB-LABEL: add_ugecmp_i32_i16_i8:
3259c377c53SCraig Topper; RV64ZBB:       # %bb.0:
3269c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
3279c377c53SCraig Topper; RV64ZBB-NEXT:    addi a0, a0, -128
3289c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, -256
3299c377c53SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
3309c377c53SCraig Topper; RV64ZBB-NEXT:    ret
3319c377c53SCraig Topper  %x = zext i16 %xx to i32
3329c377c53SCraig Topper  %tmp0 = add i32 %x, -128 ; ~0U << (8-1)
3339c377c53SCraig Topper  %tmp1 = icmp uge i32 %tmp0, -256 ; ~0U << 8
3349c377c53SCraig Topper  ret i1 %tmp1
3359c377c53SCraig Topper}
3369c377c53SCraig Topper
3379c377c53SCraig Topperdefine i1 @add_ugecmp_i32_i16(i32 %x) nounwind {
33862e6082dSCraig Topper; RV32I-LABEL: add_ugecmp_i32_i16:
33962e6082dSCraig Topper; RV32I:       # %bb.0:
34062e6082dSCraig Topper; RV32I-NEXT:    lui a1, 1048568
34162e6082dSCraig Topper; RV32I-NEXT:    add a0, a0, a1
34262e6082dSCraig Topper; RV32I-NEXT:    lui a1, 1048560
34362e6082dSCraig Topper; RV32I-NEXT:    addi a1, a1, -1
34462e6082dSCraig Topper; RV32I-NEXT:    sltu a0, a1, a0
34562e6082dSCraig Topper; RV32I-NEXT:    ret
3469c377c53SCraig Topper;
34762e6082dSCraig Topper; RV64I-LABEL: add_ugecmp_i32_i16:
34862e6082dSCraig Topper; RV64I:       # %bb.0:
34962e6082dSCraig Topper; RV64I-NEXT:    lui a1, 1048568
35062e6082dSCraig Topper; RV64I-NEXT:    addw a0, a0, a1
35162e6082dSCraig Topper; RV64I-NEXT:    lui a1, 1048560
35262e6082dSCraig Topper; RV64I-NEXT:    addiw a1, a1, -1
35362e6082dSCraig Topper; RV64I-NEXT:    sltu a0, a1, a0
35462e6082dSCraig Topper; RV64I-NEXT:    ret
35562e6082dSCraig Topper;
35662e6082dSCraig Topper; RV32ZBB-LABEL: add_ugecmp_i32_i16:
35762e6082dSCraig Topper; RV32ZBB:       # %bb.0:
35862e6082dSCraig Topper; RV32ZBB-NEXT:    sext.h a1, a0
35962e6082dSCraig Topper; RV32ZBB-NEXT:    xor a0, a1, a0
36062e6082dSCraig Topper; RV32ZBB-NEXT:    seqz a0, a0
36162e6082dSCraig Topper; RV32ZBB-NEXT:    ret
36262e6082dSCraig Topper;
36362e6082dSCraig Topper; RV64ZBB-LABEL: add_ugecmp_i32_i16:
36462e6082dSCraig Topper; RV64ZBB:       # %bb.0:
36562e6082dSCraig Topper; RV64ZBB-NEXT:    sext.w a1, a0
36662e6082dSCraig Topper; RV64ZBB-NEXT:    sext.h a0, a0
36762e6082dSCraig Topper; RV64ZBB-NEXT:    xor a0, a0, a1
36862e6082dSCraig Topper; RV64ZBB-NEXT:    seqz a0, a0
36962e6082dSCraig Topper; RV64ZBB-NEXT:    ret
3709c377c53SCraig Topper  %tmp0 = add i32 %x, -32768 ; ~0U << (16-1)
3719c377c53SCraig Topper  %tmp1 = icmp uge i32 %tmp0, -65536 ; ~0U << 16
3729c377c53SCraig Topper  ret i1 %tmp1
3739c377c53SCraig Topper}
3749c377c53SCraig Topper
3759c377c53SCraig Topperdefine i1 @add_ugecmp_i32_i8(i32 %x) nounwind {
3769c377c53SCraig Topper; RV32-LABEL: add_ugecmp_i32_i8:
3779c377c53SCraig Topper; RV32:       # %bb.0:
3789c377c53SCraig Topper; RV32-NEXT:    addi a0, a0, -128
3799c377c53SCraig Topper; RV32-NEXT:    sltiu a0, a0, -256
3809c377c53SCraig Topper; RV32-NEXT:    xori a0, a0, 1
3819c377c53SCraig Topper; RV32-NEXT:    ret
3829c377c53SCraig Topper;
3839c377c53SCraig Topper; RV64-LABEL: add_ugecmp_i32_i8:
3849c377c53SCraig Topper; RV64:       # %bb.0:
3859c377c53SCraig Topper; RV64-NEXT:    addiw a0, a0, -128
3869c377c53SCraig Topper; RV64-NEXT:    sltiu a0, a0, -256
3879c377c53SCraig Topper; RV64-NEXT:    xori a0, a0, 1
3889c377c53SCraig Topper; RV64-NEXT:    ret
3899c377c53SCraig Topper  %tmp0 = add i32 %x, -128 ; ~0U << (8-1)
3909c377c53SCraig Topper  %tmp1 = icmp uge i32 %tmp0, -256 ; ~0U << 8
3919c377c53SCraig Topper  ret i1 %tmp1
3929c377c53SCraig Topper}
3939c377c53SCraig Topper
3949c377c53SCraig Topperdefine i1 @add_ugecmp_i64_i32(i64 %x) nounwind {
3959c377c53SCraig Topper; RV32-LABEL: add_ugecmp_i64_i32:
3969c377c53SCraig Topper; RV32:       # %bb.0:
39762e6082dSCraig Topper; RV32-NEXT:    srai a0, a0, 31
39862e6082dSCraig Topper; RV32-NEXT:    xor a0, a0, a1
3999c377c53SCraig Topper; RV32-NEXT:    seqz a0, a0
4009c377c53SCraig Topper; RV32-NEXT:    ret
4019c377c53SCraig Topper;
40262e6082dSCraig Topper; RV64-LABEL: add_ugecmp_i64_i32:
40362e6082dSCraig Topper; RV64:       # %bb.0:
40462e6082dSCraig Topper; RV64-NEXT:    sext.w a1, a0
40562e6082dSCraig Topper; RV64-NEXT:    xor a0, a1, a0
40662e6082dSCraig Topper; RV64-NEXT:    seqz a0, a0
40762e6082dSCraig Topper; RV64-NEXT:    ret
4089c377c53SCraig Topper  %tmp0 = add i64 %x, -2147483648 ; ~0U << (32-1)
4099c377c53SCraig Topper  %tmp1 = icmp uge i64 %tmp0, -4294967296 ; ~0U << 32
4109c377c53SCraig Topper  ret i1 %tmp1
4119c377c53SCraig Topper}
4129c377c53SCraig Topper
4139c377c53SCraig Topperdefine i1 @add_ugecmp_i64_i16(i64 %x) nounwind {
41462e6082dSCraig Topper; RV32I-LABEL: add_ugecmp_i64_i16:
41562e6082dSCraig Topper; RV32I:       # %bb.0:
41662e6082dSCraig Topper; RV32I-NEXT:    lui a2, 1048568
41762e6082dSCraig Topper; RV32I-NEXT:    add a2, a0, a2
41862e6082dSCraig Topper; RV32I-NEXT:    sltu a0, a2, a0
41962e6082dSCraig Topper; RV32I-NEXT:    add a0, a1, a0
42062e6082dSCraig Topper; RV32I-NEXT:    lui a1, 1048560
42162e6082dSCraig Topper; RV32I-NEXT:    addi a1, a1, -1
42262e6082dSCraig Topper; RV32I-NEXT:    sltu a1, a1, a2
423a456885eSCraig Topper; RV32I-NEXT:    seqz a0, a0
42462e6082dSCraig Topper; RV32I-NEXT:    and a0, a0, a1
42562e6082dSCraig Topper; RV32I-NEXT:    ret
4269c377c53SCraig Topper;
42762e6082dSCraig Topper; RV64I-LABEL: add_ugecmp_i64_i16:
42862e6082dSCraig Topper; RV64I:       # %bb.0:
42962e6082dSCraig Topper; RV64I-NEXT:    lui a1, 1048568
43062e6082dSCraig Topper; RV64I-NEXT:    add a0, a0, a1
43162e6082dSCraig Topper; RV64I-NEXT:    lui a1, 1048560
43262e6082dSCraig Topper; RV64I-NEXT:    addiw a1, a1, -1
43362e6082dSCraig Topper; RV64I-NEXT:    sltu a0, a1, a0
43462e6082dSCraig Topper; RV64I-NEXT:    ret
43562e6082dSCraig Topper;
43662e6082dSCraig Topper; RV32ZBB-LABEL: add_ugecmp_i64_i16:
43762e6082dSCraig Topper; RV32ZBB:       # %bb.0:
43862e6082dSCraig Topper; RV32ZBB-NEXT:    sext.h a2, a0
43962e6082dSCraig Topper; RV32ZBB-NEXT:    xor a0, a2, a0
44062e6082dSCraig Topper; RV32ZBB-NEXT:    srai a2, a2, 31
44162e6082dSCraig Topper; RV32ZBB-NEXT:    xor a1, a2, a1
44262e6082dSCraig Topper; RV32ZBB-NEXT:    or a0, a0, a1
44362e6082dSCraig Topper; RV32ZBB-NEXT:    seqz a0, a0
44462e6082dSCraig Topper; RV32ZBB-NEXT:    ret
44562e6082dSCraig Topper;
44662e6082dSCraig Topper; RV64ZBB-LABEL: add_ugecmp_i64_i16:
44762e6082dSCraig Topper; RV64ZBB:       # %bb.0:
44862e6082dSCraig Topper; RV64ZBB-NEXT:    sext.h a1, a0
44962e6082dSCraig Topper; RV64ZBB-NEXT:    xor a0, a1, a0
45062e6082dSCraig Topper; RV64ZBB-NEXT:    seqz a0, a0
45162e6082dSCraig Topper; RV64ZBB-NEXT:    ret
4529c377c53SCraig Topper  %tmp0 = add i64 %x, -32768 ; ~0U << (16-1)
4539c377c53SCraig Topper  %tmp1 = icmp uge i64 %tmp0, -65536 ; ~0U << 16
4549c377c53SCraig Topper  ret i1 %tmp1
4559c377c53SCraig Topper}
4569c377c53SCraig Topper
4579c377c53SCraig Topperdefine i1 @add_ugecmp_i64_i8(i64 %x) nounwind {
458e5532fb4SYingwei Zheng; RV32I-LABEL: add_ugecmp_i64_i8:
459e5532fb4SYingwei Zheng; RV32I:       # %bb.0:
460e5532fb4SYingwei Zheng; RV32I-NEXT:    addi a2, a0, -128
461e5532fb4SYingwei Zheng; RV32I-NEXT:    sltu a0, a2, a0
462*9122c523SPengcheng Wang; RV32I-NEXT:    sltiu a2, a2, -256
463e5532fb4SYingwei Zheng; RV32I-NEXT:    add a0, a1, a0
464a456885eSCraig Topper; RV32I-NEXT:    seqz a0, a0
465*9122c523SPengcheng Wang; RV32I-NEXT:    xori a1, a2, 1
466e5532fb4SYingwei Zheng; RV32I-NEXT:    and a0, a0, a1
467e5532fb4SYingwei Zheng; RV32I-NEXT:    ret
4689c377c53SCraig Topper;
4699c377c53SCraig Topper; RV64-LABEL: add_ugecmp_i64_i8:
4709c377c53SCraig Topper; RV64:       # %bb.0:
4719c377c53SCraig Topper; RV64-NEXT:    addi a0, a0, -128
4729c377c53SCraig Topper; RV64-NEXT:    sltiu a0, a0, -256
4739c377c53SCraig Topper; RV64-NEXT:    xori a0, a0, 1
4749c377c53SCraig Topper; RV64-NEXT:    ret
475e5532fb4SYingwei Zheng;
476e5532fb4SYingwei Zheng; RV32ZBB-LABEL: add_ugecmp_i64_i8:
477e5532fb4SYingwei Zheng; RV32ZBB:       # %bb.0:
478e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    sext.b a2, a0
479e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    xor a0, a2, a0
480e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    srai a2, a2, 31
481e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    xor a1, a2, a1
482e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    or a0, a0, a1
483e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    seqz a0, a0
484e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    ret
4859c377c53SCraig Topper  %tmp0 = add i64 %x, -128 ; ~0U << (8-1)
4869c377c53SCraig Topper  %tmp1 = icmp uge i64 %tmp0, -256 ; ~0U << 8
4879c377c53SCraig Topper  ret i1 %tmp1
4889c377c53SCraig Topper}
4899c377c53SCraig Topper
4909c377c53SCraig Topper; Slightly more canonical variant
4919c377c53SCraig Topperdefine i1 @add_ugtcmp_i16_i8(i16 %x) nounwind {
4927d40ea85SCraig Topper; RV32I-LABEL: add_ugtcmp_i16_i8:
4937d40ea85SCraig Topper; RV32I:       # %bb.0:
4947d40ea85SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
4957d40ea85SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
4967d40ea85SCraig Topper; RV32I-NEXT:    addi a0, a0, -128
4977d40ea85SCraig Topper; RV32I-NEXT:    srli a0, a0, 8
4987d40ea85SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 255
4997d40ea85SCraig Topper; RV32I-NEXT:    xori a0, a0, 1
5007d40ea85SCraig Topper; RV32I-NEXT:    ret
5019c377c53SCraig Topper;
5027d40ea85SCraig Topper; RV64I-LABEL: add_ugtcmp_i16_i8:
5037d40ea85SCraig Topper; RV64I:       # %bb.0:
5047d40ea85SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
5057d40ea85SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
5067d40ea85SCraig Topper; RV64I-NEXT:    addi a0, a0, -128
5077d40ea85SCraig Topper; RV64I-NEXT:    srli a0, a0, 8
5087d40ea85SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 255
5097d40ea85SCraig Topper; RV64I-NEXT:    xori a0, a0, 1
5107d40ea85SCraig Topper; RV64I-NEXT:    ret
5117d40ea85SCraig Topper;
5127d40ea85SCraig Topper; RV32ZBB-LABEL: add_ugtcmp_i16_i8:
5137d40ea85SCraig Topper; RV32ZBB:       # %bb.0:
5147d40ea85SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
5157d40ea85SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, -128
5167d40ea85SCraig Topper; RV32ZBB-NEXT:    srli a0, a0, 8
5177d40ea85SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 255
5187d40ea85SCraig Topper; RV32ZBB-NEXT:    xori a0, a0, 1
5197d40ea85SCraig Topper; RV32ZBB-NEXT:    ret
5207d40ea85SCraig Topper;
5217d40ea85SCraig Topper; RV64ZBB-LABEL: add_ugtcmp_i16_i8:
5227d40ea85SCraig Topper; RV64ZBB:       # %bb.0:
5237d40ea85SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
5247d40ea85SCraig Topper; RV64ZBB-NEXT:    addi a0, a0, -128
5257d40ea85SCraig Topper; RV64ZBB-NEXT:    srli a0, a0, 8
5267d40ea85SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 255
5277d40ea85SCraig Topper; RV64ZBB-NEXT:    xori a0, a0, 1
5287d40ea85SCraig Topper; RV64ZBB-NEXT:    ret
5299c377c53SCraig Topper  %tmp0 = add i16 %x, -128 ; ~0U << (8-1)
5309c377c53SCraig Topper  %tmp1 = icmp ugt i16 %tmp0, -257 ; ~0U << 8 - 1
5319c377c53SCraig Topper  ret i1 %tmp1
5329c377c53SCraig Topper}
5339c377c53SCraig Topper
5349c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
5359c377c53SCraig Topper; add + icmp ult
5369c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
5379c377c53SCraig Topper
5389c377c53SCraig Topperdefine i1 @add_ultcmp_i16_i8(i16 %x) nounwind {
5399c377c53SCraig Topper; RV32I-LABEL: add_ultcmp_i16_i8:
5409c377c53SCraig Topper; RV32I:       # %bb.0:
5419c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 128
5429c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
5439c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
5449c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 256
5459c377c53SCraig Topper; RV32I-NEXT:    ret
5469c377c53SCraig Topper;
5479c377c53SCraig Topper; RV64I-LABEL: add_ultcmp_i16_i8:
5489c377c53SCraig Topper; RV64I:       # %bb.0:
54986240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 128
5509c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
5519c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
5529c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 256
5539c377c53SCraig Topper; RV64I-NEXT:    ret
5549c377c53SCraig Topper;
5559c377c53SCraig Topper; RV32ZBB-LABEL: add_ultcmp_i16_i8:
5569c377c53SCraig Topper; RV32ZBB:       # %bb.0:
5579c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 128
5589c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
5599c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 256
5609c377c53SCraig Topper; RV32ZBB-NEXT:    ret
5619c377c53SCraig Topper;
5629c377c53SCraig Topper; RV64ZBB-LABEL: add_ultcmp_i16_i8:
5639c377c53SCraig Topper; RV64ZBB:       # %bb.0:
56486240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 128
5659c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
5669c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 256
5679c377c53SCraig Topper; RV64ZBB-NEXT:    ret
5689c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
5699c377c53SCraig Topper  %tmp1 = icmp ult i16 %tmp0, 256 ; 1U << 8
5709c377c53SCraig Topper  ret i1 %tmp1
5719c377c53SCraig Topper}
5729c377c53SCraig Topper
5739c377c53SCraig Topperdefine i1 @add_ultcmp_i32_i16(i32 %x) nounwind {
57462e6082dSCraig Topper; RV32I-LABEL: add_ultcmp_i32_i16:
57562e6082dSCraig Topper; RV32I:       # %bb.0:
57662e6082dSCraig Topper; RV32I-NEXT:    lui a1, 8
57762e6082dSCraig Topper; RV32I-NEXT:    add a0, a0, a1
57862e6082dSCraig Topper; RV32I-NEXT:    srli a0, a0, 16
57962e6082dSCraig Topper; RV32I-NEXT:    seqz a0, a0
58062e6082dSCraig Topper; RV32I-NEXT:    ret
5819c377c53SCraig Topper;
58262e6082dSCraig Topper; RV64I-LABEL: add_ultcmp_i32_i16:
58362e6082dSCraig Topper; RV64I:       # %bb.0:
58462e6082dSCraig Topper; RV64I-NEXT:    lui a1, 8
58562e6082dSCraig Topper; RV64I-NEXT:    add a0, a0, a1
58662e6082dSCraig Topper; RV64I-NEXT:    srliw a0, a0, 16
58762e6082dSCraig Topper; RV64I-NEXT:    seqz a0, a0
58862e6082dSCraig Topper; RV64I-NEXT:    ret
58962e6082dSCraig Topper;
59062e6082dSCraig Topper; RV32ZBB-LABEL: add_ultcmp_i32_i16:
59162e6082dSCraig Topper; RV32ZBB:       # %bb.0:
59262e6082dSCraig Topper; RV32ZBB-NEXT:    sext.h a1, a0
59362e6082dSCraig Topper; RV32ZBB-NEXT:    xor a0, a1, a0
59462e6082dSCraig Topper; RV32ZBB-NEXT:    seqz a0, a0
59562e6082dSCraig Topper; RV32ZBB-NEXT:    ret
59662e6082dSCraig Topper;
59762e6082dSCraig Topper; RV64ZBB-LABEL: add_ultcmp_i32_i16:
59862e6082dSCraig Topper; RV64ZBB:       # %bb.0:
59962e6082dSCraig Topper; RV64ZBB-NEXT:    sext.w a1, a0
60062e6082dSCraig Topper; RV64ZBB-NEXT:    sext.h a0, a0
60162e6082dSCraig Topper; RV64ZBB-NEXT:    xor a0, a0, a1
60262e6082dSCraig Topper; RV64ZBB-NEXT:    seqz a0, a0
60362e6082dSCraig Topper; RV64ZBB-NEXT:    ret
6049c377c53SCraig Topper  %tmp0 = add i32 %x, 32768 ; 1U << (16-1)
6059c377c53SCraig Topper  %tmp1 = icmp ult i32 %tmp0, 65536 ; 1U << 16
6069c377c53SCraig Topper  ret i1 %tmp1
6079c377c53SCraig Topper}
6089c377c53SCraig Topper
6099c377c53SCraig Topperdefine i1 @add_ultcmp_i32_i8(i32 %x) nounwind {
6109c377c53SCraig Topper; RV32-LABEL: add_ultcmp_i32_i8:
6119c377c53SCraig Topper; RV32:       # %bb.0:
6129c377c53SCraig Topper; RV32-NEXT:    addi a0, a0, 128
6139c377c53SCraig Topper; RV32-NEXT:    sltiu a0, a0, 256
6149c377c53SCraig Topper; RV32-NEXT:    ret
6159c377c53SCraig Topper;
6169c377c53SCraig Topper; RV64-LABEL: add_ultcmp_i32_i8:
6179c377c53SCraig Topper; RV64:       # %bb.0:
6189c377c53SCraig Topper; RV64-NEXT:    addiw a0, a0, 128
6199c377c53SCraig Topper; RV64-NEXT:    sltiu a0, a0, 256
6209c377c53SCraig Topper; RV64-NEXT:    ret
6219c377c53SCraig Topper  %tmp0 = add i32 %x, 128 ; 1U << (8-1)
6229c377c53SCraig Topper  %tmp1 = icmp ult i32 %tmp0, 256 ; 1U << 8
6239c377c53SCraig Topper  ret i1 %tmp1
6249c377c53SCraig Topper}
6259c377c53SCraig Topper
6269c377c53SCraig Topperdefine i1 @add_ultcmp_i64_i32(i64 %x) nounwind {
6279c377c53SCraig Topper; RV32-LABEL: add_ultcmp_i64_i32:
6289c377c53SCraig Topper; RV32:       # %bb.0:
62962e6082dSCraig Topper; RV32-NEXT:    srai a0, a0, 31
63062e6082dSCraig Topper; RV32-NEXT:    xor a0, a0, a1
6319c377c53SCraig Topper; RV32-NEXT:    seqz a0, a0
6329c377c53SCraig Topper; RV32-NEXT:    ret
6339c377c53SCraig Topper;
6349c377c53SCraig Topper; RV64-LABEL: add_ultcmp_i64_i32:
6359c377c53SCraig Topper; RV64:       # %bb.0:
63662e6082dSCraig Topper; RV64-NEXT:    sext.w a1, a0
63762e6082dSCraig Topper; RV64-NEXT:    xor a0, a1, a0
6389c377c53SCraig Topper; RV64-NEXT:    seqz a0, a0
6399c377c53SCraig Topper; RV64-NEXT:    ret
6409c377c53SCraig Topper  %tmp0 = add i64 %x, 2147483648 ; 1U << (32-1)
6419c377c53SCraig Topper  %tmp1 = icmp ult i64 %tmp0, 4294967296 ; 1U << 32
6429c377c53SCraig Topper  ret i1 %tmp1
6439c377c53SCraig Topper}
6449c377c53SCraig Topper
6459c377c53SCraig Topperdefine i1 @add_ultcmp_i64_i16(i64 %x) nounwind {
64662e6082dSCraig Topper; RV32I-LABEL: add_ultcmp_i64_i16:
64762e6082dSCraig Topper; RV32I:       # %bb.0:
64862e6082dSCraig Topper; RV32I-NEXT:    lui a2, 8
64962e6082dSCraig Topper; RV32I-NEXT:    add a2, a0, a2
65062e6082dSCraig Topper; RV32I-NEXT:    sltu a0, a2, a0
65162e6082dSCraig Topper; RV32I-NEXT:    add a0, a1, a0
65262e6082dSCraig Topper; RV32I-NEXT:    srli a2, a2, 16
65362e6082dSCraig Topper; RV32I-NEXT:    or a0, a0, a2
65462e6082dSCraig Topper; RV32I-NEXT:    seqz a0, a0
65562e6082dSCraig Topper; RV32I-NEXT:    ret
6569c377c53SCraig Topper;
65762e6082dSCraig Topper; RV64I-LABEL: add_ultcmp_i64_i16:
65862e6082dSCraig Topper; RV64I:       # %bb.0:
65962e6082dSCraig Topper; RV64I-NEXT:    lui a1, 8
66062e6082dSCraig Topper; RV64I-NEXT:    add a0, a0, a1
66162e6082dSCraig Topper; RV64I-NEXT:    srli a0, a0, 16
66262e6082dSCraig Topper; RV64I-NEXT:    seqz a0, a0
66362e6082dSCraig Topper; RV64I-NEXT:    ret
66462e6082dSCraig Topper;
66562e6082dSCraig Topper; RV32ZBB-LABEL: add_ultcmp_i64_i16:
66662e6082dSCraig Topper; RV32ZBB:       # %bb.0:
66762e6082dSCraig Topper; RV32ZBB-NEXT:    sext.h a2, a0
66862e6082dSCraig Topper; RV32ZBB-NEXT:    xor a0, a2, a0
66962e6082dSCraig Topper; RV32ZBB-NEXT:    srai a2, a2, 31
67062e6082dSCraig Topper; RV32ZBB-NEXT:    xor a1, a2, a1
67162e6082dSCraig Topper; RV32ZBB-NEXT:    or a0, a0, a1
67262e6082dSCraig Topper; RV32ZBB-NEXT:    seqz a0, a0
67362e6082dSCraig Topper; RV32ZBB-NEXT:    ret
67462e6082dSCraig Topper;
67562e6082dSCraig Topper; RV64ZBB-LABEL: add_ultcmp_i64_i16:
67662e6082dSCraig Topper; RV64ZBB:       # %bb.0:
67762e6082dSCraig Topper; RV64ZBB-NEXT:    sext.h a1, a0
67862e6082dSCraig Topper; RV64ZBB-NEXT:    xor a0, a1, a0
67962e6082dSCraig Topper; RV64ZBB-NEXT:    seqz a0, a0
68062e6082dSCraig Topper; RV64ZBB-NEXT:    ret
6819c377c53SCraig Topper  %tmp0 = add i64 %x, 32768 ; 1U << (16-1)
6829c377c53SCraig Topper  %tmp1 = icmp ult i64 %tmp0, 65536 ; 1U << 16
6839c377c53SCraig Topper  ret i1 %tmp1
6849c377c53SCraig Topper}
6859c377c53SCraig Topper
6869c377c53SCraig Topperdefine i1 @add_ultcmp_i64_i8(i64 %x) nounwind {
687e5532fb4SYingwei Zheng; RV32I-LABEL: add_ultcmp_i64_i8:
688e5532fb4SYingwei Zheng; RV32I:       # %bb.0:
689e5532fb4SYingwei Zheng; RV32I-NEXT:    addi a2, a0, 128
690e5532fb4SYingwei Zheng; RV32I-NEXT:    sltu a0, a2, a0
691e5532fb4SYingwei Zheng; RV32I-NEXT:    add a0, a1, a0
692a456885eSCraig Topper; RV32I-NEXT:    seqz a0, a0
693e5532fb4SYingwei Zheng; RV32I-NEXT:    sltiu a1, a2, 256
694e5532fb4SYingwei Zheng; RV32I-NEXT:    and a0, a0, a1
695e5532fb4SYingwei Zheng; RV32I-NEXT:    ret
6969c377c53SCraig Topper;
6979c377c53SCraig Topper; RV64-LABEL: add_ultcmp_i64_i8:
6989c377c53SCraig Topper; RV64:       # %bb.0:
6999c377c53SCraig Topper; RV64-NEXT:    addi a0, a0, 128
7009c377c53SCraig Topper; RV64-NEXT:    sltiu a0, a0, 256
7019c377c53SCraig Topper; RV64-NEXT:    ret
702e5532fb4SYingwei Zheng;
703e5532fb4SYingwei Zheng; RV32ZBB-LABEL: add_ultcmp_i64_i8:
704e5532fb4SYingwei Zheng; RV32ZBB:       # %bb.0:
705e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    sext.b a2, a0
706e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    xor a0, a2, a0
707e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    srai a2, a2, 31
708e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    xor a1, a2, a1
709e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    or a0, a0, a1
710e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    seqz a0, a0
711e5532fb4SYingwei Zheng; RV32ZBB-NEXT:    ret
7129c377c53SCraig Topper  %tmp0 = add i64 %x, 128 ; 1U << (8-1)
7139c377c53SCraig Topper  %tmp1 = icmp ult i64 %tmp0, 256 ; 1U << 8
7149c377c53SCraig Topper  ret i1 %tmp1
7159c377c53SCraig Topper}
7169c377c53SCraig Topper
7179c377c53SCraig Topper; Slightly more canonical variant
7189c377c53SCraig Topperdefine i1 @add_ulecmp_i16_i8(i16 %x) nounwind {
7199c377c53SCraig Topper; RV32I-LABEL: add_ulecmp_i16_i8:
7209c377c53SCraig Topper; RV32I:       # %bb.0:
7219c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 128
7229c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
7239c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
7249c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 256
7259c377c53SCraig Topper; RV32I-NEXT:    ret
7269c377c53SCraig Topper;
7279c377c53SCraig Topper; RV64I-LABEL: add_ulecmp_i16_i8:
7289c377c53SCraig Topper; RV64I:       # %bb.0:
72986240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 128
7309c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
7319c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
7329c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 256
7339c377c53SCraig Topper; RV64I-NEXT:    ret
7349c377c53SCraig Topper;
7359c377c53SCraig Topper; RV32ZBB-LABEL: add_ulecmp_i16_i8:
7369c377c53SCraig Topper; RV32ZBB:       # %bb.0:
7379c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 128
7389c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
7399c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 256
7409c377c53SCraig Topper; RV32ZBB-NEXT:    ret
7419c377c53SCraig Topper;
7429c377c53SCraig Topper; RV64ZBB-LABEL: add_ulecmp_i16_i8:
7439c377c53SCraig Topper; RV64ZBB:       # %bb.0:
74486240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 128
7459c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
7469c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 256
7479c377c53SCraig Topper; RV64ZBB-NEXT:    ret
7489c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
7499c377c53SCraig Topper  %tmp1 = icmp ule i16 %tmp0, 255 ; (1U << 8) - 1
7509c377c53SCraig Topper  ret i1 %tmp1
7519c377c53SCraig Topper}
7529c377c53SCraig Topper
7539c377c53SCraig Topper; Negative tests
7549c377c53SCraig Topper; ---------------------------------------------------------------------------- ;
7559c377c53SCraig Topper
7569c377c53SCraig Topper; Adding not a constant
7579c377c53SCraig Topperdefine i1 @add_ultcmp_bad_i16_i8_add(i16 %x, i16 %y) nounwind {
7589c377c53SCraig Topper; RV32I-LABEL: add_ultcmp_bad_i16_i8_add:
7599c377c53SCraig Topper; RV32I:       # %bb.0:
7609c377c53SCraig Topper; RV32I-NEXT:    add a0, a0, a1
7619c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
7629c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
7639c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 256
7649c377c53SCraig Topper; RV32I-NEXT:    ret
7659c377c53SCraig Topper;
7669c377c53SCraig Topper; RV64I-LABEL: add_ultcmp_bad_i16_i8_add:
7679c377c53SCraig Topper; RV64I:       # %bb.0:
7689c377c53SCraig Topper; RV64I-NEXT:    add a0, a0, a1
7699c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
7709c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
7719c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 256
7729c377c53SCraig Topper; RV64I-NEXT:    ret
7739c377c53SCraig Topper;
7749c377c53SCraig Topper; RV32ZBB-LABEL: add_ultcmp_bad_i16_i8_add:
7759c377c53SCraig Topper; RV32ZBB:       # %bb.0:
7769c377c53SCraig Topper; RV32ZBB-NEXT:    add a0, a0, a1
7779c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
7789c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 256
7799c377c53SCraig Topper; RV32ZBB-NEXT:    ret
7809c377c53SCraig Topper;
7819c377c53SCraig Topper; RV64ZBB-LABEL: add_ultcmp_bad_i16_i8_add:
7829c377c53SCraig Topper; RV64ZBB:       # %bb.0:
7839c377c53SCraig Topper; RV64ZBB-NEXT:    add a0, a0, a1
7849c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
7859c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 256
7869c377c53SCraig Topper; RV64ZBB-NEXT:    ret
7879c377c53SCraig Topper  %tmp0 = add i16 %x, %y
7889c377c53SCraig Topper  %tmp1 = icmp ult i16 %tmp0, 256 ; 1U << 8
7899c377c53SCraig Topper  ret i1 %tmp1
7909c377c53SCraig Topper}
7919c377c53SCraig Topper
7929c377c53SCraig Topper; Comparing not with a constant
7939c377c53SCraig Topperdefine i1 @add_ultcmp_bad_i16_i8_cmp(i16 %x, i16 %y) nounwind {
7949c377c53SCraig Topper; RV32I-LABEL: add_ultcmp_bad_i16_i8_cmp:
7959c377c53SCraig Topper; RV32I:       # %bb.0:
7969c377c53SCraig Topper; RV32I-NEXT:    lui a2, 16
797*9122c523SPengcheng Wang; RV32I-NEXT:    addi a0, a0, 128
7989c377c53SCraig Topper; RV32I-NEXT:    addi a2, a2, -1
7999c377c53SCraig Topper; RV32I-NEXT:    and a1, a1, a2
8009c377c53SCraig Topper; RV32I-NEXT:    and a0, a0, a2
8019c377c53SCraig Topper; RV32I-NEXT:    sltu a0, a0, a1
8029c377c53SCraig Topper; RV32I-NEXT:    ret
8039c377c53SCraig Topper;
8049c377c53SCraig Topper; RV64I-LABEL: add_ultcmp_bad_i16_i8_cmp:
8059c377c53SCraig Topper; RV64I:       # %bb.0:
8069c377c53SCraig Topper; RV64I-NEXT:    lui a2, 16
807*9122c523SPengcheng Wang; RV64I-NEXT:    addi a0, a0, 128
8089c377c53SCraig Topper; RV64I-NEXT:    addiw a2, a2, -1
8099c377c53SCraig Topper; RV64I-NEXT:    and a1, a1, a2
8109c377c53SCraig Topper; RV64I-NEXT:    and a0, a0, a2
8119c377c53SCraig Topper; RV64I-NEXT:    sltu a0, a0, a1
8129c377c53SCraig Topper; RV64I-NEXT:    ret
8139c377c53SCraig Topper;
8149c377c53SCraig Topper; RV32ZBB-LABEL: add_ultcmp_bad_i16_i8_cmp:
8159c377c53SCraig Topper; RV32ZBB:       # %bb.0:
8169c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a1, a1
8179c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 128
8189c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
8199c377c53SCraig Topper; RV32ZBB-NEXT:    sltu a0, a0, a1
8209c377c53SCraig Topper; RV32ZBB-NEXT:    ret
8219c377c53SCraig Topper;
8229c377c53SCraig Topper; RV64ZBB-LABEL: add_ultcmp_bad_i16_i8_cmp:
8239c377c53SCraig Topper; RV64ZBB:       # %bb.0:
8249c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a1, a1
82586240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 128
8269c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
8279c377c53SCraig Topper; RV64ZBB-NEXT:    sltu a0, a0, a1
8289c377c53SCraig Topper; RV64ZBB-NEXT:    ret
8299c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
8309c377c53SCraig Topper  %tmp1 = icmp ult i16 %tmp0, %y
8319c377c53SCraig Topper  ret i1 %tmp1
8329c377c53SCraig Topper}
8339c377c53SCraig Topper
8349c377c53SCraig Topper; Second constant is not larger than the first one
8359c377c53SCraig Topperdefine i1 @add_ultcmp_bad_i8_i16(i16 %x) nounwind {
8369c377c53SCraig Topper; RV32I-LABEL: add_ultcmp_bad_i8_i16:
8379c377c53SCraig Topper; RV32I:       # %bb.0:
8389c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 128
8399c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
8409c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
8419c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 128
8429c377c53SCraig Topper; RV32I-NEXT:    ret
8439c377c53SCraig Topper;
8449c377c53SCraig Topper; RV64I-LABEL: add_ultcmp_bad_i8_i16:
8459c377c53SCraig Topper; RV64I:       # %bb.0:
84686240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 128
8479c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
8489c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
8499c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 128
8509c377c53SCraig Topper; RV64I-NEXT:    ret
8519c377c53SCraig Topper;
8529c377c53SCraig Topper; RV32ZBB-LABEL: add_ultcmp_bad_i8_i16:
8539c377c53SCraig Topper; RV32ZBB:       # %bb.0:
8549c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 128
8559c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
8569c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 128
8579c377c53SCraig Topper; RV32ZBB-NEXT:    ret
8589c377c53SCraig Topper;
8599c377c53SCraig Topper; RV64ZBB-LABEL: add_ultcmp_bad_i8_i16:
8609c377c53SCraig Topper; RV64ZBB:       # %bb.0:
86186240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 128
8629c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
8639c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 128
8649c377c53SCraig Topper; RV64ZBB-NEXT:    ret
8659c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
8669c377c53SCraig Topper  %tmp1 = icmp ult i16 %tmp0, 128 ; 1U << (8-1)
8679c377c53SCraig Topper  ret i1 %tmp1
8689c377c53SCraig Topper}
8699c377c53SCraig Topper
8709c377c53SCraig Topper; First constant is not power of two
8719c377c53SCraig Topperdefine i1 @add_ultcmp_bad_i16_i8_c0notpoweroftwo(i16 %x) nounwind {
8729c377c53SCraig Topper; RV32I-LABEL: add_ultcmp_bad_i16_i8_c0notpoweroftwo:
8739c377c53SCraig Topper; RV32I:       # %bb.0:
8749c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 192
8759c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
8769c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
8779c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 256
8789c377c53SCraig Topper; RV32I-NEXT:    ret
8799c377c53SCraig Topper;
8809c377c53SCraig Topper; RV64I-LABEL: add_ultcmp_bad_i16_i8_c0notpoweroftwo:
8819c377c53SCraig Topper; RV64I:       # %bb.0:
88286240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 192
8839c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
8849c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
8859c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 256
8869c377c53SCraig Topper; RV64I-NEXT:    ret
8879c377c53SCraig Topper;
8889c377c53SCraig Topper; RV32ZBB-LABEL: add_ultcmp_bad_i16_i8_c0notpoweroftwo:
8899c377c53SCraig Topper; RV32ZBB:       # %bb.0:
8909c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 192
8919c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
8929c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 256
8939c377c53SCraig Topper; RV32ZBB-NEXT:    ret
8949c377c53SCraig Topper;
8959c377c53SCraig Topper; RV64ZBB-LABEL: add_ultcmp_bad_i16_i8_c0notpoweroftwo:
8969c377c53SCraig Topper; RV64ZBB:       # %bb.0:
89786240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 192
8989c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
8999c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 256
9009c377c53SCraig Topper; RV64ZBB-NEXT:    ret
9019c377c53SCraig Topper  %tmp0 = add i16 %x, 192 ; (1U << (8-1)) + (1U << (8-1-1))
9029c377c53SCraig Topper  %tmp1 = icmp ult i16 %tmp0, 256 ; 1U << 8
9039c377c53SCraig Topper  ret i1 %tmp1
9049c377c53SCraig Topper}
9059c377c53SCraig Topper
9069c377c53SCraig Topper; Second constant is not power of two
9079c377c53SCraig Topperdefine i1 @add_ultcmp_bad_i16_i8_c1notpoweroftwo(i16 %x) nounwind {
9089c377c53SCraig Topper; RV32I-LABEL: add_ultcmp_bad_i16_i8_c1notpoweroftwo:
9099c377c53SCraig Topper; RV32I:       # %bb.0:
9109c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 128
9119c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
9129c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
9139c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 768
9149c377c53SCraig Topper; RV32I-NEXT:    ret
9159c377c53SCraig Topper;
9169c377c53SCraig Topper; RV64I-LABEL: add_ultcmp_bad_i16_i8_c1notpoweroftwo:
9179c377c53SCraig Topper; RV64I:       # %bb.0:
91886240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 128
9199c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
9209c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
9219c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 768
9229c377c53SCraig Topper; RV64I-NEXT:    ret
9239c377c53SCraig Topper;
9249c377c53SCraig Topper; RV32ZBB-LABEL: add_ultcmp_bad_i16_i8_c1notpoweroftwo:
9259c377c53SCraig Topper; RV32ZBB:       # %bb.0:
9269c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 128
9279c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
9289c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 768
9299c377c53SCraig Topper; RV32ZBB-NEXT:    ret
9309c377c53SCraig Topper;
9319c377c53SCraig Topper; RV64ZBB-LABEL: add_ultcmp_bad_i16_i8_c1notpoweroftwo:
9329c377c53SCraig Topper; RV64ZBB:       # %bb.0:
93386240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 128
9349c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
9359c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 768
9369c377c53SCraig Topper; RV64ZBB-NEXT:    ret
9379c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
9389c377c53SCraig Topper  %tmp1 = icmp ult i16 %tmp0, 768 ; (1U << 8)) + (1U << (8+1))
9399c377c53SCraig Topper  ret i1 %tmp1
9409c377c53SCraig Topper}
9419c377c53SCraig Topper
9429c377c53SCraig Topper; Magic check fails, 64 << 1 != 256
9439c377c53SCraig Topperdefine i1 @add_ultcmp_bad_i16_i8_magic(i16 %x) nounwind {
9449c377c53SCraig Topper; RV32I-LABEL: add_ultcmp_bad_i16_i8_magic:
9459c377c53SCraig Topper; RV32I:       # %bb.0:
9469c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 64
9479c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
9489c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
9499c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 256
9509c377c53SCraig Topper; RV32I-NEXT:    ret
9519c377c53SCraig Topper;
9529c377c53SCraig Topper; RV64I-LABEL: add_ultcmp_bad_i16_i8_magic:
9539c377c53SCraig Topper; RV64I:       # %bb.0:
95486240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 64
9559c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
9569c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
9579c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 256
9589c377c53SCraig Topper; RV64I-NEXT:    ret
9599c377c53SCraig Topper;
9609c377c53SCraig Topper; RV32ZBB-LABEL: add_ultcmp_bad_i16_i8_magic:
9619c377c53SCraig Topper; RV32ZBB:       # %bb.0:
9629c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 64
9639c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
9649c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 256
9659c377c53SCraig Topper; RV32ZBB-NEXT:    ret
9669c377c53SCraig Topper;
9679c377c53SCraig Topper; RV64ZBB-LABEL: add_ultcmp_bad_i16_i8_magic:
9689c377c53SCraig Topper; RV64ZBB:       # %bb.0:
96986240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 64
9709c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
9719c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 256
9729c377c53SCraig Topper; RV64ZBB-NEXT:    ret
9739c377c53SCraig Topper  %tmp0 = add i16 %x, 64 ; 1U << (8-1-1)
9749c377c53SCraig Topper  %tmp1 = icmp ult i16 %tmp0, 256 ; 1U << 8
9759c377c53SCraig Topper  ret i1 %tmp1
9769c377c53SCraig Topper}
9779c377c53SCraig Topper
9789c377c53SCraig Topper; Bad 'destination type'
9799c377c53SCraig Topperdefine i1 @add_ultcmp_bad_i16_i4(i16 %x) nounwind {
9809c377c53SCraig Topper; RV32I-LABEL: add_ultcmp_bad_i16_i4:
9819c377c53SCraig Topper; RV32I:       # %bb.0:
9829c377c53SCraig Topper; RV32I-NEXT:    addi a0, a0, 8
9839c377c53SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
9849c377c53SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
9859c377c53SCraig Topper; RV32I-NEXT:    sltiu a0, a0, 16
9869c377c53SCraig Topper; RV32I-NEXT:    ret
9879c377c53SCraig Topper;
9889c377c53SCraig Topper; RV64I-LABEL: add_ultcmp_bad_i16_i4:
9899c377c53SCraig Topper; RV64I:       # %bb.0:
99086240751SPhilip Reames; RV64I-NEXT:    addi a0, a0, 8
9919c377c53SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
9929c377c53SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
9939c377c53SCraig Topper; RV64I-NEXT:    sltiu a0, a0, 16
9949c377c53SCraig Topper; RV64I-NEXT:    ret
9959c377c53SCraig Topper;
9969c377c53SCraig Topper; RV32ZBB-LABEL: add_ultcmp_bad_i16_i4:
9979c377c53SCraig Topper; RV32ZBB:       # %bb.0:
9989c377c53SCraig Topper; RV32ZBB-NEXT:    addi a0, a0, 8
9999c377c53SCraig Topper; RV32ZBB-NEXT:    zext.h a0, a0
10009c377c53SCraig Topper; RV32ZBB-NEXT:    sltiu a0, a0, 16
10019c377c53SCraig Topper; RV32ZBB-NEXT:    ret
10029c377c53SCraig Topper;
10039c377c53SCraig Topper; RV64ZBB-LABEL: add_ultcmp_bad_i16_i4:
10049c377c53SCraig Topper; RV64ZBB:       # %bb.0:
100586240751SPhilip Reames; RV64ZBB-NEXT:    addi a0, a0, 8
10069c377c53SCraig Topper; RV64ZBB-NEXT:    zext.h a0, a0
10079c377c53SCraig Topper; RV64ZBB-NEXT:    sltiu a0, a0, 16
10089c377c53SCraig Topper; RV64ZBB-NEXT:    ret
10099c377c53SCraig Topper  %tmp0 = add i16 %x, 8 ; 1U << (4-1)
10109c377c53SCraig Topper  %tmp1 = icmp ult i16 %tmp0, 16 ; 1U << 4
10119c377c53SCraig Topper  ret i1 %tmp1
10129c377c53SCraig Topper}
10139c377c53SCraig Topper
10149c377c53SCraig Topper; Bad storage type
10159c377c53SCraig Topperdefine i1 @add_ultcmp_bad_i24_i8(i24 %x) nounwind {
10169c377c53SCraig Topper; RV32-LABEL: add_ultcmp_bad_i24_i8:
10179c377c53SCraig Topper; RV32:       # %bb.0:
10189c377c53SCraig Topper; RV32-NEXT:    addi a0, a0, 128
10199c377c53SCraig Topper; RV32-NEXT:    slli a0, a0, 8
10209c377c53SCraig Topper; RV32-NEXT:    srli a0, a0, 8
10219c377c53SCraig Topper; RV32-NEXT:    sltiu a0, a0, 256
10229c377c53SCraig Topper; RV32-NEXT:    ret
10239c377c53SCraig Topper;
10249c377c53SCraig Topper; RV64-LABEL: add_ultcmp_bad_i24_i8:
10259c377c53SCraig Topper; RV64:       # %bb.0:
102686240751SPhilip Reames; RV64-NEXT:    addi a0, a0, 128
10279c377c53SCraig Topper; RV64-NEXT:    slli a0, a0, 40
10289c377c53SCraig Topper; RV64-NEXT:    srli a0, a0, 40
10299c377c53SCraig Topper; RV64-NEXT:    sltiu a0, a0, 256
10309c377c53SCraig Topper; RV64-NEXT:    ret
10319c377c53SCraig Topper  %tmp0 = add i24 %x, 128 ; 1U << (8-1)
10329c377c53SCraig Topper  %tmp1 = icmp ult i24 %tmp0, 256 ; 1U << 8
10339c377c53SCraig Topper  ret i1 %tmp1
10349c377c53SCraig Topper}
10359c377c53SCraig Topper
10369c377c53SCraig Topperdefine i1 @add_ulecmp_bad_i16_i8(i16 %x) nounwind {
10379c377c53SCraig Topper; CHECK-LABEL: add_ulecmp_bad_i16_i8:
10389c377c53SCraig Topper; CHECK:       # %bb.0:
10399c377c53SCraig Topper; CHECK-NEXT:    li a0, 1
10409c377c53SCraig Topper; CHECK-NEXT:    ret
10419c377c53SCraig Topper  %tmp0 = add i16 %x, 128 ; 1U << (8-1)
10429c377c53SCraig Topper  %tmp1 = icmp ule i16 %tmp0, -1 ; when we +1 it, it will wrap to 0
10439c377c53SCraig Topper  ret i1 %tmp1
10449c377c53SCraig Topper}
1045