17cd72585SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 27cd72585SCraig Topper; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 37cd72585SCraig Topper; RUN: | FileCheck %s -check-prefix=RV32I 47cd72585SCraig Topper; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 57cd72585SCraig Topper; RUN: | FileCheck %s -check-prefix=RV64I 67cd72585SCraig Topper 77cd72585SCraig Topperdefine i32 @shl_by_complemented_32(i32 %x) { 87cd72585SCraig Topper; RV32I-LABEL: shl_by_complemented_32: 97cd72585SCraig Topper; RV32I: # %bb.0: 107cd72585SCraig Topper; RV32I-NEXT: not a1, a0 117cd72585SCraig Topper; RV32I-NEXT: sll a0, a0, a1 127cd72585SCraig Topper; RV32I-NEXT: ret 137cd72585SCraig Topper; 147cd72585SCraig Topper; RV64I-LABEL: shl_by_complemented_32: 157cd72585SCraig Topper; RV64I: # %bb.0: 167cd72585SCraig Topper; RV64I-NEXT: not a1, a0 177cd72585SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 187cd72585SCraig Topper; RV64I-NEXT: ret 197cd72585SCraig Topper %a = sub i32 31, %x 207cd72585SCraig Topper %b = shl i32 %x, %a 217cd72585SCraig Topper ret i32 %b 227cd72585SCraig Topper} 237cd72585SCraig Topper 247cd72585SCraig Topperdefine i64 @shl_by_complemented_64(i64 %x) { 257cd72585SCraig Topper; RV32I-LABEL: shl_by_complemented_64: 267cd72585SCraig Topper; RV32I: # %bb.0: 277cd72585SCraig Topper; RV32I-NEXT: not a4, a0 28b6ea46feSLiaoChunyu; RV32I-NEXT: li a2, 31 29b6ea46feSLiaoChunyu; RV32I-NEXT: sub a2, a2, a0 30b6ea46feSLiaoChunyu; RV32I-NEXT: sll a3, a0, a4 31b6ea46feSLiaoChunyu; RV32I-NEXT: bltz a2, .LBB1_2 327cd72585SCraig Topper; RV32I-NEXT: # %bb.1: 33b6ea46feSLiaoChunyu; RV32I-NEXT: mv a1, a3 347cd72585SCraig Topper; RV32I-NEXT: j .LBB1_3 357cd72585SCraig Topper; RV32I-NEXT: .LBB1_2: 367cd72585SCraig Topper; RV32I-NEXT: sll a1, a1, a4 377cd72585SCraig Topper; RV32I-NEXT: li a4, 63 387cd72585SCraig Topper; RV32I-NEXT: sub a4, a4, a0 39a63b7247SCraig Topper; RV32I-NEXT: not a4, a4 407cd72585SCraig Topper; RV32I-NEXT: srli a0, a0, 1 417cd72585SCraig Topper; RV32I-NEXT: srl a0, a0, a4 427cd72585SCraig Topper; RV32I-NEXT: or a1, a1, a0 437cd72585SCraig Topper; RV32I-NEXT: .LBB1_3: 44b6ea46feSLiaoChunyu; RV32I-NEXT: srai a0, a2, 31 45b6ea46feSLiaoChunyu; RV32I-NEXT: and a0, a0, a3 467cd72585SCraig Topper; RV32I-NEXT: ret 477cd72585SCraig Topper; 487cd72585SCraig Topper; RV64I-LABEL: shl_by_complemented_64: 497cd72585SCraig Topper; RV64I: # %bb.0: 507cd72585SCraig Topper; RV64I-NEXT: not a1, a0 517cd72585SCraig Topper; RV64I-NEXT: sll a0, a0, a1 527cd72585SCraig Topper; RV64I-NEXT: ret 537cd72585SCraig Topper %a = sub i64 63, %x 547cd72585SCraig Topper %b = shl i64 %x, %a 557cd72585SCraig Topper ret i64 %b 567cd72585SCraig Topper} 577cd72585SCraig Topper 587cd72585SCraig Topperdefine i32 @lshr_by_complemented_32(i32 %x) { 597cd72585SCraig Topper; RV32I-LABEL: lshr_by_complemented_32: 607cd72585SCraig Topper; RV32I: # %bb.0: 617cd72585SCraig Topper; RV32I-NEXT: not a1, a0 627cd72585SCraig Topper; RV32I-NEXT: srl a0, a0, a1 637cd72585SCraig Topper; RV32I-NEXT: ret 647cd72585SCraig Topper; 657cd72585SCraig Topper; RV64I-LABEL: lshr_by_complemented_32: 667cd72585SCraig Topper; RV64I: # %bb.0: 677cd72585SCraig Topper; RV64I-NEXT: not a1, a0 687cd72585SCraig Topper; RV64I-NEXT: srlw a0, a0, a1 697cd72585SCraig Topper; RV64I-NEXT: ret 707cd72585SCraig Topper %a = sub i32 31, %x 717cd72585SCraig Topper %b = lshr i32 %x, %a 727cd72585SCraig Topper ret i32 %b 737cd72585SCraig Topper} 747cd72585SCraig Topper 757cd72585SCraig Topperdefine i64 @lshr_by_complemented_64(i64 %x) { 767cd72585SCraig Topper; RV32I-LABEL: lshr_by_complemented_64: 777cd72585SCraig Topper; RV32I: # %bb.0: 787cd72585SCraig Topper; RV32I-NEXT: not a4, a0 79b6ea46feSLiaoChunyu; RV32I-NEXT: li a2, 31 80b6ea46feSLiaoChunyu; RV32I-NEXT: sub a2, a2, a0 81b6ea46feSLiaoChunyu; RV32I-NEXT: srl a3, a1, a4 82b6ea46feSLiaoChunyu; RV32I-NEXT: bltz a2, .LBB3_2 837cd72585SCraig Topper; RV32I-NEXT: # %bb.1: 84b6ea46feSLiaoChunyu; RV32I-NEXT: mv a0, a3 857cd72585SCraig Topper; RV32I-NEXT: j .LBB3_3 867cd72585SCraig Topper; RV32I-NEXT: .LBB3_2: 877cd72585SCraig Topper; RV32I-NEXT: srl a4, a0, a4 887cd72585SCraig Topper; RV32I-NEXT: li a5, 63 897cd72585SCraig Topper; RV32I-NEXT: sub a5, a5, a0 90a63b7247SCraig Topper; RV32I-NEXT: not a0, a5 917cd72585SCraig Topper; RV32I-NEXT: slli a1, a1, 1 927cd72585SCraig Topper; RV32I-NEXT: sll a0, a1, a0 937cd72585SCraig Topper; RV32I-NEXT: or a0, a4, a0 947cd72585SCraig Topper; RV32I-NEXT: .LBB3_3: 95b6ea46feSLiaoChunyu; RV32I-NEXT: srai a1, a2, 31 96b6ea46feSLiaoChunyu; RV32I-NEXT: and a1, a1, a3 977cd72585SCraig Topper; RV32I-NEXT: ret 987cd72585SCraig Topper; 997cd72585SCraig Topper; RV64I-LABEL: lshr_by_complemented_64: 1007cd72585SCraig Topper; RV64I: # %bb.0: 1017cd72585SCraig Topper; RV64I-NEXT: not a1, a0 1027cd72585SCraig Topper; RV64I-NEXT: srl a0, a0, a1 1037cd72585SCraig Topper; RV64I-NEXT: ret 1047cd72585SCraig Topper %a = sub i64 63, %x 1057cd72585SCraig Topper %b = lshr i64 %x, %a 1067cd72585SCraig Topper ret i64 %b 1077cd72585SCraig Topper} 1087cd72585SCraig Topper 1097cd72585SCraig Topperdefine i32 @ashr_by_complemented_32(i32 %x) { 1107cd72585SCraig Topper; RV32I-LABEL: ashr_by_complemented_32: 1117cd72585SCraig Topper; RV32I: # %bb.0: 1127cd72585SCraig Topper; RV32I-NEXT: not a1, a0 1137cd72585SCraig Topper; RV32I-NEXT: sra a0, a0, a1 1147cd72585SCraig Topper; RV32I-NEXT: ret 1157cd72585SCraig Topper; 1167cd72585SCraig Topper; RV64I-LABEL: ashr_by_complemented_32: 1177cd72585SCraig Topper; RV64I: # %bb.0: 1187cd72585SCraig Topper; RV64I-NEXT: not a1, a0 1197cd72585SCraig Topper; RV64I-NEXT: sraw a0, a0, a1 1207cd72585SCraig Topper; RV64I-NEXT: ret 1217cd72585SCraig Topper %a = sub i32 31, %x 1227cd72585SCraig Topper %b = ashr i32 %x, %a 1237cd72585SCraig Topper ret i32 %b 1247cd72585SCraig Topper} 1257cd72585SCraig Topper 1267cd72585SCraig Topperdefine i64 @ashr_by_complemented_64(i64 %x) { 1277cd72585SCraig Topper; RV32I-LABEL: ashr_by_complemented_64: 1287cd72585SCraig Topper; RV32I: # %bb.0: 1297cd72585SCraig Topper; RV32I-NEXT: mv a2, a0 1307cd72585SCraig Topper; RV32I-NEXT: li a0, 31 1317cd72585SCraig Topper; RV32I-NEXT: sub a4, a0, a2 1327cd72585SCraig Topper; RV32I-NEXT: not a3, a2 1337cd72585SCraig Topper; RV32I-NEXT: sra a0, a1, a3 1347cd72585SCraig Topper; RV32I-NEXT: bltz a4, .LBB5_2 1357cd72585SCraig Topper; RV32I-NEXT: # %bb.1: 1367cd72585SCraig Topper; RV32I-NEXT: srai a1, a1, 31 1377cd72585SCraig Topper; RV32I-NEXT: ret 1387cd72585SCraig Topper; RV32I-NEXT: .LBB5_2: 1397cd72585SCraig Topper; RV32I-NEXT: srl a3, a2, a3 1407cd72585SCraig Topper; RV32I-NEXT: li a4, 63 1417cd72585SCraig Topper; RV32I-NEXT: sub a4, a4, a2 142a63b7247SCraig Topper; RV32I-NEXT: not a2, a4 1437cd72585SCraig Topper; RV32I-NEXT: slli a1, a1, 1 1447cd72585SCraig Topper; RV32I-NEXT: sll a1, a1, a2 1457cd72585SCraig Topper; RV32I-NEXT: or a3, a3, a1 1467cd72585SCraig Topper; RV32I-NEXT: mv a1, a0 1477cd72585SCraig Topper; RV32I-NEXT: mv a0, a3 1487cd72585SCraig Topper; RV32I-NEXT: ret 1497cd72585SCraig Topper; 1507cd72585SCraig Topper; RV64I-LABEL: ashr_by_complemented_64: 1517cd72585SCraig Topper; RV64I: # %bb.0: 1527cd72585SCraig Topper; RV64I-NEXT: not a1, a0 1537cd72585SCraig Topper; RV64I-NEXT: sra a0, a0, a1 1547cd72585SCraig Topper; RV64I-NEXT: ret 1557cd72585SCraig Topper %a = sub i64 63, %x 1567cd72585SCraig Topper %b = ashr i64 %x, %a 1577cd72585SCraig Topper ret i64 %b 1587cd72585SCraig Topper} 1597cd72585SCraig Topper 1607cd72585SCraig Topperdefine i32 @shl_by_masked_complemented_32(i32 %x) { 1617cd72585SCraig Topper; RV32I-LABEL: shl_by_masked_complemented_32: 1627cd72585SCraig Topper; RV32I: # %bb.0: 1637cd72585SCraig Topper; RV32I-NEXT: not a1, a0 1647cd72585SCraig Topper; RV32I-NEXT: sll a0, a0, a1 1657cd72585SCraig Topper; RV32I-NEXT: ret 1667cd72585SCraig Topper; 1677cd72585SCraig Topper; RV64I-LABEL: shl_by_masked_complemented_32: 1687cd72585SCraig Topper; RV64I: # %bb.0: 1697cd72585SCraig Topper; RV64I-NEXT: not a1, a0 1707cd72585SCraig Topper; RV64I-NEXT: sllw a0, a0, a1 1717cd72585SCraig Topper; RV64I-NEXT: ret 1727cd72585SCraig Topper %a = sub i32 31, %x 1737cd72585SCraig Topper %b = and i32 %a, 31 1747cd72585SCraig Topper %c = shl i32 %x, %b 1757cd72585SCraig Topper ret i32 %c 1767cd72585SCraig Topper} 1777cd72585SCraig Topper 1787cd72585SCraig Topperdefine i64 @shl_by_masked_complemented_64(i64 %x) { 1797cd72585SCraig Topper; RV32I-LABEL: shl_by_masked_complemented_64: 1807cd72585SCraig Topper; RV32I: # %bb.0: 1817cd72585SCraig Topper; RV32I-NEXT: li a2, 63 1827cd72585SCraig Topper; RV32I-NEXT: sub a2, a2, a0 1837cd72585SCraig Topper; RV32I-NEXT: andi a4, a2, 63 1847cd72585SCraig Topper; RV32I-NEXT: addi a2, a4, -32 1857cd72585SCraig Topper; RV32I-NEXT: not a3, a0 1867cd72585SCraig Topper; RV32I-NEXT: bltz a2, .LBB7_2 1877cd72585SCraig Topper; RV32I-NEXT: # %bb.1: 1887cd72585SCraig Topper; RV32I-NEXT: sll a1, a0, a4 1897cd72585SCraig Topper; RV32I-NEXT: j .LBB7_3 1907cd72585SCraig Topper; RV32I-NEXT: .LBB7_2: 1917cd72585SCraig Topper; RV32I-NEXT: sll a1, a1, a3 192a63b7247SCraig Topper; RV32I-NEXT: not a4, a4 1937cd72585SCraig Topper; RV32I-NEXT: srli a5, a0, 1 1947cd72585SCraig Topper; RV32I-NEXT: srl a4, a5, a4 1957cd72585SCraig Topper; RV32I-NEXT: or a1, a1, a4 1967cd72585SCraig Topper; RV32I-NEXT: .LBB7_3: 1977cd72585SCraig Topper; RV32I-NEXT: sll a0, a0, a3 198b6ea46feSLiaoChunyu; RV32I-NEXT: srai a2, a2, 31 1997cd72585SCraig Topper; RV32I-NEXT: and a0, a2, a0 2007cd72585SCraig Topper; RV32I-NEXT: ret 2017cd72585SCraig Topper; 2027cd72585SCraig Topper; RV64I-LABEL: shl_by_masked_complemented_64: 2037cd72585SCraig Topper; RV64I: # %bb.0: 2047cd72585SCraig Topper; RV64I-NEXT: not a1, a0 2057cd72585SCraig Topper; RV64I-NEXT: sll a0, a0, a1 2067cd72585SCraig Topper; RV64I-NEXT: ret 2077cd72585SCraig Topper %a = sub i64 63, %x 2087cd72585SCraig Topper %b = and i64 %a, 63 2097cd72585SCraig Topper %c = shl i64 %x, %b 2107cd72585SCraig Topper ret i64 %c 2117cd72585SCraig Topper} 2127cd72585SCraig Topper 2137cd72585SCraig Topperdefine i64 @lshr_by_masked_complemented_64(i64 %x) { 2147cd72585SCraig Topper; RV32I-LABEL: lshr_by_masked_complemented_64: 2157cd72585SCraig Topper; RV32I: # %bb.0: 2167cd72585SCraig Topper; RV32I-NEXT: li a2, 63 2177cd72585SCraig Topper; RV32I-NEXT: sub a2, a2, a0 2187cd72585SCraig Topper; RV32I-NEXT: andi a4, a2, 63 2197cd72585SCraig Topper; RV32I-NEXT: addi a2, a4, -32 2207cd72585SCraig Topper; RV32I-NEXT: not a3, a0 2217cd72585SCraig Topper; RV32I-NEXT: bltz a2, .LBB8_2 2227cd72585SCraig Topper; RV32I-NEXT: # %bb.1: 2237cd72585SCraig Topper; RV32I-NEXT: srl a0, a1, a4 2247cd72585SCraig Topper; RV32I-NEXT: j .LBB8_3 2257cd72585SCraig Topper; RV32I-NEXT: .LBB8_2: 2267cd72585SCraig Topper; RV32I-NEXT: srl a0, a0, a3 227a63b7247SCraig Topper; RV32I-NEXT: not a4, a4 2287cd72585SCraig Topper; RV32I-NEXT: slli a5, a1, 1 2297cd72585SCraig Topper; RV32I-NEXT: sll a4, a5, a4 2307cd72585SCraig Topper; RV32I-NEXT: or a0, a0, a4 2317cd72585SCraig Topper; RV32I-NEXT: .LBB8_3: 2327cd72585SCraig Topper; RV32I-NEXT: srl a1, a1, a3 233b6ea46feSLiaoChunyu; RV32I-NEXT: srai a2, a2, 31 2347cd72585SCraig Topper; RV32I-NEXT: and a1, a2, a1 2357cd72585SCraig Topper; RV32I-NEXT: ret 2367cd72585SCraig Topper; 2377cd72585SCraig Topper; RV64I-LABEL: lshr_by_masked_complemented_64: 2387cd72585SCraig Topper; RV64I: # %bb.0: 2397cd72585SCraig Topper; RV64I-NEXT: not a1, a0 2407cd72585SCraig Topper; RV64I-NEXT: srl a0, a0, a1 2417cd72585SCraig Topper; RV64I-NEXT: ret 2427cd72585SCraig Topper %a = sub i64 63, %x 2437cd72585SCraig Topper %b = and i64 %a, 63 2447cd72585SCraig Topper %c = lshr i64 %x, %b 2457cd72585SCraig Topper ret i64 %c 2467cd72585SCraig Topper} 2477cd72585SCraig Topper 2487cd72585SCraig Topperdefine i64 @ashr_by_masked_complemented_64(i64 %x) { 2497cd72585SCraig Topper; RV32I-LABEL: ashr_by_masked_complemented_64: 2507cd72585SCraig Topper; RV32I: # %bb.0: 2517cd72585SCraig Topper; RV32I-NEXT: li a2, 63 2527cd72585SCraig Topper; RV32I-NEXT: sub a2, a2, a0 253*9122c523SPengcheng Wang; RV32I-NEXT: andi a2, a2, 63 254*9122c523SPengcheng Wang; RV32I-NEXT: addi a3, a2, -32 255*9122c523SPengcheng Wang; RV32I-NEXT: bltz a3, .LBB9_2 2567cd72585SCraig Topper; RV32I-NEXT: # %bb.1: 257*9122c523SPengcheng Wang; RV32I-NEXT: mv a0, a1 258*9122c523SPengcheng Wang; RV32I-NEXT: srai a1, a1, 31 259*9122c523SPengcheng Wang; RV32I-NEXT: sra a0, a0, a2 2607cd72585SCraig Topper; RV32I-NEXT: ret 2617cd72585SCraig Topper; RV32I-NEXT: .LBB9_2: 262*9122c523SPengcheng Wang; RV32I-NEXT: not a3, a0 263*9122c523SPengcheng Wang; RV32I-NEXT: not a2, a2 264*9122c523SPengcheng Wang; RV32I-NEXT: slli a4, a1, 1 265*9122c523SPengcheng Wang; RV32I-NEXT: sra a1, a1, a3 266*9122c523SPengcheng Wang; RV32I-NEXT: srl a0, a0, a3 267*9122c523SPengcheng Wang; RV32I-NEXT: sll a2, a4, a2 2687cd72585SCraig Topper; RV32I-NEXT: or a0, a0, a2 2697cd72585SCraig Topper; RV32I-NEXT: ret 2707cd72585SCraig Topper; 2717cd72585SCraig Topper; RV64I-LABEL: ashr_by_masked_complemented_64: 2727cd72585SCraig Topper; RV64I: # %bb.0: 2737cd72585SCraig Topper; RV64I-NEXT: not a1, a0 2747cd72585SCraig Topper; RV64I-NEXT: sra a0, a0, a1 2757cd72585SCraig Topper; RV64I-NEXT: ret 2767cd72585SCraig Topper %a = sub i64 63, %x 2777cd72585SCraig Topper %b = and i64 %a, 63 2787cd72585SCraig Topper %c = ashr i64 %x, %b 2797cd72585SCraig Topper ret i64 %c 2807cd72585SCraig Topper} 281