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