[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / RISCV / bswap-ctlz-cttz-ctpop.ll
blob1921e236837ad7304f79411e3d2d0c122f751423
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s -check-prefix=RV32I
4 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s -check-prefix=RV64I
7 declare i16 @llvm.bswap.i16(i16)
8 declare i32 @llvm.bswap.i32(i32)
9 declare i64 @llvm.bswap.i64(i64)
10 declare i8 @llvm.cttz.i8(i8, i1)
11 declare i16 @llvm.cttz.i16(i16, i1)
12 declare i32 @llvm.cttz.i32(i32, i1)
13 declare i64 @llvm.cttz.i64(i64, i1)
14 declare i32 @llvm.ctlz.i32(i32, i1)
15 declare i32 @llvm.ctpop.i32(i32)
16 declare i64 @llvm.ctpop.i64(i64)
18 define i16 @test_bswap_i16(i16 %a) nounwind {
19 ; RV32I-LABEL: test_bswap_i16:
20 ; RV32I:       # %bb.0:
21 ; RV32I-NEXT:    slli a1, a0, 8
22 ; RV32I-NEXT:    slli a0, a0, 16
23 ; RV32I-NEXT:    srli a0, a0, 24
24 ; RV32I-NEXT:    or a0, a1, a0
25 ; RV32I-NEXT:    ret
27 ; RV64I-LABEL: test_bswap_i16:
28 ; RV64I:       # %bb.0:
29 ; RV64I-NEXT:    slli a1, a0, 8
30 ; RV64I-NEXT:    slli a0, a0, 48
31 ; RV64I-NEXT:    srli a0, a0, 56
32 ; RV64I-NEXT:    or a0, a1, a0
33 ; RV64I-NEXT:    ret
34   %tmp = call i16 @llvm.bswap.i16(i16 %a)
35   ret i16 %tmp
38 define i32 @test_bswap_i32(i32 %a) nounwind {
39 ; RV32I-LABEL: test_bswap_i32:
40 ; RV32I:       # %bb.0:
41 ; RV32I-NEXT:    srli a1, a0, 8
42 ; RV32I-NEXT:    lui a2, 16
43 ; RV32I-NEXT:    addi a2, a2, -256
44 ; RV32I-NEXT:    and a1, a1, a2
45 ; RV32I-NEXT:    srli a2, a0, 24
46 ; RV32I-NEXT:    or a1, a1, a2
47 ; RV32I-NEXT:    slli a2, a0, 8
48 ; RV32I-NEXT:    lui a3, 4080
49 ; RV32I-NEXT:    and a2, a2, a3
50 ; RV32I-NEXT:    slli a0, a0, 24
51 ; RV32I-NEXT:    or a0, a0, a2
52 ; RV32I-NEXT:    or a0, a0, a1
53 ; RV32I-NEXT:    ret
55 ; RV64I-LABEL: test_bswap_i32:
56 ; RV64I:       # %bb.0:
57 ; RV64I-NEXT:    srliw a1, a0, 8
58 ; RV64I-NEXT:    lui a2, 16
59 ; RV64I-NEXT:    addiw a2, a2, -256
60 ; RV64I-NEXT:    and a1, a1, a2
61 ; RV64I-NEXT:    srliw a2, a0, 24
62 ; RV64I-NEXT:    or a1, a1, a2
63 ; RV64I-NEXT:    slli a2, a0, 8
64 ; RV64I-NEXT:    lui a3, 4080
65 ; RV64I-NEXT:    and a2, a2, a3
66 ; RV64I-NEXT:    slli a0, a0, 24
67 ; RV64I-NEXT:    or a0, a0, a2
68 ; RV64I-NEXT:    or a0, a0, a1
69 ; RV64I-NEXT:    ret
70   %tmp = call i32 @llvm.bswap.i32(i32 %a)
71   ret i32 %tmp
74 define i64 @test_bswap_i64(i64 %a) nounwind {
75 ; RV32I-LABEL: test_bswap_i64:
76 ; RV32I:       # %bb.0:
77 ; RV32I-NEXT:    srli a2, a1, 8
78 ; RV32I-NEXT:    lui a3, 16
79 ; RV32I-NEXT:    addi a3, a3, -256
80 ; RV32I-NEXT:    and a2, a2, a3
81 ; RV32I-NEXT:    srli a4, a1, 24
82 ; RV32I-NEXT:    or a2, a2, a4
83 ; RV32I-NEXT:    slli a4, a1, 8
84 ; RV32I-NEXT:    lui a5, 4080
85 ; RV32I-NEXT:    and a4, a4, a5
86 ; RV32I-NEXT:    slli a1, a1, 24
87 ; RV32I-NEXT:    or a1, a1, a4
88 ; RV32I-NEXT:    or a2, a1, a2
89 ; RV32I-NEXT:    srli a1, a0, 8
90 ; RV32I-NEXT:    and a1, a1, a3
91 ; RV32I-NEXT:    srli a3, a0, 24
92 ; RV32I-NEXT:    or a1, a1, a3
93 ; RV32I-NEXT:    slli a3, a0, 8
94 ; RV32I-NEXT:    and a3, a3, a5
95 ; RV32I-NEXT:    slli a0, a0, 24
96 ; RV32I-NEXT:    or a0, a0, a3
97 ; RV32I-NEXT:    or a1, a0, a1
98 ; RV32I-NEXT:    mv a0, a2
99 ; RV32I-NEXT:    ret
101 ; RV64I-LABEL: test_bswap_i64:
102 ; RV64I:       # %bb.0:
103 ; RV64I-NEXT:    srli a1, a0, 24
104 ; RV64I-NEXT:    lui a2, 4080
105 ; RV64I-NEXT:    and a1, a1, a2
106 ; RV64I-NEXT:    srli a2, a0, 8
107 ; RV64I-NEXT:    addi a3, zero, 255
108 ; RV64I-NEXT:    slli a4, a3, 24
109 ; RV64I-NEXT:    and a2, a2, a4
110 ; RV64I-NEXT:    or a1, a2, a1
111 ; RV64I-NEXT:    srli a2, a0, 40
112 ; RV64I-NEXT:    lui a4, 16
113 ; RV64I-NEXT:    addiw a4, a4, -256
114 ; RV64I-NEXT:    and a2, a2, a4
115 ; RV64I-NEXT:    srli a4, a0, 56
116 ; RV64I-NEXT:    or a2, a2, a4
117 ; RV64I-NEXT:    or a1, a1, a2
118 ; RV64I-NEXT:    slli a2, a0, 8
119 ; RV64I-NEXT:    slli a4, a3, 32
120 ; RV64I-NEXT:    and a2, a2, a4
121 ; RV64I-NEXT:    slli a4, a0, 24
122 ; RV64I-NEXT:    slli a5, a3, 40
123 ; RV64I-NEXT:    and a4, a4, a5
124 ; RV64I-NEXT:    or a2, a4, a2
125 ; RV64I-NEXT:    slli a4, a0, 40
126 ; RV64I-NEXT:    slli a3, a3, 48
127 ; RV64I-NEXT:    and a3, a4, a3
128 ; RV64I-NEXT:    slli a0, a0, 56
129 ; RV64I-NEXT:    or a0, a0, a3
130 ; RV64I-NEXT:    or a0, a0, a2
131 ; RV64I-NEXT:    or a0, a0, a1
132 ; RV64I-NEXT:    ret
133   %tmp = call i64 @llvm.bswap.i64(i64 %a)
134   ret i64 %tmp
137 define i8 @test_cttz_i8(i8 %a) nounwind {
138 ; RV32I-LABEL: test_cttz_i8:
139 ; RV32I:       # %bb.0:
140 ; RV32I-NEXT:    addi sp, sp, -16
141 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
142 ; RV32I-NEXT:    andi a1, a0, 255
143 ; RV32I-NEXT:    beqz a1, .LBB3_2
144 ; RV32I-NEXT:  # %bb.1: # %cond.false
145 ; RV32I-NEXT:    addi a1, a0, -1
146 ; RV32I-NEXT:    not a0, a0
147 ; RV32I-NEXT:    and a0, a0, a1
148 ; RV32I-NEXT:    srli a1, a0, 1
149 ; RV32I-NEXT:    lui a2, 349525
150 ; RV32I-NEXT:    addi a2, a2, 1365
151 ; RV32I-NEXT:    and a1, a1, a2
152 ; RV32I-NEXT:    sub a0, a0, a1
153 ; RV32I-NEXT:    lui a1, 209715
154 ; RV32I-NEXT:    addi a1, a1, 819
155 ; RV32I-NEXT:    and a2, a0, a1
156 ; RV32I-NEXT:    srli a0, a0, 2
157 ; RV32I-NEXT:    and a0, a0, a1
158 ; RV32I-NEXT:    add a0, a2, a0
159 ; RV32I-NEXT:    srli a1, a0, 4
160 ; RV32I-NEXT:    add a0, a0, a1
161 ; RV32I-NEXT:    lui a1, 61681
162 ; RV32I-NEXT:    addi a1, a1, -241
163 ; RV32I-NEXT:    and a0, a0, a1
164 ; RV32I-NEXT:    lui a1, 4112
165 ; RV32I-NEXT:    addi a1, a1, 257
166 ; RV32I-NEXT:    call __mulsi3@plt
167 ; RV32I-NEXT:    srli a0, a0, 24
168 ; RV32I-NEXT:    j .LBB3_3
169 ; RV32I-NEXT:  .LBB3_2:
170 ; RV32I-NEXT:    addi a0, zero, 8
171 ; RV32I-NEXT:  .LBB3_3: # %cond.end
172 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
173 ; RV32I-NEXT:    addi sp, sp, 16
174 ; RV32I-NEXT:    ret
176 ; RV64I-LABEL: test_cttz_i8:
177 ; RV64I:       # %bb.0:
178 ; RV64I-NEXT:    addi sp, sp, -16
179 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
180 ; RV64I-NEXT:    andi a1, a0, 255
181 ; RV64I-NEXT:    beqz a1, .LBB3_2
182 ; RV64I-NEXT:  # %bb.1: # %cond.false
183 ; RV64I-NEXT:    addi a1, a0, -1
184 ; RV64I-NEXT:    not a0, a0
185 ; RV64I-NEXT:    and a0, a0, a1
186 ; RV64I-NEXT:    srli a1, a0, 1
187 ; RV64I-NEXT:    lui a2, 21845
188 ; RV64I-NEXT:    addiw a2, a2, 1365
189 ; RV64I-NEXT:    slli a2, a2, 12
190 ; RV64I-NEXT:    addi a2, a2, 1365
191 ; RV64I-NEXT:    slli a2, a2, 12
192 ; RV64I-NEXT:    addi a2, a2, 1365
193 ; RV64I-NEXT:    slli a2, a2, 12
194 ; RV64I-NEXT:    addi a2, a2, 1365
195 ; RV64I-NEXT:    and a1, a1, a2
196 ; RV64I-NEXT:    sub a0, a0, a1
197 ; RV64I-NEXT:    lui a1, 13107
198 ; RV64I-NEXT:    addiw a1, a1, 819
199 ; RV64I-NEXT:    slli a1, a1, 12
200 ; RV64I-NEXT:    addi a1, a1, 819
201 ; RV64I-NEXT:    slli a1, a1, 12
202 ; RV64I-NEXT:    addi a1, a1, 819
203 ; RV64I-NEXT:    slli a1, a1, 12
204 ; RV64I-NEXT:    addi a1, a1, 819
205 ; RV64I-NEXT:    and a2, a0, a1
206 ; RV64I-NEXT:    srli a0, a0, 2
207 ; RV64I-NEXT:    and a0, a0, a1
208 ; RV64I-NEXT:    add a0, a2, a0
209 ; RV64I-NEXT:    srli a1, a0, 4
210 ; RV64I-NEXT:    add a0, a0, a1
211 ; RV64I-NEXT:    lui a1, 3855
212 ; RV64I-NEXT:    addiw a1, a1, 241
213 ; RV64I-NEXT:    slli a1, a1, 12
214 ; RV64I-NEXT:    addi a1, a1, -241
215 ; RV64I-NEXT:    slli a1, a1, 12
216 ; RV64I-NEXT:    addi a1, a1, 241
217 ; RV64I-NEXT:    slli a1, a1, 12
218 ; RV64I-NEXT:    addi a1, a1, -241
219 ; RV64I-NEXT:    and a0, a0, a1
220 ; RV64I-NEXT:    lui a1, 4112
221 ; RV64I-NEXT:    addiw a1, a1, 257
222 ; RV64I-NEXT:    slli a1, a1, 16
223 ; RV64I-NEXT:    addi a1, a1, 257
224 ; RV64I-NEXT:    slli a1, a1, 16
225 ; RV64I-NEXT:    addi a1, a1, 257
226 ; RV64I-NEXT:    call __muldi3@plt
227 ; RV64I-NEXT:    srli a0, a0, 56
228 ; RV64I-NEXT:    j .LBB3_3
229 ; RV64I-NEXT:  .LBB3_2:
230 ; RV64I-NEXT:    addi a0, zero, 8
231 ; RV64I-NEXT:  .LBB3_3: # %cond.end
232 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
233 ; RV64I-NEXT:    addi sp, sp, 16
234 ; RV64I-NEXT:    ret
235   %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 false)
236   ret i8 %tmp
239 define i16 @test_cttz_i16(i16 %a) nounwind {
240 ; RV32I-LABEL: test_cttz_i16:
241 ; RV32I:       # %bb.0:
242 ; RV32I-NEXT:    addi sp, sp, -16
243 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
244 ; RV32I-NEXT:    lui a1, 16
245 ; RV32I-NEXT:    addi a1, a1, -1
246 ; RV32I-NEXT:    and a1, a0, a1
247 ; RV32I-NEXT:    beqz a1, .LBB4_2
248 ; RV32I-NEXT:  # %bb.1: # %cond.false
249 ; RV32I-NEXT:    addi a1, a0, -1
250 ; RV32I-NEXT:    not a0, a0
251 ; RV32I-NEXT:    and a0, a0, a1
252 ; RV32I-NEXT:    srli a1, a0, 1
253 ; RV32I-NEXT:    lui a2, 349525
254 ; RV32I-NEXT:    addi a2, a2, 1365
255 ; RV32I-NEXT:    and a1, a1, a2
256 ; RV32I-NEXT:    sub a0, a0, a1
257 ; RV32I-NEXT:    lui a1, 209715
258 ; RV32I-NEXT:    addi a1, a1, 819
259 ; RV32I-NEXT:    and a2, a0, a1
260 ; RV32I-NEXT:    srli a0, a0, 2
261 ; RV32I-NEXT:    and a0, a0, a1
262 ; RV32I-NEXT:    add a0, a2, a0
263 ; RV32I-NEXT:    srli a1, a0, 4
264 ; RV32I-NEXT:    add a0, a0, a1
265 ; RV32I-NEXT:    lui a1, 61681
266 ; RV32I-NEXT:    addi a1, a1, -241
267 ; RV32I-NEXT:    and a0, a0, a1
268 ; RV32I-NEXT:    lui a1, 4112
269 ; RV32I-NEXT:    addi a1, a1, 257
270 ; RV32I-NEXT:    call __mulsi3@plt
271 ; RV32I-NEXT:    srli a0, a0, 24
272 ; RV32I-NEXT:    j .LBB4_3
273 ; RV32I-NEXT:  .LBB4_2:
274 ; RV32I-NEXT:    addi a0, zero, 16
275 ; RV32I-NEXT:  .LBB4_3: # %cond.end
276 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
277 ; RV32I-NEXT:    addi sp, sp, 16
278 ; RV32I-NEXT:    ret
280 ; RV64I-LABEL: test_cttz_i16:
281 ; RV64I:       # %bb.0:
282 ; RV64I-NEXT:    addi sp, sp, -16
283 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
284 ; RV64I-NEXT:    lui a1, 16
285 ; RV64I-NEXT:    addiw a1, a1, -1
286 ; RV64I-NEXT:    and a1, a0, a1
287 ; RV64I-NEXT:    beqz a1, .LBB4_2
288 ; RV64I-NEXT:  # %bb.1: # %cond.false
289 ; RV64I-NEXT:    addi a1, a0, -1
290 ; RV64I-NEXT:    not a0, a0
291 ; RV64I-NEXT:    and a0, a0, a1
292 ; RV64I-NEXT:    srli a1, a0, 1
293 ; RV64I-NEXT:    lui a2, 21845
294 ; RV64I-NEXT:    addiw a2, a2, 1365
295 ; RV64I-NEXT:    slli a2, a2, 12
296 ; RV64I-NEXT:    addi a2, a2, 1365
297 ; RV64I-NEXT:    slli a2, a2, 12
298 ; RV64I-NEXT:    addi a2, a2, 1365
299 ; RV64I-NEXT:    slli a2, a2, 12
300 ; RV64I-NEXT:    addi a2, a2, 1365
301 ; RV64I-NEXT:    and a1, a1, a2
302 ; RV64I-NEXT:    sub a0, a0, a1
303 ; RV64I-NEXT:    lui a1, 13107
304 ; RV64I-NEXT:    addiw a1, a1, 819
305 ; RV64I-NEXT:    slli a1, a1, 12
306 ; RV64I-NEXT:    addi a1, a1, 819
307 ; RV64I-NEXT:    slli a1, a1, 12
308 ; RV64I-NEXT:    addi a1, a1, 819
309 ; RV64I-NEXT:    slli a1, a1, 12
310 ; RV64I-NEXT:    addi a1, a1, 819
311 ; RV64I-NEXT:    and a2, a0, a1
312 ; RV64I-NEXT:    srli a0, a0, 2
313 ; RV64I-NEXT:    and a0, a0, a1
314 ; RV64I-NEXT:    add a0, a2, a0
315 ; RV64I-NEXT:    srli a1, a0, 4
316 ; RV64I-NEXT:    add a0, a0, a1
317 ; RV64I-NEXT:    lui a1, 3855
318 ; RV64I-NEXT:    addiw a1, a1, 241
319 ; RV64I-NEXT:    slli a1, a1, 12
320 ; RV64I-NEXT:    addi a1, a1, -241
321 ; RV64I-NEXT:    slli a1, a1, 12
322 ; RV64I-NEXT:    addi a1, a1, 241
323 ; RV64I-NEXT:    slli a1, a1, 12
324 ; RV64I-NEXT:    addi a1, a1, -241
325 ; RV64I-NEXT:    and a0, a0, a1
326 ; RV64I-NEXT:    lui a1, 4112
327 ; RV64I-NEXT:    addiw a1, a1, 257
328 ; RV64I-NEXT:    slli a1, a1, 16
329 ; RV64I-NEXT:    addi a1, a1, 257
330 ; RV64I-NEXT:    slli a1, a1, 16
331 ; RV64I-NEXT:    addi a1, a1, 257
332 ; RV64I-NEXT:    call __muldi3@plt
333 ; RV64I-NEXT:    srli a0, a0, 56
334 ; RV64I-NEXT:    j .LBB4_3
335 ; RV64I-NEXT:  .LBB4_2:
336 ; RV64I-NEXT:    addi a0, zero, 16
337 ; RV64I-NEXT:  .LBB4_3: # %cond.end
338 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
339 ; RV64I-NEXT:    addi sp, sp, 16
340 ; RV64I-NEXT:    ret
341   %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 false)
342   ret i16 %tmp
345 define i32 @test_cttz_i32(i32 %a) nounwind {
346 ; RV32I-LABEL: test_cttz_i32:
347 ; RV32I:       # %bb.0:
348 ; RV32I-NEXT:    addi sp, sp, -16
349 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
350 ; RV32I-NEXT:    beqz a0, .LBB5_2
351 ; RV32I-NEXT:  # %bb.1: # %cond.false
352 ; RV32I-NEXT:    addi a1, a0, -1
353 ; RV32I-NEXT:    not a0, a0
354 ; RV32I-NEXT:    and a0, a0, a1
355 ; RV32I-NEXT:    srli a1, a0, 1
356 ; RV32I-NEXT:    lui a2, 349525
357 ; RV32I-NEXT:    addi a2, a2, 1365
358 ; RV32I-NEXT:    and a1, a1, a2
359 ; RV32I-NEXT:    sub a0, a0, a1
360 ; RV32I-NEXT:    lui a1, 209715
361 ; RV32I-NEXT:    addi a1, a1, 819
362 ; RV32I-NEXT:    and a2, a0, a1
363 ; RV32I-NEXT:    srli a0, a0, 2
364 ; RV32I-NEXT:    and a0, a0, a1
365 ; RV32I-NEXT:    add a0, a2, a0
366 ; RV32I-NEXT:    srli a1, a0, 4
367 ; RV32I-NEXT:    add a0, a0, a1
368 ; RV32I-NEXT:    lui a1, 61681
369 ; RV32I-NEXT:    addi a1, a1, -241
370 ; RV32I-NEXT:    and a0, a0, a1
371 ; RV32I-NEXT:    lui a1, 4112
372 ; RV32I-NEXT:    addi a1, a1, 257
373 ; RV32I-NEXT:    call __mulsi3@plt
374 ; RV32I-NEXT:    srli a0, a0, 24
375 ; RV32I-NEXT:    j .LBB5_3
376 ; RV32I-NEXT:  .LBB5_2:
377 ; RV32I-NEXT:    addi a0, zero, 32
378 ; RV32I-NEXT:  .LBB5_3: # %cond.end
379 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
380 ; RV32I-NEXT:    addi sp, sp, 16
381 ; RV32I-NEXT:    ret
383 ; RV64I-LABEL: test_cttz_i32:
384 ; RV64I:       # %bb.0:
385 ; RV64I-NEXT:    addi sp, sp, -16
386 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
387 ; RV64I-NEXT:    sext.w a1, a0
388 ; RV64I-NEXT:    beqz a1, .LBB5_2
389 ; RV64I-NEXT:  # %bb.1: # %cond.false
390 ; RV64I-NEXT:    addi a1, a0, -1
391 ; RV64I-NEXT:    not a0, a0
392 ; RV64I-NEXT:    and a0, a0, a1
393 ; RV64I-NEXT:    srli a1, a0, 1
394 ; RV64I-NEXT:    lui a2, 21845
395 ; RV64I-NEXT:    addiw a2, a2, 1365
396 ; RV64I-NEXT:    slli a2, a2, 12
397 ; RV64I-NEXT:    addi a2, a2, 1365
398 ; RV64I-NEXT:    slli a2, a2, 12
399 ; RV64I-NEXT:    addi a2, a2, 1365
400 ; RV64I-NEXT:    slli a2, a2, 12
401 ; RV64I-NEXT:    addi a2, a2, 1365
402 ; RV64I-NEXT:    and a1, a1, a2
403 ; RV64I-NEXT:    sub a0, a0, a1
404 ; RV64I-NEXT:    lui a1, 13107
405 ; RV64I-NEXT:    addiw a1, a1, 819
406 ; RV64I-NEXT:    slli a1, a1, 12
407 ; RV64I-NEXT:    addi a1, a1, 819
408 ; RV64I-NEXT:    slli a1, a1, 12
409 ; RV64I-NEXT:    addi a1, a1, 819
410 ; RV64I-NEXT:    slli a1, a1, 12
411 ; RV64I-NEXT:    addi a1, a1, 819
412 ; RV64I-NEXT:    and a2, a0, a1
413 ; RV64I-NEXT:    srli a0, a0, 2
414 ; RV64I-NEXT:    and a0, a0, a1
415 ; RV64I-NEXT:    add a0, a2, a0
416 ; RV64I-NEXT:    srli a1, a0, 4
417 ; RV64I-NEXT:    add a0, a0, a1
418 ; RV64I-NEXT:    lui a1, 3855
419 ; RV64I-NEXT:    addiw a1, a1, 241
420 ; RV64I-NEXT:    slli a1, a1, 12
421 ; RV64I-NEXT:    addi a1, a1, -241
422 ; RV64I-NEXT:    slli a1, a1, 12
423 ; RV64I-NEXT:    addi a1, a1, 241
424 ; RV64I-NEXT:    slli a1, a1, 12
425 ; RV64I-NEXT:    addi a1, a1, -241
426 ; RV64I-NEXT:    and a0, a0, a1
427 ; RV64I-NEXT:    lui a1, 4112
428 ; RV64I-NEXT:    addiw a1, a1, 257
429 ; RV64I-NEXT:    slli a1, a1, 16
430 ; RV64I-NEXT:    addi a1, a1, 257
431 ; RV64I-NEXT:    slli a1, a1, 16
432 ; RV64I-NEXT:    addi a1, a1, 257
433 ; RV64I-NEXT:    call __muldi3@plt
434 ; RV64I-NEXT:    srli a0, a0, 56
435 ; RV64I-NEXT:    j .LBB5_3
436 ; RV64I-NEXT:  .LBB5_2:
437 ; RV64I-NEXT:    addi a0, zero, 32
438 ; RV64I-NEXT:  .LBB5_3: # %cond.end
439 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
440 ; RV64I-NEXT:    addi sp, sp, 16
441 ; RV64I-NEXT:    ret
442   %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 false)
443   ret i32 %tmp
446 define i32 @test_ctlz_i32(i32 %a) nounwind {
447 ; RV32I-LABEL: test_ctlz_i32:
448 ; RV32I:       # %bb.0:
449 ; RV32I-NEXT:    addi sp, sp, -16
450 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
451 ; RV32I-NEXT:    beqz a0, .LBB6_2
452 ; RV32I-NEXT:  # %bb.1: # %cond.false
453 ; RV32I-NEXT:    srli a1, a0, 1
454 ; RV32I-NEXT:    or a0, a0, a1
455 ; RV32I-NEXT:    srli a1, a0, 2
456 ; RV32I-NEXT:    or a0, a0, a1
457 ; RV32I-NEXT:    srli a1, a0, 4
458 ; RV32I-NEXT:    or a0, a0, a1
459 ; RV32I-NEXT:    srli a1, a0, 8
460 ; RV32I-NEXT:    or a0, a0, a1
461 ; RV32I-NEXT:    srli a1, a0, 16
462 ; RV32I-NEXT:    or a0, a0, a1
463 ; RV32I-NEXT:    not a0, a0
464 ; RV32I-NEXT:    srli a1, a0, 1
465 ; RV32I-NEXT:    lui a2, 349525
466 ; RV32I-NEXT:    addi a2, a2, 1365
467 ; RV32I-NEXT:    and a1, a1, a2
468 ; RV32I-NEXT:    sub a0, a0, a1
469 ; RV32I-NEXT:    lui a1, 209715
470 ; RV32I-NEXT:    addi a1, a1, 819
471 ; RV32I-NEXT:    and a2, a0, a1
472 ; RV32I-NEXT:    srli a0, a0, 2
473 ; RV32I-NEXT:    and a0, a0, a1
474 ; RV32I-NEXT:    add a0, a2, a0
475 ; RV32I-NEXT:    srli a1, a0, 4
476 ; RV32I-NEXT:    add a0, a0, a1
477 ; RV32I-NEXT:    lui a1, 61681
478 ; RV32I-NEXT:    addi a1, a1, -241
479 ; RV32I-NEXT:    and a0, a0, a1
480 ; RV32I-NEXT:    lui a1, 4112
481 ; RV32I-NEXT:    addi a1, a1, 257
482 ; RV32I-NEXT:    call __mulsi3@plt
483 ; RV32I-NEXT:    srli a0, a0, 24
484 ; RV32I-NEXT:    j .LBB6_3
485 ; RV32I-NEXT:  .LBB6_2:
486 ; RV32I-NEXT:    addi a0, zero, 32
487 ; RV32I-NEXT:  .LBB6_3: # %cond.end
488 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
489 ; RV32I-NEXT:    addi sp, sp, 16
490 ; RV32I-NEXT:    ret
492 ; RV64I-LABEL: test_ctlz_i32:
493 ; RV64I:       # %bb.0:
494 ; RV64I-NEXT:    addi sp, sp, -16
495 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
496 ; RV64I-NEXT:    sext.w a1, a0
497 ; RV64I-NEXT:    beqz a1, .LBB6_2
498 ; RV64I-NEXT:  # %bb.1: # %cond.false
499 ; RV64I-NEXT:    srliw a1, a0, 1
500 ; RV64I-NEXT:    slli a0, a0, 32
501 ; RV64I-NEXT:    srli a0, a0, 32
502 ; RV64I-NEXT:    or a0, a0, a1
503 ; RV64I-NEXT:    srli a1, a0, 2
504 ; RV64I-NEXT:    or a0, a0, a1
505 ; RV64I-NEXT:    srli a1, a0, 4
506 ; RV64I-NEXT:    or a0, a0, a1
507 ; RV64I-NEXT:    srli a1, a0, 8
508 ; RV64I-NEXT:    or a0, a0, a1
509 ; RV64I-NEXT:    srli a1, a0, 16
510 ; RV64I-NEXT:    or a0, a0, a1
511 ; RV64I-NEXT:    srli a1, a0, 32
512 ; RV64I-NEXT:    or a0, a0, a1
513 ; RV64I-NEXT:    not a0, a0
514 ; RV64I-NEXT:    srli a1, a0, 1
515 ; RV64I-NEXT:    lui a2, 21845
516 ; RV64I-NEXT:    addiw a2, a2, 1365
517 ; RV64I-NEXT:    slli a2, a2, 12
518 ; RV64I-NEXT:    addi a2, a2, 1365
519 ; RV64I-NEXT:    slli a2, a2, 12
520 ; RV64I-NEXT:    addi a2, a2, 1365
521 ; RV64I-NEXT:    slli a2, a2, 12
522 ; RV64I-NEXT:    addi a2, a2, 1365
523 ; RV64I-NEXT:    and a1, a1, a2
524 ; RV64I-NEXT:    sub a0, a0, a1
525 ; RV64I-NEXT:    lui a1, 13107
526 ; RV64I-NEXT:    addiw a1, a1, 819
527 ; RV64I-NEXT:    slli a1, a1, 12
528 ; RV64I-NEXT:    addi a1, a1, 819
529 ; RV64I-NEXT:    slli a1, a1, 12
530 ; RV64I-NEXT:    addi a1, a1, 819
531 ; RV64I-NEXT:    slli a1, a1, 12
532 ; RV64I-NEXT:    addi a1, a1, 819
533 ; RV64I-NEXT:    and a2, a0, a1
534 ; RV64I-NEXT:    srli a0, a0, 2
535 ; RV64I-NEXT:    and a0, a0, a1
536 ; RV64I-NEXT:    add a0, a2, a0
537 ; RV64I-NEXT:    srli a1, a0, 4
538 ; RV64I-NEXT:    add a0, a0, a1
539 ; RV64I-NEXT:    lui a1, 3855
540 ; RV64I-NEXT:    addiw a1, a1, 241
541 ; RV64I-NEXT:    slli a1, a1, 12
542 ; RV64I-NEXT:    addi a1, a1, -241
543 ; RV64I-NEXT:    slli a1, a1, 12
544 ; RV64I-NEXT:    addi a1, a1, 241
545 ; RV64I-NEXT:    slli a1, a1, 12
546 ; RV64I-NEXT:    addi a1, a1, -241
547 ; RV64I-NEXT:    and a0, a0, a1
548 ; RV64I-NEXT:    lui a1, 4112
549 ; RV64I-NEXT:    addiw a1, a1, 257
550 ; RV64I-NEXT:    slli a1, a1, 16
551 ; RV64I-NEXT:    addi a1, a1, 257
552 ; RV64I-NEXT:    slli a1, a1, 16
553 ; RV64I-NEXT:    addi a1, a1, 257
554 ; RV64I-NEXT:    call __muldi3@plt
555 ; RV64I-NEXT:    srli a0, a0, 56
556 ; RV64I-NEXT:    addi a0, a0, -32
557 ; RV64I-NEXT:    j .LBB6_3
558 ; RV64I-NEXT:  .LBB6_2:
559 ; RV64I-NEXT:    addi a0, zero, 32
560 ; RV64I-NEXT:  .LBB6_3: # %cond.end
561 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
562 ; RV64I-NEXT:    addi sp, sp, 16
563 ; RV64I-NEXT:    ret
564   %tmp = call i32 @llvm.ctlz.i32(i32 %a, i1 false)
565   ret i32 %tmp
568 define i64 @test_cttz_i64(i64 %a) nounwind {
569 ; RV32I-LABEL: test_cttz_i64:
570 ; RV32I:       # %bb.0:
571 ; RV32I-NEXT:    addi sp, sp, -32
572 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
573 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
574 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
575 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
576 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
577 ; RV32I-NEXT:    sw s4, 8(sp) # 4-byte Folded Spill
578 ; RV32I-NEXT:    sw s5, 4(sp) # 4-byte Folded Spill
579 ; RV32I-NEXT:    sw s6, 0(sp) # 4-byte Folded Spill
580 ; RV32I-NEXT:    mv s3, a1
581 ; RV32I-NEXT:    mv s4, a0
582 ; RV32I-NEXT:    addi a0, a0, -1
583 ; RV32I-NEXT:    not a1, s4
584 ; RV32I-NEXT:    and a0, a1, a0
585 ; RV32I-NEXT:    srli a1, a0, 1
586 ; RV32I-NEXT:    lui a2, 349525
587 ; RV32I-NEXT:    addi s5, a2, 1365
588 ; RV32I-NEXT:    and a1, a1, s5
589 ; RV32I-NEXT:    sub a0, a0, a1
590 ; RV32I-NEXT:    lui a1, 209715
591 ; RV32I-NEXT:    addi s0, a1, 819
592 ; RV32I-NEXT:    and a1, a0, s0
593 ; RV32I-NEXT:    srli a0, a0, 2
594 ; RV32I-NEXT:    and a0, a0, s0
595 ; RV32I-NEXT:    add a0, a1, a0
596 ; RV32I-NEXT:    srli a1, a0, 4
597 ; RV32I-NEXT:    add a0, a0, a1
598 ; RV32I-NEXT:    lui a1, 61681
599 ; RV32I-NEXT:    addi s6, a1, -241
600 ; RV32I-NEXT:    and a0, a0, s6
601 ; RV32I-NEXT:    lui a1, 4112
602 ; RV32I-NEXT:    addi s1, a1, 257
603 ; RV32I-NEXT:    mv a1, s1
604 ; RV32I-NEXT:    call __mulsi3@plt
605 ; RV32I-NEXT:    mv s2, a0
606 ; RV32I-NEXT:    addi a0, s3, -1
607 ; RV32I-NEXT:    not a1, s3
608 ; RV32I-NEXT:    and a0, a1, a0
609 ; RV32I-NEXT:    srli a1, a0, 1
610 ; RV32I-NEXT:    and a1, a1, s5
611 ; RV32I-NEXT:    sub a0, a0, a1
612 ; RV32I-NEXT:    and a1, a0, s0
613 ; RV32I-NEXT:    srli a0, a0, 2
614 ; RV32I-NEXT:    and a0, a0, s0
615 ; RV32I-NEXT:    add a0, a1, a0
616 ; RV32I-NEXT:    srli a1, a0, 4
617 ; RV32I-NEXT:    add a0, a0, a1
618 ; RV32I-NEXT:    and a0, a0, s6
619 ; RV32I-NEXT:    mv a1, s1
620 ; RV32I-NEXT:    call __mulsi3@plt
621 ; RV32I-NEXT:    bnez s4, .LBB7_2
622 ; RV32I-NEXT:  # %bb.1:
623 ; RV32I-NEXT:    srli a0, a0, 24
624 ; RV32I-NEXT:    addi a0, a0, 32
625 ; RV32I-NEXT:    j .LBB7_3
626 ; RV32I-NEXT:  .LBB7_2:
627 ; RV32I-NEXT:    srli a0, s2, 24
628 ; RV32I-NEXT:  .LBB7_3:
629 ; RV32I-NEXT:    mv a1, zero
630 ; RV32I-NEXT:    lw s6, 0(sp) # 4-byte Folded Reload
631 ; RV32I-NEXT:    lw s5, 4(sp) # 4-byte Folded Reload
632 ; RV32I-NEXT:    lw s4, 8(sp) # 4-byte Folded Reload
633 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
634 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
635 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
636 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
637 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
638 ; RV32I-NEXT:    addi sp, sp, 32
639 ; RV32I-NEXT:    ret
641 ; RV64I-LABEL: test_cttz_i64:
642 ; RV64I:       # %bb.0:
643 ; RV64I-NEXT:    addi sp, sp, -16
644 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
645 ; RV64I-NEXT:    beqz a0, .LBB7_2
646 ; RV64I-NEXT:  # %bb.1: # %cond.false
647 ; RV64I-NEXT:    addi a1, a0, -1
648 ; RV64I-NEXT:    not a0, a0
649 ; RV64I-NEXT:    and a0, a0, a1
650 ; RV64I-NEXT:    srli a1, a0, 1
651 ; RV64I-NEXT:    lui a2, 21845
652 ; RV64I-NEXT:    addiw a2, a2, 1365
653 ; RV64I-NEXT:    slli a2, a2, 12
654 ; RV64I-NEXT:    addi a2, a2, 1365
655 ; RV64I-NEXT:    slli a2, a2, 12
656 ; RV64I-NEXT:    addi a2, a2, 1365
657 ; RV64I-NEXT:    slli a2, a2, 12
658 ; RV64I-NEXT:    addi a2, a2, 1365
659 ; RV64I-NEXT:    and a1, a1, a2
660 ; RV64I-NEXT:    sub a0, a0, a1
661 ; RV64I-NEXT:    lui a1, 13107
662 ; RV64I-NEXT:    addiw a1, a1, 819
663 ; RV64I-NEXT:    slli a1, a1, 12
664 ; RV64I-NEXT:    addi a1, a1, 819
665 ; RV64I-NEXT:    slli a1, a1, 12
666 ; RV64I-NEXT:    addi a1, a1, 819
667 ; RV64I-NEXT:    slli a1, a1, 12
668 ; RV64I-NEXT:    addi a1, a1, 819
669 ; RV64I-NEXT:    and a2, a0, a1
670 ; RV64I-NEXT:    srli a0, a0, 2
671 ; RV64I-NEXT:    and a0, a0, a1
672 ; RV64I-NEXT:    add a0, a2, a0
673 ; RV64I-NEXT:    srli a1, a0, 4
674 ; RV64I-NEXT:    add a0, a0, a1
675 ; RV64I-NEXT:    lui a1, 3855
676 ; RV64I-NEXT:    addiw a1, a1, 241
677 ; RV64I-NEXT:    slli a1, a1, 12
678 ; RV64I-NEXT:    addi a1, a1, -241
679 ; RV64I-NEXT:    slli a1, a1, 12
680 ; RV64I-NEXT:    addi a1, a1, 241
681 ; RV64I-NEXT:    slli a1, a1, 12
682 ; RV64I-NEXT:    addi a1, a1, -241
683 ; RV64I-NEXT:    and a0, a0, a1
684 ; RV64I-NEXT:    lui a1, 4112
685 ; RV64I-NEXT:    addiw a1, a1, 257
686 ; RV64I-NEXT:    slli a1, a1, 16
687 ; RV64I-NEXT:    addi a1, a1, 257
688 ; RV64I-NEXT:    slli a1, a1, 16
689 ; RV64I-NEXT:    addi a1, a1, 257
690 ; RV64I-NEXT:    call __muldi3@plt
691 ; RV64I-NEXT:    srli a0, a0, 56
692 ; RV64I-NEXT:    j .LBB7_3
693 ; RV64I-NEXT:  .LBB7_2:
694 ; RV64I-NEXT:    addi a0, zero, 64
695 ; RV64I-NEXT:  .LBB7_3: # %cond.end
696 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
697 ; RV64I-NEXT:    addi sp, sp, 16
698 ; RV64I-NEXT:    ret
699   %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 false)
700   ret i64 %tmp
703 define i8 @test_cttz_i8_zero_undef(i8 %a) nounwind {
704 ; RV32I-LABEL: test_cttz_i8_zero_undef:
705 ; RV32I:       # %bb.0:
706 ; RV32I-NEXT:    addi sp, sp, -16
707 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
708 ; RV32I-NEXT:    addi a1, a0, -1
709 ; RV32I-NEXT:    not a0, a0
710 ; RV32I-NEXT:    and a0, a0, a1
711 ; RV32I-NEXT:    srli a1, a0, 1
712 ; RV32I-NEXT:    lui a2, 349525
713 ; RV32I-NEXT:    addi a2, a2, 1365
714 ; RV32I-NEXT:    and a1, a1, a2
715 ; RV32I-NEXT:    sub a0, a0, a1
716 ; RV32I-NEXT:    lui a1, 209715
717 ; RV32I-NEXT:    addi a1, a1, 819
718 ; RV32I-NEXT:    and a2, a0, a1
719 ; RV32I-NEXT:    srli a0, a0, 2
720 ; RV32I-NEXT:    and a0, a0, a1
721 ; RV32I-NEXT:    add a0, a2, a0
722 ; RV32I-NEXT:    srli a1, a0, 4
723 ; RV32I-NEXT:    add a0, a0, a1
724 ; RV32I-NEXT:    lui a1, 61681
725 ; RV32I-NEXT:    addi a1, a1, -241
726 ; RV32I-NEXT:    and a0, a0, a1
727 ; RV32I-NEXT:    lui a1, 4112
728 ; RV32I-NEXT:    addi a1, a1, 257
729 ; RV32I-NEXT:    call __mulsi3@plt
730 ; RV32I-NEXT:    srli a0, a0, 24
731 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
732 ; RV32I-NEXT:    addi sp, sp, 16
733 ; RV32I-NEXT:    ret
735 ; RV64I-LABEL: test_cttz_i8_zero_undef:
736 ; RV64I:       # %bb.0:
737 ; RV64I-NEXT:    addi sp, sp, -16
738 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
739 ; RV64I-NEXT:    addi a1, a0, -1
740 ; RV64I-NEXT:    not a0, a0
741 ; RV64I-NEXT:    and a0, a0, a1
742 ; RV64I-NEXT:    srli a1, a0, 1
743 ; RV64I-NEXT:    lui a2, 21845
744 ; RV64I-NEXT:    addiw a2, a2, 1365
745 ; RV64I-NEXT:    slli a2, a2, 12
746 ; RV64I-NEXT:    addi a2, a2, 1365
747 ; RV64I-NEXT:    slli a2, a2, 12
748 ; RV64I-NEXT:    addi a2, a2, 1365
749 ; RV64I-NEXT:    slli a2, a2, 12
750 ; RV64I-NEXT:    addi a2, a2, 1365
751 ; RV64I-NEXT:    and a1, a1, a2
752 ; RV64I-NEXT:    sub a0, a0, a1
753 ; RV64I-NEXT:    lui a1, 13107
754 ; RV64I-NEXT:    addiw a1, a1, 819
755 ; RV64I-NEXT:    slli a1, a1, 12
756 ; RV64I-NEXT:    addi a1, a1, 819
757 ; RV64I-NEXT:    slli a1, a1, 12
758 ; RV64I-NEXT:    addi a1, a1, 819
759 ; RV64I-NEXT:    slli a1, a1, 12
760 ; RV64I-NEXT:    addi a1, a1, 819
761 ; RV64I-NEXT:    and a2, a0, a1
762 ; RV64I-NEXT:    srli a0, a0, 2
763 ; RV64I-NEXT:    and a0, a0, a1
764 ; RV64I-NEXT:    add a0, a2, a0
765 ; RV64I-NEXT:    srli a1, a0, 4
766 ; RV64I-NEXT:    add a0, a0, a1
767 ; RV64I-NEXT:    lui a1, 3855
768 ; RV64I-NEXT:    addiw a1, a1, 241
769 ; RV64I-NEXT:    slli a1, a1, 12
770 ; RV64I-NEXT:    addi a1, a1, -241
771 ; RV64I-NEXT:    slli a1, a1, 12
772 ; RV64I-NEXT:    addi a1, a1, 241
773 ; RV64I-NEXT:    slli a1, a1, 12
774 ; RV64I-NEXT:    addi a1, a1, -241
775 ; RV64I-NEXT:    and a0, a0, a1
776 ; RV64I-NEXT:    lui a1, 4112
777 ; RV64I-NEXT:    addiw a1, a1, 257
778 ; RV64I-NEXT:    slli a1, a1, 16
779 ; RV64I-NEXT:    addi a1, a1, 257
780 ; RV64I-NEXT:    slli a1, a1, 16
781 ; RV64I-NEXT:    addi a1, a1, 257
782 ; RV64I-NEXT:    call __muldi3@plt
783 ; RV64I-NEXT:    srli a0, a0, 56
784 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
785 ; RV64I-NEXT:    addi sp, sp, 16
786 ; RV64I-NEXT:    ret
787   %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 true)
788   ret i8 %tmp
791 define i16 @test_cttz_i16_zero_undef(i16 %a) nounwind {
792 ; RV32I-LABEL: test_cttz_i16_zero_undef:
793 ; RV32I:       # %bb.0:
794 ; RV32I-NEXT:    addi sp, sp, -16
795 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
796 ; RV32I-NEXT:    addi a1, a0, -1
797 ; RV32I-NEXT:    not a0, a0
798 ; RV32I-NEXT:    and a0, a0, a1
799 ; RV32I-NEXT:    srli a1, a0, 1
800 ; RV32I-NEXT:    lui a2, 349525
801 ; RV32I-NEXT:    addi a2, a2, 1365
802 ; RV32I-NEXT:    and a1, a1, a2
803 ; RV32I-NEXT:    sub a0, a0, a1
804 ; RV32I-NEXT:    lui a1, 209715
805 ; RV32I-NEXT:    addi a1, a1, 819
806 ; RV32I-NEXT:    and a2, a0, a1
807 ; RV32I-NEXT:    srli a0, a0, 2
808 ; RV32I-NEXT:    and a0, a0, a1
809 ; RV32I-NEXT:    add a0, a2, a0
810 ; RV32I-NEXT:    srli a1, a0, 4
811 ; RV32I-NEXT:    add a0, a0, a1
812 ; RV32I-NEXT:    lui a1, 61681
813 ; RV32I-NEXT:    addi a1, a1, -241
814 ; RV32I-NEXT:    and a0, a0, a1
815 ; RV32I-NEXT:    lui a1, 4112
816 ; RV32I-NEXT:    addi a1, a1, 257
817 ; RV32I-NEXT:    call __mulsi3@plt
818 ; RV32I-NEXT:    srli a0, a0, 24
819 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
820 ; RV32I-NEXT:    addi sp, sp, 16
821 ; RV32I-NEXT:    ret
823 ; RV64I-LABEL: test_cttz_i16_zero_undef:
824 ; RV64I:       # %bb.0:
825 ; RV64I-NEXT:    addi sp, sp, -16
826 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
827 ; RV64I-NEXT:    addi a1, a0, -1
828 ; RV64I-NEXT:    not a0, a0
829 ; RV64I-NEXT:    and a0, a0, a1
830 ; RV64I-NEXT:    srli a1, a0, 1
831 ; RV64I-NEXT:    lui a2, 21845
832 ; RV64I-NEXT:    addiw a2, a2, 1365
833 ; RV64I-NEXT:    slli a2, a2, 12
834 ; RV64I-NEXT:    addi a2, a2, 1365
835 ; RV64I-NEXT:    slli a2, a2, 12
836 ; RV64I-NEXT:    addi a2, a2, 1365
837 ; RV64I-NEXT:    slli a2, a2, 12
838 ; RV64I-NEXT:    addi a2, a2, 1365
839 ; RV64I-NEXT:    and a1, a1, a2
840 ; RV64I-NEXT:    sub a0, a0, a1
841 ; RV64I-NEXT:    lui a1, 13107
842 ; RV64I-NEXT:    addiw a1, a1, 819
843 ; RV64I-NEXT:    slli a1, a1, 12
844 ; RV64I-NEXT:    addi a1, a1, 819
845 ; RV64I-NEXT:    slli a1, a1, 12
846 ; RV64I-NEXT:    addi a1, a1, 819
847 ; RV64I-NEXT:    slli a1, a1, 12
848 ; RV64I-NEXT:    addi a1, a1, 819
849 ; RV64I-NEXT:    and a2, a0, a1
850 ; RV64I-NEXT:    srli a0, a0, 2
851 ; RV64I-NEXT:    and a0, a0, a1
852 ; RV64I-NEXT:    add a0, a2, a0
853 ; RV64I-NEXT:    srli a1, a0, 4
854 ; RV64I-NEXT:    add a0, a0, a1
855 ; RV64I-NEXT:    lui a1, 3855
856 ; RV64I-NEXT:    addiw a1, a1, 241
857 ; RV64I-NEXT:    slli a1, a1, 12
858 ; RV64I-NEXT:    addi a1, a1, -241
859 ; RV64I-NEXT:    slli a1, a1, 12
860 ; RV64I-NEXT:    addi a1, a1, 241
861 ; RV64I-NEXT:    slli a1, a1, 12
862 ; RV64I-NEXT:    addi a1, a1, -241
863 ; RV64I-NEXT:    and a0, a0, a1
864 ; RV64I-NEXT:    lui a1, 4112
865 ; RV64I-NEXT:    addiw a1, a1, 257
866 ; RV64I-NEXT:    slli a1, a1, 16
867 ; RV64I-NEXT:    addi a1, a1, 257
868 ; RV64I-NEXT:    slli a1, a1, 16
869 ; RV64I-NEXT:    addi a1, a1, 257
870 ; RV64I-NEXT:    call __muldi3@plt
871 ; RV64I-NEXT:    srli a0, a0, 56
872 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
873 ; RV64I-NEXT:    addi sp, sp, 16
874 ; RV64I-NEXT:    ret
875   %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 true)
876   ret i16 %tmp
879 define i32 @test_cttz_i32_zero_undef(i32 %a) nounwind {
880 ; RV32I-LABEL: test_cttz_i32_zero_undef:
881 ; RV32I:       # %bb.0:
882 ; RV32I-NEXT:    addi sp, sp, -16
883 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
884 ; RV32I-NEXT:    addi a1, a0, -1
885 ; RV32I-NEXT:    not a0, a0
886 ; RV32I-NEXT:    and a0, a0, a1
887 ; RV32I-NEXT:    srli a1, a0, 1
888 ; RV32I-NEXT:    lui a2, 349525
889 ; RV32I-NEXT:    addi a2, a2, 1365
890 ; RV32I-NEXT:    and a1, a1, a2
891 ; RV32I-NEXT:    sub a0, a0, a1
892 ; RV32I-NEXT:    lui a1, 209715
893 ; RV32I-NEXT:    addi a1, a1, 819
894 ; RV32I-NEXT:    and a2, a0, a1
895 ; RV32I-NEXT:    srli a0, a0, 2
896 ; RV32I-NEXT:    and a0, a0, a1
897 ; RV32I-NEXT:    add a0, a2, a0
898 ; RV32I-NEXT:    srli a1, a0, 4
899 ; RV32I-NEXT:    add a0, a0, a1
900 ; RV32I-NEXT:    lui a1, 61681
901 ; RV32I-NEXT:    addi a1, a1, -241
902 ; RV32I-NEXT:    and a0, a0, a1
903 ; RV32I-NEXT:    lui a1, 4112
904 ; RV32I-NEXT:    addi a1, a1, 257
905 ; RV32I-NEXT:    call __mulsi3@plt
906 ; RV32I-NEXT:    srli a0, a0, 24
907 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
908 ; RV32I-NEXT:    addi sp, sp, 16
909 ; RV32I-NEXT:    ret
911 ; RV64I-LABEL: test_cttz_i32_zero_undef:
912 ; RV64I:       # %bb.0:
913 ; RV64I-NEXT:    addi sp, sp, -16
914 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
915 ; RV64I-NEXT:    addi a1, a0, -1
916 ; RV64I-NEXT:    not a0, a0
917 ; RV64I-NEXT:    and a0, a0, a1
918 ; RV64I-NEXT:    srli a1, a0, 1
919 ; RV64I-NEXT:    lui a2, 21845
920 ; RV64I-NEXT:    addiw a2, a2, 1365
921 ; RV64I-NEXT:    slli a2, a2, 12
922 ; RV64I-NEXT:    addi a2, a2, 1365
923 ; RV64I-NEXT:    slli a2, a2, 12
924 ; RV64I-NEXT:    addi a2, a2, 1365
925 ; RV64I-NEXT:    slli a2, a2, 12
926 ; RV64I-NEXT:    addi a2, a2, 1365
927 ; RV64I-NEXT:    and a1, a1, a2
928 ; RV64I-NEXT:    sub a0, a0, a1
929 ; RV64I-NEXT:    lui a1, 13107
930 ; RV64I-NEXT:    addiw a1, a1, 819
931 ; RV64I-NEXT:    slli a1, a1, 12
932 ; RV64I-NEXT:    addi a1, a1, 819
933 ; RV64I-NEXT:    slli a1, a1, 12
934 ; RV64I-NEXT:    addi a1, a1, 819
935 ; RV64I-NEXT:    slli a1, a1, 12
936 ; RV64I-NEXT:    addi a1, a1, 819
937 ; RV64I-NEXT:    and a2, a0, a1
938 ; RV64I-NEXT:    srli a0, a0, 2
939 ; RV64I-NEXT:    and a0, a0, a1
940 ; RV64I-NEXT:    add a0, a2, a0
941 ; RV64I-NEXT:    srli a1, a0, 4
942 ; RV64I-NEXT:    add a0, a0, a1
943 ; RV64I-NEXT:    lui a1, 3855
944 ; RV64I-NEXT:    addiw a1, a1, 241
945 ; RV64I-NEXT:    slli a1, a1, 12
946 ; RV64I-NEXT:    addi a1, a1, -241
947 ; RV64I-NEXT:    slli a1, a1, 12
948 ; RV64I-NEXT:    addi a1, a1, 241
949 ; RV64I-NEXT:    slli a1, a1, 12
950 ; RV64I-NEXT:    addi a1, a1, -241
951 ; RV64I-NEXT:    and a0, a0, a1
952 ; RV64I-NEXT:    lui a1, 4112
953 ; RV64I-NEXT:    addiw a1, a1, 257
954 ; RV64I-NEXT:    slli a1, a1, 16
955 ; RV64I-NEXT:    addi a1, a1, 257
956 ; RV64I-NEXT:    slli a1, a1, 16
957 ; RV64I-NEXT:    addi a1, a1, 257
958 ; RV64I-NEXT:    call __muldi3@plt
959 ; RV64I-NEXT:    srli a0, a0, 56
960 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
961 ; RV64I-NEXT:    addi sp, sp, 16
962 ; RV64I-NEXT:    ret
963   %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 true)
964   ret i32 %tmp
967 define i64 @test_cttz_i64_zero_undef(i64 %a) nounwind {
968 ; RV32I-LABEL: test_cttz_i64_zero_undef:
969 ; RV32I:       # %bb.0:
970 ; RV32I-NEXT:    addi sp, sp, -32
971 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
972 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
973 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
974 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
975 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
976 ; RV32I-NEXT:    sw s4, 8(sp) # 4-byte Folded Spill
977 ; RV32I-NEXT:    sw s5, 4(sp) # 4-byte Folded Spill
978 ; RV32I-NEXT:    sw s6, 0(sp) # 4-byte Folded Spill
979 ; RV32I-NEXT:    mv s3, a1
980 ; RV32I-NEXT:    mv s4, a0
981 ; RV32I-NEXT:    addi a0, a0, -1
982 ; RV32I-NEXT:    not a1, s4
983 ; RV32I-NEXT:    and a0, a1, a0
984 ; RV32I-NEXT:    srli a1, a0, 1
985 ; RV32I-NEXT:    lui a2, 349525
986 ; RV32I-NEXT:    addi s5, a2, 1365
987 ; RV32I-NEXT:    and a1, a1, s5
988 ; RV32I-NEXT:    sub a0, a0, a1
989 ; RV32I-NEXT:    lui a1, 209715
990 ; RV32I-NEXT:    addi s0, a1, 819
991 ; RV32I-NEXT:    and a1, a0, s0
992 ; RV32I-NEXT:    srli a0, a0, 2
993 ; RV32I-NEXT:    and a0, a0, s0
994 ; RV32I-NEXT:    add a0, a1, a0
995 ; RV32I-NEXT:    srli a1, a0, 4
996 ; RV32I-NEXT:    add a0, a0, a1
997 ; RV32I-NEXT:    lui a1, 61681
998 ; RV32I-NEXT:    addi s6, a1, -241
999 ; RV32I-NEXT:    and a0, a0, s6
1000 ; RV32I-NEXT:    lui a1, 4112
1001 ; RV32I-NEXT:    addi s1, a1, 257
1002 ; RV32I-NEXT:    mv a1, s1
1003 ; RV32I-NEXT:    call __mulsi3@plt
1004 ; RV32I-NEXT:    mv s2, a0
1005 ; RV32I-NEXT:    addi a0, s3, -1
1006 ; RV32I-NEXT:    not a1, s3
1007 ; RV32I-NEXT:    and a0, a1, a0
1008 ; RV32I-NEXT:    srli a1, a0, 1
1009 ; RV32I-NEXT:    and a1, a1, s5
1010 ; RV32I-NEXT:    sub a0, a0, a1
1011 ; RV32I-NEXT:    and a1, a0, s0
1012 ; RV32I-NEXT:    srli a0, a0, 2
1013 ; RV32I-NEXT:    and a0, a0, s0
1014 ; RV32I-NEXT:    add a0, a1, a0
1015 ; RV32I-NEXT:    srli a1, a0, 4
1016 ; RV32I-NEXT:    add a0, a0, a1
1017 ; RV32I-NEXT:    and a0, a0, s6
1018 ; RV32I-NEXT:    mv a1, s1
1019 ; RV32I-NEXT:    call __mulsi3@plt
1020 ; RV32I-NEXT:    bnez s4, .LBB11_2
1021 ; RV32I-NEXT:  # %bb.1:
1022 ; RV32I-NEXT:    srli a0, a0, 24
1023 ; RV32I-NEXT:    addi a0, a0, 32
1024 ; RV32I-NEXT:    j .LBB11_3
1025 ; RV32I-NEXT:  .LBB11_2:
1026 ; RV32I-NEXT:    srli a0, s2, 24
1027 ; RV32I-NEXT:  .LBB11_3:
1028 ; RV32I-NEXT:    mv a1, zero
1029 ; RV32I-NEXT:    lw s6, 0(sp) # 4-byte Folded Reload
1030 ; RV32I-NEXT:    lw s5, 4(sp) # 4-byte Folded Reload
1031 ; RV32I-NEXT:    lw s4, 8(sp) # 4-byte Folded Reload
1032 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
1033 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1034 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1035 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1036 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1037 ; RV32I-NEXT:    addi sp, sp, 32
1038 ; RV32I-NEXT:    ret
1040 ; RV64I-LABEL: test_cttz_i64_zero_undef:
1041 ; RV64I:       # %bb.0:
1042 ; RV64I-NEXT:    addi sp, sp, -16
1043 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1044 ; RV64I-NEXT:    addi a1, a0, -1
1045 ; RV64I-NEXT:    not a0, a0
1046 ; RV64I-NEXT:    and a0, a0, a1
1047 ; RV64I-NEXT:    srli a1, a0, 1
1048 ; RV64I-NEXT:    lui a2, 21845
1049 ; RV64I-NEXT:    addiw a2, a2, 1365
1050 ; RV64I-NEXT:    slli a2, a2, 12
1051 ; RV64I-NEXT:    addi a2, a2, 1365
1052 ; RV64I-NEXT:    slli a2, a2, 12
1053 ; RV64I-NEXT:    addi a2, a2, 1365
1054 ; RV64I-NEXT:    slli a2, a2, 12
1055 ; RV64I-NEXT:    addi a2, a2, 1365
1056 ; RV64I-NEXT:    and a1, a1, a2
1057 ; RV64I-NEXT:    sub a0, a0, a1
1058 ; RV64I-NEXT:    lui a1, 13107
1059 ; RV64I-NEXT:    addiw a1, a1, 819
1060 ; RV64I-NEXT:    slli a1, a1, 12
1061 ; RV64I-NEXT:    addi a1, a1, 819
1062 ; RV64I-NEXT:    slli a1, a1, 12
1063 ; RV64I-NEXT:    addi a1, a1, 819
1064 ; RV64I-NEXT:    slli a1, a1, 12
1065 ; RV64I-NEXT:    addi a1, a1, 819
1066 ; RV64I-NEXT:    and a2, a0, a1
1067 ; RV64I-NEXT:    srli a0, a0, 2
1068 ; RV64I-NEXT:    and a0, a0, a1
1069 ; RV64I-NEXT:    add a0, a2, a0
1070 ; RV64I-NEXT:    srli a1, a0, 4
1071 ; RV64I-NEXT:    add a0, a0, a1
1072 ; RV64I-NEXT:    lui a1, 3855
1073 ; RV64I-NEXT:    addiw a1, a1, 241
1074 ; RV64I-NEXT:    slli a1, a1, 12
1075 ; RV64I-NEXT:    addi a1, a1, -241
1076 ; RV64I-NEXT:    slli a1, a1, 12
1077 ; RV64I-NEXT:    addi a1, a1, 241
1078 ; RV64I-NEXT:    slli a1, a1, 12
1079 ; RV64I-NEXT:    addi a1, a1, -241
1080 ; RV64I-NEXT:    and a0, a0, a1
1081 ; RV64I-NEXT:    lui a1, 4112
1082 ; RV64I-NEXT:    addiw a1, a1, 257
1083 ; RV64I-NEXT:    slli a1, a1, 16
1084 ; RV64I-NEXT:    addi a1, a1, 257
1085 ; RV64I-NEXT:    slli a1, a1, 16
1086 ; RV64I-NEXT:    addi a1, a1, 257
1087 ; RV64I-NEXT:    call __muldi3@plt
1088 ; RV64I-NEXT:    srli a0, a0, 56
1089 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1090 ; RV64I-NEXT:    addi sp, sp, 16
1091 ; RV64I-NEXT:    ret
1092   %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 true)
1093   ret i64 %tmp
1096 define i32 @test_ctpop_i32(i32 %a) nounwind {
1097 ; RV32I-LABEL: test_ctpop_i32:
1098 ; RV32I:       # %bb.0:
1099 ; RV32I-NEXT:    addi sp, sp, -16
1100 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1101 ; RV32I-NEXT:    srli a1, a0, 1
1102 ; RV32I-NEXT:    lui a2, 349525
1103 ; RV32I-NEXT:    addi a2, a2, 1365
1104 ; RV32I-NEXT:    and a1, a1, a2
1105 ; RV32I-NEXT:    sub a0, a0, a1
1106 ; RV32I-NEXT:    lui a1, 209715
1107 ; RV32I-NEXT:    addi a1, a1, 819
1108 ; RV32I-NEXT:    and a2, a0, a1
1109 ; RV32I-NEXT:    srli a0, a0, 2
1110 ; RV32I-NEXT:    and a0, a0, a1
1111 ; RV32I-NEXT:    add a0, a2, a0
1112 ; RV32I-NEXT:    srli a1, a0, 4
1113 ; RV32I-NEXT:    add a0, a0, a1
1114 ; RV32I-NEXT:    lui a1, 61681
1115 ; RV32I-NEXT:    addi a1, a1, -241
1116 ; RV32I-NEXT:    and a0, a0, a1
1117 ; RV32I-NEXT:    lui a1, 4112
1118 ; RV32I-NEXT:    addi a1, a1, 257
1119 ; RV32I-NEXT:    call __mulsi3@plt
1120 ; RV32I-NEXT:    srli a0, a0, 24
1121 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1122 ; RV32I-NEXT:    addi sp, sp, 16
1123 ; RV32I-NEXT:    ret
1125 ; RV64I-LABEL: test_ctpop_i32:
1126 ; RV64I:       # %bb.0:
1127 ; RV64I-NEXT:    addi sp, sp, -16
1128 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1129 ; RV64I-NEXT:    slli a1, a0, 32
1130 ; RV64I-NEXT:    srli a1, a1, 32
1131 ; RV64I-NEXT:    srliw a0, a0, 1
1132 ; RV64I-NEXT:    lui a2, 349525
1133 ; RV64I-NEXT:    addiw a2, a2, 1365
1134 ; RV64I-NEXT:    and a0, a0, a2
1135 ; RV64I-NEXT:    sub a0, a1, a0
1136 ; RV64I-NEXT:    srli a1, a0, 2
1137 ; RV64I-NEXT:    lui a2, 13107
1138 ; RV64I-NEXT:    addiw a2, a2, 819
1139 ; RV64I-NEXT:    slli a2, a2, 12
1140 ; RV64I-NEXT:    addi a2, a2, 819
1141 ; RV64I-NEXT:    slli a2, a2, 12
1142 ; RV64I-NEXT:    addi a2, a2, 819
1143 ; RV64I-NEXT:    slli a2, a2, 12
1144 ; RV64I-NEXT:    addi a2, a2, 819
1145 ; RV64I-NEXT:    and a1, a1, a2
1146 ; RV64I-NEXT:    and a0, a0, a2
1147 ; RV64I-NEXT:    add a0, a0, a1
1148 ; RV64I-NEXT:    srli a1, a0, 4
1149 ; RV64I-NEXT:    add a0, a0, a1
1150 ; RV64I-NEXT:    lui a1, 3855
1151 ; RV64I-NEXT:    addiw a1, a1, 241
1152 ; RV64I-NEXT:    slli a1, a1, 12
1153 ; RV64I-NEXT:    addi a1, a1, -241
1154 ; RV64I-NEXT:    slli a1, a1, 12
1155 ; RV64I-NEXT:    addi a1, a1, 241
1156 ; RV64I-NEXT:    slli a1, a1, 12
1157 ; RV64I-NEXT:    addi a1, a1, -241
1158 ; RV64I-NEXT:    and a0, a0, a1
1159 ; RV64I-NEXT:    lui a1, 4112
1160 ; RV64I-NEXT:    addiw a1, a1, 257
1161 ; RV64I-NEXT:    slli a1, a1, 16
1162 ; RV64I-NEXT:    addi a1, a1, 257
1163 ; RV64I-NEXT:    slli a1, a1, 16
1164 ; RV64I-NEXT:    addi a1, a1, 257
1165 ; RV64I-NEXT:    call __muldi3@plt
1166 ; RV64I-NEXT:    srli a0, a0, 56
1167 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1168 ; RV64I-NEXT:    addi sp, sp, 16
1169 ; RV64I-NEXT:    ret
1170   %1 = call i32 @llvm.ctpop.i32(i32 %a)
1171   ret i32 %1
1174 define i64 @test_ctpop_i64(i64 %a) nounwind {
1175 ; RV32I-LABEL: test_ctpop_i64:
1176 ; RV32I:       # %bb.0:
1177 ; RV32I-NEXT:    addi sp, sp, -32
1178 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1179 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1180 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1181 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
1182 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
1183 ; RV32I-NEXT:    sw s4, 8(sp) # 4-byte Folded Spill
1184 ; RV32I-NEXT:    sw s5, 4(sp) # 4-byte Folded Spill
1185 ; RV32I-NEXT:    mv s2, a0
1186 ; RV32I-NEXT:    srli a0, a1, 1
1187 ; RV32I-NEXT:    lui a2, 349525
1188 ; RV32I-NEXT:    addi s3, a2, 1365
1189 ; RV32I-NEXT:    and a0, a0, s3
1190 ; RV32I-NEXT:    sub a0, a1, a0
1191 ; RV32I-NEXT:    lui a1, 209715
1192 ; RV32I-NEXT:    addi s0, a1, 819
1193 ; RV32I-NEXT:    and a1, a0, s0
1194 ; RV32I-NEXT:    srli a0, a0, 2
1195 ; RV32I-NEXT:    and a0, a0, s0
1196 ; RV32I-NEXT:    add a0, a1, a0
1197 ; RV32I-NEXT:    srli a1, a0, 4
1198 ; RV32I-NEXT:    add a0, a0, a1
1199 ; RV32I-NEXT:    lui a1, 61681
1200 ; RV32I-NEXT:    addi s4, a1, -241
1201 ; RV32I-NEXT:    and a0, a0, s4
1202 ; RV32I-NEXT:    lui a1, 4112
1203 ; RV32I-NEXT:    addi s1, a1, 257
1204 ; RV32I-NEXT:    mv a1, s1
1205 ; RV32I-NEXT:    call __mulsi3@plt
1206 ; RV32I-NEXT:    srli s5, a0, 24
1207 ; RV32I-NEXT:    srli a0, s2, 1
1208 ; RV32I-NEXT:    and a0, a0, s3
1209 ; RV32I-NEXT:    sub a0, s2, a0
1210 ; RV32I-NEXT:    and a1, a0, s0
1211 ; RV32I-NEXT:    srli a0, a0, 2
1212 ; RV32I-NEXT:    and a0, a0, s0
1213 ; RV32I-NEXT:    add a0, a1, a0
1214 ; RV32I-NEXT:    srli a1, a0, 4
1215 ; RV32I-NEXT:    add a0, a0, a1
1216 ; RV32I-NEXT:    and a0, a0, s4
1217 ; RV32I-NEXT:    mv a1, s1
1218 ; RV32I-NEXT:    call __mulsi3@plt
1219 ; RV32I-NEXT:    srli a0, a0, 24
1220 ; RV32I-NEXT:    add a0, a0, s5
1221 ; RV32I-NEXT:    mv a1, zero
1222 ; RV32I-NEXT:    lw s5, 4(sp) # 4-byte Folded Reload
1223 ; RV32I-NEXT:    lw s4, 8(sp) # 4-byte Folded Reload
1224 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
1225 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
1226 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1227 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1228 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1229 ; RV32I-NEXT:    addi sp, sp, 32
1230 ; RV32I-NEXT:    ret
1232 ; RV64I-LABEL: test_ctpop_i64:
1233 ; RV64I:       # %bb.0:
1234 ; RV64I-NEXT:    addi sp, sp, -16
1235 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1236 ; RV64I-NEXT:    srli a1, a0, 1
1237 ; RV64I-NEXT:    lui a2, 21845
1238 ; RV64I-NEXT:    addiw a2, a2, 1365
1239 ; RV64I-NEXT:    slli a2, a2, 12
1240 ; RV64I-NEXT:    addi a2, a2, 1365
1241 ; RV64I-NEXT:    slli a2, a2, 12
1242 ; RV64I-NEXT:    addi a2, a2, 1365
1243 ; RV64I-NEXT:    slli a2, a2, 12
1244 ; RV64I-NEXT:    addi a2, a2, 1365
1245 ; RV64I-NEXT:    and a1, a1, a2
1246 ; RV64I-NEXT:    sub a0, a0, a1
1247 ; RV64I-NEXT:    lui a1, 13107
1248 ; RV64I-NEXT:    addiw a1, a1, 819
1249 ; RV64I-NEXT:    slli a1, a1, 12
1250 ; RV64I-NEXT:    addi a1, a1, 819
1251 ; RV64I-NEXT:    slli a1, a1, 12
1252 ; RV64I-NEXT:    addi a1, a1, 819
1253 ; RV64I-NEXT:    slli a1, a1, 12
1254 ; RV64I-NEXT:    addi a1, a1, 819
1255 ; RV64I-NEXT:    and a2, a0, a1
1256 ; RV64I-NEXT:    srli a0, a0, 2
1257 ; RV64I-NEXT:    and a0, a0, a1
1258 ; RV64I-NEXT:    add a0, a2, a0
1259 ; RV64I-NEXT:    srli a1, a0, 4
1260 ; RV64I-NEXT:    add a0, a0, a1
1261 ; RV64I-NEXT:    lui a1, 3855
1262 ; RV64I-NEXT:    addiw a1, a1, 241
1263 ; RV64I-NEXT:    slli a1, a1, 12
1264 ; RV64I-NEXT:    addi a1, a1, -241
1265 ; RV64I-NEXT:    slli a1, a1, 12
1266 ; RV64I-NEXT:    addi a1, a1, 241
1267 ; RV64I-NEXT:    slli a1, a1, 12
1268 ; RV64I-NEXT:    addi a1, a1, -241
1269 ; RV64I-NEXT:    and a0, a0, a1
1270 ; RV64I-NEXT:    lui a1, 4112
1271 ; RV64I-NEXT:    addiw a1, a1, 257
1272 ; RV64I-NEXT:    slli a1, a1, 16
1273 ; RV64I-NEXT:    addi a1, a1, 257
1274 ; RV64I-NEXT:    slli a1, a1, 16
1275 ; RV64I-NEXT:    addi a1, a1, 257
1276 ; RV64I-NEXT:    call __muldi3@plt
1277 ; RV64I-NEXT:    srli a0, a0, 56
1278 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1279 ; RV64I-NEXT:    addi sp, sp, 16
1280 ; RV64I-NEXT:    ret
1281   %1 = call i64 @llvm.ctpop.i64(i64 %a)
1282   ret i64 %1
1285 define i32 @test_parity_i32(i32 %a) {
1286 ; RV32I-LABEL: test_parity_i32:
1287 ; RV32I:       # %bb.0:
1288 ; RV32I-NEXT:    srli a1, a0, 16
1289 ; RV32I-NEXT:    xor a0, a0, a1
1290 ; RV32I-NEXT:    srli a1, a0, 8
1291 ; RV32I-NEXT:    xor a0, a0, a1
1292 ; RV32I-NEXT:    srli a1, a0, 4
1293 ; RV32I-NEXT:    xor a0, a0, a1
1294 ; RV32I-NEXT:    srli a1, a0, 2
1295 ; RV32I-NEXT:    xor a0, a0, a1
1296 ; RV32I-NEXT:    srli a1, a0, 1
1297 ; RV32I-NEXT:    xor a0, a0, a1
1298 ; RV32I-NEXT:    andi a0, a0, 1
1299 ; RV32I-NEXT:    ret
1301 ; RV64I-LABEL: test_parity_i32:
1302 ; RV64I:       # %bb.0:
1303 ; RV64I-NEXT:    slli a1, a0, 32
1304 ; RV64I-NEXT:    srli a1, a1, 32
1305 ; RV64I-NEXT:    srliw a0, a0, 16
1306 ; RV64I-NEXT:    xor a0, a1, a0
1307 ; RV64I-NEXT:    srli a1, a0, 8
1308 ; RV64I-NEXT:    xor a0, a0, a1
1309 ; RV64I-NEXT:    srli a1, a0, 4
1310 ; RV64I-NEXT:    xor a0, a0, a1
1311 ; RV64I-NEXT:    srli a1, a0, 2
1312 ; RV64I-NEXT:    xor a0, a0, a1
1313 ; RV64I-NEXT:    srli a1, a0, 1
1314 ; RV64I-NEXT:    xor a0, a0, a1
1315 ; RV64I-NEXT:    andi a0, a0, 1
1316 ; RV64I-NEXT:    ret
1317   %1 = call i32 @llvm.ctpop.i32(i32 %a)
1318   %2 = and i32 %1, 1
1319   ret i32 %2
1322 define i64 @test_parity_i64(i64 %a) {
1323 ; RV32I-LABEL: test_parity_i64:
1324 ; RV32I:       # %bb.0:
1325 ; RV32I-NEXT:    xor a0, a0, a1
1326 ; RV32I-NEXT:    srli a1, a0, 16
1327 ; RV32I-NEXT:    xor a0, a0, a1
1328 ; RV32I-NEXT:    srli a1, a0, 8
1329 ; RV32I-NEXT:    xor a0, a0, a1
1330 ; RV32I-NEXT:    srli a1, a0, 4
1331 ; RV32I-NEXT:    xor a0, a0, a1
1332 ; RV32I-NEXT:    srli a1, a0, 2
1333 ; RV32I-NEXT:    xor a0, a0, a1
1334 ; RV32I-NEXT:    srli a1, a0, 1
1335 ; RV32I-NEXT:    xor a0, a0, a1
1336 ; RV32I-NEXT:    andi a0, a0, 1
1337 ; RV32I-NEXT:    mv a1, zero
1338 ; RV32I-NEXT:    ret
1340 ; RV64I-LABEL: test_parity_i64:
1341 ; RV64I:       # %bb.0:
1342 ; RV64I-NEXT:    srli a1, a0, 32
1343 ; RV64I-NEXT:    xor a0, a0, a1
1344 ; RV64I-NEXT:    srli a1, a0, 16
1345 ; RV64I-NEXT:    xor a0, a0, a1
1346 ; RV64I-NEXT:    srli a1, a0, 8
1347 ; RV64I-NEXT:    xor a0, a0, a1
1348 ; RV64I-NEXT:    srli a1, a0, 4
1349 ; RV64I-NEXT:    xor a0, a0, a1
1350 ; RV64I-NEXT:    srli a1, a0, 2
1351 ; RV64I-NEXT:    xor a0, a0, a1
1352 ; RV64I-NEXT:    srli a1, a0, 1
1353 ; RV64I-NEXT:    xor a0, a0, a1
1354 ; RV64I-NEXT:    andi a0, a0, 1
1355 ; RV64I-NEXT:    ret
1356   %1 = call i64 @llvm.ctpop.i64(i64 %a)
1357   %2 = and i64 %1, 1
1358   ret i64 %2