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