[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv64zbt.ll
blob33d0421adfb8110ab1588cca839707a0a2f61be5
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s -check-prefix=RV64I
4 ; RUN: llc -mtriple=riscv64 -mattr=+experimental-b -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s -check-prefix=RV64B
6 ; RUN: llc -mtriple=riscv64 -mattr=+experimental-zbt -verify-machineinstrs < %s \
7 ; RUN:   | FileCheck %s -check-prefix=RV64ZBT
9 define signext i32 @cmix_i32(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
10 ; RV64I-LABEL: cmix_i32:
11 ; RV64I:       # %bb.0:
12 ; RV64I-NEXT:    and a0, a1, a0
13 ; RV64I-NEXT:    not a1, a1
14 ; RV64I-NEXT:    and a1, a1, a2
15 ; RV64I-NEXT:    or a0, a1, a0
16 ; RV64I-NEXT:    ret
18 ; RV64B-LABEL: cmix_i32:
19 ; RV64B:       # %bb.0:
20 ; RV64B-NEXT:    cmix a0, a1, a0, a2
21 ; RV64B-NEXT:    ret
23 ; RV64ZBT-LABEL: cmix_i32:
24 ; RV64ZBT:       # %bb.0:
25 ; RV64ZBT-NEXT:    cmix a0, a1, a0, a2
26 ; RV64ZBT-NEXT:    ret
27   %and = and i32 %b, %a
28   %neg = xor i32 %b, -1
29   %and1 = and i32 %neg, %c
30   %or = or i32 %and1, %and
31   ret i32 %or
34 define i64 @cmix_i64(i64 %a, i64 %b, i64 %c) nounwind {
35 ; RV64I-LABEL: cmix_i64:
36 ; RV64I:       # %bb.0:
37 ; RV64I-NEXT:    and a0, a1, a0
38 ; RV64I-NEXT:    not a1, a1
39 ; RV64I-NEXT:    and a1, a1, a2
40 ; RV64I-NEXT:    or a0, a1, a0
41 ; RV64I-NEXT:    ret
43 ; RV64B-LABEL: cmix_i64:
44 ; RV64B:       # %bb.0:
45 ; RV64B-NEXT:    cmix a0, a1, a0, a2
46 ; RV64B-NEXT:    ret
48 ; RV64ZBT-LABEL: cmix_i64:
49 ; RV64ZBT:       # %bb.0:
50 ; RV64ZBT-NEXT:    cmix a0, a1, a0, a2
51 ; RV64ZBT-NEXT:    ret
52   %and = and i64 %b, %a
53   %neg = xor i64 %b, -1
54   %and1 = and i64 %neg, %c
55   %or = or i64 %and1, %and
56   ret i64 %or
59 define signext i32 @cmov_i32(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
60 ; RV64I-LABEL: cmov_i32:
61 ; RV64I:       # %bb.0:
62 ; RV64I-NEXT:    beqz a1, .LBB2_2
63 ; RV64I-NEXT:  # %bb.1:
64 ; RV64I-NEXT:    mv a2, a0
65 ; RV64I-NEXT:  .LBB2_2:
66 ; RV64I-NEXT:    mv a0, a2
67 ; RV64I-NEXT:    ret
69 ; RV64B-LABEL: cmov_i32:
70 ; RV64B:       # %bb.0:
71 ; RV64B-NEXT:    cmov a0, a1, a0, a2
72 ; RV64B-NEXT:    ret
74 ; RV64ZBT-LABEL: cmov_i32:
75 ; RV64ZBT:       # %bb.0:
76 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a2
77 ; RV64ZBT-NEXT:    ret
78   %tobool.not = icmp eq i32 %b, 0
79   %cond = select i1 %tobool.not, i32 %c, i32 %a
80   ret i32 %cond
83 define signext i32 @cmov_sle_i32(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) nounwind {
84 ; RV64I-LABEL: cmov_sle_i32:
85 ; RV64I:       # %bb.0:
86 ; RV64I-NEXT:    bge a2, a1, .LBB3_2
87 ; RV64I-NEXT:  # %bb.1:
88 ; RV64I-NEXT:    mv a0, a3
89 ; RV64I-NEXT:  .LBB3_2:
90 ; RV64I-NEXT:    ret
92 ; RV64B-LABEL: cmov_sle_i32:
93 ; RV64B:       # %bb.0:
94 ; RV64B-NEXT:    slt a1, a2, a1
95 ; RV64B-NEXT:    cmov a0, a1, a3, a0
96 ; RV64B-NEXT:    ret
98 ; RV64ZBT-LABEL: cmov_sle_i32:
99 ; RV64ZBT:       # %bb.0:
100 ; RV64ZBT-NEXT:    slt a1, a2, a1
101 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
102 ; RV64ZBT-NEXT:    ret
103   %tobool = icmp sle i32 %b, %c
104   %cond = select i1 %tobool, i32 %a, i32 %d
105   ret i32 %cond
108 define signext i32 @cmov_sge_i32(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) nounwind {
109 ; RV64I-LABEL: cmov_sge_i32:
110 ; RV64I:       # %bb.0:
111 ; RV64I-NEXT:    bge a1, a2, .LBB4_2
112 ; RV64I-NEXT:  # %bb.1:
113 ; RV64I-NEXT:    mv a0, a3
114 ; RV64I-NEXT:  .LBB4_2:
115 ; RV64I-NEXT:    ret
117 ; RV64B-LABEL: cmov_sge_i32:
118 ; RV64B:       # %bb.0:
119 ; RV64B-NEXT:    slt a1, a1, a2
120 ; RV64B-NEXT:    cmov a0, a1, a3, a0
121 ; RV64B-NEXT:    ret
123 ; RV64ZBT-LABEL: cmov_sge_i32:
124 ; RV64ZBT:       # %bb.0:
125 ; RV64ZBT-NEXT:    slt a1, a1, a2
126 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
127 ; RV64ZBT-NEXT:    ret
128   %tobool = icmp sge i32 %b, %c
129   %cond = select i1 %tobool, i32 %a, i32 %d
130   ret i32 %cond
133 define signext i32 @cmov_ule_i32(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) nounwind {
134 ; RV64I-LABEL: cmov_ule_i32:
135 ; RV64I:       # %bb.0:
136 ; RV64I-NEXT:    bgeu a2, a1, .LBB5_2
137 ; RV64I-NEXT:  # %bb.1:
138 ; RV64I-NEXT:    mv a0, a3
139 ; RV64I-NEXT:  .LBB5_2:
140 ; RV64I-NEXT:    ret
142 ; RV64B-LABEL: cmov_ule_i32:
143 ; RV64B:       # %bb.0:
144 ; RV64B-NEXT:    sltu a1, a2, a1
145 ; RV64B-NEXT:    cmov a0, a1, a3, a0
146 ; RV64B-NEXT:    ret
148 ; RV64ZBT-LABEL: cmov_ule_i32:
149 ; RV64ZBT:       # %bb.0:
150 ; RV64ZBT-NEXT:    sltu a1, a2, a1
151 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
152 ; RV64ZBT-NEXT:    ret
153   %tobool = icmp ule i32 %b, %c
154   %cond = select i1 %tobool, i32 %a, i32 %d
155   ret i32 %cond
158 define signext i32 @cmov_uge_i32(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) nounwind {
159 ; RV64I-LABEL: cmov_uge_i32:
160 ; RV64I:       # %bb.0:
161 ; RV64I-NEXT:    bgeu a1, a2, .LBB6_2
162 ; RV64I-NEXT:  # %bb.1:
163 ; RV64I-NEXT:    mv a0, a3
164 ; RV64I-NEXT:  .LBB6_2:
165 ; RV64I-NEXT:    ret
167 ; RV64B-LABEL: cmov_uge_i32:
168 ; RV64B:       # %bb.0:
169 ; RV64B-NEXT:    sltu a1, a1, a2
170 ; RV64B-NEXT:    cmov a0, a1, a3, a0
171 ; RV64B-NEXT:    ret
173 ; RV64ZBT-LABEL: cmov_uge_i32:
174 ; RV64ZBT:       # %bb.0:
175 ; RV64ZBT-NEXT:    sltu a1, a1, a2
176 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
177 ; RV64ZBT-NEXT:    ret
178   %tobool = icmp uge i32 %b, %c
179   %cond = select i1 %tobool, i32 %a, i32 %d
180   ret i32 %cond
183 define i64 @cmov_i64(i64 %a, i64 %b, i64 %c) nounwind {
184 ; RV64I-LABEL: cmov_i64:
185 ; RV64I:       # %bb.0:
186 ; RV64I-NEXT:    beqz a1, .LBB7_2
187 ; RV64I-NEXT:  # %bb.1:
188 ; RV64I-NEXT:    mv a2, a0
189 ; RV64I-NEXT:  .LBB7_2:
190 ; RV64I-NEXT:    mv a0, a2
191 ; RV64I-NEXT:    ret
193 ; RV64B-LABEL: cmov_i64:
194 ; RV64B:       # %bb.0:
195 ; RV64B-NEXT:    cmov a0, a1, a0, a2
196 ; RV64B-NEXT:    ret
198 ; RV64ZBT-LABEL: cmov_i64:
199 ; RV64ZBT:       # %bb.0:
200 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a2
201 ; RV64ZBT-NEXT:    ret
202   %tobool.not = icmp eq i64 %b, 0
203   %cond = select i1 %tobool.not, i64 %c, i64 %a
204   ret i64 %cond
207 define i64 @cmov_sle_i64(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {
208 ; RV64I-LABEL: cmov_sle_i64:
209 ; RV64I:       # %bb.0:
210 ; RV64I-NEXT:    bge a2, a1, .LBB8_2
211 ; RV64I-NEXT:  # %bb.1:
212 ; RV64I-NEXT:    mv a0, a3
213 ; RV64I-NEXT:  .LBB8_2:
214 ; RV64I-NEXT:    ret
216 ; RV64B-LABEL: cmov_sle_i64:
217 ; RV64B:       # %bb.0:
218 ; RV64B-NEXT:    slt a1, a2, a1
219 ; RV64B-NEXT:    cmov a0, a1, a3, a0
220 ; RV64B-NEXT:    ret
222 ; RV64ZBT-LABEL: cmov_sle_i64:
223 ; RV64ZBT:       # %bb.0:
224 ; RV64ZBT-NEXT:    slt a1, a2, a1
225 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
226 ; RV64ZBT-NEXT:    ret
227   %tobool = icmp sle i64 %b, %c
228   %cond = select i1 %tobool, i64 %a, i64 %d
229   ret i64 %cond
232 define i64 @cmov_sge_i64(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {
233 ; RV64I-LABEL: cmov_sge_i64:
234 ; RV64I:       # %bb.0:
235 ; RV64I-NEXT:    bge a1, a2, .LBB9_2
236 ; RV64I-NEXT:  # %bb.1:
237 ; RV64I-NEXT:    mv a0, a3
238 ; RV64I-NEXT:  .LBB9_2:
239 ; RV64I-NEXT:    ret
241 ; RV64B-LABEL: cmov_sge_i64:
242 ; RV64B:       # %bb.0:
243 ; RV64B-NEXT:    slt a1, a1, a2
244 ; RV64B-NEXT:    cmov a0, a1, a3, a0
245 ; RV64B-NEXT:    ret
247 ; RV64ZBT-LABEL: cmov_sge_i64:
248 ; RV64ZBT:       # %bb.0:
249 ; RV64ZBT-NEXT:    slt a1, a1, a2
250 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
251 ; RV64ZBT-NEXT:    ret
252   %tobool = icmp sge i64 %b, %c
253   %cond = select i1 %tobool, i64 %a, i64 %d
254   ret i64 %cond
257 define i64 @cmov_ule_i64(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {
258 ; RV64I-LABEL: cmov_ule_i64:
259 ; RV64I:       # %bb.0:
260 ; RV64I-NEXT:    bgeu a2, a1, .LBB10_2
261 ; RV64I-NEXT:  # %bb.1:
262 ; RV64I-NEXT:    mv a0, a3
263 ; RV64I-NEXT:  .LBB10_2:
264 ; RV64I-NEXT:    ret
266 ; RV64B-LABEL: cmov_ule_i64:
267 ; RV64B:       # %bb.0:
268 ; RV64B-NEXT:    sltu a1, a2, a1
269 ; RV64B-NEXT:    cmov a0, a1, a3, a0
270 ; RV64B-NEXT:    ret
272 ; RV64ZBT-LABEL: cmov_ule_i64:
273 ; RV64ZBT:       # %bb.0:
274 ; RV64ZBT-NEXT:    sltu a1, a2, a1
275 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
276 ; RV64ZBT-NEXT:    ret
277   %tobool = icmp ule i64 %b, %c
278   %cond = select i1 %tobool, i64 %a, i64 %d
279   ret i64 %cond
282 define i64 @cmov_uge_i64(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {
283 ; RV64I-LABEL: cmov_uge_i64:
284 ; RV64I:       # %bb.0:
285 ; RV64I-NEXT:    bgeu a1, a2, .LBB11_2
286 ; RV64I-NEXT:  # %bb.1:
287 ; RV64I-NEXT:    mv a0, a3
288 ; RV64I-NEXT:  .LBB11_2:
289 ; RV64I-NEXT:    ret
291 ; RV64B-LABEL: cmov_uge_i64:
292 ; RV64B:       # %bb.0:
293 ; RV64B-NEXT:    sltu a1, a1, a2
294 ; RV64B-NEXT:    cmov a0, a1, a3, a0
295 ; RV64B-NEXT:    ret
297 ; RV64ZBT-LABEL: cmov_uge_i64:
298 ; RV64ZBT:       # %bb.0:
299 ; RV64ZBT-NEXT:    sltu a1, a1, a2
300 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
301 ; RV64ZBT-NEXT:    ret
302   %tobool = icmp uge i64 %b, %c
303   %cond = select i1 %tobool, i64 %a, i64 %d
304   ret i64 %cond
307 declare i32 @llvm.fshl.i32(i32, i32, i32)
309 define signext i32 @fshl_i32(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
310 ; RV64I-LABEL: fshl_i32:
311 ; RV64I:       # %bb.0:
312 ; RV64I-NEXT:    slli a0, a0, 32
313 ; RV64I-NEXT:    slli a1, a1, 32
314 ; RV64I-NEXT:    srli a1, a1, 32
315 ; RV64I-NEXT:    or a0, a0, a1
316 ; RV64I-NEXT:    andi a1, a2, 31
317 ; RV64I-NEXT:    sll a0, a0, a1
318 ; RV64I-NEXT:    srai a0, a0, 32
319 ; RV64I-NEXT:    ret
321 ; RV64B-LABEL: fshl_i32:
322 ; RV64B:       # %bb.0:
323 ; RV64B-NEXT:    andi a2, a2, 31
324 ; RV64B-NEXT:    fslw a0, a0, a1, a2
325 ; RV64B-NEXT:    ret
327 ; RV64ZBT-LABEL: fshl_i32:
328 ; RV64ZBT:       # %bb.0:
329 ; RV64ZBT-NEXT:    andi a2, a2, 31
330 ; RV64ZBT-NEXT:    fslw a0, a0, a1, a2
331 ; RV64ZBT-NEXT:    ret
332   %1 = tail call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %c)
333   ret i32 %1
336 ; Similar to fshl_i32 but result is not sign extended.
337 define void @fshl_i32_nosext(i32 signext %a, i32 signext %b, i32 signext %c, i32* %x) nounwind {
338 ; RV64I-LABEL: fshl_i32_nosext:
339 ; RV64I:       # %bb.0:
340 ; RV64I-NEXT:    slli a0, a0, 32
341 ; RV64I-NEXT:    slli a1, a1, 32
342 ; RV64I-NEXT:    srli a1, a1, 32
343 ; RV64I-NEXT:    or a0, a0, a1
344 ; RV64I-NEXT:    andi a1, a2, 31
345 ; RV64I-NEXT:    sll a0, a0, a1
346 ; RV64I-NEXT:    srli a0, a0, 32
347 ; RV64I-NEXT:    sw a0, 0(a3)
348 ; RV64I-NEXT:    ret
350 ; RV64B-LABEL: fshl_i32_nosext:
351 ; RV64B:       # %bb.0:
352 ; RV64B-NEXT:    andi a2, a2, 31
353 ; RV64B-NEXT:    fslw a0, a0, a1, a2
354 ; RV64B-NEXT:    sw a0, 0(a3)
355 ; RV64B-NEXT:    ret
357 ; RV64ZBT-LABEL: fshl_i32_nosext:
358 ; RV64ZBT:       # %bb.0:
359 ; RV64ZBT-NEXT:    andi a2, a2, 31
360 ; RV64ZBT-NEXT:    fslw a0, a0, a1, a2
361 ; RV64ZBT-NEXT:    sw a0, 0(a3)
362 ; RV64ZBT-NEXT:    ret
363   %1 = tail call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %c)
364   store i32 %1, i32* %x
365   ret void
368 declare i64 @llvm.fshl.i64(i64, i64, i64)
370 define i64 @fshl_i64(i64 %a, i64 %b, i64 %c) nounwind {
371 ; RV64I-LABEL: fshl_i64:
372 ; RV64I:       # %bb.0:
373 ; RV64I-NEXT:    sll a0, a0, a2
374 ; RV64I-NEXT:    not a2, a2
375 ; RV64I-NEXT:    srli a1, a1, 1
376 ; RV64I-NEXT:    srl a1, a1, a2
377 ; RV64I-NEXT:    or a0, a0, a1
378 ; RV64I-NEXT:    ret
380 ; RV64B-LABEL: fshl_i64:
381 ; RV64B:       # %bb.0:
382 ; RV64B-NEXT:    andi a2, a2, 63
383 ; RV64B-NEXT:    fsl a0, a0, a1, a2
384 ; RV64B-NEXT:    ret
386 ; RV64ZBT-LABEL: fshl_i64:
387 ; RV64ZBT:       # %bb.0:
388 ; RV64ZBT-NEXT:    andi a2, a2, 63
389 ; RV64ZBT-NEXT:    fsl a0, a0, a1, a2
390 ; RV64ZBT-NEXT:    ret
391   %1 = tail call i64 @llvm.fshl.i64(i64 %a, i64 %b, i64 %c)
392   ret i64 %1
395 declare i32 @llvm.fshr.i32(i32, i32, i32)
397 define signext i32 @fshr_i32(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
398 ; RV64I-LABEL: fshr_i32:
399 ; RV64I:       # %bb.0:
400 ; RV64I-NEXT:    slli a0, a0, 32
401 ; RV64I-NEXT:    slli a1, a1, 32
402 ; RV64I-NEXT:    srli a1, a1, 32
403 ; RV64I-NEXT:    or a0, a0, a1
404 ; RV64I-NEXT:    andi a1, a2, 31
405 ; RV64I-NEXT:    srl a0, a0, a1
406 ; RV64I-NEXT:    sext.w a0, a0
407 ; RV64I-NEXT:    ret
409 ; RV64B-LABEL: fshr_i32:
410 ; RV64B:       # %bb.0:
411 ; RV64B-NEXT:    andi a2, a2, 31
412 ; RV64B-NEXT:    fsrw a0, a1, a0, a2
413 ; RV64B-NEXT:    ret
415 ; RV64ZBT-LABEL: fshr_i32:
416 ; RV64ZBT:       # %bb.0:
417 ; RV64ZBT-NEXT:    andi a2, a2, 31
418 ; RV64ZBT-NEXT:    fsrw a0, a1, a0, a2
419 ; RV64ZBT-NEXT:    ret
420   %1 = tail call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 %c)
421   ret i32 %1
424 ; Similar to fshr_i32 but result is not sign extended.
425 define void @fshr_i32_nosext(i32 signext %a, i32 signext %b, i32 signext %c, i32* %x) nounwind {
426 ; RV64I-LABEL: fshr_i32_nosext:
427 ; RV64I:       # %bb.0:
428 ; RV64I-NEXT:    slli a0, a0, 32
429 ; RV64I-NEXT:    slli a1, a1, 32
430 ; RV64I-NEXT:    srli a1, a1, 32
431 ; RV64I-NEXT:    or a0, a0, a1
432 ; RV64I-NEXT:    andi a1, a2, 31
433 ; RV64I-NEXT:    srl a0, a0, a1
434 ; RV64I-NEXT:    sw a0, 0(a3)
435 ; RV64I-NEXT:    ret
437 ; RV64B-LABEL: fshr_i32_nosext:
438 ; RV64B:       # %bb.0:
439 ; RV64B-NEXT:    andi a2, a2, 31
440 ; RV64B-NEXT:    fsrw a0, a1, a0, a2
441 ; RV64B-NEXT:    sw a0, 0(a3)
442 ; RV64B-NEXT:    ret
444 ; RV64ZBT-LABEL: fshr_i32_nosext:
445 ; RV64ZBT:       # %bb.0:
446 ; RV64ZBT-NEXT:    andi a2, a2, 31
447 ; RV64ZBT-NEXT:    fsrw a0, a1, a0, a2
448 ; RV64ZBT-NEXT:    sw a0, 0(a3)
449 ; RV64ZBT-NEXT:    ret
450   %1 = tail call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 %c)
451   store i32 %1, i32* %x
452   ret void
455 declare i64 @llvm.fshr.i64(i64, i64, i64)
457 define i64 @fshr_i64(i64 %a, i64 %b, i64 %c) nounwind {
458 ; RV64I-LABEL: fshr_i64:
459 ; RV64I:       # %bb.0:
460 ; RV64I-NEXT:    srl a1, a1, a2
461 ; RV64I-NEXT:    not a2, a2
462 ; RV64I-NEXT:    slli a0, a0, 1
463 ; RV64I-NEXT:    sll a0, a0, a2
464 ; RV64I-NEXT:    or a0, a0, a1
465 ; RV64I-NEXT:    ret
467 ; RV64B-LABEL: fshr_i64:
468 ; RV64B:       # %bb.0:
469 ; RV64B-NEXT:    andi a2, a2, 63
470 ; RV64B-NEXT:    fsr a0, a1, a0, a2
471 ; RV64B-NEXT:    ret
473 ; RV64ZBT-LABEL: fshr_i64:
474 ; RV64ZBT:       # %bb.0:
475 ; RV64ZBT-NEXT:    andi a2, a2, 63
476 ; RV64ZBT-NEXT:    fsr a0, a1, a0, a2
477 ; RV64ZBT-NEXT:    ret
478   %1 = tail call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 %c)
479   ret i64 %1
482 define signext i32 @fshri_i32(i32 signext %a, i32 signext %b) nounwind {
483 ; RV64I-LABEL: fshri_i32:
484 ; RV64I:       # %bb.0:
485 ; RV64I-NEXT:    srliw a1, a1, 5
486 ; RV64I-NEXT:    slli a0, a0, 27
487 ; RV64I-NEXT:    or a0, a0, a1
488 ; RV64I-NEXT:    sext.w a0, a0
489 ; RV64I-NEXT:    ret
491 ; RV64B-LABEL: fshri_i32:
492 ; RV64B:       # %bb.0:
493 ; RV64B-NEXT:    fsriw a0, a1, a0, 5
494 ; RV64B-NEXT:    ret
496 ; RV64ZBT-LABEL: fshri_i32:
497 ; RV64ZBT:       # %bb.0:
498 ; RV64ZBT-NEXT:    fsriw a0, a1, a0, 5
499 ; RV64ZBT-NEXT:    ret
500   %1 = tail call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 5)
501   ret i32 %1
504 ; Similar to fshr_i32 but result is not sign extended.
505 define void @fshri_i32_nosext(i32 signext %a, i32 signext %b, i32* %x) nounwind {
506 ; RV64I-LABEL: fshri_i32_nosext:
507 ; RV64I:       # %bb.0:
508 ; RV64I-NEXT:    srliw a1, a1, 5
509 ; RV64I-NEXT:    slli a0, a0, 27
510 ; RV64I-NEXT:    or a0, a0, a1
511 ; RV64I-NEXT:    sw a0, 0(a2)
512 ; RV64I-NEXT:    ret
514 ; RV64B-LABEL: fshri_i32_nosext:
515 ; RV64B:       # %bb.0:
516 ; RV64B-NEXT:    fsriw a0, a1, a0, 5
517 ; RV64B-NEXT:    sw a0, 0(a2)
518 ; RV64B-NEXT:    ret
520 ; RV64ZBT-LABEL: fshri_i32_nosext:
521 ; RV64ZBT:       # %bb.0:
522 ; RV64ZBT-NEXT:    fsriw a0, a1, a0, 5
523 ; RV64ZBT-NEXT:    sw a0, 0(a2)
524 ; RV64ZBT-NEXT:    ret
525   %1 = tail call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 5)
526   store i32 %1, i32* %x
527   ret void
530 define i64 @fshri_i64(i64 %a, i64 %b) nounwind {
531 ; RV64I-LABEL: fshri_i64:
532 ; RV64I:       # %bb.0:
533 ; RV64I-NEXT:    srli a1, a1, 5
534 ; RV64I-NEXT:    slli a0, a0, 59
535 ; RV64I-NEXT:    or a0, a0, a1
536 ; RV64I-NEXT:    ret
538 ; RV64B-LABEL: fshri_i64:
539 ; RV64B:       # %bb.0:
540 ; RV64B-NEXT:    fsri a0, a1, a0, 5
541 ; RV64B-NEXT:    ret
543 ; RV64ZBT-LABEL: fshri_i64:
544 ; RV64ZBT:       # %bb.0:
545 ; RV64ZBT-NEXT:    fsri a0, a1, a0, 5
546 ; RV64ZBT-NEXT:    ret
547   %1 = tail call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 5)
548   ret i64 %1
551 define signext i32 @fshli_i32(i32 signext %a, i32 signext %b) nounwind {
552 ; RV64I-LABEL: fshli_i32:
553 ; RV64I:       # %bb.0:
554 ; RV64I-NEXT:    srliw a1, a1, 27
555 ; RV64I-NEXT:    slli a0, a0, 5
556 ; RV64I-NEXT:    or a0, a0, a1
557 ; RV64I-NEXT:    sext.w a0, a0
558 ; RV64I-NEXT:    ret
560 ; RV64B-LABEL: fshli_i32:
561 ; RV64B:       # %bb.0:
562 ; RV64B-NEXT:    fsriw a0, a1, a0, 27
563 ; RV64B-NEXT:    ret
565 ; RV64ZBT-LABEL: fshli_i32:
566 ; RV64ZBT:       # %bb.0:
567 ; RV64ZBT-NEXT:    fsriw a0, a1, a0, 27
568 ; RV64ZBT-NEXT:    ret
569   %1 = tail call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 5)
570   ret i32 %1
573 ; Similar to fshl_i32 but result is not sign extended.
574 define void @fshli_i32_nosext(i32 signext %a, i32 signext %b, i32* %x) nounwind {
575 ; RV64I-LABEL: fshli_i32_nosext:
576 ; RV64I:       # %bb.0:
577 ; RV64I-NEXT:    srliw a1, a1, 27
578 ; RV64I-NEXT:    slli a0, a0, 5
579 ; RV64I-NEXT:    or a0, a0, a1
580 ; RV64I-NEXT:    sw a0, 0(a2)
581 ; RV64I-NEXT:    ret
583 ; RV64B-LABEL: fshli_i32_nosext:
584 ; RV64B:       # %bb.0:
585 ; RV64B-NEXT:    fsriw a0, a1, a0, 27
586 ; RV64B-NEXT:    sw a0, 0(a2)
587 ; RV64B-NEXT:    ret
589 ; RV64ZBT-LABEL: fshli_i32_nosext:
590 ; RV64ZBT:       # %bb.0:
591 ; RV64ZBT-NEXT:    fsriw a0, a1, a0, 27
592 ; RV64ZBT-NEXT:    sw a0, 0(a2)
593 ; RV64ZBT-NEXT:    ret
594   %1 = tail call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 5)
595   store i32 %1, i32* %x
596   ret void
599 define i64 @fshli_i64(i64 %a, i64 %b) nounwind {
600 ; RV64I-LABEL: fshli_i64:
601 ; RV64I:       # %bb.0:
602 ; RV64I-NEXT:    srli a1, a1, 59
603 ; RV64I-NEXT:    slli a0, a0, 5
604 ; RV64I-NEXT:    or a0, a0, a1
605 ; RV64I-NEXT:    ret
607 ; RV64B-LABEL: fshli_i64:
608 ; RV64B:       # %bb.0:
609 ; RV64B-NEXT:    fsri a0, a1, a0, 59
610 ; RV64B-NEXT:    ret
612 ; RV64ZBT-LABEL: fshli_i64:
613 ; RV64ZBT:       # %bb.0:
614 ; RV64ZBT-NEXT:    fsri a0, a1, a0, 59
615 ; RV64ZBT-NEXT:    ret
616   %1 = tail call i64 @llvm.fshl.i64(i64 %a, i64 %b, i64 5)
617   ret i64 %1