[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv64zbt.ll
blob25ae45234c048695d9320e6da5356287ab418426
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-zbt -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s -check-prefix=RV64ZBT
7 define signext i32 @cmix_i32(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
8 ; RV64I-LABEL: cmix_i32:
9 ; RV64I:       # %bb.0:
10 ; RV64I-NEXT:    and a0, a1, a0
11 ; RV64I-NEXT:    not a1, a1
12 ; RV64I-NEXT:    and a1, a1, a2
13 ; RV64I-NEXT:    or a0, a1, a0
14 ; RV64I-NEXT:    ret
16 ; RV64ZBT-LABEL: cmix_i32:
17 ; RV64ZBT:       # %bb.0:
18 ; RV64ZBT-NEXT:    cmix a0, a1, a0, a2
19 ; RV64ZBT-NEXT:    ret
20   %and = and i32 %b, %a
21   %neg = xor i32 %b, -1
22   %and1 = and i32 %neg, %c
23   %or = or i32 %and1, %and
24   ret i32 %or
27 define signext i32 @cmix_i32_2(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
28 ; RV64I-LABEL: cmix_i32_2:
29 ; RV64I:       # %bb.0:
30 ; RV64I-NEXT:    xor a0, a0, a2
31 ; RV64I-NEXT:    and a0, a0, a1
32 ; RV64I-NEXT:    xor a0, a0, a2
33 ; RV64I-NEXT:    ret
35 ; RV64ZBT-LABEL: cmix_i32_2:
36 ; RV64ZBT:       # %bb.0:
37 ; RV64ZBT-NEXT:    cmix a0, a1, a0, a2
38 ; RV64ZBT-NEXT:    ret
39   %xor = xor i32 %a, %c
40   %and = and i32 %xor, %b
41   %xor1 = xor i32 %and, %c
42   ret i32 %xor1
45 define i64 @cmix_i64(i64 %a, i64 %b, i64 %c) nounwind {
46 ; RV64I-LABEL: cmix_i64:
47 ; RV64I:       # %bb.0:
48 ; RV64I-NEXT:    and a0, a1, a0
49 ; RV64I-NEXT:    not a1, a1
50 ; RV64I-NEXT:    and a1, a1, a2
51 ; RV64I-NEXT:    or a0, a1, a0
52 ; RV64I-NEXT:    ret
54 ; RV64ZBT-LABEL: cmix_i64:
55 ; RV64ZBT:       # %bb.0:
56 ; RV64ZBT-NEXT:    cmix a0, a1, a0, a2
57 ; RV64ZBT-NEXT:    ret
58   %and = and i64 %b, %a
59   %neg = xor i64 %b, -1
60   %and1 = and i64 %neg, %c
61   %or = or i64 %and1, %and
62   ret i64 %or
65 define i64 @cmix_i64_2(i64 %a, i64 %b, i64 %c) nounwind {
66 ; RV64I-LABEL: cmix_i64_2:
67 ; RV64I:       # %bb.0:
68 ; RV64I-NEXT:    xor a0, a1, a2
69 ; RV64I-NEXT:    and a0, a0, a1
70 ; RV64I-NEXT:    xor a0, a0, a2
71 ; RV64I-NEXT:    ret
73 ; RV64ZBT-LABEL: cmix_i64_2:
74 ; RV64ZBT:       # %bb.0:
75 ; RV64ZBT-NEXT:    cmix a0, a1, a1, a2
76 ; RV64ZBT-NEXT:    ret
77   %xor = xor i64 %b, %c
78   %and = and i64 %xor, %b
79   %xor1 = xor i64 %and, %c
80   ret i64 %xor1
83 define signext i32 @cmov_i32(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
84 ; RV64I-LABEL: cmov_i32:
85 ; RV64I:       # %bb.0:
86 ; RV64I-NEXT:    beqz a1, .LBB4_2
87 ; RV64I-NEXT:  # %bb.1:
88 ; RV64I-NEXT:    mv a2, a0
89 ; RV64I-NEXT:  .LBB4_2:
90 ; RV64I-NEXT:    mv a0, a2
91 ; RV64I-NEXT:    ret
93 ; RV64ZBT-LABEL: cmov_i32:
94 ; RV64ZBT:       # %bb.0:
95 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a2
96 ; RV64ZBT-NEXT:    ret
97   %tobool.not = icmp eq i32 %b, 0
98   %cond = select i1 %tobool.not, i32 %c, i32 %a
99   ret i32 %cond
102 define signext i32 @cmov_sle_i32(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) nounwind {
103 ; RV64I-LABEL: cmov_sle_i32:
104 ; RV64I:       # %bb.0:
105 ; RV64I-NEXT:    bge a2, a1, .LBB5_2
106 ; RV64I-NEXT:  # %bb.1:
107 ; RV64I-NEXT:    mv a0, a3
108 ; RV64I-NEXT:  .LBB5_2:
109 ; RV64I-NEXT:    ret
111 ; RV64ZBT-LABEL: cmov_sle_i32:
112 ; RV64ZBT:       # %bb.0:
113 ; RV64ZBT-NEXT:    slt a1, a2, a1
114 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
115 ; RV64ZBT-NEXT:    ret
116   %tobool = icmp sle i32 %b, %c
117   %cond = select i1 %tobool, i32 %a, i32 %d
118   ret i32 %cond
121 define signext i32 @cmov_sge_i32(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) nounwind {
122 ; RV64I-LABEL: cmov_sge_i32:
123 ; RV64I:       # %bb.0:
124 ; RV64I-NEXT:    bge a1, a2, .LBB6_2
125 ; RV64I-NEXT:  # %bb.1:
126 ; RV64I-NEXT:    mv a0, a3
127 ; RV64I-NEXT:  .LBB6_2:
128 ; RV64I-NEXT:    ret
130 ; RV64ZBT-LABEL: cmov_sge_i32:
131 ; RV64ZBT:       # %bb.0:
132 ; RV64ZBT-NEXT:    slt a1, a1, a2
133 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
134 ; RV64ZBT-NEXT:    ret
135   %tobool = icmp sge i32 %b, %c
136   %cond = select i1 %tobool, i32 %a, i32 %d
137   ret i32 %cond
140 define signext i32 @cmov_ule_i32(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) nounwind {
141 ; RV64I-LABEL: cmov_ule_i32:
142 ; RV64I:       # %bb.0:
143 ; RV64I-NEXT:    bgeu a2, a1, .LBB7_2
144 ; RV64I-NEXT:  # %bb.1:
145 ; RV64I-NEXT:    mv a0, a3
146 ; RV64I-NEXT:  .LBB7_2:
147 ; RV64I-NEXT:    ret
149 ; RV64ZBT-LABEL: cmov_ule_i32:
150 ; RV64ZBT:       # %bb.0:
151 ; RV64ZBT-NEXT:    sltu a1, a2, a1
152 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
153 ; RV64ZBT-NEXT:    ret
154   %tobool = icmp ule i32 %b, %c
155   %cond = select i1 %tobool, i32 %a, i32 %d
156   ret i32 %cond
159 define signext i32 @cmov_uge_i32(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) nounwind {
160 ; RV64I-LABEL: cmov_uge_i32:
161 ; RV64I:       # %bb.0:
162 ; RV64I-NEXT:    bgeu a1, a2, .LBB8_2
163 ; RV64I-NEXT:  # %bb.1:
164 ; RV64I-NEXT:    mv a0, a3
165 ; RV64I-NEXT:  .LBB8_2:
166 ; RV64I-NEXT:    ret
168 ; RV64ZBT-LABEL: cmov_uge_i32:
169 ; RV64ZBT:       # %bb.0:
170 ; RV64ZBT-NEXT:    sltu a1, a1, a2
171 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
172 ; RV64ZBT-NEXT:    ret
173   %tobool = icmp uge i32 %b, %c
174   %cond = select i1 %tobool, i32 %a, i32 %d
175   ret i32 %cond
178 define i64 @cmov_i64(i64 %a, i64 %b, i64 %c) nounwind {
179 ; RV64I-LABEL: cmov_i64:
180 ; RV64I:       # %bb.0:
181 ; RV64I-NEXT:    beqz a1, .LBB9_2
182 ; RV64I-NEXT:  # %bb.1:
183 ; RV64I-NEXT:    mv a2, a0
184 ; RV64I-NEXT:  .LBB9_2:
185 ; RV64I-NEXT:    mv a0, a2
186 ; RV64I-NEXT:    ret
188 ; RV64ZBT-LABEL: cmov_i64:
189 ; RV64ZBT:       # %bb.0:
190 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a2
191 ; RV64ZBT-NEXT:    ret
192   %tobool.not = icmp eq i64 %b, 0
193   %cond = select i1 %tobool.not, i64 %c, i64 %a
194   ret i64 %cond
197 define i64 @cmov_eq_i64_constant_2048(i64 %a, i64 %b, i64 %c) nounwind {
198 ; RV64I-LABEL: cmov_eq_i64_constant_2048:
199 ; RV64I:       # %bb.0:
200 ; RV64I-NEXT:    lui a3, 1
201 ; RV64I-NEXT:    addiw a3, a3, -2048
202 ; RV64I-NEXT:    beq a1, a3, .LBB10_2
203 ; RV64I-NEXT:  # %bb.1:
204 ; RV64I-NEXT:    mv a0, a2
205 ; RV64I-NEXT:  .LBB10_2:
206 ; RV64I-NEXT:    ret
208 ; RV64ZBT-LABEL: cmov_eq_i64_constant_2048:
209 ; RV64ZBT:       # %bb.0:
210 ; RV64ZBT-NEXT:    addi a1, a1, -2048
211 ; RV64ZBT-NEXT:    cmov a0, a1, a2, a0
212 ; RV64ZBT-NEXT:    ret
213   %tobool.not = icmp eq i64 %b, 2048
214   %cond = select i1 %tobool.not, i64 %a, i64 %c
215   ret i64 %cond
218 define i64 @cmov_eq_i64_constant_neg_2047(i64 %a, i64 %b, i64 %c) nounwind {
219 ; RV64I-LABEL: cmov_eq_i64_constant_neg_2047:
220 ; RV64I:       # %bb.0:
221 ; RV64I-NEXT:    li a3, -2047
222 ; RV64I-NEXT:    beq a1, a3, .LBB11_2
223 ; RV64I-NEXT:  # %bb.1:
224 ; RV64I-NEXT:    mv a0, a2
225 ; RV64I-NEXT:  .LBB11_2:
226 ; RV64I-NEXT:    ret
228 ; RV64ZBT-LABEL: cmov_eq_i64_constant_neg_2047:
229 ; RV64ZBT:       # %bb.0:
230 ; RV64ZBT-NEXT:    addi a1, a1, 2047
231 ; RV64ZBT-NEXT:    cmov a0, a1, a2, a0
232 ; RV64ZBT-NEXT:    ret
233   %tobool.not = icmp eq i64 %b, -2047
234   %cond = select i1 %tobool.not, i64 %a, i64 %c
235   ret i64 %cond
238 define i64 @cmov_ne_i64(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {
239 ; RV64I-LABEL: cmov_ne_i64:
240 ; RV64I:       # %bb.0:
241 ; RV64I-NEXT:    bne a1, a2, .LBB12_2
242 ; RV64I-NEXT:  # %bb.1:
243 ; RV64I-NEXT:    mv a0, a3
244 ; RV64I-NEXT:  .LBB12_2:
245 ; RV64I-NEXT:    ret
247 ; RV64ZBT-LABEL: cmov_ne_i64:
248 ; RV64ZBT:       # %bb.0:
249 ; RV64ZBT-NEXT:    xor a1, a1, a2
250 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a3
251 ; RV64ZBT-NEXT:    ret
252   %tobool.not = icmp ne i64 %b, %c
253   %cond = select i1 %tobool.not, i64 %a, i64 %d
254   ret i64 %cond
257 define i64 @cmov_ne_i64_constant_zero(i64 %a, i64 %b, i64 %c) nounwind {
258 ; RV64I-LABEL: cmov_ne_i64_constant_zero:
259 ; RV64I:       # %bb.0:
260 ; RV64I-NEXT:    bnez a1, .LBB13_2
261 ; RV64I-NEXT:  # %bb.1:
262 ; RV64I-NEXT:    mv a0, a2
263 ; RV64I-NEXT:  .LBB13_2:
264 ; RV64I-NEXT:    ret
266 ; RV64ZBT-LABEL: cmov_ne_i64_constant_zero:
267 ; RV64ZBT:       # %bb.0:
268 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a2
269 ; RV64ZBT-NEXT:    ret
270   %tobool.not = icmp ne i64 %b, 0
271   %cond = select i1 %tobool.not, i64 %a, i64 %c
272   ret i64 %cond
275 define i64 @cmov_ne_i64_constant_2048(i64 %a, i64 %b, i64 %c) nounwind {
276 ; RV64I-LABEL: cmov_ne_i64_constant_2048:
277 ; RV64I:       # %bb.0:
278 ; RV64I-NEXT:    lui a3, 1
279 ; RV64I-NEXT:    addiw a3, a3, -2048
280 ; RV64I-NEXT:    bne a1, a3, .LBB14_2
281 ; RV64I-NEXT:  # %bb.1:
282 ; RV64I-NEXT:    mv a0, a2
283 ; RV64I-NEXT:  .LBB14_2:
284 ; RV64I-NEXT:    ret
286 ; RV64ZBT-LABEL: cmov_ne_i64_constant_2048:
287 ; RV64ZBT:       # %bb.0:
288 ; RV64ZBT-NEXT:    addi a1, a1, -2048
289 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a2
290 ; RV64ZBT-NEXT:    ret
291   %tobool.not = icmp ne i64 %b, 2048
292   %cond = select i1 %tobool.not, i64 %a, i64 %c
293   ret i64 %cond
296 define i64 @cmov_ne_i64_constant_neg_2047(i64 %a, i64 %b, i64 %c) nounwind {
297 ; RV64I-LABEL: cmov_ne_i64_constant_neg_2047:
298 ; RV64I:       # %bb.0:
299 ; RV64I-NEXT:    li a3, -2047
300 ; RV64I-NEXT:    bne a1, a3, .LBB15_2
301 ; RV64I-NEXT:  # %bb.1:
302 ; RV64I-NEXT:    mv a0, a2
303 ; RV64I-NEXT:  .LBB15_2:
304 ; RV64I-NEXT:    ret
306 ; RV64ZBT-LABEL: cmov_ne_i64_constant_neg_2047:
307 ; RV64ZBT:       # %bb.0:
308 ; RV64ZBT-NEXT:    addi a1, a1, 2047
309 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a2
310 ; RV64ZBT-NEXT:    ret
311   %tobool.not = icmp ne i64 %b, -2047
312   %cond = select i1 %tobool.not, i64 %a, i64 %c
313   ret i64 %cond
316 define i64 @cmov_sle_i64(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {
317 ; RV64I-LABEL: cmov_sle_i64:
318 ; RV64I:       # %bb.0:
319 ; RV64I-NEXT:    bge a2, a1, .LBB16_2
320 ; RV64I-NEXT:  # %bb.1:
321 ; RV64I-NEXT:    mv a0, a3
322 ; RV64I-NEXT:  .LBB16_2:
323 ; RV64I-NEXT:    ret
325 ; RV64ZBT-LABEL: cmov_sle_i64:
326 ; RV64ZBT:       # %bb.0:
327 ; RV64ZBT-NEXT:    slt a1, a2, a1
328 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
329 ; RV64ZBT-NEXT:    ret
330   %tobool = icmp sle i64 %b, %c
331   %cond = select i1 %tobool, i64 %a, i64 %d
332   ret i64 %cond
335 define i64 @cmov_sle_i64_constant_2046(i64 %a, i64 %b, i64 %c) nounwind {
336 ; RV64I-LABEL: cmov_sle_i64_constant_2046:
337 ; RV64I:       # %bb.0:
338 ; RV64I-NEXT:    li a3, 2047
339 ; RV64I-NEXT:    blt a1, a3, .LBB17_2
340 ; RV64I-NEXT:  # %bb.1:
341 ; RV64I-NEXT:    mv a0, a2
342 ; RV64I-NEXT:  .LBB17_2:
343 ; RV64I-NEXT:    ret
345 ; RV64ZBT-LABEL: cmov_sle_i64_constant_2046:
346 ; RV64ZBT:       # %bb.0:
347 ; RV64ZBT-NEXT:    slti a1, a1, 2047
348 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a2
349 ; RV64ZBT-NEXT:    ret
350   %tobool = icmp sle i64 %b, 2046
351   %cond = select i1 %tobool, i64 %a, i64 %c
352   ret i64 %cond
355 define i64 @cmov_sle_i64_constant_neg_2049(i64 %a, i64 %b, i64 %c) nounwind {
356 ; RV64I-LABEL: cmov_sle_i64_constant_neg_2049:
357 ; RV64I:       # %bb.0:
358 ; RV64I-NEXT:    li a3, -2048
359 ; RV64I-NEXT:    blt a1, a3, .LBB18_2
360 ; RV64I-NEXT:  # %bb.1:
361 ; RV64I-NEXT:    mv a0, a2
362 ; RV64I-NEXT:  .LBB18_2:
363 ; RV64I-NEXT:    ret
365 ; RV64ZBT-LABEL: cmov_sle_i64_constant_neg_2049:
366 ; RV64ZBT:       # %bb.0:
367 ; RV64ZBT-NEXT:    slti a1, a1, -2048
368 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a2
369 ; RV64ZBT-NEXT:    ret
370   %tobool = icmp sle i64 %b, -2049
371   %cond = select i1 %tobool, i64 %a, i64 %c
372   ret i64 %cond
375 define i64 @cmov_sgt_i64(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {
376 ; RV64I-LABEL: cmov_sgt_i64:
377 ; RV64I:       # %bb.0:
378 ; RV64I-NEXT:    blt a2, a1, .LBB19_2
379 ; RV64I-NEXT:  # %bb.1:
380 ; RV64I-NEXT:    mv a0, a3
381 ; RV64I-NEXT:  .LBB19_2:
382 ; RV64I-NEXT:    ret
384 ; RV64ZBT-LABEL: cmov_sgt_i64:
385 ; RV64ZBT:       # %bb.0:
386 ; RV64ZBT-NEXT:    slt a1, a2, a1
387 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a3
388 ; RV64ZBT-NEXT:    ret
389   %tobool = icmp sgt i64 %b, %c
390   %cond = select i1 %tobool, i64 %a, i64 %d
391   ret i64 %cond
394 define i64 @cmov_sgt_i64_constant_2046(i64 %a, i64 %b, i64 %c) nounwind {
395 ; RV64I-LABEL: cmov_sgt_i64_constant_2046:
396 ; RV64I:       # %bb.0:
397 ; RV64I-NEXT:    li a3, 2046
398 ; RV64I-NEXT:    blt a3, a1, .LBB20_2
399 ; RV64I-NEXT:  # %bb.1:
400 ; RV64I-NEXT:    mv a0, a2
401 ; RV64I-NEXT:  .LBB20_2:
402 ; RV64I-NEXT:    ret
404 ; RV64ZBT-LABEL: cmov_sgt_i64_constant_2046:
405 ; RV64ZBT:       # %bb.0:
406 ; RV64ZBT-NEXT:    slti a1, a1, 2047
407 ; RV64ZBT-NEXT:    cmov a0, a1, a2, a0
408 ; RV64ZBT-NEXT:    ret
409   %tobool = icmp sgt i64 %b, 2046
410   %cond = select i1 %tobool, i64 %a, i64 %c
411   ret i64 %cond
414 define i64 @cmov_sgt_i64_constant_neg_2049(i64 %a, i64 %b, i64 %c) nounwind {
415 ; RV64I-LABEL: cmov_sgt_i64_constant_neg_2049:
416 ; RV64I:       # %bb.0:
417 ; RV64I-NEXT:    lui a3, 1048575
418 ; RV64I-NEXT:    addiw a3, a3, 2047
419 ; RV64I-NEXT:    blt a3, a1, .LBB21_2
420 ; RV64I-NEXT:  # %bb.1:
421 ; RV64I-NEXT:    mv a0, a2
422 ; RV64I-NEXT:  .LBB21_2:
423 ; RV64I-NEXT:    ret
425 ; RV64ZBT-LABEL: cmov_sgt_i64_constant_neg_2049:
426 ; RV64ZBT:       # %bb.0:
427 ; RV64ZBT-NEXT:    slti a1, a1, -2048
428 ; RV64ZBT-NEXT:    cmov a0, a1, a2, a0
429 ; RV64ZBT-NEXT:    ret
430   %tobool = icmp sgt i64 %b, -2049
431   %cond = select i1 %tobool, i64 %a, i64 %c
432   ret i64 %cond
435 define i64 @cmov_sge_i64(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {
436 ; RV64I-LABEL: cmov_sge_i64:
437 ; RV64I:       # %bb.0:
438 ; RV64I-NEXT:    bge a1, a2, .LBB22_2
439 ; RV64I-NEXT:  # %bb.1:
440 ; RV64I-NEXT:    mv a0, a3
441 ; RV64I-NEXT:  .LBB22_2:
442 ; RV64I-NEXT:    ret
444 ; RV64ZBT-LABEL: cmov_sge_i64:
445 ; RV64ZBT:       # %bb.0:
446 ; RV64ZBT-NEXT:    slt a1, a1, a2
447 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
448 ; RV64ZBT-NEXT:    ret
449   %tobool = icmp sge i64 %b, %c
450   %cond = select i1 %tobool, i64 %a, i64 %d
451   ret i64 %cond
454 define i64 @cmov_sge_i64_constant_2047(i64 %a, i64 %b, i64 %c) nounwind {
455 ; RV64I-LABEL: cmov_sge_i64_constant_2047:
456 ; RV64I:       # %bb.0:
457 ; RV64I-NEXT:    li a3, 2046
458 ; RV64I-NEXT:    blt a3, a1, .LBB23_2
459 ; RV64I-NEXT:  # %bb.1:
460 ; RV64I-NEXT:    mv a0, a2
461 ; RV64I-NEXT:  .LBB23_2:
462 ; RV64I-NEXT:    ret
464 ; RV64ZBT-LABEL: cmov_sge_i64_constant_2047:
465 ; RV64ZBT:       # %bb.0:
466 ; RV64ZBT-NEXT:    slti a1, a1, 2047
467 ; RV64ZBT-NEXT:    cmov a0, a1, a2, a0
468 ; RV64ZBT-NEXT:    ret
469   %tobool = icmp sge i64 %b, 2047
470   %cond = select i1 %tobool, i64 %a, i64 %c
471   ret i64 %cond
474 define i64 @cmov_sge_i64_constant_neg_2048(i64 %a, i64 %b, i64 %c) nounwind {
475 ; RV64I-LABEL: cmov_sge_i64_constant_neg_2048:
476 ; RV64I:       # %bb.0:
477 ; RV64I-NEXT:    lui a3, 1048575
478 ; RV64I-NEXT:    addiw a3, a3, 2047
479 ; RV64I-NEXT:    blt a3, a1, .LBB24_2
480 ; RV64I-NEXT:  # %bb.1:
481 ; RV64I-NEXT:    mv a0, a2
482 ; RV64I-NEXT:  .LBB24_2:
483 ; RV64I-NEXT:    ret
485 ; RV64ZBT-LABEL: cmov_sge_i64_constant_neg_2048:
486 ; RV64ZBT:       # %bb.0:
487 ; RV64ZBT-NEXT:    slti a1, a1, -2048
488 ; RV64ZBT-NEXT:    cmov a0, a1, a2, a0
489 ; RV64ZBT-NEXT:    ret
490   %tobool = icmp sge i64 %b, -2048
491   %cond = select i1 %tobool, i64 %a, i64 %c
492   ret i64 %cond
495 define i64 @cmov_ule_i64(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {
496 ; RV64I-LABEL: cmov_ule_i64:
497 ; RV64I:       # %bb.0:
498 ; RV64I-NEXT:    bgeu a2, a1, .LBB25_2
499 ; RV64I-NEXT:  # %bb.1:
500 ; RV64I-NEXT:    mv a0, a3
501 ; RV64I-NEXT:  .LBB25_2:
502 ; RV64I-NEXT:    ret
504 ; RV64ZBT-LABEL: cmov_ule_i64:
505 ; RV64ZBT:       # %bb.0:
506 ; RV64ZBT-NEXT:    sltu a1, a2, a1
507 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
508 ; RV64ZBT-NEXT:    ret
509   %tobool = icmp ule i64 %b, %c
510   %cond = select i1 %tobool, i64 %a, i64 %d
511   ret i64 %cond
514 define i64 @cmov_ule_i64_constant_2047(i64 %a, i64 %b, i64 %c) nounwind {
515 ; RV64I-LABEL: cmov_ule_i64_constant_2047:
516 ; RV64I:       # %bb.0:
517 ; RV64I-NEXT:    srli a1, a1, 11
518 ; RV64I-NEXT:    beqz a1, .LBB26_2
519 ; RV64I-NEXT:  # %bb.1:
520 ; RV64I-NEXT:    mv a0, a2
521 ; RV64I-NEXT:  .LBB26_2:
522 ; RV64I-NEXT:    ret
524 ; RV64ZBT-LABEL: cmov_ule_i64_constant_2047:
525 ; RV64ZBT:       # %bb.0:
526 ; RV64ZBT-NEXT:    srli a1, a1, 11
527 ; RV64ZBT-NEXT:    cmov a0, a1, a2, a0
528 ; RV64ZBT-NEXT:    ret
529   %tobool = icmp ule i64 %b, 2047
530   %cond = select i1 %tobool, i64 %a, i64 %c
531   ret i64 %cond
534 define i64 @cmov_ule_i64_constant_neg_2049(i64 %a, i64 %b, i64 %c) nounwind {
535 ; RV64I-LABEL: cmov_ule_i64_constant_neg_2049:
536 ; RV64I:       # %bb.0:
537 ; RV64I-NEXT:    li a3, -2048
538 ; RV64I-NEXT:    bltu a1, a3, .LBB27_2
539 ; RV64I-NEXT:  # %bb.1:
540 ; RV64I-NEXT:    mv a0, a2
541 ; RV64I-NEXT:  .LBB27_2:
542 ; RV64I-NEXT:    ret
544 ; RV64ZBT-LABEL: cmov_ule_i64_constant_neg_2049:
545 ; RV64ZBT:       # %bb.0:
546 ; RV64ZBT-NEXT:    sltiu a1, a1, -2048
547 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a2
548 ; RV64ZBT-NEXT:    ret
549   %tobool = icmp ule i64 %b, 18446744073709549567
550   %cond = select i1 %tobool, i64 %a, i64 %c
551   ret i64 %cond
554 define i64 @cmov_ugt_i64(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {
555 ; RV64I-LABEL: cmov_ugt_i64:
556 ; RV64I:       # %bb.0:
557 ; RV64I-NEXT:    bltu a2, a1, .LBB28_2
558 ; RV64I-NEXT:  # %bb.1:
559 ; RV64I-NEXT:    mv a0, a3
560 ; RV64I-NEXT:  .LBB28_2:
561 ; RV64I-NEXT:    ret
563 ; RV64ZBT-LABEL: cmov_ugt_i64:
564 ; RV64ZBT:       # %bb.0:
565 ; RV64ZBT-NEXT:    sltu a1, a2, a1
566 ; RV64ZBT-NEXT:    cmov a0, a1, a0, a3
567 ; RV64ZBT-NEXT:    ret
568   %tobool = icmp ugt i64 %b, %c
569   %cond = select i1 %tobool, i64 %a, i64 %d
570   ret i64 %cond
573 define i64 @cmov_ugt_i64_constant_2046(i64 %a, i64 %b, i64 %c) nounwind {
574 ; RV64I-LABEL: cmov_ugt_i64_constant_2046:
575 ; RV64I:       # %bb.0:
576 ; RV64I-NEXT:    li a3, 2046
577 ; RV64I-NEXT:    bltu a3, a1, .LBB29_2
578 ; RV64I-NEXT:  # %bb.1:
579 ; RV64I-NEXT:    mv a0, a2
580 ; RV64I-NEXT:  .LBB29_2:
581 ; RV64I-NEXT:    ret
583 ; RV64ZBT-LABEL: cmov_ugt_i64_constant_2046:
584 ; RV64ZBT:       # %bb.0:
585 ; RV64ZBT-NEXT:    sltiu a1, a1, 2047
586 ; RV64ZBT-NEXT:    cmov a0, a1, a2, a0
587 ; RV64ZBT-NEXT:    ret
588   %tobool = icmp ugt i64 %b, 2046
589   %cond = select i1 %tobool, i64 %a, i64 %c
590   ret i64 %cond
593 define i64 @cmov_ugt_i64_constant_neg_2049(i64 %a, i64 %b, i64 %c) nounwind {
594 ; RV64I-LABEL: cmov_ugt_i64_constant_neg_2049:
595 ; RV64I:       # %bb.0:
596 ; RV64I-NEXT:    lui a3, 1048575
597 ; RV64I-NEXT:    addiw a3, a3, 2047
598 ; RV64I-NEXT:    bltu a3, a1, .LBB30_2
599 ; RV64I-NEXT:  # %bb.1:
600 ; RV64I-NEXT:    mv a0, a2
601 ; RV64I-NEXT:  .LBB30_2:
602 ; RV64I-NEXT:    ret
604 ; RV64ZBT-LABEL: cmov_ugt_i64_constant_neg_2049:
605 ; RV64ZBT:       # %bb.0:
606 ; RV64ZBT-NEXT:    sltiu a1, a1, -2048
607 ; RV64ZBT-NEXT:    cmov a0, a1, a2, a0
608 ; RV64ZBT-NEXT:    ret
609   %tobool = icmp ugt i64 %b, 18446744073709549567
610   %cond = select i1 %tobool, i64 %a, i64 %c
611   ret i64 %cond
614 define i64 @cmov_uge_i64(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {
615 ; RV64I-LABEL: cmov_uge_i64:
616 ; RV64I:       # %bb.0:
617 ; RV64I-NEXT:    bgeu a1, a2, .LBB31_2
618 ; RV64I-NEXT:  # %bb.1:
619 ; RV64I-NEXT:    mv a0, a3
620 ; RV64I-NEXT:  .LBB31_2:
621 ; RV64I-NEXT:    ret
623 ; RV64ZBT-LABEL: cmov_uge_i64:
624 ; RV64ZBT:       # %bb.0:
625 ; RV64ZBT-NEXT:    sltu a1, a1, a2
626 ; RV64ZBT-NEXT:    cmov a0, a1, a3, a0
627 ; RV64ZBT-NEXT:    ret
628   %tobool = icmp uge i64 %b, %c
629   %cond = select i1 %tobool, i64 %a, i64 %d
630   ret i64 %cond
633 define i64 @cmov_uge_i64_constant_2047(i64 %a, i64 %b, i64 %c) nounwind {
634 ; RV64I-LABEL: cmov_uge_i64_constant_2047:
635 ; RV64I:       # %bb.0:
636 ; RV64I-NEXT:    li a3, 2046
637 ; RV64I-NEXT:    bltu a3, a1, .LBB32_2
638 ; RV64I-NEXT:  # %bb.1:
639 ; RV64I-NEXT:    mv a0, a2
640 ; RV64I-NEXT:  .LBB32_2:
641 ; RV64I-NEXT:    ret
643 ; RV64ZBT-LABEL: cmov_uge_i64_constant_2047:
644 ; RV64ZBT:       # %bb.0:
645 ; RV64ZBT-NEXT:    sltiu a1, a1, 2047
646 ; RV64ZBT-NEXT:    cmov a0, a1, a2, a0
647 ; RV64ZBT-NEXT:    ret
648   %tobool = icmp uge i64 %b, 2047
649   %cond = select i1 %tobool, i64 %a, i64 %c
650   ret i64 %cond
653 define i64 @cmov_uge_i64_constant_neg_2048(i64 %a, i64 %b, i64 %c) nounwind {
654 ; RV64I-LABEL: cmov_uge_i64_constant_neg_2048:
655 ; RV64I:       # %bb.0:
656 ; RV64I-NEXT:    lui a3, 1048575
657 ; RV64I-NEXT:    addiw a3, a3, 2047
658 ; RV64I-NEXT:    bltu a3, a1, .LBB33_2
659 ; RV64I-NEXT:  # %bb.1:
660 ; RV64I-NEXT:    mv a0, a2
661 ; RV64I-NEXT:  .LBB33_2:
662 ; RV64I-NEXT:    ret
664 ; RV64ZBT-LABEL: cmov_uge_i64_constant_neg_2048:
665 ; RV64ZBT:       # %bb.0:
666 ; RV64ZBT-NEXT:    sltiu a1, a1, -2048
667 ; RV64ZBT-NEXT:    cmov a0, a1, a2, a0
668 ; RV64ZBT-NEXT:    ret
669   %tobool = icmp uge i64 %b, 18446744073709549568
670   %cond = select i1 %tobool, i64 %a, i64 %c
671   ret i64 %cond
674 declare i32 @llvm.fshl.i32(i32, i32, i32)
676 define signext i32 @fshl_i32(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
677 ; RV64I-LABEL: fshl_i32:
678 ; RV64I:       # %bb.0:
679 ; RV64I-NEXT:    slli a0, a0, 32
680 ; RV64I-NEXT:    slli a1, a1, 32
681 ; RV64I-NEXT:    srli a1, a1, 32
682 ; RV64I-NEXT:    or a0, a0, a1
683 ; RV64I-NEXT:    andi a1, a2, 31
684 ; RV64I-NEXT:    sll a0, a0, a1
685 ; RV64I-NEXT:    srai a0, a0, 32
686 ; RV64I-NEXT:    ret
688 ; RV64ZBT-LABEL: fshl_i32:
689 ; RV64ZBT:       # %bb.0:
690 ; RV64ZBT-NEXT:    andi a2, a2, 31
691 ; RV64ZBT-NEXT:    fslw a0, a0, a1, a2
692 ; RV64ZBT-NEXT:    ret
693   %1 = tail call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %c)
694   ret i32 %1
697 ; Similar to fshl_i32 but result is not sign extended.
698 define void @fshl_i32_nosext(i32 signext %a, i32 signext %b, i32 signext %c, i32* %x) nounwind {
699 ; RV64I-LABEL: fshl_i32_nosext:
700 ; RV64I:       # %bb.0:
701 ; RV64I-NEXT:    slli a0, a0, 32
702 ; RV64I-NEXT:    slli a1, a1, 32
703 ; RV64I-NEXT:    srli a1, a1, 32
704 ; RV64I-NEXT:    or a0, a0, a1
705 ; RV64I-NEXT:    andi a1, a2, 31
706 ; RV64I-NEXT:    sll a0, a0, a1
707 ; RV64I-NEXT:    srli a0, a0, 32
708 ; RV64I-NEXT:    sw a0, 0(a3)
709 ; RV64I-NEXT:    ret
711 ; RV64ZBT-LABEL: fshl_i32_nosext:
712 ; RV64ZBT:       # %bb.0:
713 ; RV64ZBT-NEXT:    andi a2, a2, 31
714 ; RV64ZBT-NEXT:    fslw a0, a0, a1, a2
715 ; RV64ZBT-NEXT:    sw a0, 0(a3)
716 ; RV64ZBT-NEXT:    ret
717   %1 = tail call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %c)
718   store i32 %1, i32* %x
719   ret void
722 declare i64 @llvm.fshl.i64(i64, i64, i64)
724 define i64 @fshl_i64(i64 %a, i64 %b, i64 %c) nounwind {
725 ; RV64I-LABEL: fshl_i64:
726 ; RV64I:       # %bb.0:
727 ; RV64I-NEXT:    sll a0, a0, a2
728 ; RV64I-NEXT:    not a2, a2
729 ; RV64I-NEXT:    srli a1, a1, 1
730 ; RV64I-NEXT:    srl a1, a1, a2
731 ; RV64I-NEXT:    or a0, a0, a1
732 ; RV64I-NEXT:    ret
734 ; RV64ZBT-LABEL: fshl_i64:
735 ; RV64ZBT:       # %bb.0:
736 ; RV64ZBT-NEXT:    andi a2, a2, 63
737 ; RV64ZBT-NEXT:    fsl a0, a0, a1, a2
738 ; RV64ZBT-NEXT:    ret
739   %1 = tail call i64 @llvm.fshl.i64(i64 %a, i64 %b, i64 %c)
740   ret i64 %1
743 declare i32 @llvm.fshr.i32(i32, i32, i32)
745 define signext i32 @fshr_i32(i32 signext %a, i32 signext %b, i32 signext %c) nounwind {
746 ; RV64I-LABEL: fshr_i32:
747 ; RV64I:       # %bb.0:
748 ; RV64I-NEXT:    slli a0, a0, 32
749 ; RV64I-NEXT:    slli a1, a1, 32
750 ; RV64I-NEXT:    srli a1, a1, 32
751 ; RV64I-NEXT:    or a0, a0, a1
752 ; RV64I-NEXT:    andi a1, a2, 31
753 ; RV64I-NEXT:    srl a0, a0, a1
754 ; RV64I-NEXT:    sext.w a0, a0
755 ; RV64I-NEXT:    ret
757 ; RV64ZBT-LABEL: fshr_i32:
758 ; RV64ZBT:       # %bb.0:
759 ; RV64ZBT-NEXT:    andi a2, a2, 31
760 ; RV64ZBT-NEXT:    fsrw a0, a1, a0, a2
761 ; RV64ZBT-NEXT:    ret
762   %1 = tail call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 %c)
763   ret i32 %1
766 ; Similar to fshr_i32 but result is not sign extended.
767 define void @fshr_i32_nosext(i32 signext %a, i32 signext %b, i32 signext %c, i32* %x) nounwind {
768 ; RV64I-LABEL: fshr_i32_nosext:
769 ; RV64I:       # %bb.0:
770 ; RV64I-NEXT:    slli a0, a0, 32
771 ; RV64I-NEXT:    slli a1, a1, 32
772 ; RV64I-NEXT:    srli a1, a1, 32
773 ; RV64I-NEXT:    or a0, a0, a1
774 ; RV64I-NEXT:    andi a1, a2, 31
775 ; RV64I-NEXT:    srl a0, a0, a1
776 ; RV64I-NEXT:    sw a0, 0(a3)
777 ; RV64I-NEXT:    ret
779 ; RV64ZBT-LABEL: fshr_i32_nosext:
780 ; RV64ZBT:       # %bb.0:
781 ; RV64ZBT-NEXT:    andi a2, a2, 31
782 ; RV64ZBT-NEXT:    fsrw a0, a1, a0, a2
783 ; RV64ZBT-NEXT:    sw a0, 0(a3)
784 ; RV64ZBT-NEXT:    ret
785   %1 = tail call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 %c)
786   store i32 %1, i32* %x
787   ret void
790 declare i64 @llvm.fshr.i64(i64, i64, i64)
792 define i64 @fshr_i64(i64 %a, i64 %b, i64 %c) nounwind {
793 ; RV64I-LABEL: fshr_i64:
794 ; RV64I:       # %bb.0:
795 ; RV64I-NEXT:    srl a1, a1, a2
796 ; RV64I-NEXT:    not a2, a2
797 ; RV64I-NEXT:    slli a0, a0, 1
798 ; RV64I-NEXT:    sll a0, a0, a2
799 ; RV64I-NEXT:    or a0, a0, a1
800 ; RV64I-NEXT:    ret
802 ; RV64ZBT-LABEL: fshr_i64:
803 ; RV64ZBT:       # %bb.0:
804 ; RV64ZBT-NEXT:    andi a2, a2, 63
805 ; RV64ZBT-NEXT:    fsr a0, a1, a0, a2
806 ; RV64ZBT-NEXT:    ret
807   %1 = tail call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 %c)
808   ret i64 %1
811 define signext i32 @fshri_i32(i32 signext %a, i32 signext %b) nounwind {
812 ; RV64I-LABEL: fshri_i32:
813 ; RV64I:       # %bb.0:
814 ; RV64I-NEXT:    srliw a1, a1, 5
815 ; RV64I-NEXT:    slliw a0, a0, 27
816 ; RV64I-NEXT:    or a0, a0, a1
817 ; RV64I-NEXT:    ret
819 ; RV64ZBT-LABEL: fshri_i32:
820 ; RV64ZBT:       # %bb.0:
821 ; RV64ZBT-NEXT:    fsriw a0, a1, a0, 5
822 ; RV64ZBT-NEXT:    ret
823   %1 = tail call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 5)
824   ret i32 %1
827 ; Similar to fshr_i32 but result is not sign extended.
828 define void @fshri_i32_nosext(i32 signext %a, i32 signext %b, i32* %x) nounwind {
829 ; RV64I-LABEL: fshri_i32_nosext:
830 ; RV64I:       # %bb.0:
831 ; RV64I-NEXT:    srliw a1, a1, 5
832 ; RV64I-NEXT:    slli a0, a0, 27
833 ; RV64I-NEXT:    or a0, a0, a1
834 ; RV64I-NEXT:    sw a0, 0(a2)
835 ; RV64I-NEXT:    ret
837 ; RV64ZBT-LABEL: fshri_i32_nosext:
838 ; RV64ZBT:       # %bb.0:
839 ; RV64ZBT-NEXT:    fsriw a0, a1, a0, 5
840 ; RV64ZBT-NEXT:    sw a0, 0(a2)
841 ; RV64ZBT-NEXT:    ret
842   %1 = tail call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 5)
843   store i32 %1, i32* %x
844   ret void
847 define i64 @fshri_i64(i64 %a, i64 %b) nounwind {
848 ; RV64I-LABEL: fshri_i64:
849 ; RV64I:       # %bb.0:
850 ; RV64I-NEXT:    srli a1, a1, 5
851 ; RV64I-NEXT:    slli a0, a0, 59
852 ; RV64I-NEXT:    or a0, a0, a1
853 ; RV64I-NEXT:    ret
855 ; RV64ZBT-LABEL: fshri_i64:
856 ; RV64ZBT:       # %bb.0:
857 ; RV64ZBT-NEXT:    fsri a0, a1, a0, 5
858 ; RV64ZBT-NEXT:    ret
859   %1 = tail call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 5)
860   ret i64 %1
863 define signext i32 @fshli_i32(i32 signext %a, i32 signext %b) nounwind {
864 ; RV64I-LABEL: fshli_i32:
865 ; RV64I:       # %bb.0:
866 ; RV64I-NEXT:    srliw a1, a1, 27
867 ; RV64I-NEXT:    slliw a0, a0, 5
868 ; RV64I-NEXT:    or a0, a0, a1
869 ; RV64I-NEXT:    ret
871 ; RV64ZBT-LABEL: fshli_i32:
872 ; RV64ZBT:       # %bb.0:
873 ; RV64ZBT-NEXT:    fsriw a0, a1, a0, 27
874 ; RV64ZBT-NEXT:    ret
875   %1 = tail call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 5)
876   ret i32 %1
879 ; Similar to fshl_i32 but result is not sign extended.
880 define void @fshli_i32_nosext(i32 signext %a, i32 signext %b, i32* %x) nounwind {
881 ; RV64I-LABEL: fshli_i32_nosext:
882 ; RV64I:       # %bb.0:
883 ; RV64I-NEXT:    srliw a1, a1, 27
884 ; RV64I-NEXT:    slli a0, a0, 5
885 ; RV64I-NEXT:    or a0, a0, a1
886 ; RV64I-NEXT:    sw a0, 0(a2)
887 ; RV64I-NEXT:    ret
889 ; RV64ZBT-LABEL: fshli_i32_nosext:
890 ; RV64ZBT:       # %bb.0:
891 ; RV64ZBT-NEXT:    fsriw a0, a1, a0, 27
892 ; RV64ZBT-NEXT:    sw a0, 0(a2)
893 ; RV64ZBT-NEXT:    ret
894   %1 = tail call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 5)
895   store i32 %1, i32* %x
896   ret void
899 define i64 @fshli_i64(i64 %a, i64 %b) nounwind {
900 ; RV64I-LABEL: fshli_i64:
901 ; RV64I:       # %bb.0:
902 ; RV64I-NEXT:    srli a1, a1, 59
903 ; RV64I-NEXT:    slli a0, a0, 5
904 ; RV64I-NEXT:    or a0, a0, a1
905 ; RV64I-NEXT:    ret
907 ; RV64ZBT-LABEL: fshli_i64:
908 ; RV64ZBT:       # %bb.0:
909 ; RV64ZBT-NEXT:    fsri a0, a1, a0, 59
910 ; RV64ZBT-NEXT:    ret
911   %1 = tail call i64 @llvm.fshl.i64(i64 %a, i64 %b, i64 5)
912   ret i64 %1