xref: /llvm-project/llvm/test/CodeGen/RISCV/shl-cttz.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
19e8ecce8SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
29e8ecce8SYingwei Zheng; RUN: llc -mtriple=riscv32 -mattr=+m < %s \
39e8ecce8SYingwei Zheng; RUN:   | FileCheck %s -check-prefix=RV32I
49e8ecce8SYingwei Zheng; RUN: llc -mtriple=riscv32 -mattr=+m,+zbb < %s \
59e8ecce8SYingwei Zheng; RUN:   | FileCheck %s -check-prefix=RV32ZBB
69e8ecce8SYingwei Zheng; RUN: llc -mtriple=riscv64 -mattr=+m < %s \
7ca7ad38cSCraig Topper; RUN:   | FileCheck %s -check-prefixes=RV64I
89e8ecce8SYingwei Zheng; RUN: llc -mtriple=riscv64 -mattr=+m,+zbb < %s \
9ca7ad38cSCraig Topper; RUN:   | FileCheck %s -check-prefixes=RV64ZBB
109e8ecce8SYingwei Zheng
119e8ecce8SYingwei Zhengdefine i8 @shl_cttz_i8(i8 %x, i8 %y) {
129e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_i8:
139e8ecce8SYingwei Zheng; RV32I:       # %bb.0: # %entry
149e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a2, a1, -1
159e8ecce8SYingwei Zheng; RV32I-NEXT:    not a1, a1
169e8ecce8SYingwei Zheng; RV32I-NEXT:    and a1, a1, a2
179e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a2, a1, 1
189e8ecce8SYingwei Zheng; RV32I-NEXT:    andi a2, a2, 85
199e8ecce8SYingwei Zheng; RV32I-NEXT:    sub a1, a1, a2
209e8ecce8SYingwei Zheng; RV32I-NEXT:    andi a2, a1, 51
219e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a1, a1, 2
229e8ecce8SYingwei Zheng; RV32I-NEXT:    andi a1, a1, 51
239e8ecce8SYingwei Zheng; RV32I-NEXT:    add a1, a2, a1
249e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a2, a1, 4
259e8ecce8SYingwei Zheng; RV32I-NEXT:    add a1, a1, a2
269e8ecce8SYingwei Zheng; RV32I-NEXT:    andi a1, a1, 15
279e8ecce8SYingwei Zheng; RV32I-NEXT:    sll a0, a0, a1
289e8ecce8SYingwei Zheng; RV32I-NEXT:    ret
299e8ecce8SYingwei Zheng;
309e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_i8:
319e8ecce8SYingwei Zheng; RV32ZBB:       # %bb.0: # %entry
329e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz a1, a1
339e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sll a0, a0, a1
349e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ret
359e8ecce8SYingwei Zheng;
36ca7ad38cSCraig Topper; RV64I-LABEL: shl_cttz_i8:
37ca7ad38cSCraig Topper; RV64I:       # %bb.0: # %entry
38ca7ad38cSCraig Topper; RV64I-NEXT:    addi a2, a1, -1
39ca7ad38cSCraig Topper; RV64I-NEXT:    not a1, a1
40ca7ad38cSCraig Topper; RV64I-NEXT:    and a1, a1, a2
41ca7ad38cSCraig Topper; RV64I-NEXT:    srli a2, a1, 1
42ca7ad38cSCraig Topper; RV64I-NEXT:    andi a2, a2, 85
43ca7ad38cSCraig Topper; RV64I-NEXT:    subw a1, a1, a2
44ca7ad38cSCraig Topper; RV64I-NEXT:    andi a2, a1, 51
45ca7ad38cSCraig Topper; RV64I-NEXT:    srli a1, a1, 2
46ca7ad38cSCraig Topper; RV64I-NEXT:    andi a1, a1, 51
47ca7ad38cSCraig Topper; RV64I-NEXT:    add a1, a2, a1
48ca7ad38cSCraig Topper; RV64I-NEXT:    srli a2, a1, 4
49ca7ad38cSCraig Topper; RV64I-NEXT:    add a1, a1, a2
50ca7ad38cSCraig Topper; RV64I-NEXT:    andi a1, a1, 15
51ca7ad38cSCraig Topper; RV64I-NEXT:    sll a0, a0, a1
52ca7ad38cSCraig Topper; RV64I-NEXT:    ret
539e8ecce8SYingwei Zheng;
54ca7ad38cSCraig Topper; RV64ZBB-LABEL: shl_cttz_i8:
55ca7ad38cSCraig Topper; RV64ZBB:       # %bb.0: # %entry
56ca7ad38cSCraig Topper; RV64ZBB-NEXT:    ctz a1, a1
57ca7ad38cSCraig Topper; RV64ZBB-NEXT:    sll a0, a0, a1
58ca7ad38cSCraig Topper; RV64ZBB-NEXT:    ret
599e8ecce8SYingwei Zhengentry:
609e8ecce8SYingwei Zheng  %cttz = call i8 @llvm.cttz.i8(i8 %y, i1 true)
619e8ecce8SYingwei Zheng  %res = shl i8 %x, %cttz
629e8ecce8SYingwei Zheng  ret i8 %res
639e8ecce8SYingwei Zheng}
649e8ecce8SYingwei Zheng
659e8ecce8SYingwei Zhengdefine i8 @shl_cttz_constant_i8(i8 %y) {
669e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_constant_i8:
679e8ecce8SYingwei Zheng; RV32I:       # %bb.0: # %entry
689e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a1, a0, -1
699e8ecce8SYingwei Zheng; RV32I-NEXT:    not a0, a0
709e8ecce8SYingwei Zheng; RV32I-NEXT:    and a0, a0, a1
719e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a1, a0, 1
729e8ecce8SYingwei Zheng; RV32I-NEXT:    andi a1, a1, 85
739e8ecce8SYingwei Zheng; RV32I-NEXT:    sub a0, a0, a1
749e8ecce8SYingwei Zheng; RV32I-NEXT:    andi a1, a0, 51
759e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a0, a0, 2
769e8ecce8SYingwei Zheng; RV32I-NEXT:    andi a0, a0, 51
779e8ecce8SYingwei Zheng; RV32I-NEXT:    add a0, a1, a0
789e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a1, a0, 4
799e8ecce8SYingwei Zheng; RV32I-NEXT:    add a0, a0, a1
809e8ecce8SYingwei Zheng; RV32I-NEXT:    andi a0, a0, 15
819e8ecce8SYingwei Zheng; RV32I-NEXT:    li a1, 4
829e8ecce8SYingwei Zheng; RV32I-NEXT:    sll a0, a1, a0
839e8ecce8SYingwei Zheng; RV32I-NEXT:    ret
849e8ecce8SYingwei Zheng;
859e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_constant_i8:
869e8ecce8SYingwei Zheng; RV32ZBB:       # %bb.0: # %entry
879e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz a0, a0
889e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    li a1, 4
899e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sll a0, a1, a0
909e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ret
919e8ecce8SYingwei Zheng;
92ca7ad38cSCraig Topper; RV64I-LABEL: shl_cttz_constant_i8:
93ca7ad38cSCraig Topper; RV64I:       # %bb.0: # %entry
94ca7ad38cSCraig Topper; RV64I-NEXT:    addi a1, a0, -1
95ca7ad38cSCraig Topper; RV64I-NEXT:    not a0, a0
96ca7ad38cSCraig Topper; RV64I-NEXT:    and a0, a0, a1
97ca7ad38cSCraig Topper; RV64I-NEXT:    srli a1, a0, 1
98ca7ad38cSCraig Topper; RV64I-NEXT:    andi a1, a1, 85
99ca7ad38cSCraig Topper; RV64I-NEXT:    subw a0, a0, a1
100ca7ad38cSCraig Topper; RV64I-NEXT:    andi a1, a0, 51
101ca7ad38cSCraig Topper; RV64I-NEXT:    srli a0, a0, 2
102ca7ad38cSCraig Topper; RV64I-NEXT:    andi a0, a0, 51
103ca7ad38cSCraig Topper; RV64I-NEXT:    add a0, a1, a0
104ca7ad38cSCraig Topper; RV64I-NEXT:    srli a1, a0, 4
105ca7ad38cSCraig Topper; RV64I-NEXT:    add a0, a0, a1
106ca7ad38cSCraig Topper; RV64I-NEXT:    andi a0, a0, 15
107ca7ad38cSCraig Topper; RV64I-NEXT:    li a1, 4
108ca7ad38cSCraig Topper; RV64I-NEXT:    sll a0, a1, a0
109ca7ad38cSCraig Topper; RV64I-NEXT:    ret
1109e8ecce8SYingwei Zheng;
111ca7ad38cSCraig Topper; RV64ZBB-LABEL: shl_cttz_constant_i8:
112ca7ad38cSCraig Topper; RV64ZBB:       # %bb.0: # %entry
113ca7ad38cSCraig Topper; RV64ZBB-NEXT:    ctz a0, a0
114ca7ad38cSCraig Topper; RV64ZBB-NEXT:    li a1, 4
115ca7ad38cSCraig Topper; RV64ZBB-NEXT:    sll a0, a1, a0
116ca7ad38cSCraig Topper; RV64ZBB-NEXT:    ret
1179e8ecce8SYingwei Zhengentry:
1189e8ecce8SYingwei Zheng  %cttz = call i8 @llvm.cttz.i8(i8 %y, i1 true)
1199e8ecce8SYingwei Zheng  %res = shl i8 4, %cttz
1209e8ecce8SYingwei Zheng  ret i8 %res
1219e8ecce8SYingwei Zheng}
1229e8ecce8SYingwei Zheng
1239e8ecce8SYingwei Zhengdefine i16 @shl_cttz_i16(i16 %x, i16 %y) {
1249e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_i16:
1259e8ecce8SYingwei Zheng; RV32I:       # %bb.0: # %entry
1269e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a2, a1, -1
1279e8ecce8SYingwei Zheng; RV32I-NEXT:    not a1, a1
1289e8ecce8SYingwei Zheng; RV32I-NEXT:    lui a3, 5
1299e8ecce8SYingwei Zheng; RV32I-NEXT:    and a1, a1, a2
130*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a3, 1365
131*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a1, 1
132*9122c523SPengcheng Wang; RV32I-NEXT:    and a2, a3, a2
133*9122c523SPengcheng Wang; RV32I-NEXT:    lui a3, 3
134*9122c523SPengcheng Wang; RV32I-NEXT:    addi a3, a3, 819
135*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a2
136*9122c523SPengcheng Wang; RV32I-NEXT:    and a2, a1, a3
137*9122c523SPengcheng Wang; RV32I-NEXT:    srli a1, a1, 2
138*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a3
139*9122c523SPengcheng Wang; RV32I-NEXT:    add a1, a2, a1
1409e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a2, a1, 4
1419e8ecce8SYingwei Zheng; RV32I-NEXT:    add a1, a1, a2
1429e8ecce8SYingwei Zheng; RV32I-NEXT:    andi a2, a1, 15
1439e8ecce8SYingwei Zheng; RV32I-NEXT:    slli a1, a1, 20
1449e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a1, a1, 28
1459e8ecce8SYingwei Zheng; RV32I-NEXT:    add a1, a2, a1
1469e8ecce8SYingwei Zheng; RV32I-NEXT:    sll a0, a0, a1
1479e8ecce8SYingwei Zheng; RV32I-NEXT:    ret
1489e8ecce8SYingwei Zheng;
1499e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_i16:
1509e8ecce8SYingwei Zheng; RV32ZBB:       # %bb.0: # %entry
1519e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz a1, a1
1529e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sll a0, a0, a1
1539e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ret
1549e8ecce8SYingwei Zheng;
155ca7ad38cSCraig Topper; RV64I-LABEL: shl_cttz_i16:
156ca7ad38cSCraig Topper; RV64I:       # %bb.0: # %entry
157ca7ad38cSCraig Topper; RV64I-NEXT:    addi a2, a1, -1
158ca7ad38cSCraig Topper; RV64I-NEXT:    not a1, a1
159ca7ad38cSCraig Topper; RV64I-NEXT:    lui a3, 5
160ca7ad38cSCraig Topper; RV64I-NEXT:    and a1, a1, a2
161*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a3, 1365
162*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a1, 1
163*9122c523SPengcheng Wang; RV64I-NEXT:    and a2, a3, a2
164*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 3
165*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a3, a3, 819
166*9122c523SPengcheng Wang; RV64I-NEXT:    sub a1, a1, a2
167*9122c523SPengcheng Wang; RV64I-NEXT:    and a2, a1, a3
168*9122c523SPengcheng Wang; RV64I-NEXT:    srli a1, a1, 2
169*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a3
170*9122c523SPengcheng Wang; RV64I-NEXT:    add a1, a2, a1
171ca7ad38cSCraig Topper; RV64I-NEXT:    srli a2, a1, 4
172ca7ad38cSCraig Topper; RV64I-NEXT:    add a1, a1, a2
173ca7ad38cSCraig Topper; RV64I-NEXT:    andi a2, a1, 15
174ca7ad38cSCraig Topper; RV64I-NEXT:    slli a1, a1, 52
175ca7ad38cSCraig Topper; RV64I-NEXT:    srli a1, a1, 60
176ca7ad38cSCraig Topper; RV64I-NEXT:    add a1, a2, a1
177ca7ad38cSCraig Topper; RV64I-NEXT:    sll a0, a0, a1
178ca7ad38cSCraig Topper; RV64I-NEXT:    ret
1799e8ecce8SYingwei Zheng;
180ca7ad38cSCraig Topper; RV64ZBB-LABEL: shl_cttz_i16:
181ca7ad38cSCraig Topper; RV64ZBB:       # %bb.0: # %entry
182ca7ad38cSCraig Topper; RV64ZBB-NEXT:    ctz a1, a1
183ca7ad38cSCraig Topper; RV64ZBB-NEXT:    sll a0, a0, a1
184ca7ad38cSCraig Topper; RV64ZBB-NEXT:    ret
1859e8ecce8SYingwei Zhengentry:
1869e8ecce8SYingwei Zheng  %cttz = call i16 @llvm.cttz.i16(i16 %y, i1 true)
1879e8ecce8SYingwei Zheng  %res = shl i16 %x, %cttz
1889e8ecce8SYingwei Zheng  ret i16 %res
1899e8ecce8SYingwei Zheng}
1909e8ecce8SYingwei Zheng
1919e8ecce8SYingwei Zhengdefine i16 @shl_cttz_constant_i16(i16 %y) {
1929e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_constant_i16:
1939e8ecce8SYingwei Zheng; RV32I:       # %bb.0: # %entry
1949e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a1, a0, -1
1959e8ecce8SYingwei Zheng; RV32I-NEXT:    not a0, a0
1969e8ecce8SYingwei Zheng; RV32I-NEXT:    lui a2, 5
1979e8ecce8SYingwei Zheng; RV32I-NEXT:    and a0, a0, a1
198*9122c523SPengcheng Wang; RV32I-NEXT:    addi a1, a2, 1365
199*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a0, 1
200*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a2, a1
201*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 3
202*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 819
203*9122c523SPengcheng Wang; RV32I-NEXT:    sub a0, a0, a1
204*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a0, a2
205*9122c523SPengcheng Wang; RV32I-NEXT:    srli a0, a0, 2
206*9122c523SPengcheng Wang; RV32I-NEXT:    and a0, a0, a2
207*9122c523SPengcheng Wang; RV32I-NEXT:    add a0, a1, a0
2089e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a1, a0, 4
2099e8ecce8SYingwei Zheng; RV32I-NEXT:    add a0, a0, a1
2109e8ecce8SYingwei Zheng; RV32I-NEXT:    andi a1, a0, 15
2119e8ecce8SYingwei Zheng; RV32I-NEXT:    slli a0, a0, 20
2129e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a0, a0, 28
2139e8ecce8SYingwei Zheng; RV32I-NEXT:    add a0, a1, a0
2149e8ecce8SYingwei Zheng; RV32I-NEXT:    li a1, 4
2159e8ecce8SYingwei Zheng; RV32I-NEXT:    sll a0, a1, a0
2169e8ecce8SYingwei Zheng; RV32I-NEXT:    ret
2179e8ecce8SYingwei Zheng;
2189e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_constant_i16:
2199e8ecce8SYingwei Zheng; RV32ZBB:       # %bb.0: # %entry
2209e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz a0, a0
2219e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    li a1, 4
2229e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sll a0, a1, a0
2239e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ret
2249e8ecce8SYingwei Zheng;
225ca7ad38cSCraig Topper; RV64I-LABEL: shl_cttz_constant_i16:
226ca7ad38cSCraig Topper; RV64I:       # %bb.0: # %entry
227ca7ad38cSCraig Topper; RV64I-NEXT:    addi a1, a0, -1
228ca7ad38cSCraig Topper; RV64I-NEXT:    not a0, a0
229ca7ad38cSCraig Topper; RV64I-NEXT:    lui a2, 5
230ca7ad38cSCraig Topper; RV64I-NEXT:    and a0, a0, a1
231*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a1, a2, 1365
232*9122c523SPengcheng Wang; RV64I-NEXT:    srli a2, a0, 1
233*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a2, a1
234*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 3
235*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 819
236*9122c523SPengcheng Wang; RV64I-NEXT:    sub a0, a0, a1
237*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a0, a2
238*9122c523SPengcheng Wang; RV64I-NEXT:    srli a0, a0, 2
239*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a2
240*9122c523SPengcheng Wang; RV64I-NEXT:    add a0, a1, a0
241ca7ad38cSCraig Topper; RV64I-NEXT:    srli a1, a0, 4
242ca7ad38cSCraig Topper; RV64I-NEXT:    add a0, a0, a1
243ca7ad38cSCraig Topper; RV64I-NEXT:    andi a1, a0, 15
244ca7ad38cSCraig Topper; RV64I-NEXT:    slli a0, a0, 52
245ca7ad38cSCraig Topper; RV64I-NEXT:    srli a0, a0, 60
246ca7ad38cSCraig Topper; RV64I-NEXT:    add a0, a1, a0
247ca7ad38cSCraig Topper; RV64I-NEXT:    li a1, 4
248ca7ad38cSCraig Topper; RV64I-NEXT:    sll a0, a1, a0
249ca7ad38cSCraig Topper; RV64I-NEXT:    ret
2509e8ecce8SYingwei Zheng;
251ca7ad38cSCraig Topper; RV64ZBB-LABEL: shl_cttz_constant_i16:
252ca7ad38cSCraig Topper; RV64ZBB:       # %bb.0: # %entry
253ca7ad38cSCraig Topper; RV64ZBB-NEXT:    ctz a0, a0
254ca7ad38cSCraig Topper; RV64ZBB-NEXT:    li a1, 4
255ca7ad38cSCraig Topper; RV64ZBB-NEXT:    sll a0, a1, a0
256ca7ad38cSCraig Topper; RV64ZBB-NEXT:    ret
2579e8ecce8SYingwei Zhengentry:
2589e8ecce8SYingwei Zheng  %cttz = call i16 @llvm.cttz.i16(i16 %y, i1 true)
2599e8ecce8SYingwei Zheng  %res = shl i16 4, %cttz
2609e8ecce8SYingwei Zheng  ret i16 %res
2619e8ecce8SYingwei Zheng}
2629e8ecce8SYingwei Zheng
2639e8ecce8SYingwei Zhengdefine i32 @shl_cttz_i32(i32 %x, i32 %y) {
2649e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_i32:
2659e8ecce8SYingwei Zheng; RV32I:       # %bb.0: # %entry
2669e8ecce8SYingwei Zheng; RV32I-NEXT:    neg a2, a1
2679e8ecce8SYingwei Zheng; RV32I-NEXT:    and a1, a1, a2
2689e8ecce8SYingwei Zheng; RV32I-NEXT:    mul a0, a1, a0
2699e8ecce8SYingwei Zheng; RV32I-NEXT:    ret
2709e8ecce8SYingwei Zheng;
2719e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_i32:
2729e8ecce8SYingwei Zheng; RV32ZBB:       # %bb.0: # %entry
2739e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz a1, a1
2749e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sll a0, a0, a1
2759e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ret
2769e8ecce8SYingwei Zheng;
2779e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_i32:
2789e8ecce8SYingwei Zheng; RV64I:       # %bb.0: # %entry
2799e8ecce8SYingwei Zheng; RV64I-NEXT:    negw a2, a1
2809e8ecce8SYingwei Zheng; RV64I-NEXT:    and a1, a1, a2
2819e8ecce8SYingwei Zheng; RV64I-NEXT:    lui a2, 30667
2829e8ecce8SYingwei Zheng; RV64I-NEXT:    addi a2, a2, 1329
2839e8ecce8SYingwei Zheng; RV64I-NEXT:    mul a1, a1, a2
2849e8ecce8SYingwei Zheng; RV64I-NEXT:    srliw a1, a1, 27
2859e8ecce8SYingwei Zheng; RV64I-NEXT:    lui a2, %hi(.LCPI4_0)
2869e8ecce8SYingwei Zheng; RV64I-NEXT:    addi a2, a2, %lo(.LCPI4_0)
2879e8ecce8SYingwei Zheng; RV64I-NEXT:    add a1, a2, a1
2889e8ecce8SYingwei Zheng; RV64I-NEXT:    lbu a1, 0(a1)
2899e8ecce8SYingwei Zheng; RV64I-NEXT:    sllw a0, a0, a1
2909e8ecce8SYingwei Zheng; RV64I-NEXT:    ret
2919e8ecce8SYingwei Zheng;
2929e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_i32:
2939e8ecce8SYingwei Zheng; RV64ZBB:       # %bb.0: # %entry
2949e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ctzw a1, a1
2959e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    sllw a0, a0, a1
2969e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ret
2979e8ecce8SYingwei Zhengentry:
2989e8ecce8SYingwei Zheng  %cttz = call i32 @llvm.cttz.i32(i32 %y, i1 true)
2999e8ecce8SYingwei Zheng  %res = shl i32 %x, %cttz
3009e8ecce8SYingwei Zheng  ret i32 %res
3019e8ecce8SYingwei Zheng}
3029e8ecce8SYingwei Zheng
3039e8ecce8SYingwei Zhengdefine i32 @shl_cttz_i32_zero_is_defined(i32 %x, i32 %y) {
3049e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_i32_zero_is_defined:
3059e8ecce8SYingwei Zheng; RV32I:       # %bb.0: # %entry
3069e8ecce8SYingwei Zheng; RV32I-NEXT:    beqz a1, .LBB5_2
3079e8ecce8SYingwei Zheng; RV32I-NEXT:  # %bb.1: # %cond.false
3089e8ecce8SYingwei Zheng; RV32I-NEXT:    neg a2, a1
3099e8ecce8SYingwei Zheng; RV32I-NEXT:    and a1, a1, a2
3109e8ecce8SYingwei Zheng; RV32I-NEXT:    lui a2, 30667
3119e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a2, a2, 1329
3129e8ecce8SYingwei Zheng; RV32I-NEXT:    mul a1, a1, a2
3139e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a1, a1, 27
3149e8ecce8SYingwei Zheng; RV32I-NEXT:    lui a2, %hi(.LCPI5_0)
3159e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a2, a2, %lo(.LCPI5_0)
3169e8ecce8SYingwei Zheng; RV32I-NEXT:    add a1, a2, a1
3179e8ecce8SYingwei Zheng; RV32I-NEXT:    lbu a1, 0(a1)
3189e8ecce8SYingwei Zheng; RV32I-NEXT:    sll a0, a0, a1
3199e8ecce8SYingwei Zheng; RV32I-NEXT:    ret
3209e8ecce8SYingwei Zheng; RV32I-NEXT:  .LBB5_2:
3219e8ecce8SYingwei Zheng; RV32I-NEXT:    li a1, 32
3229e8ecce8SYingwei Zheng; RV32I-NEXT:    sll a0, a0, a1
3239e8ecce8SYingwei Zheng; RV32I-NEXT:    ret
3249e8ecce8SYingwei Zheng;
3259e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_i32_zero_is_defined:
3269e8ecce8SYingwei Zheng; RV32ZBB:       # %bb.0: # %entry
3279e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz a1, a1
3289e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sll a0, a0, a1
3299e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ret
3309e8ecce8SYingwei Zheng;
3319e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_i32_zero_is_defined:
3329e8ecce8SYingwei Zheng; RV64I:       # %bb.0: # %entry
3339e8ecce8SYingwei Zheng; RV64I-NEXT:    sext.w a2, a1
3349e8ecce8SYingwei Zheng; RV64I-NEXT:    beqz a2, .LBB5_2
3359e8ecce8SYingwei Zheng; RV64I-NEXT:  # %bb.1: # %cond.false
3369e8ecce8SYingwei Zheng; RV64I-NEXT:    negw a2, a1
3379e8ecce8SYingwei Zheng; RV64I-NEXT:    and a1, a1, a2
3389e8ecce8SYingwei Zheng; RV64I-NEXT:    lui a2, 30667
3399e8ecce8SYingwei Zheng; RV64I-NEXT:    addi a2, a2, 1329
3409e8ecce8SYingwei Zheng; RV64I-NEXT:    mul a1, a1, a2
3419e8ecce8SYingwei Zheng; RV64I-NEXT:    srliw a1, a1, 27
3429e8ecce8SYingwei Zheng; RV64I-NEXT:    lui a2, %hi(.LCPI5_0)
3439e8ecce8SYingwei Zheng; RV64I-NEXT:    addi a2, a2, %lo(.LCPI5_0)
3449e8ecce8SYingwei Zheng; RV64I-NEXT:    add a1, a2, a1
3459e8ecce8SYingwei Zheng; RV64I-NEXT:    lbu a1, 0(a1)
3469e8ecce8SYingwei Zheng; RV64I-NEXT:    sllw a0, a0, a1
3479e8ecce8SYingwei Zheng; RV64I-NEXT:    ret
3489e8ecce8SYingwei Zheng; RV64I-NEXT:  .LBB5_2:
3499e8ecce8SYingwei Zheng; RV64I-NEXT:    li a1, 32
3509e8ecce8SYingwei Zheng; RV64I-NEXT:    sllw a0, a0, a1
3519e8ecce8SYingwei Zheng; RV64I-NEXT:    ret
3529e8ecce8SYingwei Zheng;
3539e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_i32_zero_is_defined:
3549e8ecce8SYingwei Zheng; RV64ZBB:       # %bb.0: # %entry
3559e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ctzw a1, a1
3569e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    sllw a0, a0, a1
3579e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ret
3589e8ecce8SYingwei Zhengentry:
3599e8ecce8SYingwei Zheng  %cttz = call i32 @llvm.cttz.i32(i32 %y, i1 false)
3609e8ecce8SYingwei Zheng  %res = shl i32 %x, %cttz
3619e8ecce8SYingwei Zheng  ret i32 %res
3629e8ecce8SYingwei Zheng}
3639e8ecce8SYingwei Zheng
3649e8ecce8SYingwei Zhengdefine i32 @shl_cttz_constant_i32(i32 %y) {
3659e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_constant_i32:
3669e8ecce8SYingwei Zheng; RV32I:       # %bb.0: # %entry
3679e8ecce8SYingwei Zheng; RV32I-NEXT:    neg a1, a0
3689e8ecce8SYingwei Zheng; RV32I-NEXT:    and a0, a0, a1
3699e8ecce8SYingwei Zheng; RV32I-NEXT:    slli a0, a0, 2
3709e8ecce8SYingwei Zheng; RV32I-NEXT:    ret
3719e8ecce8SYingwei Zheng;
3729e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_constant_i32:
3739e8ecce8SYingwei Zheng; RV32ZBB:       # %bb.0: # %entry
3749e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz a0, a0
3759e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    li a1, 4
3769e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sll a0, a1, a0
3779e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ret
3789e8ecce8SYingwei Zheng;
3799e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_constant_i32:
3809e8ecce8SYingwei Zheng; RV64I:       # %bb.0: # %entry
3819e8ecce8SYingwei Zheng; RV64I-NEXT:    negw a1, a0
3829e8ecce8SYingwei Zheng; RV64I-NEXT:    and a0, a0, a1
3839e8ecce8SYingwei Zheng; RV64I-NEXT:    lui a1, 30667
3849e8ecce8SYingwei Zheng; RV64I-NEXT:    addi a1, a1, 1329
3859e8ecce8SYingwei Zheng; RV64I-NEXT:    mul a0, a0, a1
3869e8ecce8SYingwei Zheng; RV64I-NEXT:    srliw a0, a0, 27
3879e8ecce8SYingwei Zheng; RV64I-NEXT:    lui a1, %hi(.LCPI6_0)
3889e8ecce8SYingwei Zheng; RV64I-NEXT:    addi a1, a1, %lo(.LCPI6_0)
3899e8ecce8SYingwei Zheng; RV64I-NEXT:    add a0, a1, a0
3909e8ecce8SYingwei Zheng; RV64I-NEXT:    lbu a0, 0(a0)
3919e8ecce8SYingwei Zheng; RV64I-NEXT:    li a1, 4
3929e8ecce8SYingwei Zheng; RV64I-NEXT:    sllw a0, a1, a0
3939e8ecce8SYingwei Zheng; RV64I-NEXT:    ret
3949e8ecce8SYingwei Zheng;
3959e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_constant_i32:
3969e8ecce8SYingwei Zheng; RV64ZBB:       # %bb.0: # %entry
3979e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ctzw a0, a0
3989e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    li a1, 4
3999e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    sllw a0, a1, a0
4009e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ret
4019e8ecce8SYingwei Zhengentry:
4029e8ecce8SYingwei Zheng  %cttz = call i32 @llvm.cttz.i32(i32 %y, i1 true)
4039e8ecce8SYingwei Zheng  %res = shl i32 4, %cttz
4049e8ecce8SYingwei Zheng  ret i32 %res
4059e8ecce8SYingwei Zheng}
4069e8ecce8SYingwei Zheng
4079e8ecce8SYingwei Zhengdefine i32 @shl_cttz_multiuse_i32(i32 %x, i32 %y) {
4089e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_multiuse_i32:
4099e8ecce8SYingwei Zheng; RV32I:       # %bb.0: # %entry
4109e8ecce8SYingwei Zheng; RV32I-NEXT:    addi sp, sp, -16
4119e8ecce8SYingwei Zheng; RV32I-NEXT:    .cfi_def_cfa_offset 16
4129e8ecce8SYingwei Zheng; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4139e8ecce8SYingwei Zheng; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
4149e8ecce8SYingwei Zheng; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
4159e8ecce8SYingwei Zheng; RV32I-NEXT:    .cfi_offset ra, -4
4169e8ecce8SYingwei Zheng; RV32I-NEXT:    .cfi_offset s0, -8
4179e8ecce8SYingwei Zheng; RV32I-NEXT:    .cfi_offset s1, -12
4189e8ecce8SYingwei Zheng; RV32I-NEXT:    neg a2, a1
4199e8ecce8SYingwei Zheng; RV32I-NEXT:    and a1, a1, a2
4209e8ecce8SYingwei Zheng; RV32I-NEXT:    lui a2, 30667
4219e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a2, a2, 1329
4229e8ecce8SYingwei Zheng; RV32I-NEXT:    mul a1, a1, a2
4239e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a1, a1, 27
4249e8ecce8SYingwei Zheng; RV32I-NEXT:    lui a2, %hi(.LCPI7_0)
4259e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a2, a2, %lo(.LCPI7_0)
4269e8ecce8SYingwei Zheng; RV32I-NEXT:    add a1, a2, a1
4279e8ecce8SYingwei Zheng; RV32I-NEXT:    lbu s0, 0(a1)
4289e8ecce8SYingwei Zheng; RV32I-NEXT:    mv s1, a0
4299e8ecce8SYingwei Zheng; RV32I-NEXT:    mv a0, s0
4309e8ecce8SYingwei Zheng; RV32I-NEXT:    call use32
4319e8ecce8SYingwei Zheng; RV32I-NEXT:    sll a0, s1, s0
4329e8ecce8SYingwei Zheng; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4339e8ecce8SYingwei Zheng; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
4349e8ecce8SYingwei Zheng; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
43597982a8cSdlav-sc; RV32I-NEXT:    .cfi_restore ra
43697982a8cSdlav-sc; RV32I-NEXT:    .cfi_restore s0
43797982a8cSdlav-sc; RV32I-NEXT:    .cfi_restore s1
4389e8ecce8SYingwei Zheng; RV32I-NEXT:    addi sp, sp, 16
43997982a8cSdlav-sc; RV32I-NEXT:    .cfi_def_cfa_offset 0
4409e8ecce8SYingwei Zheng; RV32I-NEXT:    ret
4419e8ecce8SYingwei Zheng;
4429e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_multiuse_i32:
4439e8ecce8SYingwei Zheng; RV32ZBB:       # %bb.0: # %entry
4449e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    addi sp, sp, -16
4459e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    .cfi_def_cfa_offset 16
4469e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4479e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
4489e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
4499e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    .cfi_offset ra, -4
4509e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    .cfi_offset s0, -8
4519e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    .cfi_offset s1, -12
4529e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    mv s0, a0
4539e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz s1, a1
4549e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    mv a0, s1
4559e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    call use32
4569e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sll a0, s0, s1
4579e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4589e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
4599e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
46097982a8cSdlav-sc; RV32ZBB-NEXT:    .cfi_restore ra
46197982a8cSdlav-sc; RV32ZBB-NEXT:    .cfi_restore s0
46297982a8cSdlav-sc; RV32ZBB-NEXT:    .cfi_restore s1
4639e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    addi sp, sp, 16
46497982a8cSdlav-sc; RV32ZBB-NEXT:    .cfi_def_cfa_offset 0
4659e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ret
4669e8ecce8SYingwei Zheng;
4679e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_multiuse_i32:
4689e8ecce8SYingwei Zheng; RV64I:       # %bb.0: # %entry
4699e8ecce8SYingwei Zheng; RV64I-NEXT:    addi sp, sp, -32
4709e8ecce8SYingwei Zheng; RV64I-NEXT:    .cfi_def_cfa_offset 32
4719e8ecce8SYingwei Zheng; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
4729e8ecce8SYingwei Zheng; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
4739e8ecce8SYingwei Zheng; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
4749e8ecce8SYingwei Zheng; RV64I-NEXT:    .cfi_offset ra, -8
4759e8ecce8SYingwei Zheng; RV64I-NEXT:    .cfi_offset s0, -16
4769e8ecce8SYingwei Zheng; RV64I-NEXT:    .cfi_offset s1, -24
4779e8ecce8SYingwei Zheng; RV64I-NEXT:    negw a2, a1
4789e8ecce8SYingwei Zheng; RV64I-NEXT:    and a1, a1, a2
4799e8ecce8SYingwei Zheng; RV64I-NEXT:    lui a2, 30667
4809e8ecce8SYingwei Zheng; RV64I-NEXT:    addi a2, a2, 1329
4819e8ecce8SYingwei Zheng; RV64I-NEXT:    mul a1, a1, a2
4829e8ecce8SYingwei Zheng; RV64I-NEXT:    srliw a1, a1, 27
4839e8ecce8SYingwei Zheng; RV64I-NEXT:    lui a2, %hi(.LCPI7_0)
4849e8ecce8SYingwei Zheng; RV64I-NEXT:    addi a2, a2, %lo(.LCPI7_0)
4859e8ecce8SYingwei Zheng; RV64I-NEXT:    add a1, a2, a1
4869e8ecce8SYingwei Zheng; RV64I-NEXT:    lbu s0, 0(a1)
4879e8ecce8SYingwei Zheng; RV64I-NEXT:    mv s1, a0
4889e8ecce8SYingwei Zheng; RV64I-NEXT:    mv a0, s0
4899e8ecce8SYingwei Zheng; RV64I-NEXT:    call use32
4909e8ecce8SYingwei Zheng; RV64I-NEXT:    sllw a0, s1, s0
4919e8ecce8SYingwei Zheng; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
4929e8ecce8SYingwei Zheng; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
4939e8ecce8SYingwei Zheng; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
49497982a8cSdlav-sc; RV64I-NEXT:    .cfi_restore ra
49597982a8cSdlav-sc; RV64I-NEXT:    .cfi_restore s0
49697982a8cSdlav-sc; RV64I-NEXT:    .cfi_restore s1
4979e8ecce8SYingwei Zheng; RV64I-NEXT:    addi sp, sp, 32
49897982a8cSdlav-sc; RV64I-NEXT:    .cfi_def_cfa_offset 0
4999e8ecce8SYingwei Zheng; RV64I-NEXT:    ret
5009e8ecce8SYingwei Zheng;
5019e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_multiuse_i32:
5029e8ecce8SYingwei Zheng; RV64ZBB:       # %bb.0: # %entry
5039e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    addi sp, sp, -32
5049e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    .cfi_def_cfa_offset 32
5059e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
5069e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
5079e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
5089e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    .cfi_offset ra, -8
5099e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    .cfi_offset s0, -16
5109e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    .cfi_offset s1, -24
5119e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    mv s0, a0
5129e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ctzw s1, a1
5139e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    mv a0, s1
5149e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    call use32
5159e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    sllw a0, s0, s1
5169e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
5179e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
5189e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
51997982a8cSdlav-sc; RV64ZBB-NEXT:    .cfi_restore ra
52097982a8cSdlav-sc; RV64ZBB-NEXT:    .cfi_restore s0
52197982a8cSdlav-sc; RV64ZBB-NEXT:    .cfi_restore s1
5229e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    addi sp, sp, 32
52397982a8cSdlav-sc; RV64ZBB-NEXT:    .cfi_def_cfa_offset 0
5249e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ret
5259e8ecce8SYingwei Zhengentry:
5269e8ecce8SYingwei Zheng  %cttz = call i32 @llvm.cttz.i32(i32 %y, i1 true)
5279e8ecce8SYingwei Zheng  call void @use32(i32 %cttz)
5289e8ecce8SYingwei Zheng  %res = shl i32 %x, %cttz
5299e8ecce8SYingwei Zheng  ret i32 %res
5309e8ecce8SYingwei Zheng}
5319e8ecce8SYingwei Zheng
5329e8ecce8SYingwei Zhengdefine i64 @shl_cttz_i64(i64 %x, i64 %y) {
5339e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_i64:
5349e8ecce8SYingwei Zheng; RV32I:       # %bb.0: # %entry
5359e8ecce8SYingwei Zheng; RV32I-NEXT:    lui a4, 30667
5369e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a5, a4, 1329
5379e8ecce8SYingwei Zheng; RV32I-NEXT:    lui a4, %hi(.LCPI8_0)
5389e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a4, a4, %lo(.LCPI8_0)
5399e8ecce8SYingwei Zheng; RV32I-NEXT:    bnez a2, .LBB8_2
5409e8ecce8SYingwei Zheng; RV32I-NEXT:  # %bb.1: # %entry
5419e8ecce8SYingwei Zheng; RV32I-NEXT:    neg a2, a3
5429e8ecce8SYingwei Zheng; RV32I-NEXT:    and a2, a3, a2
5439e8ecce8SYingwei Zheng; RV32I-NEXT:    mul a2, a2, a5
5449e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a2, a2, 27
5459e8ecce8SYingwei Zheng; RV32I-NEXT:    add a2, a4, a2
5469e8ecce8SYingwei Zheng; RV32I-NEXT:    lbu a2, 0(a2)
5479e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a4, a2, 32
5489e8ecce8SYingwei Zheng; RV32I-NEXT:    j .LBB8_3
5499e8ecce8SYingwei Zheng; RV32I-NEXT:  .LBB8_2:
5509e8ecce8SYingwei Zheng; RV32I-NEXT:    neg a3, a2
5519e8ecce8SYingwei Zheng; RV32I-NEXT:    and a2, a2, a3
5529e8ecce8SYingwei Zheng; RV32I-NEXT:    mul a2, a2, a5
5539e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a2, a2, 27
5549e8ecce8SYingwei Zheng; RV32I-NEXT:    add a2, a4, a2
5559e8ecce8SYingwei Zheng; RV32I-NEXT:    lbu a4, 0(a2)
5569e8ecce8SYingwei Zheng; RV32I-NEXT:  .LBB8_3: # %entry
5579e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a3, a4, -32
5589e8ecce8SYingwei Zheng; RV32I-NEXT:    sll a2, a0, a4
5599e8ecce8SYingwei Zheng; RV32I-NEXT:    bltz a3, .LBB8_5
5609e8ecce8SYingwei Zheng; RV32I-NEXT:  # %bb.4: # %entry
5619e8ecce8SYingwei Zheng; RV32I-NEXT:    mv a1, a2
5629e8ecce8SYingwei Zheng; RV32I-NEXT:    j .LBB8_6
5639e8ecce8SYingwei Zheng; RV32I-NEXT:  .LBB8_5:
5649e8ecce8SYingwei Zheng; RV32I-NEXT:    sll a1, a1, a4
5659e8ecce8SYingwei Zheng; RV32I-NEXT:    not a4, a4
5669e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a0, a0, 1
5679e8ecce8SYingwei Zheng; RV32I-NEXT:    srl a0, a0, a4
5689e8ecce8SYingwei Zheng; RV32I-NEXT:    or a1, a1, a0
5699e8ecce8SYingwei Zheng; RV32I-NEXT:  .LBB8_6: # %entry
5709e8ecce8SYingwei Zheng; RV32I-NEXT:    srai a0, a3, 31
5719e8ecce8SYingwei Zheng; RV32I-NEXT:    and a0, a0, a2
5729e8ecce8SYingwei Zheng; RV32I-NEXT:    ret
5739e8ecce8SYingwei Zheng;
5749e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_i64:
5759e8ecce8SYingwei Zheng; RV32ZBB:       # %bb.0: # %entry
5769e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    bnez a2, .LBB8_2
5779e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  # %bb.1: # %entry
5789e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz a2, a3
5799e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    addi a4, a2, 32
5809e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    j .LBB8_3
5819e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  .LBB8_2:
5829e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz a4, a2
5839e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  .LBB8_3: # %entry
5849e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    addi a3, a4, -32
5859e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sll a2, a0, a4
5869e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    bltz a3, .LBB8_5
5879e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  # %bb.4: # %entry
5889e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    mv a1, a2
5899e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    j .LBB8_6
5909e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  .LBB8_5:
5919e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sll a1, a1, a4
5929e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    not a4, a4
5939e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    srli a0, a0, 1
5949e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    srl a0, a0, a4
5959e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    or a1, a1, a0
5969e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  .LBB8_6: # %entry
5979e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    srai a0, a3, 31
5989e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    and a0, a0, a2
5999e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ret
6009e8ecce8SYingwei Zheng;
6019e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_i64:
6029e8ecce8SYingwei Zheng; RV64I:       # %bb.0: # %entry
6039e8ecce8SYingwei Zheng; RV64I-NEXT:    neg a2, a1
6049e8ecce8SYingwei Zheng; RV64I-NEXT:    and a1, a1, a2
6059e8ecce8SYingwei Zheng; RV64I-NEXT:    mul a0, a1, a0
6069e8ecce8SYingwei Zheng; RV64I-NEXT:    ret
6079e8ecce8SYingwei Zheng;
6089e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_i64:
6099e8ecce8SYingwei Zheng; RV64ZBB:       # %bb.0: # %entry
6109e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ctz a1, a1
6119e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    sll a0, a0, a1
6129e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ret
6139e8ecce8SYingwei Zhengentry:
6149e8ecce8SYingwei Zheng  %cttz = call i64 @llvm.cttz.i64(i64 %y, i1 true)
6159e8ecce8SYingwei Zheng  %res = shl i64 %x, %cttz
6169e8ecce8SYingwei Zheng  ret i64 %res
6179e8ecce8SYingwei Zheng}
6189e8ecce8SYingwei Zheng
6199e8ecce8SYingwei Zhengdefine i64 @shl_cttz_constant_i64(i64 %y) {
6209e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_constant_i64:
6219e8ecce8SYingwei Zheng; RV32I:       # %bb.0: # %entry
6229e8ecce8SYingwei Zheng; RV32I-NEXT:    lui a2, 30667
6239e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a3, a2, 1329
6249e8ecce8SYingwei Zheng; RV32I-NEXT:    lui a2, %hi(.LCPI9_0)
6259e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a2, a2, %lo(.LCPI9_0)
6269e8ecce8SYingwei Zheng; RV32I-NEXT:    bnez a0, .LBB9_2
6279e8ecce8SYingwei Zheng; RV32I-NEXT:  # %bb.1: # %entry
6289e8ecce8SYingwei Zheng; RV32I-NEXT:    neg a0, a1
6299e8ecce8SYingwei Zheng; RV32I-NEXT:    and a0, a1, a0
6309e8ecce8SYingwei Zheng; RV32I-NEXT:    mul a0, a0, a3
6319e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a0, a0, 27
6329e8ecce8SYingwei Zheng; RV32I-NEXT:    add a0, a2, a0
6339e8ecce8SYingwei Zheng; RV32I-NEXT:    lbu a0, 0(a0)
6349e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a1, a0, 32
6359e8ecce8SYingwei Zheng; RV32I-NEXT:    j .LBB9_3
6369e8ecce8SYingwei Zheng; RV32I-NEXT:  .LBB9_2:
6379e8ecce8SYingwei Zheng; RV32I-NEXT:    neg a1, a0
6389e8ecce8SYingwei Zheng; RV32I-NEXT:    and a0, a0, a1
6399e8ecce8SYingwei Zheng; RV32I-NEXT:    mul a0, a0, a3
6409e8ecce8SYingwei Zheng; RV32I-NEXT:    srli a0, a0, 27
6419e8ecce8SYingwei Zheng; RV32I-NEXT:    add a0, a2, a0
6429e8ecce8SYingwei Zheng; RV32I-NEXT:    lbu a1, 0(a0)
6439e8ecce8SYingwei Zheng; RV32I-NEXT:  .LBB9_3: # %entry
6449e8ecce8SYingwei Zheng; RV32I-NEXT:    li a0, 4
6459e8ecce8SYingwei Zheng; RV32I-NEXT:    addi a2, a1, -32
6469e8ecce8SYingwei Zheng; RV32I-NEXT:    sll a0, a0, a1
6479e8ecce8SYingwei Zheng; RV32I-NEXT:    bltz a2, .LBB9_5
6489e8ecce8SYingwei Zheng; RV32I-NEXT:  # %bb.4: # %entry
6499e8ecce8SYingwei Zheng; RV32I-NEXT:    mv a1, a0
6509e8ecce8SYingwei Zheng; RV32I-NEXT:    j .LBB9_6
6519e8ecce8SYingwei Zheng; RV32I-NEXT:  .LBB9_5:
6529e8ecce8SYingwei Zheng; RV32I-NEXT:    not a1, a1
6539e8ecce8SYingwei Zheng; RV32I-NEXT:    li a3, 2
6549e8ecce8SYingwei Zheng; RV32I-NEXT:    srl a1, a3, a1
6559e8ecce8SYingwei Zheng; RV32I-NEXT:  .LBB9_6: # %entry
6569e8ecce8SYingwei Zheng; RV32I-NEXT:    srai a2, a2, 31
6579e8ecce8SYingwei Zheng; RV32I-NEXT:    and a0, a2, a0
6589e8ecce8SYingwei Zheng; RV32I-NEXT:    ret
6599e8ecce8SYingwei Zheng;
6609e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_constant_i64:
6619e8ecce8SYingwei Zheng; RV32ZBB:       # %bb.0: # %entry
6629e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    bnez a0, .LBB9_2
6639e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  # %bb.1: # %entry
6649e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz a0, a1
6659e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    addi a1, a0, 32
6669e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    j .LBB9_3
6679e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  .LBB9_2:
6689e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ctz a1, a0
6699e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  .LBB9_3: # %entry
6709e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    li a0, 4
6719e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    addi a2, a1, -32
6729e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    sll a0, a0, a1
6739e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    bltz a2, .LBB9_5
6749e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  # %bb.4: # %entry
6759e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    mv a1, a0
6769e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    j .LBB9_6
6779e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  .LBB9_5:
6789e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    not a1, a1
6799e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    li a3, 2
6809e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    srl a1, a3, a1
6819e8ecce8SYingwei Zheng; RV32ZBB-NEXT:  .LBB9_6: # %entry
6829e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    srai a2, a2, 31
6839e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    and a0, a2, a0
6849e8ecce8SYingwei Zheng; RV32ZBB-NEXT:    ret
6859e8ecce8SYingwei Zheng;
6869e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_constant_i64:
6879e8ecce8SYingwei Zheng; RV64I:       # %bb.0: # %entry
6889e8ecce8SYingwei Zheng; RV64I-NEXT:    neg a1, a0
6899e8ecce8SYingwei Zheng; RV64I-NEXT:    and a0, a0, a1
6909e8ecce8SYingwei Zheng; RV64I-NEXT:    slli a0, a0, 2
6919e8ecce8SYingwei Zheng; RV64I-NEXT:    ret
6929e8ecce8SYingwei Zheng;
6939e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_constant_i64:
6949e8ecce8SYingwei Zheng; RV64ZBB:       # %bb.0: # %entry
6959e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ctz a0, a0
6969e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    li a1, 4
6979e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    sll a0, a1, a0
6989e8ecce8SYingwei Zheng; RV64ZBB-NEXT:    ret
6999e8ecce8SYingwei Zhengentry:
7009e8ecce8SYingwei Zheng  %cttz = call i64 @llvm.cttz.i64(i64 %y, i1 true)
7019e8ecce8SYingwei Zheng  %res = shl i64 4, %cttz
7029e8ecce8SYingwei Zheng  ret i64 %res
7039e8ecce8SYingwei Zheng}
7049e8ecce8SYingwei Zheng
7059e8ecce8SYingwei Zhengdeclare void @use32(i32 signext)
706