xref: /llvm-project/llvm/test/CodeGen/RISCV/shift-amount-mod.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
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