[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv64zbp-intrinsic.ll
blobc9175b6963029d02528cbe0e892a7a205bba5567
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -mattr=+experimental-b -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s -check-prefix=RV64B
4 ; RUN: llc -mtriple=riscv64 -mattr=+experimental-zbp -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s -check-prefix=RV64ZBP
7 declare i32 @llvm.riscv.grev.i32(i32 %a, i32 %b)
9 define signext i32 @grev32(i32 signext %a, i32 signext %b) nounwind {
10 ; RV64B-LABEL: grev32:
11 ; RV64B:       # %bb.0:
12 ; RV64B-NEXT:    grevw a0, a0, a1
13 ; RV64B-NEXT:    ret
15 ; RV64ZBP-LABEL: grev32:
16 ; RV64ZBP:       # %bb.0:
17 ; RV64ZBP-NEXT:    grevw a0, a0, a1
18 ; RV64ZBP-NEXT:    ret
19   %tmp = call i32 @llvm.riscv.grev.i32(i32 %a, i32 %b)
20  ret i32 %tmp
23 define signext i32 @grev32_demandedbits(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
24 ; RV64B-LABEL: grev32_demandedbits:
25 ; RV64B:       # %bb.0:
26 ; RV64B-NEXT:    add a0, a0, a1
27 ; RV64B-NEXT:    grevw a0, a0, a2
28 ; RV64B-NEXT:    ret
30 ; RV64ZBP-LABEL: grev32_demandedbits:
31 ; RV64ZBP:       # %bb.0:
32 ; RV64ZBP-NEXT:    add a0, a0, a1
33 ; RV64ZBP-NEXT:    grevw a0, a0, a2
34 ; RV64ZBP-NEXT:    ret
35   %d = add i32 %a, %b
36   %e = and i32 %c, 31
37   %tmp = call i32 @llvm.riscv.grev.i32(i32 %d, i32 %e)
38   ret i32 %tmp
41 declare i32 @llvm.riscv.grevi.i32(i32 %a)
43 define signext i32 @grevi32(i32 signext %a) nounwind {
44 ; RV64B-LABEL: grevi32:
45 ; RV64B:       # %bb.0:
46 ; RV64B-NEXT:    greviw a0, a0, 13
47 ; RV64B-NEXT:    ret
49 ; RV64ZBP-LABEL: grevi32:
50 ; RV64ZBP:       # %bb.0:
51 ; RV64ZBP-NEXT:    greviw a0, a0, 13
52 ; RV64ZBP-NEXT:    ret
53   %tmp = call i32 @llvm.riscv.grev.i32(i32 %a, i32 13)
54  ret i32 %tmp
57 declare i32 @llvm.riscv.gorc.i32(i32 %a, i32 %b)
59 define signext i32 @gorc32(i32 signext %a, i32 signext %b) nounwind {
60 ; RV64B-LABEL: gorc32:
61 ; RV64B:       # %bb.0:
62 ; RV64B-NEXT:    gorcw a0, a0, a1
63 ; RV64B-NEXT:    ret
65 ; RV64ZBP-LABEL: gorc32:
66 ; RV64ZBP:       # %bb.0:
67 ; RV64ZBP-NEXT:    gorcw a0, a0, a1
68 ; RV64ZBP-NEXT:    ret
69   %tmp = call i32 @llvm.riscv.gorc.i32(i32 %a, i32 %b)
70  ret i32 %tmp
73 define signext i32 @gorc32_demandedbits(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
74 ; RV64B-LABEL: gorc32_demandedbits:
75 ; RV64B:       # %bb.0:
76 ; RV64B-NEXT:    add a0, a0, a1
77 ; RV64B-NEXT:    gorcw a0, a0, a2
78 ; RV64B-NEXT:    ret
80 ; RV64ZBP-LABEL: gorc32_demandedbits:
81 ; RV64ZBP:       # %bb.0:
82 ; RV64ZBP-NEXT:    add a0, a0, a1
83 ; RV64ZBP-NEXT:    gorcw a0, a0, a2
84 ; RV64ZBP-NEXT:    ret
85   %d = add i32 %a, %b
86   %e = and i32 %c, 31
87   %tmp = call i32 @llvm.riscv.gorc.i32(i32 %d, i32 %e)
88   ret i32 %tmp
91 define signext i32 @gorci32(i32 signext %a) nounwind {
92 ; RV64B-LABEL: gorci32:
93 ; RV64B:       # %bb.0:
94 ; RV64B-NEXT:    gorciw a0, a0, 13
95 ; RV64B-NEXT:    ret
97 ; RV64ZBP-LABEL: gorci32:
98 ; RV64ZBP:       # %bb.0:
99 ; RV64ZBP-NEXT:    gorciw a0, a0, 13
100 ; RV64ZBP-NEXT:    ret
101   %tmp = call i32 @llvm.riscv.gorc.i32(i32 %a, i32 13)
102  ret i32 %tmp
105 declare i32 @llvm.riscv.shfl.i32(i32 %a, i32 %b)
107 define signext i32 @shfl32(i32 signext %a, i32 signext %b) nounwind {
108 ; RV64B-LABEL: shfl32:
109 ; RV64B:       # %bb.0:
110 ; RV64B-NEXT:    shflw a0, a0, a1
111 ; RV64B-NEXT:    ret
113 ; RV64ZBP-LABEL: shfl32:
114 ; RV64ZBP:       # %bb.0:
115 ; RV64ZBP-NEXT:    shflw a0, a0, a1
116 ; RV64ZBP-NEXT:    ret
117   %tmp = call i32 @llvm.riscv.shfl.i32(i32 %a, i32 %b)
118  ret i32 %tmp
121 define signext i32 @shfl32_demandedbits(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
122 ; RV64B-LABEL: shfl32_demandedbits:
123 ; RV64B:       # %bb.0:
124 ; RV64B-NEXT:    add a0, a0, a1
125 ; RV64B-NEXT:    shflw a0, a0, a2
126 ; RV64B-NEXT:    ret
128 ; RV64ZBP-LABEL: shfl32_demandedbits:
129 ; RV64ZBP:       # %bb.0:
130 ; RV64ZBP-NEXT:    add a0, a0, a1
131 ; RV64ZBP-NEXT:    shflw a0, a0, a2
132 ; RV64ZBP-NEXT:    ret
133   %d = add i32 %a, %b
134   %e = and i32 %c, 15
135   %tmp = call i32 @llvm.riscv.shfl.i32(i32 %d, i32 %e)
136   ret i32 %tmp
139 define signext i32 @shfli32(i32 signext %a) nounwind {
140 ; RV64B-LABEL: shfli32:
141 ; RV64B:       # %bb.0:
142 ; RV64B-NEXT:    shfli a0, a0, 13
143 ; RV64B-NEXT:    ret
145 ; RV64ZBP-LABEL: shfli32:
146 ; RV64ZBP:       # %bb.0:
147 ; RV64ZBP-NEXT:    shfli a0, a0, 13
148 ; RV64ZBP-NEXT:    ret
149   %tmp = call i32 @llvm.riscv.shfl.i32(i32 %a, i32 13)
150  ret i32 %tmp
153 declare i32 @llvm.riscv.unshfl.i32(i32 %a, i32 %b)
155 define signext i32 @unshfl32(i32 signext %a, i32 signext %b) nounwind {
156 ; RV64B-LABEL: unshfl32:
157 ; RV64B:       # %bb.0:
158 ; RV64B-NEXT:    unshflw a0, a0, a1
159 ; RV64B-NEXT:    ret
161 ; RV64ZBP-LABEL: unshfl32:
162 ; RV64ZBP:       # %bb.0:
163 ; RV64ZBP-NEXT:    unshflw a0, a0, a1
164 ; RV64ZBP-NEXT:    ret
165   %tmp = call i32 @llvm.riscv.unshfl.i32(i32 %a, i32 %b)
166  ret i32 %tmp
169 define signext i32 @unshfl32_demandedbits(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
170 ; RV64B-LABEL: unshfl32_demandedbits:
171 ; RV64B:       # %bb.0:
172 ; RV64B-NEXT:    add a0, a0, a1
173 ; RV64B-NEXT:    unshflw a0, a0, a2
174 ; RV64B-NEXT:    ret
176 ; RV64ZBP-LABEL: unshfl32_demandedbits:
177 ; RV64ZBP:       # %bb.0:
178 ; RV64ZBP-NEXT:    add a0, a0, a1
179 ; RV64ZBP-NEXT:    unshflw a0, a0, a2
180 ; RV64ZBP-NEXT:    ret
181   %d = add i32 %a, %b
182   %e = and i32 %c, 15
183   %tmp = call i32 @llvm.riscv.unshfl.i32(i32 %d, i32 %e)
184   ret i32 %tmp
187 define signext i32 @unshfli32(i32 signext %a) nounwind {
188 ; RV64B-LABEL: unshfli32:
189 ; RV64B:       # %bb.0:
190 ; RV64B-NEXT:    unshfli a0, a0, 13
191 ; RV64B-NEXT:    ret
193 ; RV64ZBP-LABEL: unshfli32:
194 ; RV64ZBP:       # %bb.0:
195 ; RV64ZBP-NEXT:    unshfli a0, a0, 13
196 ; RV64ZBP-NEXT:    ret
197   %tmp = call i32 @llvm.riscv.unshfl.i32(i32 %a, i32 13)
198  ret i32 %tmp
201 declare i64 @llvm.riscv.grev.i64(i64 %a, i64 %b)
203 define i64 @grev64(i64 %a, i64 %b) nounwind {
204 ; RV64B-LABEL: grev64:
205 ; RV64B:       # %bb.0:
206 ; RV64B-NEXT:    grev a0, a0, a1
207 ; RV64B-NEXT:    ret
209 ; RV64ZBP-LABEL: grev64:
210 ; RV64ZBP:       # %bb.0:
211 ; RV64ZBP-NEXT:    grev a0, a0, a1
212 ; RV64ZBP-NEXT:    ret
213   %tmp = call i64 @llvm.riscv.grev.i64(i64 %a, i64 %b)
214  ret i64 %tmp
217 define i64 @grev64_demandedbits(i64 %a, i64 %b) nounwind {
218 ; RV64B-LABEL: grev64_demandedbits:
219 ; RV64B:       # %bb.0:
220 ; RV64B-NEXT:    grev a0, a0, a1
221 ; RV64B-NEXT:    ret
223 ; RV64ZBP-LABEL: grev64_demandedbits:
224 ; RV64ZBP:       # %bb.0:
225 ; RV64ZBP-NEXT:    grev a0, a0, a1
226 ; RV64ZBP-NEXT:    ret
227   %c = and i64 %b, 63
228   %tmp = call i64 @llvm.riscv.grev.i64(i64 %a, i64 %c)
229   ret i64 %tmp
232 define i64 @grevi64(i64 %a) nounwind {
233 ; RV64B-LABEL: grevi64:
234 ; RV64B:       # %bb.0:
235 ; RV64B-NEXT:    grevi a0, a0, 13
236 ; RV64B-NEXT:    ret
238 ; RV64ZBP-LABEL: grevi64:
239 ; RV64ZBP:       # %bb.0:
240 ; RV64ZBP-NEXT:    grevi a0, a0, 13
241 ; RV64ZBP-NEXT:    ret
242   %tmp = call i64 @llvm.riscv.grev.i64(i64 %a, i64 13)
243  ret i64 %tmp
246 declare i64 @llvm.riscv.gorc.i64(i64 %a, i64 %b)
248 define i64 @gorc64(i64 %a, i64 %b) nounwind {
249 ; RV64B-LABEL: gorc64:
250 ; RV64B:       # %bb.0:
251 ; RV64B-NEXT:    gorc a0, a0, a1
252 ; RV64B-NEXT:    ret
254 ; RV64ZBP-LABEL: gorc64:
255 ; RV64ZBP:       # %bb.0:
256 ; RV64ZBP-NEXT:    gorc a0, a0, a1
257 ; RV64ZBP-NEXT:    ret
258   %tmp = call i64 @llvm.riscv.gorc.i64(i64 %a, i64 %b)
259  ret i64 %tmp
262 define i64 @gorc64_demandedbits(i64 %a, i64 %b) nounwind {
263 ; RV64B-LABEL: gorc64_demandedbits:
264 ; RV64B:       # %bb.0:
265 ; RV64B-NEXT:    gorc a0, a0, a1
266 ; RV64B-NEXT:    ret
268 ; RV64ZBP-LABEL: gorc64_demandedbits:
269 ; RV64ZBP:       # %bb.0:
270 ; RV64ZBP-NEXT:    gorc a0, a0, a1
271 ; RV64ZBP-NEXT:    ret
272   %c = and i64 %b, 63
273   %tmp = call i64 @llvm.riscv.gorc.i64(i64 %a, i64 %c)
274   ret i64 %tmp
277 declare i64 @llvm.riscv.gorci.i64(i64 %a)
279 define i64 @gorci64(i64 %a) nounwind {
280 ; RV64B-LABEL: gorci64:
281 ; RV64B:       # %bb.0:
282 ; RV64B-NEXT:    gorci a0, a0, 13
283 ; RV64B-NEXT:    ret
285 ; RV64ZBP-LABEL: gorci64:
286 ; RV64ZBP:       # %bb.0:
287 ; RV64ZBP-NEXT:    gorci a0, a0, 13
288 ; RV64ZBP-NEXT:    ret
289   %tmp = call i64 @llvm.riscv.gorc.i64(i64 %a, i64 13)
290  ret i64 %tmp
293 declare i64 @llvm.riscv.shfl.i64(i64 %a, i64 %b)
295 define i64 @shfl64(i64 %a, i64 %b) nounwind {
296 ; RV64B-LABEL: shfl64:
297 ; RV64B:       # %bb.0:
298 ; RV64B-NEXT:    shfl a0, a0, a1
299 ; RV64B-NEXT:    ret
301 ; RV64ZBP-LABEL: shfl64:
302 ; RV64ZBP:       # %bb.0:
303 ; RV64ZBP-NEXT:    shfl a0, a0, a1
304 ; RV64ZBP-NEXT:    ret
305   %tmp = call i64 @llvm.riscv.shfl.i64(i64 %a, i64 %b)
306  ret i64 %tmp
309 define i64 @shfl64_demandedbits(i64 %a, i64 %b) nounwind {
310 ; RV64B-LABEL: shfl64_demandedbits:
311 ; RV64B:       # %bb.0:
312 ; RV64B-NEXT:    shfl a0, a0, a1
313 ; RV64B-NEXT:    ret
315 ; RV64ZBP-LABEL: shfl64_demandedbits:
316 ; RV64ZBP:       # %bb.0:
317 ; RV64ZBP-NEXT:    shfl a0, a0, a1
318 ; RV64ZBP-NEXT:    ret
319   %c = and i64 %b, 31
320   %tmp = call i64 @llvm.riscv.shfl.i64(i64 %a, i64 %c)
321   ret i64 %tmp
324 define i64 @shfli64(i64 %a) nounwind {
325 ; RV64B-LABEL: shfli64:
326 ; RV64B:       # %bb.0:
327 ; RV64B-NEXT:    shfli a0, a0, 13
328 ; RV64B-NEXT:    ret
330 ; RV64ZBP-LABEL: shfli64:
331 ; RV64ZBP:       # %bb.0:
332 ; RV64ZBP-NEXT:    shfli a0, a0, 13
333 ; RV64ZBP-NEXT:    ret
334   %tmp = call i64 @llvm.riscv.shfl.i64(i64 %a, i64 13)
335  ret i64 %tmp
338 declare i64 @llvm.riscv.unshfl.i64(i64 %a, i64 %b)
340 define i64 @unshfl64(i64 %a, i64 %b) nounwind {
341 ; RV64B-LABEL: unshfl64:
342 ; RV64B:       # %bb.0:
343 ; RV64B-NEXT:    unshfl a0, a0, a1
344 ; RV64B-NEXT:    ret
346 ; RV64ZBP-LABEL: unshfl64:
347 ; RV64ZBP:       # %bb.0:
348 ; RV64ZBP-NEXT:    unshfl a0, a0, a1
349 ; RV64ZBP-NEXT:    ret
350   %tmp = call i64 @llvm.riscv.unshfl.i64(i64 %a, i64 %b)
351  ret i64 %tmp
354 define i64 @unshfl64_demandedbits(i64 %a, i64 %b) nounwind {
355 ; RV64B-LABEL: unshfl64_demandedbits:
356 ; RV64B:       # %bb.0:
357 ; RV64B-NEXT:    unshfl a0, a0, a1
358 ; RV64B-NEXT:    ret
360 ; RV64ZBP-LABEL: unshfl64_demandedbits:
361 ; RV64ZBP:       # %bb.0:
362 ; RV64ZBP-NEXT:    unshfl a0, a0, a1
363 ; RV64ZBP-NEXT:    ret
364   %c = and i64 %b, 31
365   %tmp = call i64 @llvm.riscv.unshfl.i64(i64 %a, i64 %c)
366   ret i64 %tmp
369 define i64 @unshfli64(i64 %a) nounwind {
370 ; RV64B-LABEL: unshfli64:
371 ; RV64B:       # %bb.0:
372 ; RV64B-NEXT:    unshfli a0, a0, 13
373 ; RV64B-NEXT:    ret
375 ; RV64ZBP-LABEL: unshfli64:
376 ; RV64ZBP:       # %bb.0:
377 ; RV64ZBP-NEXT:    unshfli a0, a0, 13
378 ; RV64ZBP-NEXT:    ret
379   %tmp = call i64 @llvm.riscv.unshfl.i64(i64 %a, i64 13)
380  ret i64 %tmp
383 declare i64 @llvm.riscv.xperm.n.i64(i64 %a, i64 %b)
385 define i64 @xpermn64(i64 %a, i64 %b) nounwind {
386 ; RV64B-LABEL: xpermn64:
387 ; RV64B:       # %bb.0:
388 ; RV64B-NEXT:    xperm.n a0, a0, a1
389 ; RV64B-NEXT:    ret
391 ; RV64ZBP-LABEL: xpermn64:
392 ; RV64ZBP:       # %bb.0:
393 ; RV64ZBP-NEXT:    xperm.n a0, a0, a1
394 ; RV64ZBP-NEXT:    ret
395   %tmp = call i64 @llvm.riscv.xperm.n.i64(i64 %a, i64 %b)
396  ret i64 %tmp
399 declare i64 @llvm.riscv.xperm.b.i64(i64 %a, i64 %b)
401 define i64 @xpermb64(i64 %a, i64 %b) nounwind {
402 ; RV64B-LABEL: xpermb64:
403 ; RV64B:       # %bb.0:
404 ; RV64B-NEXT:    xperm.b a0, a0, a1
405 ; RV64B-NEXT:    ret
407 ; RV64ZBP-LABEL: xpermb64:
408 ; RV64ZBP:       # %bb.0:
409 ; RV64ZBP-NEXT:    xperm.b a0, a0, a1
410 ; RV64ZBP-NEXT:    ret
411   %tmp = call i64 @llvm.riscv.xperm.b.i64(i64 %a, i64 %b)
412  ret i64 %tmp
415 declare i64 @llvm.riscv.xperm.h.i64(i64 %a, i64 %b)
417 define i64 @xpermh64(i64 %a, i64 %b) nounwind {
418 ; RV64B-LABEL: xpermh64:
419 ; RV64B:       # %bb.0:
420 ; RV64B-NEXT:    xperm.h a0, a0, a1
421 ; RV64B-NEXT:    ret
423 ; RV64ZBP-LABEL: xpermh64:
424 ; RV64ZBP:       # %bb.0:
425 ; RV64ZBP-NEXT:    xperm.h a0, a0, a1
426 ; RV64ZBP-NEXT:    ret
427   %tmp = call i64 @llvm.riscv.xperm.h.i64(i64 %a, i64 %b)
428  ret i64 %tmp
431 declare i64 @llvm.riscv.xperm.w.i64(i64 %a, i64 %b)
433 define i64 @xpermw64(i64 %a, i64 %b) nounwind {
434 ; RV64B-LABEL: xpermw64:
435 ; RV64B:       # %bb.0:
436 ; RV64B-NEXT:    xperm.w a0, a0, a1
437 ; RV64B-NEXT:    ret
439 ; RV64ZBP-LABEL: xpermw64:
440 ; RV64ZBP:       # %bb.0:
441 ; RV64ZBP-NEXT:    xperm.w a0, a0, a1
442 ; RV64ZBP-NEXT:    ret
443   %tmp = call i64 @llvm.riscv.xperm.w.i64(i64 %a, i64 %b)
444  ret i64 %tmp