Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / condops.ll
blobc405b0ae1717847657904c0c57ebae31b0be2ded
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc -mtriple=riscv32 -target-abi=ilp32f -mattr=+f < %s | FileCheck %s -check-prefix=RV32I
3 ; RUN: llc -mtriple=riscv64 -target-abi=lp64f -mattr=+f < %s | FileCheck %s -check-prefix=RV64I
4 ; RUN: llc -mtriple=riscv64 -target-abi=lp64f -mattr=+f,+xventanacondops < %s | FileCheck %s -check-prefix=RV64XVENTANACONDOPS
5 ; RUN: llc -mtriple=riscv64 -target-abi=lp64f -mattr=+f,+xtheadcondmov < %s | FileCheck %s -check-prefix=RV64XTHEADCONDMOV
6 ; RUN: llc -mtriple=riscv32 -target-abi=ilp32f -mattr=+f,+experimental-zicond < %s | FileCheck %s -check-prefix=RV32ZICOND
7 ; RUN: llc -mtriple=riscv64 -target-abi=lp64f -mattr=+f,+experimental-zicond < %s | FileCheck %s -check-prefix=RV64ZICOND
9 define i64 @zero1(i64 %rs1, i1 zeroext %rc) {
10 ; RV32I-LABEL: zero1:
11 ; RV32I:       # %bb.0:
12 ; RV32I-NEXT:    neg a2, a2
13 ; RV32I-NEXT:    and a0, a2, a0
14 ; RV32I-NEXT:    and a1, a2, a1
15 ; RV32I-NEXT:    ret
17 ; RV64I-LABEL: zero1:
18 ; RV64I:       # %bb.0:
19 ; RV64I-NEXT:    neg a1, a1
20 ; RV64I-NEXT:    and a0, a1, a0
21 ; RV64I-NEXT:    ret
23 ; RV64XVENTANACONDOPS-LABEL: zero1:
24 ; RV64XVENTANACONDOPS:       # %bb.0:
25 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a0, a1
26 ; RV64XVENTANACONDOPS-NEXT:    ret
28 ; RV64XTHEADCONDMOV-LABEL: zero1:
29 ; RV64XTHEADCONDMOV:       # %bb.0:
30 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a0, zero, a1
31 ; RV64XTHEADCONDMOV-NEXT:    ret
33 ; RV32ZICOND-LABEL: zero1:
34 ; RV32ZICOND:       # %bb.0:
35 ; RV32ZICOND-NEXT:    czero.eqz a0, a0, a2
36 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
37 ; RV32ZICOND-NEXT:    ret
39 ; RV64ZICOND-LABEL: zero1:
40 ; RV64ZICOND:       # %bb.0:
41 ; RV64ZICOND-NEXT:    czero.eqz a0, a0, a1
42 ; RV64ZICOND-NEXT:    ret
43   %sel = select i1 %rc, i64 %rs1, i64 0
44   ret i64 %sel
47 define i64 @zero2(i64 %rs1, i1 zeroext %rc) {
48 ; RV32I-LABEL: zero2:
49 ; RV32I:       # %bb.0:
50 ; RV32I-NEXT:    addi a2, a2, -1
51 ; RV32I-NEXT:    and a0, a2, a0
52 ; RV32I-NEXT:    and a1, a2, a1
53 ; RV32I-NEXT:    ret
55 ; RV64I-LABEL: zero2:
56 ; RV64I:       # %bb.0:
57 ; RV64I-NEXT:    addi a1, a1, -1
58 ; RV64I-NEXT:    and a0, a1, a0
59 ; RV64I-NEXT:    ret
61 ; RV64XVENTANACONDOPS-LABEL: zero2:
62 ; RV64XVENTANACONDOPS:       # %bb.0:
63 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a0, a1
64 ; RV64XVENTANACONDOPS-NEXT:    ret
66 ; RV64XTHEADCONDMOV-LABEL: zero2:
67 ; RV64XTHEADCONDMOV:       # %bb.0:
68 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a0, zero, a1
69 ; RV64XTHEADCONDMOV-NEXT:    ret
71 ; RV32ZICOND-LABEL: zero2:
72 ; RV32ZICOND:       # %bb.0:
73 ; RV32ZICOND-NEXT:    czero.nez a0, a0, a2
74 ; RV32ZICOND-NEXT:    czero.nez a1, a1, a2
75 ; RV32ZICOND-NEXT:    ret
77 ; RV64ZICOND-LABEL: zero2:
78 ; RV64ZICOND:       # %bb.0:
79 ; RV64ZICOND-NEXT:    czero.nez a0, a0, a1
80 ; RV64ZICOND-NEXT:    ret
81   %sel = select i1 %rc, i64 0, i64 %rs1
82   ret i64 %sel
85 define i64 @add1(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
86 ; RV32I-LABEL: add1:
87 ; RV32I:       # %bb.0:
88 ; RV32I-NEXT:    neg a0, a0
89 ; RV32I-NEXT:    and a4, a0, a4
90 ; RV32I-NEXT:    add a2, a2, a4
91 ; RV32I-NEXT:    and a0, a0, a3
92 ; RV32I-NEXT:    add a0, a1, a0
93 ; RV32I-NEXT:    sltu a1, a0, a1
94 ; RV32I-NEXT:    add a1, a2, a1
95 ; RV32I-NEXT:    ret
97 ; RV64I-LABEL: add1:
98 ; RV64I:       # %bb.0:
99 ; RV64I-NEXT:    neg a0, a0
100 ; RV64I-NEXT:    and a0, a0, a2
101 ; RV64I-NEXT:    add a0, a1, a0
102 ; RV64I-NEXT:    ret
104 ; RV64XVENTANACONDOPS-LABEL: add1:
105 ; RV64XVENTANACONDOPS:       # %bb.0:
106 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
107 ; RV64XVENTANACONDOPS-NEXT:    add a0, a1, a0
108 ; RV64XVENTANACONDOPS-NEXT:    ret
110 ; RV64XTHEADCONDMOV-LABEL: add1:
111 ; RV64XTHEADCONDMOV:       # %bb.0:
112 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
113 ; RV64XTHEADCONDMOV-NEXT:    add a0, a1, a2
114 ; RV64XTHEADCONDMOV-NEXT:    ret
116 ; RV32ZICOND-LABEL: add1:
117 ; RV32ZICOND:       # %bb.0:
118 ; RV32ZICOND-NEXT:    czero.eqz a4, a4, a0
119 ; RV32ZICOND-NEXT:    add a2, a2, a4
120 ; RV32ZICOND-NEXT:    czero.eqz a0, a3, a0
121 ; RV32ZICOND-NEXT:    add a0, a1, a0
122 ; RV32ZICOND-NEXT:    sltu a1, a0, a1
123 ; RV32ZICOND-NEXT:    add a1, a2, a1
124 ; RV32ZICOND-NEXT:    ret
126 ; RV64ZICOND-LABEL: add1:
127 ; RV64ZICOND:       # %bb.0:
128 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
129 ; RV64ZICOND-NEXT:    add a0, a1, a0
130 ; RV64ZICOND-NEXT:    ret
131   %add = add i64 %rs1, %rs2
132   %sel = select i1 %rc, i64 %add, i64 %rs1
133   ret i64 %sel
136 define i64 @add2(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
137 ; RV32I-LABEL: add2:
138 ; RV32I:       # %bb.0:
139 ; RV32I-NEXT:    neg a0, a0
140 ; RV32I-NEXT:    and a2, a0, a2
141 ; RV32I-NEXT:    add a2, a4, a2
142 ; RV32I-NEXT:    and a0, a0, a1
143 ; RV32I-NEXT:    add a0, a3, a0
144 ; RV32I-NEXT:    sltu a1, a0, a3
145 ; RV32I-NEXT:    add a1, a2, a1
146 ; RV32I-NEXT:    ret
148 ; RV64I-LABEL: add2:
149 ; RV64I:       # %bb.0:
150 ; RV64I-NEXT:    neg a0, a0
151 ; RV64I-NEXT:    and a0, a0, a1
152 ; RV64I-NEXT:    add a0, a2, a0
153 ; RV64I-NEXT:    ret
155 ; RV64XVENTANACONDOPS-LABEL: add2:
156 ; RV64XVENTANACONDOPS:       # %bb.0:
157 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
158 ; RV64XVENTANACONDOPS-NEXT:    add a0, a2, a0
159 ; RV64XVENTANACONDOPS-NEXT:    ret
161 ; RV64XTHEADCONDMOV-LABEL: add2:
162 ; RV64XTHEADCONDMOV:       # %bb.0:
163 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
164 ; RV64XTHEADCONDMOV-NEXT:    add a0, a2, a1
165 ; RV64XTHEADCONDMOV-NEXT:    ret
167 ; RV32ZICOND-LABEL: add2:
168 ; RV32ZICOND:       # %bb.0:
169 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a0
170 ; RV32ZICOND-NEXT:    add a2, a4, a2
171 ; RV32ZICOND-NEXT:    czero.eqz a0, a1, a0
172 ; RV32ZICOND-NEXT:    add a0, a3, a0
173 ; RV32ZICOND-NEXT:    sltu a1, a0, a3
174 ; RV32ZICOND-NEXT:    add a1, a2, a1
175 ; RV32ZICOND-NEXT:    ret
177 ; RV64ZICOND-LABEL: add2:
178 ; RV64ZICOND:       # %bb.0:
179 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
180 ; RV64ZICOND-NEXT:    add a0, a2, a0
181 ; RV64ZICOND-NEXT:    ret
182   %add = add i64 %rs1, %rs2
183   %sel = select i1 %rc, i64 %add, i64 %rs2
184   ret i64 %sel
187 define i64 @add3(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
188 ; RV32I-LABEL: add3:
189 ; RV32I:       # %bb.0:
190 ; RV32I-NEXT:    addi a0, a0, -1
191 ; RV32I-NEXT:    and a4, a0, a4
192 ; RV32I-NEXT:    add a2, a2, a4
193 ; RV32I-NEXT:    and a0, a0, a3
194 ; RV32I-NEXT:    add a0, a1, a0
195 ; RV32I-NEXT:    sltu a1, a0, a1
196 ; RV32I-NEXT:    add a1, a2, a1
197 ; RV32I-NEXT:    ret
199 ; RV64I-LABEL: add3:
200 ; RV64I:       # %bb.0:
201 ; RV64I-NEXT:    addi a0, a0, -1
202 ; RV64I-NEXT:    and a0, a0, a2
203 ; RV64I-NEXT:    add a0, a1, a0
204 ; RV64I-NEXT:    ret
206 ; RV64XVENTANACONDOPS-LABEL: add3:
207 ; RV64XVENTANACONDOPS:       # %bb.0:
208 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
209 ; RV64XVENTANACONDOPS-NEXT:    add a0, a1, a0
210 ; RV64XVENTANACONDOPS-NEXT:    ret
212 ; RV64XTHEADCONDMOV-LABEL: add3:
213 ; RV64XTHEADCONDMOV:       # %bb.0:
214 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
215 ; RV64XTHEADCONDMOV-NEXT:    add a0, a1, a2
216 ; RV64XTHEADCONDMOV-NEXT:    ret
218 ; RV32ZICOND-LABEL: add3:
219 ; RV32ZICOND:       # %bb.0:
220 ; RV32ZICOND-NEXT:    czero.nez a4, a4, a0
221 ; RV32ZICOND-NEXT:    add a2, a2, a4
222 ; RV32ZICOND-NEXT:    czero.nez a0, a3, a0
223 ; RV32ZICOND-NEXT:    add a0, a1, a0
224 ; RV32ZICOND-NEXT:    sltu a1, a0, a1
225 ; RV32ZICOND-NEXT:    add a1, a2, a1
226 ; RV32ZICOND-NEXT:    ret
228 ; RV64ZICOND-LABEL: add3:
229 ; RV64ZICOND:       # %bb.0:
230 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
231 ; RV64ZICOND-NEXT:    add a0, a1, a0
232 ; RV64ZICOND-NEXT:    ret
233   %add = add i64 %rs1, %rs2
234   %sel = select i1 %rc, i64 %rs1, i64 %add
235   ret i64 %sel
238 define i64 @add4(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
239 ; RV32I-LABEL: add4:
240 ; RV32I:       # %bb.0:
241 ; RV32I-NEXT:    addi a0, a0, -1
242 ; RV32I-NEXT:    and a2, a0, a2
243 ; RV32I-NEXT:    add a2, a4, a2
244 ; RV32I-NEXT:    and a0, a0, a1
245 ; RV32I-NEXT:    add a0, a3, a0
246 ; RV32I-NEXT:    sltu a1, a0, a3
247 ; RV32I-NEXT:    add a1, a2, a1
248 ; RV32I-NEXT:    ret
250 ; RV64I-LABEL: add4:
251 ; RV64I:       # %bb.0:
252 ; RV64I-NEXT:    addi a0, a0, -1
253 ; RV64I-NEXT:    and a0, a0, a1
254 ; RV64I-NEXT:    add a0, a2, a0
255 ; RV64I-NEXT:    ret
257 ; RV64XVENTANACONDOPS-LABEL: add4:
258 ; RV64XVENTANACONDOPS:       # %bb.0:
259 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
260 ; RV64XVENTANACONDOPS-NEXT:    add a0, a2, a0
261 ; RV64XVENTANACONDOPS-NEXT:    ret
263 ; RV64XTHEADCONDMOV-LABEL: add4:
264 ; RV64XTHEADCONDMOV:       # %bb.0:
265 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
266 ; RV64XTHEADCONDMOV-NEXT:    add a0, a2, a1
267 ; RV64XTHEADCONDMOV-NEXT:    ret
269 ; RV32ZICOND-LABEL: add4:
270 ; RV32ZICOND:       # %bb.0:
271 ; RV32ZICOND-NEXT:    czero.nez a2, a2, a0
272 ; RV32ZICOND-NEXT:    add a2, a4, a2
273 ; RV32ZICOND-NEXT:    czero.nez a0, a1, a0
274 ; RV32ZICOND-NEXT:    add a0, a3, a0
275 ; RV32ZICOND-NEXT:    sltu a1, a0, a3
276 ; RV32ZICOND-NEXT:    add a1, a2, a1
277 ; RV32ZICOND-NEXT:    ret
279 ; RV64ZICOND-LABEL: add4:
280 ; RV64ZICOND:       # %bb.0:
281 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
282 ; RV64ZICOND-NEXT:    add a0, a2, a0
283 ; RV64ZICOND-NEXT:    ret
284   %add = add i64 %rs1, %rs2
285   %sel = select i1 %rc, i64 %rs2, i64 %add
286   ret i64 %sel
289 define i64 @sub1(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
290 ; RV32I-LABEL: sub1:
291 ; RV32I:       # %bb.0:
292 ; RV32I-NEXT:    neg a0, a0
293 ; RV32I-NEXT:    and a3, a0, a3
294 ; RV32I-NEXT:    sltu a5, a1, a3
295 ; RV32I-NEXT:    and a0, a0, a4
296 ; RV32I-NEXT:    sub a2, a2, a0
297 ; RV32I-NEXT:    sub a2, a2, a5
298 ; RV32I-NEXT:    sub a0, a1, a3
299 ; RV32I-NEXT:    mv a1, a2
300 ; RV32I-NEXT:    ret
302 ; RV64I-LABEL: sub1:
303 ; RV64I:       # %bb.0:
304 ; RV64I-NEXT:    neg a0, a0
305 ; RV64I-NEXT:    and a0, a0, a2
306 ; RV64I-NEXT:    sub a0, a1, a0
307 ; RV64I-NEXT:    ret
309 ; RV64XVENTANACONDOPS-LABEL: sub1:
310 ; RV64XVENTANACONDOPS:       # %bb.0:
311 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
312 ; RV64XVENTANACONDOPS-NEXT:    sub a0, a1, a0
313 ; RV64XVENTANACONDOPS-NEXT:    ret
315 ; RV64XTHEADCONDMOV-LABEL: sub1:
316 ; RV64XTHEADCONDMOV:       # %bb.0:
317 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
318 ; RV64XTHEADCONDMOV-NEXT:    sub a0, a1, a2
319 ; RV64XTHEADCONDMOV-NEXT:    ret
321 ; RV32ZICOND-LABEL: sub1:
322 ; RV32ZICOND:       # %bb.0:
323 ; RV32ZICOND-NEXT:    czero.eqz a3, a3, a0
324 ; RV32ZICOND-NEXT:    sltu a5, a1, a3
325 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a0
326 ; RV32ZICOND-NEXT:    sub a2, a2, a0
327 ; RV32ZICOND-NEXT:    sub a2, a2, a5
328 ; RV32ZICOND-NEXT:    sub a0, a1, a3
329 ; RV32ZICOND-NEXT:    mv a1, a2
330 ; RV32ZICOND-NEXT:    ret
332 ; RV64ZICOND-LABEL: sub1:
333 ; RV64ZICOND:       # %bb.0:
334 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
335 ; RV64ZICOND-NEXT:    sub a0, a1, a0
336 ; RV64ZICOND-NEXT:    ret
337   %sub = sub i64 %rs1, %rs2
338   %sel = select i1 %rc, i64 %sub, i64 %rs1
339   ret i64 %sel
342 define i64 @sub2(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
343 ; RV32I-LABEL: sub2:
344 ; RV32I:       # %bb.0:
345 ; RV32I-NEXT:    addi a0, a0, -1
346 ; RV32I-NEXT:    and a3, a0, a3
347 ; RV32I-NEXT:    sltu a5, a1, a3
348 ; RV32I-NEXT:    and a0, a0, a4
349 ; RV32I-NEXT:    sub a2, a2, a0
350 ; RV32I-NEXT:    sub a2, a2, a5
351 ; RV32I-NEXT:    sub a0, a1, a3
352 ; RV32I-NEXT:    mv a1, a2
353 ; RV32I-NEXT:    ret
355 ; RV64I-LABEL: sub2:
356 ; RV64I:       # %bb.0:
357 ; RV64I-NEXT:    addi a0, a0, -1
358 ; RV64I-NEXT:    and a0, a0, a2
359 ; RV64I-NEXT:    sub a0, a1, a0
360 ; RV64I-NEXT:    ret
362 ; RV64XVENTANACONDOPS-LABEL: sub2:
363 ; RV64XVENTANACONDOPS:       # %bb.0:
364 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
365 ; RV64XVENTANACONDOPS-NEXT:    sub a0, a1, a0
366 ; RV64XVENTANACONDOPS-NEXT:    ret
368 ; RV64XTHEADCONDMOV-LABEL: sub2:
369 ; RV64XTHEADCONDMOV:       # %bb.0:
370 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
371 ; RV64XTHEADCONDMOV-NEXT:    sub a0, a1, a2
372 ; RV64XTHEADCONDMOV-NEXT:    ret
374 ; RV32ZICOND-LABEL: sub2:
375 ; RV32ZICOND:       # %bb.0:
376 ; RV32ZICOND-NEXT:    czero.nez a3, a3, a0
377 ; RV32ZICOND-NEXT:    sltu a5, a1, a3
378 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a0
379 ; RV32ZICOND-NEXT:    sub a2, a2, a0
380 ; RV32ZICOND-NEXT:    sub a2, a2, a5
381 ; RV32ZICOND-NEXT:    sub a0, a1, a3
382 ; RV32ZICOND-NEXT:    mv a1, a2
383 ; RV32ZICOND-NEXT:    ret
385 ; RV64ZICOND-LABEL: sub2:
386 ; RV64ZICOND:       # %bb.0:
387 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
388 ; RV64ZICOND-NEXT:    sub a0, a1, a0
389 ; RV64ZICOND-NEXT:    ret
390   %sub = sub i64 %rs1, %rs2
391   %sel = select i1 %rc, i64 %rs1, i64 %sub
392   ret i64 %sel
395 define i64 @or1(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
396 ; RV32I-LABEL: or1:
397 ; RV32I:       # %bb.0:
398 ; RV32I-NEXT:    neg a5, a0
399 ; RV32I-NEXT:    and a0, a5, a3
400 ; RV32I-NEXT:    or a0, a1, a0
401 ; RV32I-NEXT:    and a1, a5, a4
402 ; RV32I-NEXT:    or a1, a2, a1
403 ; RV32I-NEXT:    ret
405 ; RV64I-LABEL: or1:
406 ; RV64I:       # %bb.0:
407 ; RV64I-NEXT:    neg a0, a0
408 ; RV64I-NEXT:    and a0, a0, a2
409 ; RV64I-NEXT:    or a0, a1, a0
410 ; RV64I-NEXT:    ret
412 ; RV64XVENTANACONDOPS-LABEL: or1:
413 ; RV64XVENTANACONDOPS:       # %bb.0:
414 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
415 ; RV64XVENTANACONDOPS-NEXT:    or a0, a1, a0
416 ; RV64XVENTANACONDOPS-NEXT:    ret
418 ; RV64XTHEADCONDMOV-LABEL: or1:
419 ; RV64XTHEADCONDMOV:       # %bb.0:
420 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
421 ; RV64XTHEADCONDMOV-NEXT:    or a0, a1, a2
422 ; RV64XTHEADCONDMOV-NEXT:    ret
424 ; RV32ZICOND-LABEL: or1:
425 ; RV32ZICOND:       # %bb.0:
426 ; RV32ZICOND-NEXT:    czero.eqz a3, a3, a0
427 ; RV32ZICOND-NEXT:    or a3, a1, a3
428 ; RV32ZICOND-NEXT:    czero.eqz a1, a4, a0
429 ; RV32ZICOND-NEXT:    or a1, a2, a1
430 ; RV32ZICOND-NEXT:    mv a0, a3
431 ; RV32ZICOND-NEXT:    ret
433 ; RV64ZICOND-LABEL: or1:
434 ; RV64ZICOND:       # %bb.0:
435 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
436 ; RV64ZICOND-NEXT:    or a0, a1, a0
437 ; RV64ZICOND-NEXT:    ret
438   %or = or i64 %rs1, %rs2
439   %sel = select i1 %rc, i64 %or, i64 %rs1
440   ret i64 %sel
443 define i64 @or2(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
444 ; RV32I-LABEL: or2:
445 ; RV32I:       # %bb.0:
446 ; RV32I-NEXT:    neg a5, a0
447 ; RV32I-NEXT:    and a0, a5, a1
448 ; RV32I-NEXT:    or a0, a3, a0
449 ; RV32I-NEXT:    and a1, a5, a2
450 ; RV32I-NEXT:    or a1, a4, a1
451 ; RV32I-NEXT:    ret
453 ; RV64I-LABEL: or2:
454 ; RV64I:       # %bb.0:
455 ; RV64I-NEXT:    neg a0, a0
456 ; RV64I-NEXT:    and a0, a0, a1
457 ; RV64I-NEXT:    or a0, a2, a0
458 ; RV64I-NEXT:    ret
460 ; RV64XVENTANACONDOPS-LABEL: or2:
461 ; RV64XVENTANACONDOPS:       # %bb.0:
462 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
463 ; RV64XVENTANACONDOPS-NEXT:    or a0, a2, a0
464 ; RV64XVENTANACONDOPS-NEXT:    ret
466 ; RV64XTHEADCONDMOV-LABEL: or2:
467 ; RV64XTHEADCONDMOV:       # %bb.0:
468 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
469 ; RV64XTHEADCONDMOV-NEXT:    or a0, a2, a1
470 ; RV64XTHEADCONDMOV-NEXT:    ret
472 ; RV32ZICOND-LABEL: or2:
473 ; RV32ZICOND:       # %bb.0:
474 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a0
475 ; RV32ZICOND-NEXT:    or a3, a3, a1
476 ; RV32ZICOND-NEXT:    czero.eqz a1, a2, a0
477 ; RV32ZICOND-NEXT:    or a1, a4, a1
478 ; RV32ZICOND-NEXT:    mv a0, a3
479 ; RV32ZICOND-NEXT:    ret
481 ; RV64ZICOND-LABEL: or2:
482 ; RV64ZICOND:       # %bb.0:
483 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
484 ; RV64ZICOND-NEXT:    or a0, a2, a0
485 ; RV64ZICOND-NEXT:    ret
486   %or = or i64 %rs1, %rs2
487   %sel = select i1 %rc, i64 %or, i64 %rs2
488   ret i64 %sel
491 define i64 @or3(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
492 ; RV32I-LABEL: or3:
493 ; RV32I:       # %bb.0:
494 ; RV32I-NEXT:    addi a5, a0, -1
495 ; RV32I-NEXT:    and a0, a5, a3
496 ; RV32I-NEXT:    or a0, a1, a0
497 ; RV32I-NEXT:    and a1, a5, a4
498 ; RV32I-NEXT:    or a1, a2, a1
499 ; RV32I-NEXT:    ret
501 ; RV64I-LABEL: or3:
502 ; RV64I:       # %bb.0:
503 ; RV64I-NEXT:    addi a0, a0, -1
504 ; RV64I-NEXT:    and a0, a0, a2
505 ; RV64I-NEXT:    or a0, a1, a0
506 ; RV64I-NEXT:    ret
508 ; RV64XVENTANACONDOPS-LABEL: or3:
509 ; RV64XVENTANACONDOPS:       # %bb.0:
510 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
511 ; RV64XVENTANACONDOPS-NEXT:    or a0, a1, a0
512 ; RV64XVENTANACONDOPS-NEXT:    ret
514 ; RV64XTHEADCONDMOV-LABEL: or3:
515 ; RV64XTHEADCONDMOV:       # %bb.0:
516 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
517 ; RV64XTHEADCONDMOV-NEXT:    or a0, a1, a2
518 ; RV64XTHEADCONDMOV-NEXT:    ret
520 ; RV32ZICOND-LABEL: or3:
521 ; RV32ZICOND:       # %bb.0:
522 ; RV32ZICOND-NEXT:    czero.nez a3, a3, a0
523 ; RV32ZICOND-NEXT:    or a3, a1, a3
524 ; RV32ZICOND-NEXT:    czero.nez a1, a4, a0
525 ; RV32ZICOND-NEXT:    or a1, a2, a1
526 ; RV32ZICOND-NEXT:    mv a0, a3
527 ; RV32ZICOND-NEXT:    ret
529 ; RV64ZICOND-LABEL: or3:
530 ; RV64ZICOND:       # %bb.0:
531 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
532 ; RV64ZICOND-NEXT:    or a0, a1, a0
533 ; RV64ZICOND-NEXT:    ret
534   %or = or i64 %rs1, %rs2
535   %sel = select i1 %rc, i64 %rs1, i64 %or
536   ret i64 %sel
539 define i64 @or4(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
540 ; RV32I-LABEL: or4:
541 ; RV32I:       # %bb.0:
542 ; RV32I-NEXT:    addi a5, a0, -1
543 ; RV32I-NEXT:    and a0, a5, a1
544 ; RV32I-NEXT:    or a0, a3, a0
545 ; RV32I-NEXT:    and a1, a5, a2
546 ; RV32I-NEXT:    or a1, a4, a1
547 ; RV32I-NEXT:    ret
549 ; RV64I-LABEL: or4:
550 ; RV64I:       # %bb.0:
551 ; RV64I-NEXT:    addi a0, a0, -1
552 ; RV64I-NEXT:    and a0, a0, a1
553 ; RV64I-NEXT:    or a0, a2, a0
554 ; RV64I-NEXT:    ret
556 ; RV64XVENTANACONDOPS-LABEL: or4:
557 ; RV64XVENTANACONDOPS:       # %bb.0:
558 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
559 ; RV64XVENTANACONDOPS-NEXT:    or a0, a2, a0
560 ; RV64XVENTANACONDOPS-NEXT:    ret
562 ; RV64XTHEADCONDMOV-LABEL: or4:
563 ; RV64XTHEADCONDMOV:       # %bb.0:
564 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
565 ; RV64XTHEADCONDMOV-NEXT:    or a0, a2, a1
566 ; RV64XTHEADCONDMOV-NEXT:    ret
568 ; RV32ZICOND-LABEL: or4:
569 ; RV32ZICOND:       # %bb.0:
570 ; RV32ZICOND-NEXT:    czero.nez a1, a1, a0
571 ; RV32ZICOND-NEXT:    or a3, a3, a1
572 ; RV32ZICOND-NEXT:    czero.nez a1, a2, a0
573 ; RV32ZICOND-NEXT:    or a1, a4, a1
574 ; RV32ZICOND-NEXT:    mv a0, a3
575 ; RV32ZICOND-NEXT:    ret
577 ; RV64ZICOND-LABEL: or4:
578 ; RV64ZICOND:       # %bb.0:
579 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
580 ; RV64ZICOND-NEXT:    or a0, a2, a0
581 ; RV64ZICOND-NEXT:    ret
582   %or = or i64 %rs1, %rs2
583   %sel = select i1 %rc, i64 %rs2, i64 %or
584   ret i64 %sel
587 define i64 @xor1(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
588 ; RV32I-LABEL: xor1:
589 ; RV32I:       # %bb.0:
590 ; RV32I-NEXT:    neg a5, a0
591 ; RV32I-NEXT:    and a0, a5, a3
592 ; RV32I-NEXT:    xor a0, a1, a0
593 ; RV32I-NEXT:    and a1, a5, a4
594 ; RV32I-NEXT:    xor a1, a2, a1
595 ; RV32I-NEXT:    ret
597 ; RV64I-LABEL: xor1:
598 ; RV64I:       # %bb.0:
599 ; RV64I-NEXT:    neg a0, a0
600 ; RV64I-NEXT:    and a0, a0, a2
601 ; RV64I-NEXT:    xor a0, a1, a0
602 ; RV64I-NEXT:    ret
604 ; RV64XVENTANACONDOPS-LABEL: xor1:
605 ; RV64XVENTANACONDOPS:       # %bb.0:
606 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
607 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a1, a0
608 ; RV64XVENTANACONDOPS-NEXT:    ret
610 ; RV64XTHEADCONDMOV-LABEL: xor1:
611 ; RV64XTHEADCONDMOV:       # %bb.0:
612 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
613 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a1, a2
614 ; RV64XTHEADCONDMOV-NEXT:    ret
616 ; RV32ZICOND-LABEL: xor1:
617 ; RV32ZICOND:       # %bb.0:
618 ; RV32ZICOND-NEXT:    czero.eqz a3, a3, a0
619 ; RV32ZICOND-NEXT:    xor a3, a1, a3
620 ; RV32ZICOND-NEXT:    czero.eqz a1, a4, a0
621 ; RV32ZICOND-NEXT:    xor a1, a2, a1
622 ; RV32ZICOND-NEXT:    mv a0, a3
623 ; RV32ZICOND-NEXT:    ret
625 ; RV64ZICOND-LABEL: xor1:
626 ; RV64ZICOND:       # %bb.0:
627 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
628 ; RV64ZICOND-NEXT:    xor a0, a1, a0
629 ; RV64ZICOND-NEXT:    ret
630   %xor = xor i64 %rs1, %rs2
631   %sel = select i1 %rc, i64 %xor, i64 %rs1
632   ret i64 %sel
635 define i64 @xor2(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
636 ; RV32I-LABEL: xor2:
637 ; RV32I:       # %bb.0:
638 ; RV32I-NEXT:    neg a5, a0
639 ; RV32I-NEXT:    and a0, a5, a1
640 ; RV32I-NEXT:    xor a0, a3, a0
641 ; RV32I-NEXT:    and a1, a5, a2
642 ; RV32I-NEXT:    xor a1, a4, a1
643 ; RV32I-NEXT:    ret
645 ; RV64I-LABEL: xor2:
646 ; RV64I:       # %bb.0:
647 ; RV64I-NEXT:    neg a0, a0
648 ; RV64I-NEXT:    and a0, a0, a1
649 ; RV64I-NEXT:    xor a0, a2, a0
650 ; RV64I-NEXT:    ret
652 ; RV64XVENTANACONDOPS-LABEL: xor2:
653 ; RV64XVENTANACONDOPS:       # %bb.0:
654 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
655 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a2, a0
656 ; RV64XVENTANACONDOPS-NEXT:    ret
658 ; RV64XTHEADCONDMOV-LABEL: xor2:
659 ; RV64XTHEADCONDMOV:       # %bb.0:
660 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
661 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a2, a1
662 ; RV64XTHEADCONDMOV-NEXT:    ret
664 ; RV32ZICOND-LABEL: xor2:
665 ; RV32ZICOND:       # %bb.0:
666 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a0
667 ; RV32ZICOND-NEXT:    xor a3, a3, a1
668 ; RV32ZICOND-NEXT:    czero.eqz a1, a2, a0
669 ; RV32ZICOND-NEXT:    xor a1, a4, a1
670 ; RV32ZICOND-NEXT:    mv a0, a3
671 ; RV32ZICOND-NEXT:    ret
673 ; RV64ZICOND-LABEL: xor2:
674 ; RV64ZICOND:       # %bb.0:
675 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
676 ; RV64ZICOND-NEXT:    xor a0, a2, a0
677 ; RV64ZICOND-NEXT:    ret
678   %xor = xor i64 %rs1, %rs2
679   %sel = select i1 %rc, i64 %xor, i64 %rs2
680   ret i64 %sel
683 define i64 @xor3(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
684 ; RV32I-LABEL: xor3:
685 ; RV32I:       # %bb.0:
686 ; RV32I-NEXT:    addi a5, a0, -1
687 ; RV32I-NEXT:    and a0, a5, a3
688 ; RV32I-NEXT:    xor a0, a1, a0
689 ; RV32I-NEXT:    and a1, a5, a4
690 ; RV32I-NEXT:    xor a1, a2, a1
691 ; RV32I-NEXT:    ret
693 ; RV64I-LABEL: xor3:
694 ; RV64I:       # %bb.0:
695 ; RV64I-NEXT:    addi a0, a0, -1
696 ; RV64I-NEXT:    and a0, a0, a2
697 ; RV64I-NEXT:    xor a0, a1, a0
698 ; RV64I-NEXT:    ret
700 ; RV64XVENTANACONDOPS-LABEL: xor3:
701 ; RV64XVENTANACONDOPS:       # %bb.0:
702 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
703 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a1, a0
704 ; RV64XVENTANACONDOPS-NEXT:    ret
706 ; RV64XTHEADCONDMOV-LABEL: xor3:
707 ; RV64XTHEADCONDMOV:       # %bb.0:
708 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
709 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a1, a2
710 ; RV64XTHEADCONDMOV-NEXT:    ret
712 ; RV32ZICOND-LABEL: xor3:
713 ; RV32ZICOND:       # %bb.0:
714 ; RV32ZICOND-NEXT:    czero.nez a3, a3, a0
715 ; RV32ZICOND-NEXT:    xor a3, a1, a3
716 ; RV32ZICOND-NEXT:    czero.nez a1, a4, a0
717 ; RV32ZICOND-NEXT:    xor a1, a2, a1
718 ; RV32ZICOND-NEXT:    mv a0, a3
719 ; RV32ZICOND-NEXT:    ret
721 ; RV64ZICOND-LABEL: xor3:
722 ; RV64ZICOND:       # %bb.0:
723 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
724 ; RV64ZICOND-NEXT:    xor a0, a1, a0
725 ; RV64ZICOND-NEXT:    ret
726   %xor = xor i64 %rs1, %rs2
727   %sel = select i1 %rc, i64 %rs1, i64 %xor
728   ret i64 %sel
731 define i64 @xor4(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
732 ; RV32I-LABEL: xor4:
733 ; RV32I:       # %bb.0:
734 ; RV32I-NEXT:    addi a5, a0, -1
735 ; RV32I-NEXT:    and a0, a5, a1
736 ; RV32I-NEXT:    xor a0, a3, a0
737 ; RV32I-NEXT:    and a1, a5, a2
738 ; RV32I-NEXT:    xor a1, a4, a1
739 ; RV32I-NEXT:    ret
741 ; RV64I-LABEL: xor4:
742 ; RV64I:       # %bb.0:
743 ; RV64I-NEXT:    addi a0, a0, -1
744 ; RV64I-NEXT:    and a0, a0, a1
745 ; RV64I-NEXT:    xor a0, a2, a0
746 ; RV64I-NEXT:    ret
748 ; RV64XVENTANACONDOPS-LABEL: xor4:
749 ; RV64XVENTANACONDOPS:       # %bb.0:
750 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
751 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a2, a0
752 ; RV64XVENTANACONDOPS-NEXT:    ret
754 ; RV64XTHEADCONDMOV-LABEL: xor4:
755 ; RV64XTHEADCONDMOV:       # %bb.0:
756 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
757 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a2, a1
758 ; RV64XTHEADCONDMOV-NEXT:    ret
760 ; RV32ZICOND-LABEL: xor4:
761 ; RV32ZICOND:       # %bb.0:
762 ; RV32ZICOND-NEXT:    czero.nez a1, a1, a0
763 ; RV32ZICOND-NEXT:    xor a3, a3, a1
764 ; RV32ZICOND-NEXT:    czero.nez a1, a2, a0
765 ; RV32ZICOND-NEXT:    xor a1, a4, a1
766 ; RV32ZICOND-NEXT:    mv a0, a3
767 ; RV32ZICOND-NEXT:    ret
769 ; RV64ZICOND-LABEL: xor4:
770 ; RV64ZICOND:       # %bb.0:
771 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
772 ; RV64ZICOND-NEXT:    xor a0, a2, a0
773 ; RV64ZICOND-NEXT:    ret
774   %xor = xor i64 %rs1, %rs2
775   %sel = select i1 %rc, i64 %rs2, i64 %xor
776   ret i64 %sel
779 define i64 @and1(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
780 ; RV32I-LABEL: and1:
781 ; RV32I:       # %bb.0:
782 ; RV32I-NEXT:    beqz a0, .LBB16_2
783 ; RV32I-NEXT:  # %bb.1:
784 ; RV32I-NEXT:    and a2, a2, a4
785 ; RV32I-NEXT:    and a1, a1, a3
786 ; RV32I-NEXT:  .LBB16_2:
787 ; RV32I-NEXT:    mv a0, a1
788 ; RV32I-NEXT:    mv a1, a2
789 ; RV32I-NEXT:    ret
791 ; RV64I-LABEL: and1:
792 ; RV64I:       # %bb.0:
793 ; RV64I-NEXT:    beqz a0, .LBB16_2
794 ; RV64I-NEXT:  # %bb.1:
795 ; RV64I-NEXT:    and a1, a1, a2
796 ; RV64I-NEXT:  .LBB16_2:
797 ; RV64I-NEXT:    mv a0, a1
798 ; RV64I-NEXT:    ret
800 ; RV64XVENTANACONDOPS-LABEL: and1:
801 ; RV64XVENTANACONDOPS:       # %bb.0:
802 ; RV64XVENTANACONDOPS-NEXT:    and a2, a1, a2
803 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
804 ; RV64XVENTANACONDOPS-NEXT:    or a0, a2, a0
805 ; RV64XVENTANACONDOPS-NEXT:    ret
807 ; RV64XTHEADCONDMOV-LABEL: and1:
808 ; RV64XTHEADCONDMOV:       # %bb.0:
809 ; RV64XTHEADCONDMOV-NEXT:    and a2, a1, a2
810 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a1, a0
811 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
812 ; RV64XTHEADCONDMOV-NEXT:    ret
814 ; RV32ZICOND-LABEL: and1:
815 ; RV32ZICOND:       # %bb.0:
816 ; RV32ZICOND-NEXT:    and a4, a2, a4
817 ; RV32ZICOND-NEXT:    and a3, a1, a3
818 ; RV32ZICOND-NEXT:    czero.nez a1, a1, a0
819 ; RV32ZICOND-NEXT:    or a3, a3, a1
820 ; RV32ZICOND-NEXT:    czero.nez a1, a2, a0
821 ; RV32ZICOND-NEXT:    or a1, a4, a1
822 ; RV32ZICOND-NEXT:    mv a0, a3
823 ; RV32ZICOND-NEXT:    ret
825 ; RV64ZICOND-LABEL: and1:
826 ; RV64ZICOND:       # %bb.0:
827 ; RV64ZICOND-NEXT:    and a2, a1, a2
828 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
829 ; RV64ZICOND-NEXT:    or a0, a2, a0
830 ; RV64ZICOND-NEXT:    ret
831   %and = and i64 %rs1, %rs2
832   %sel = select i1 %rc, i64 %and, i64 %rs1
833   ret i64 %sel
836 define i64 @and2(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
837 ; RV32I-LABEL: and2:
838 ; RV32I:       # %bb.0:
839 ; RV32I-NEXT:    beqz a0, .LBB17_2
840 ; RV32I-NEXT:  # %bb.1:
841 ; RV32I-NEXT:    and a4, a2, a4
842 ; RV32I-NEXT:    and a3, a1, a3
843 ; RV32I-NEXT:  .LBB17_2:
844 ; RV32I-NEXT:    mv a0, a3
845 ; RV32I-NEXT:    mv a1, a4
846 ; RV32I-NEXT:    ret
848 ; RV64I-LABEL: and2:
849 ; RV64I:       # %bb.0:
850 ; RV64I-NEXT:    beqz a0, .LBB17_2
851 ; RV64I-NEXT:  # %bb.1:
852 ; RV64I-NEXT:    and a2, a1, a2
853 ; RV64I-NEXT:  .LBB17_2:
854 ; RV64I-NEXT:    mv a0, a2
855 ; RV64I-NEXT:    ret
857 ; RV64XVENTANACONDOPS-LABEL: and2:
858 ; RV64XVENTANACONDOPS:       # %bb.0:
859 ; RV64XVENTANACONDOPS-NEXT:    and a1, a1, a2
860 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
861 ; RV64XVENTANACONDOPS-NEXT:    or a0, a1, a0
862 ; RV64XVENTANACONDOPS-NEXT:    ret
864 ; RV64XTHEADCONDMOV-LABEL: and2:
865 ; RV64XTHEADCONDMOV:       # %bb.0:
866 ; RV64XTHEADCONDMOV-NEXT:    and a1, a1, a2
867 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, a2, a0
868 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
869 ; RV64XTHEADCONDMOV-NEXT:    ret
871 ; RV32ZICOND-LABEL: and2:
872 ; RV32ZICOND:       # %bb.0:
873 ; RV32ZICOND-NEXT:    and a5, a2, a4
874 ; RV32ZICOND-NEXT:    and a1, a1, a3
875 ; RV32ZICOND-NEXT:    czero.nez a2, a3, a0
876 ; RV32ZICOND-NEXT:    or a2, a1, a2
877 ; RV32ZICOND-NEXT:    czero.nez a1, a4, a0
878 ; RV32ZICOND-NEXT:    or a1, a5, a1
879 ; RV32ZICOND-NEXT:    mv a0, a2
880 ; RV32ZICOND-NEXT:    ret
882 ; RV64ZICOND-LABEL: and2:
883 ; RV64ZICOND:       # %bb.0:
884 ; RV64ZICOND-NEXT:    and a1, a1, a2
885 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
886 ; RV64ZICOND-NEXT:    or a0, a1, a0
887 ; RV64ZICOND-NEXT:    ret
888   %and = and i64 %rs1, %rs2
889   %sel = select i1 %rc, i64 %and, i64 %rs2
890   ret i64 %sel
893 define i64 @and3(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
894 ; RV32I-LABEL: and3:
895 ; RV32I:       # %bb.0:
896 ; RV32I-NEXT:    bnez a0, .LBB18_2
897 ; RV32I-NEXT:  # %bb.1:
898 ; RV32I-NEXT:    and a2, a2, a4
899 ; RV32I-NEXT:    and a1, a1, a3
900 ; RV32I-NEXT:  .LBB18_2:
901 ; RV32I-NEXT:    mv a0, a1
902 ; RV32I-NEXT:    mv a1, a2
903 ; RV32I-NEXT:    ret
905 ; RV64I-LABEL: and3:
906 ; RV64I:       # %bb.0:
907 ; RV64I-NEXT:    bnez a0, .LBB18_2
908 ; RV64I-NEXT:  # %bb.1:
909 ; RV64I-NEXT:    and a1, a1, a2
910 ; RV64I-NEXT:  .LBB18_2:
911 ; RV64I-NEXT:    mv a0, a1
912 ; RV64I-NEXT:    ret
914 ; RV64XVENTANACONDOPS-LABEL: and3:
915 ; RV64XVENTANACONDOPS:       # %bb.0:
916 ; RV64XVENTANACONDOPS-NEXT:    and a2, a1, a2
917 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
918 ; RV64XVENTANACONDOPS-NEXT:    or a0, a2, a0
919 ; RV64XVENTANACONDOPS-NEXT:    ret
921 ; RV64XTHEADCONDMOV-LABEL: and3:
922 ; RV64XTHEADCONDMOV:       # %bb.0:
923 ; RV64XTHEADCONDMOV-NEXT:    and a2, a1, a2
924 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a1, a0
925 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
926 ; RV64XTHEADCONDMOV-NEXT:    ret
928 ; RV32ZICOND-LABEL: and3:
929 ; RV32ZICOND:       # %bb.0:
930 ; RV32ZICOND-NEXT:    and a4, a2, a4
931 ; RV32ZICOND-NEXT:    and a3, a1, a3
932 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a0
933 ; RV32ZICOND-NEXT:    or a3, a3, a1
934 ; RV32ZICOND-NEXT:    czero.eqz a1, a2, a0
935 ; RV32ZICOND-NEXT:    or a1, a4, a1
936 ; RV32ZICOND-NEXT:    mv a0, a3
937 ; RV32ZICOND-NEXT:    ret
939 ; RV64ZICOND-LABEL: and3:
940 ; RV64ZICOND:       # %bb.0:
941 ; RV64ZICOND-NEXT:    and a2, a1, a2
942 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
943 ; RV64ZICOND-NEXT:    or a0, a2, a0
944 ; RV64ZICOND-NEXT:    ret
945   %and = and i64 %rs1, %rs2
946   %sel = select i1 %rc, i64 %rs1, i64 %and
947   ret i64 %sel
950 define i64 @and4(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
951 ; RV32I-LABEL: and4:
952 ; RV32I:       # %bb.0:
953 ; RV32I-NEXT:    bnez a0, .LBB19_2
954 ; RV32I-NEXT:  # %bb.1:
955 ; RV32I-NEXT:    and a4, a2, a4
956 ; RV32I-NEXT:    and a3, a1, a3
957 ; RV32I-NEXT:  .LBB19_2:
958 ; RV32I-NEXT:    mv a0, a3
959 ; RV32I-NEXT:    mv a1, a4
960 ; RV32I-NEXT:    ret
962 ; RV64I-LABEL: and4:
963 ; RV64I:       # %bb.0:
964 ; RV64I-NEXT:    bnez a0, .LBB19_2
965 ; RV64I-NEXT:  # %bb.1:
966 ; RV64I-NEXT:    and a2, a1, a2
967 ; RV64I-NEXT:  .LBB19_2:
968 ; RV64I-NEXT:    mv a0, a2
969 ; RV64I-NEXT:    ret
971 ; RV64XVENTANACONDOPS-LABEL: and4:
972 ; RV64XVENTANACONDOPS:       # %bb.0:
973 ; RV64XVENTANACONDOPS-NEXT:    and a1, a1, a2
974 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
975 ; RV64XVENTANACONDOPS-NEXT:    or a0, a1, a0
976 ; RV64XVENTANACONDOPS-NEXT:    ret
978 ; RV64XTHEADCONDMOV-LABEL: and4:
979 ; RV64XTHEADCONDMOV:       # %bb.0:
980 ; RV64XTHEADCONDMOV-NEXT:    and a1, a1, a2
981 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, a2, a0
982 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
983 ; RV64XTHEADCONDMOV-NEXT:    ret
985 ; RV32ZICOND-LABEL: and4:
986 ; RV32ZICOND:       # %bb.0:
987 ; RV32ZICOND-NEXT:    and a5, a2, a4
988 ; RV32ZICOND-NEXT:    and a1, a1, a3
989 ; RV32ZICOND-NEXT:    czero.eqz a2, a3, a0
990 ; RV32ZICOND-NEXT:    or a2, a1, a2
991 ; RV32ZICOND-NEXT:    czero.eqz a1, a4, a0
992 ; RV32ZICOND-NEXT:    or a1, a5, a1
993 ; RV32ZICOND-NEXT:    mv a0, a2
994 ; RV32ZICOND-NEXT:    ret
996 ; RV64ZICOND-LABEL: and4:
997 ; RV64ZICOND:       # %bb.0:
998 ; RV64ZICOND-NEXT:    and a1, a1, a2
999 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1000 ; RV64ZICOND-NEXT:    or a0, a1, a0
1001 ; RV64ZICOND-NEXT:    ret
1002   %and = and i64 %rs1, %rs2
1003   %sel = select i1 %rc, i64 %rs2, i64 %and
1004   ret i64 %sel
1007 define i64 @basic(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
1008 ; RV32I-LABEL: basic:
1009 ; RV32I:       # %bb.0:
1010 ; RV32I-NEXT:    bnez a0, .LBB20_2
1011 ; RV32I-NEXT:  # %bb.1:
1012 ; RV32I-NEXT:    mv a1, a3
1013 ; RV32I-NEXT:    mv a2, a4
1014 ; RV32I-NEXT:  .LBB20_2:
1015 ; RV32I-NEXT:    mv a0, a1
1016 ; RV32I-NEXT:    mv a1, a2
1017 ; RV32I-NEXT:    ret
1019 ; RV64I-LABEL: basic:
1020 ; RV64I:       # %bb.0:
1021 ; RV64I-NEXT:    bnez a0, .LBB20_2
1022 ; RV64I-NEXT:  # %bb.1:
1023 ; RV64I-NEXT:    mv a1, a2
1024 ; RV64I-NEXT:  .LBB20_2:
1025 ; RV64I-NEXT:    mv a0, a1
1026 ; RV64I-NEXT:    ret
1028 ; RV64XVENTANACONDOPS-LABEL: basic:
1029 ; RV64XVENTANACONDOPS:       # %bb.0:
1030 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a2, a2, a0
1031 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
1032 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
1033 ; RV64XVENTANACONDOPS-NEXT:    ret
1035 ; RV64XTHEADCONDMOV-LABEL: basic:
1036 ; RV64XTHEADCONDMOV:       # %bb.0:
1037 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, a2, a0
1038 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
1039 ; RV64XTHEADCONDMOV-NEXT:    ret
1041 ; RV32ZICOND-LABEL: basic:
1042 ; RV32ZICOND:       # %bb.0:
1043 ; RV32ZICOND-NEXT:    czero.nez a3, a3, a0
1044 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a0
1045 ; RV32ZICOND-NEXT:    or a3, a1, a3
1046 ; RV32ZICOND-NEXT:    czero.nez a1, a4, a0
1047 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a0
1048 ; RV32ZICOND-NEXT:    or a1, a0, a1
1049 ; RV32ZICOND-NEXT:    mv a0, a3
1050 ; RV32ZICOND-NEXT:    ret
1052 ; RV64ZICOND-LABEL: basic:
1053 ; RV64ZICOND:       # %bb.0:
1054 ; RV64ZICOND-NEXT:    czero.nez a2, a2, a0
1055 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
1056 ; RV64ZICOND-NEXT:    or a0, a0, a2
1057 ; RV64ZICOND-NEXT:    ret
1058   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1059   ret i64 %sel
1062 define i64 @seteq(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1063 ; RV32I-LABEL: seteq:
1064 ; RV32I:       # %bb.0:
1065 ; RV32I-NEXT:    xor a1, a1, a3
1066 ; RV32I-NEXT:    xor a0, a0, a2
1067 ; RV32I-NEXT:    or a2, a0, a1
1068 ; RV32I-NEXT:    mv a1, a5
1069 ; RV32I-NEXT:    mv a0, a4
1070 ; RV32I-NEXT:    beqz a2, .LBB21_2
1071 ; RV32I-NEXT:  # %bb.1:
1072 ; RV32I-NEXT:    mv a0, a6
1073 ; RV32I-NEXT:    mv a1, a7
1074 ; RV32I-NEXT:  .LBB21_2:
1075 ; RV32I-NEXT:    ret
1077 ; RV64I-LABEL: seteq:
1078 ; RV64I:       # %bb.0:
1079 ; RV64I-NEXT:    beq a0, a1, .LBB21_2
1080 ; RV64I-NEXT:  # %bb.1:
1081 ; RV64I-NEXT:    mv a2, a3
1082 ; RV64I-NEXT:  .LBB21_2:
1083 ; RV64I-NEXT:    mv a0, a2
1084 ; RV64I-NEXT:    ret
1086 ; RV64XVENTANACONDOPS-LABEL: seteq:
1087 ; RV64XVENTANACONDOPS:       # %bb.0:
1088 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
1089 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a3, a0
1090 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
1091 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1092 ; RV64XVENTANACONDOPS-NEXT:    ret
1094 ; RV64XTHEADCONDMOV-LABEL: seteq:
1095 ; RV64XTHEADCONDMOV:       # %bb.0:
1096 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
1097 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a3, a0
1098 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1099 ; RV64XTHEADCONDMOV-NEXT:    ret
1101 ; RV32ZICOND-LABEL: seteq:
1102 ; RV32ZICOND:       # %bb.0:
1103 ; RV32ZICOND-NEXT:    xor a1, a1, a3
1104 ; RV32ZICOND-NEXT:    xor a0, a0, a2
1105 ; RV32ZICOND-NEXT:    or a1, a0, a1
1106 ; RV32ZICOND-NEXT:    czero.eqz a0, a6, a1
1107 ; RV32ZICOND-NEXT:    czero.nez a2, a4, a1
1108 ; RV32ZICOND-NEXT:    or a0, a2, a0
1109 ; RV32ZICOND-NEXT:    czero.eqz a2, a7, a1
1110 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
1111 ; RV32ZICOND-NEXT:    or a1, a1, a2
1112 ; RV32ZICOND-NEXT:    ret
1114 ; RV64ZICOND-LABEL: seteq:
1115 ; RV64ZICOND:       # %bb.0:
1116 ; RV64ZICOND-NEXT:    xor a0, a0, a1
1117 ; RV64ZICOND-NEXT:    czero.eqz a1, a3, a0
1118 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
1119 ; RV64ZICOND-NEXT:    or a0, a0, a1
1120 ; RV64ZICOND-NEXT:    ret
1121   %rc = icmp eq i64 %a, %b
1122   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1123   ret i64 %sel
1126 define i64 @setne(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1127 ; RV32I-LABEL: setne:
1128 ; RV32I:       # %bb.0:
1129 ; RV32I-NEXT:    xor a1, a1, a3
1130 ; RV32I-NEXT:    xor a0, a0, a2
1131 ; RV32I-NEXT:    or a2, a0, a1
1132 ; RV32I-NEXT:    mv a1, a5
1133 ; RV32I-NEXT:    mv a0, a4
1134 ; RV32I-NEXT:    bnez a2, .LBB22_2
1135 ; RV32I-NEXT:  # %bb.1:
1136 ; RV32I-NEXT:    mv a0, a6
1137 ; RV32I-NEXT:    mv a1, a7
1138 ; RV32I-NEXT:  .LBB22_2:
1139 ; RV32I-NEXT:    ret
1141 ; RV64I-LABEL: setne:
1142 ; RV64I:       # %bb.0:
1143 ; RV64I-NEXT:    bne a0, a1, .LBB22_2
1144 ; RV64I-NEXT:  # %bb.1:
1145 ; RV64I-NEXT:    mv a2, a3
1146 ; RV64I-NEXT:  .LBB22_2:
1147 ; RV64I-NEXT:    mv a0, a2
1148 ; RV64I-NEXT:    ret
1150 ; RV64XVENTANACONDOPS-LABEL: setne:
1151 ; RV64XVENTANACONDOPS:       # %bb.0:
1152 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
1153 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a1, a3, a0
1154 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
1155 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1156 ; RV64XVENTANACONDOPS-NEXT:    ret
1158 ; RV64XTHEADCONDMOV-LABEL: setne:
1159 ; RV64XTHEADCONDMOV:       # %bb.0:
1160 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
1161 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a3, a0
1162 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1163 ; RV64XTHEADCONDMOV-NEXT:    ret
1165 ; RV32ZICOND-LABEL: setne:
1166 ; RV32ZICOND:       # %bb.0:
1167 ; RV32ZICOND-NEXT:    xor a1, a1, a3
1168 ; RV32ZICOND-NEXT:    xor a0, a0, a2
1169 ; RV32ZICOND-NEXT:    or a1, a0, a1
1170 ; RV32ZICOND-NEXT:    czero.nez a0, a6, a1
1171 ; RV32ZICOND-NEXT:    czero.eqz a2, a4, a1
1172 ; RV32ZICOND-NEXT:    or a0, a2, a0
1173 ; RV32ZICOND-NEXT:    czero.nez a2, a7, a1
1174 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
1175 ; RV32ZICOND-NEXT:    or a1, a1, a2
1176 ; RV32ZICOND-NEXT:    ret
1178 ; RV64ZICOND-LABEL: setne:
1179 ; RV64ZICOND:       # %bb.0:
1180 ; RV64ZICOND-NEXT:    xor a0, a0, a1
1181 ; RV64ZICOND-NEXT:    czero.nez a1, a3, a0
1182 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1183 ; RV64ZICOND-NEXT:    or a0, a0, a1
1184 ; RV64ZICOND-NEXT:    ret
1185   %rc = icmp ne i64 %a, %b
1186   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1187   ret i64 %sel
1190 define i64 @setgt(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1191 ; RV32I-LABEL: setgt:
1192 ; RV32I:       # %bb.0:
1193 ; RV32I-NEXT:    beq a1, a3, .LBB23_2
1194 ; RV32I-NEXT:  # %bb.1:
1195 ; RV32I-NEXT:    slt a0, a3, a1
1196 ; RV32I-NEXT:    beqz a0, .LBB23_3
1197 ; RV32I-NEXT:    j .LBB23_4
1198 ; RV32I-NEXT:  .LBB23_2:
1199 ; RV32I-NEXT:    sltu a0, a2, a0
1200 ; RV32I-NEXT:    bnez a0, .LBB23_4
1201 ; RV32I-NEXT:  .LBB23_3:
1202 ; RV32I-NEXT:    mv a4, a6
1203 ; RV32I-NEXT:    mv a5, a7
1204 ; RV32I-NEXT:  .LBB23_4:
1205 ; RV32I-NEXT:    mv a0, a4
1206 ; RV32I-NEXT:    mv a1, a5
1207 ; RV32I-NEXT:    ret
1209 ; RV64I-LABEL: setgt:
1210 ; RV64I:       # %bb.0:
1211 ; RV64I-NEXT:    blt a1, a0, .LBB23_2
1212 ; RV64I-NEXT:  # %bb.1:
1213 ; RV64I-NEXT:    mv a2, a3
1214 ; RV64I-NEXT:  .LBB23_2:
1215 ; RV64I-NEXT:    mv a0, a2
1216 ; RV64I-NEXT:    ret
1218 ; RV64XVENTANACONDOPS-LABEL: setgt:
1219 ; RV64XVENTANACONDOPS:       # %bb.0:
1220 ; RV64XVENTANACONDOPS-NEXT:    slt a0, a1, a0
1221 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a1, a3, a0
1222 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
1223 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1224 ; RV64XVENTANACONDOPS-NEXT:    ret
1226 ; RV64XTHEADCONDMOV-LABEL: setgt:
1227 ; RV64XTHEADCONDMOV:       # %bb.0:
1228 ; RV64XTHEADCONDMOV-NEXT:    slt a0, a1, a0
1229 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a3, a0
1230 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1231 ; RV64XTHEADCONDMOV-NEXT:    ret
1233 ; RV32ZICOND-LABEL: setgt:
1234 ; RV32ZICOND:       # %bb.0:
1235 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1236 ; RV32ZICOND-NEXT:    slt a1, a3, a1
1237 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1238 ; RV32ZICOND-NEXT:    sltu a0, a2, a0
1239 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1240 ; RV32ZICOND-NEXT:    or a1, a0, a1
1241 ; RV32ZICOND-NEXT:    czero.nez a0, a6, a1
1242 ; RV32ZICOND-NEXT:    czero.eqz a2, a4, a1
1243 ; RV32ZICOND-NEXT:    or a0, a2, a0
1244 ; RV32ZICOND-NEXT:    czero.nez a2, a7, a1
1245 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
1246 ; RV32ZICOND-NEXT:    or a1, a1, a2
1247 ; RV32ZICOND-NEXT:    ret
1249 ; RV64ZICOND-LABEL: setgt:
1250 ; RV64ZICOND:       # %bb.0:
1251 ; RV64ZICOND-NEXT:    slt a0, a1, a0
1252 ; RV64ZICOND-NEXT:    czero.nez a1, a3, a0
1253 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1254 ; RV64ZICOND-NEXT:    or a0, a0, a1
1255 ; RV64ZICOND-NEXT:    ret
1256   %rc = icmp sgt i64 %a, %b
1257   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1258   ret i64 %sel
1261 define i64 @setge(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1262 ; RV32I-LABEL: setge:
1263 ; RV32I:       # %bb.0:
1264 ; RV32I-NEXT:    beq a1, a3, .LBB24_2
1265 ; RV32I-NEXT:  # %bb.1:
1266 ; RV32I-NEXT:    slt a0, a1, a3
1267 ; RV32I-NEXT:    bnez a0, .LBB24_3
1268 ; RV32I-NEXT:    j .LBB24_4
1269 ; RV32I-NEXT:  .LBB24_2:
1270 ; RV32I-NEXT:    sltu a0, a0, a2
1271 ; RV32I-NEXT:    beqz a0, .LBB24_4
1272 ; RV32I-NEXT:  .LBB24_3:
1273 ; RV32I-NEXT:    mv a4, a6
1274 ; RV32I-NEXT:    mv a5, a7
1275 ; RV32I-NEXT:  .LBB24_4:
1276 ; RV32I-NEXT:    mv a0, a4
1277 ; RV32I-NEXT:    mv a1, a5
1278 ; RV32I-NEXT:    ret
1280 ; RV64I-LABEL: setge:
1281 ; RV64I:       # %bb.0:
1282 ; RV64I-NEXT:    bge a0, a1, .LBB24_2
1283 ; RV64I-NEXT:  # %bb.1:
1284 ; RV64I-NEXT:    mv a2, a3
1285 ; RV64I-NEXT:  .LBB24_2:
1286 ; RV64I-NEXT:    mv a0, a2
1287 ; RV64I-NEXT:    ret
1289 ; RV64XVENTANACONDOPS-LABEL: setge:
1290 ; RV64XVENTANACONDOPS:       # %bb.0:
1291 ; RV64XVENTANACONDOPS-NEXT:    slt a0, a0, a1
1292 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a3, a0
1293 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
1294 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1295 ; RV64XVENTANACONDOPS-NEXT:    ret
1297 ; RV64XTHEADCONDMOV-LABEL: setge:
1298 ; RV64XTHEADCONDMOV:       # %bb.0:
1299 ; RV64XTHEADCONDMOV-NEXT:    slt a0, a0, a1
1300 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a3, a0
1301 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1302 ; RV64XTHEADCONDMOV-NEXT:    ret
1304 ; RV32ZICOND-LABEL: setge:
1305 ; RV32ZICOND:       # %bb.0:
1306 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1307 ; RV32ZICOND-NEXT:    slt a1, a1, a3
1308 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1309 ; RV32ZICOND-NEXT:    sltu a0, a0, a2
1310 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1311 ; RV32ZICOND-NEXT:    or a1, a0, a1
1312 ; RV32ZICOND-NEXT:    czero.eqz a0, a6, a1
1313 ; RV32ZICOND-NEXT:    czero.nez a2, a4, a1
1314 ; RV32ZICOND-NEXT:    or a0, a2, a0
1315 ; RV32ZICOND-NEXT:    czero.eqz a2, a7, a1
1316 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
1317 ; RV32ZICOND-NEXT:    or a1, a1, a2
1318 ; RV32ZICOND-NEXT:    ret
1320 ; RV64ZICOND-LABEL: setge:
1321 ; RV64ZICOND:       # %bb.0:
1322 ; RV64ZICOND-NEXT:    slt a0, a0, a1
1323 ; RV64ZICOND-NEXT:    czero.eqz a1, a3, a0
1324 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
1325 ; RV64ZICOND-NEXT:    or a0, a0, a1
1326 ; RV64ZICOND-NEXT:    ret
1327   %rc = icmp sge i64 %a, %b
1328   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1329   ret i64 %sel
1332 define i64 @setlt(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1333 ; RV32I-LABEL: setlt:
1334 ; RV32I:       # %bb.0:
1335 ; RV32I-NEXT:    beq a1, a3, .LBB25_2
1336 ; RV32I-NEXT:  # %bb.1:
1337 ; RV32I-NEXT:    slt a0, a1, a3
1338 ; RV32I-NEXT:    beqz a0, .LBB25_3
1339 ; RV32I-NEXT:    j .LBB25_4
1340 ; RV32I-NEXT:  .LBB25_2:
1341 ; RV32I-NEXT:    sltu a0, a0, a2
1342 ; RV32I-NEXT:    bnez a0, .LBB25_4
1343 ; RV32I-NEXT:  .LBB25_3:
1344 ; RV32I-NEXT:    mv a4, a6
1345 ; RV32I-NEXT:    mv a5, a7
1346 ; RV32I-NEXT:  .LBB25_4:
1347 ; RV32I-NEXT:    mv a0, a4
1348 ; RV32I-NEXT:    mv a1, a5
1349 ; RV32I-NEXT:    ret
1351 ; RV64I-LABEL: setlt:
1352 ; RV64I:       # %bb.0:
1353 ; RV64I-NEXT:    blt a0, a1, .LBB25_2
1354 ; RV64I-NEXT:  # %bb.1:
1355 ; RV64I-NEXT:    mv a2, a3
1356 ; RV64I-NEXT:  .LBB25_2:
1357 ; RV64I-NEXT:    mv a0, a2
1358 ; RV64I-NEXT:    ret
1360 ; RV64XVENTANACONDOPS-LABEL: setlt:
1361 ; RV64XVENTANACONDOPS:       # %bb.0:
1362 ; RV64XVENTANACONDOPS-NEXT:    slt a0, a0, a1
1363 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a1, a3, a0
1364 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
1365 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1366 ; RV64XVENTANACONDOPS-NEXT:    ret
1368 ; RV64XTHEADCONDMOV-LABEL: setlt:
1369 ; RV64XTHEADCONDMOV:       # %bb.0:
1370 ; RV64XTHEADCONDMOV-NEXT:    slt a0, a0, a1
1371 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a3, a0
1372 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1373 ; RV64XTHEADCONDMOV-NEXT:    ret
1375 ; RV32ZICOND-LABEL: setlt:
1376 ; RV32ZICOND:       # %bb.0:
1377 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1378 ; RV32ZICOND-NEXT:    slt a1, a1, a3
1379 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1380 ; RV32ZICOND-NEXT:    sltu a0, a0, a2
1381 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1382 ; RV32ZICOND-NEXT:    or a1, a0, a1
1383 ; RV32ZICOND-NEXT:    czero.nez a0, a6, a1
1384 ; RV32ZICOND-NEXT:    czero.eqz a2, a4, a1
1385 ; RV32ZICOND-NEXT:    or a0, a2, a0
1386 ; RV32ZICOND-NEXT:    czero.nez a2, a7, a1
1387 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
1388 ; RV32ZICOND-NEXT:    or a1, a1, a2
1389 ; RV32ZICOND-NEXT:    ret
1391 ; RV64ZICOND-LABEL: setlt:
1392 ; RV64ZICOND:       # %bb.0:
1393 ; RV64ZICOND-NEXT:    slt a0, a0, a1
1394 ; RV64ZICOND-NEXT:    czero.nez a1, a3, a0
1395 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1396 ; RV64ZICOND-NEXT:    or a0, a0, a1
1397 ; RV64ZICOND-NEXT:    ret
1398   %rc = icmp slt i64 %a, %b
1399   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1400   ret i64 %sel
1403 define i64 @setle(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1404 ; RV32I-LABEL: setle:
1405 ; RV32I:       # %bb.0:
1406 ; RV32I-NEXT:    beq a1, a3, .LBB26_2
1407 ; RV32I-NEXT:  # %bb.1:
1408 ; RV32I-NEXT:    slt a0, a3, a1
1409 ; RV32I-NEXT:    bnez a0, .LBB26_3
1410 ; RV32I-NEXT:    j .LBB26_4
1411 ; RV32I-NEXT:  .LBB26_2:
1412 ; RV32I-NEXT:    sltu a0, a2, a0
1413 ; RV32I-NEXT:    beqz a0, .LBB26_4
1414 ; RV32I-NEXT:  .LBB26_3:
1415 ; RV32I-NEXT:    mv a4, a6
1416 ; RV32I-NEXT:    mv a5, a7
1417 ; RV32I-NEXT:  .LBB26_4:
1418 ; RV32I-NEXT:    mv a0, a4
1419 ; RV32I-NEXT:    mv a1, a5
1420 ; RV32I-NEXT:    ret
1422 ; RV64I-LABEL: setle:
1423 ; RV64I:       # %bb.0:
1424 ; RV64I-NEXT:    bge a1, a0, .LBB26_2
1425 ; RV64I-NEXT:  # %bb.1:
1426 ; RV64I-NEXT:    mv a2, a3
1427 ; RV64I-NEXT:  .LBB26_2:
1428 ; RV64I-NEXT:    mv a0, a2
1429 ; RV64I-NEXT:    ret
1431 ; RV64XVENTANACONDOPS-LABEL: setle:
1432 ; RV64XVENTANACONDOPS:       # %bb.0:
1433 ; RV64XVENTANACONDOPS-NEXT:    slt a0, a1, a0
1434 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a3, a0
1435 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
1436 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1437 ; RV64XVENTANACONDOPS-NEXT:    ret
1439 ; RV64XTHEADCONDMOV-LABEL: setle:
1440 ; RV64XTHEADCONDMOV:       # %bb.0:
1441 ; RV64XTHEADCONDMOV-NEXT:    slt a0, a1, a0
1442 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a3, a0
1443 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1444 ; RV64XTHEADCONDMOV-NEXT:    ret
1446 ; RV32ZICOND-LABEL: setle:
1447 ; RV32ZICOND:       # %bb.0:
1448 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1449 ; RV32ZICOND-NEXT:    slt a1, a3, a1
1450 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1451 ; RV32ZICOND-NEXT:    sltu a0, a2, a0
1452 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1453 ; RV32ZICOND-NEXT:    or a1, a0, a1
1454 ; RV32ZICOND-NEXT:    czero.eqz a0, a6, a1
1455 ; RV32ZICOND-NEXT:    czero.nez a2, a4, a1
1456 ; RV32ZICOND-NEXT:    or a0, a2, a0
1457 ; RV32ZICOND-NEXT:    czero.eqz a2, a7, a1
1458 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
1459 ; RV32ZICOND-NEXT:    or a1, a1, a2
1460 ; RV32ZICOND-NEXT:    ret
1462 ; RV64ZICOND-LABEL: setle:
1463 ; RV64ZICOND:       # %bb.0:
1464 ; RV64ZICOND-NEXT:    slt a0, a1, a0
1465 ; RV64ZICOND-NEXT:    czero.eqz a1, a3, a0
1466 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
1467 ; RV64ZICOND-NEXT:    or a0, a0, a1
1468 ; RV64ZICOND-NEXT:    ret
1469   %rc = icmp sle i64 %a, %b
1470   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1471   ret i64 %sel
1474 define i64 @setugt(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1475 ; RV32I-LABEL: setugt:
1476 ; RV32I:       # %bb.0:
1477 ; RV32I-NEXT:    beq a1, a3, .LBB27_2
1478 ; RV32I-NEXT:  # %bb.1:
1479 ; RV32I-NEXT:    sltu a0, a3, a1
1480 ; RV32I-NEXT:    beqz a0, .LBB27_3
1481 ; RV32I-NEXT:    j .LBB27_4
1482 ; RV32I-NEXT:  .LBB27_2:
1483 ; RV32I-NEXT:    sltu a0, a2, a0
1484 ; RV32I-NEXT:    bnez a0, .LBB27_4
1485 ; RV32I-NEXT:  .LBB27_3:
1486 ; RV32I-NEXT:    mv a4, a6
1487 ; RV32I-NEXT:    mv a5, a7
1488 ; RV32I-NEXT:  .LBB27_4:
1489 ; RV32I-NEXT:    mv a0, a4
1490 ; RV32I-NEXT:    mv a1, a5
1491 ; RV32I-NEXT:    ret
1493 ; RV64I-LABEL: setugt:
1494 ; RV64I:       # %bb.0:
1495 ; RV64I-NEXT:    bltu a1, a0, .LBB27_2
1496 ; RV64I-NEXT:  # %bb.1:
1497 ; RV64I-NEXT:    mv a2, a3
1498 ; RV64I-NEXT:  .LBB27_2:
1499 ; RV64I-NEXT:    mv a0, a2
1500 ; RV64I-NEXT:    ret
1502 ; RV64XVENTANACONDOPS-LABEL: setugt:
1503 ; RV64XVENTANACONDOPS:       # %bb.0:
1504 ; RV64XVENTANACONDOPS-NEXT:    sltu a0, a1, a0
1505 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a1, a3, a0
1506 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
1507 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1508 ; RV64XVENTANACONDOPS-NEXT:    ret
1510 ; RV64XTHEADCONDMOV-LABEL: setugt:
1511 ; RV64XTHEADCONDMOV:       # %bb.0:
1512 ; RV64XTHEADCONDMOV-NEXT:    sltu a0, a1, a0
1513 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a3, a0
1514 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1515 ; RV64XTHEADCONDMOV-NEXT:    ret
1517 ; RV32ZICOND-LABEL: setugt:
1518 ; RV32ZICOND:       # %bb.0:
1519 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1520 ; RV32ZICOND-NEXT:    sltu a1, a3, a1
1521 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1522 ; RV32ZICOND-NEXT:    sltu a0, a2, a0
1523 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1524 ; RV32ZICOND-NEXT:    or a1, a0, a1
1525 ; RV32ZICOND-NEXT:    czero.nez a0, a6, a1
1526 ; RV32ZICOND-NEXT:    czero.eqz a2, a4, a1
1527 ; RV32ZICOND-NEXT:    or a0, a2, a0
1528 ; RV32ZICOND-NEXT:    czero.nez a2, a7, a1
1529 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
1530 ; RV32ZICOND-NEXT:    or a1, a1, a2
1531 ; RV32ZICOND-NEXT:    ret
1533 ; RV64ZICOND-LABEL: setugt:
1534 ; RV64ZICOND:       # %bb.0:
1535 ; RV64ZICOND-NEXT:    sltu a0, a1, a0
1536 ; RV64ZICOND-NEXT:    czero.nez a1, a3, a0
1537 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1538 ; RV64ZICOND-NEXT:    or a0, a0, a1
1539 ; RV64ZICOND-NEXT:    ret
1540   %rc = icmp ugt i64 %a, %b
1541   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1542   ret i64 %sel
1545 define i64 @setuge(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1546 ; RV32I-LABEL: setuge:
1547 ; RV32I:       # %bb.0:
1548 ; RV32I-NEXT:    beq a1, a3, .LBB28_2
1549 ; RV32I-NEXT:  # %bb.1:
1550 ; RV32I-NEXT:    sltu a0, a1, a3
1551 ; RV32I-NEXT:    bnez a0, .LBB28_3
1552 ; RV32I-NEXT:    j .LBB28_4
1553 ; RV32I-NEXT:  .LBB28_2:
1554 ; RV32I-NEXT:    sltu a0, a0, a2
1555 ; RV32I-NEXT:    beqz a0, .LBB28_4
1556 ; RV32I-NEXT:  .LBB28_3:
1557 ; RV32I-NEXT:    mv a4, a6
1558 ; RV32I-NEXT:    mv a5, a7
1559 ; RV32I-NEXT:  .LBB28_4:
1560 ; RV32I-NEXT:    mv a0, a4
1561 ; RV32I-NEXT:    mv a1, a5
1562 ; RV32I-NEXT:    ret
1564 ; RV64I-LABEL: setuge:
1565 ; RV64I:       # %bb.0:
1566 ; RV64I-NEXT:    bgeu a0, a1, .LBB28_2
1567 ; RV64I-NEXT:  # %bb.1:
1568 ; RV64I-NEXT:    mv a2, a3
1569 ; RV64I-NEXT:  .LBB28_2:
1570 ; RV64I-NEXT:    mv a0, a2
1571 ; RV64I-NEXT:    ret
1573 ; RV64XVENTANACONDOPS-LABEL: setuge:
1574 ; RV64XVENTANACONDOPS:       # %bb.0:
1575 ; RV64XVENTANACONDOPS-NEXT:    sltu a0, a0, a1
1576 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a3, a0
1577 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
1578 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1579 ; RV64XVENTANACONDOPS-NEXT:    ret
1581 ; RV64XTHEADCONDMOV-LABEL: setuge:
1582 ; RV64XTHEADCONDMOV:       # %bb.0:
1583 ; RV64XTHEADCONDMOV-NEXT:    sltu a0, a0, a1
1584 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a3, a0
1585 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1586 ; RV64XTHEADCONDMOV-NEXT:    ret
1588 ; RV32ZICOND-LABEL: setuge:
1589 ; RV32ZICOND:       # %bb.0:
1590 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1591 ; RV32ZICOND-NEXT:    sltu a1, a1, a3
1592 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1593 ; RV32ZICOND-NEXT:    sltu a0, a0, a2
1594 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1595 ; RV32ZICOND-NEXT:    or a1, a0, a1
1596 ; RV32ZICOND-NEXT:    czero.eqz a0, a6, a1
1597 ; RV32ZICOND-NEXT:    czero.nez a2, a4, a1
1598 ; RV32ZICOND-NEXT:    or a0, a2, a0
1599 ; RV32ZICOND-NEXT:    czero.eqz a2, a7, a1
1600 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
1601 ; RV32ZICOND-NEXT:    or a1, a1, a2
1602 ; RV32ZICOND-NEXT:    ret
1604 ; RV64ZICOND-LABEL: setuge:
1605 ; RV64ZICOND:       # %bb.0:
1606 ; RV64ZICOND-NEXT:    sltu a0, a0, a1
1607 ; RV64ZICOND-NEXT:    czero.eqz a1, a3, a0
1608 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
1609 ; RV64ZICOND-NEXT:    or a0, a0, a1
1610 ; RV64ZICOND-NEXT:    ret
1611   %rc = icmp uge i64 %a, %b
1612   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1613   ret i64 %sel
1616 define i64 @setult(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1617 ; RV32I-LABEL: setult:
1618 ; RV32I:       # %bb.0:
1619 ; RV32I-NEXT:    beq a1, a3, .LBB29_2
1620 ; RV32I-NEXT:  # %bb.1:
1621 ; RV32I-NEXT:    sltu a0, a1, a3
1622 ; RV32I-NEXT:    beqz a0, .LBB29_3
1623 ; RV32I-NEXT:    j .LBB29_4
1624 ; RV32I-NEXT:  .LBB29_2:
1625 ; RV32I-NEXT:    sltu a0, a0, a2
1626 ; RV32I-NEXT:    bnez a0, .LBB29_4
1627 ; RV32I-NEXT:  .LBB29_3:
1628 ; RV32I-NEXT:    mv a4, a6
1629 ; RV32I-NEXT:    mv a5, a7
1630 ; RV32I-NEXT:  .LBB29_4:
1631 ; RV32I-NEXT:    mv a0, a4
1632 ; RV32I-NEXT:    mv a1, a5
1633 ; RV32I-NEXT:    ret
1635 ; RV64I-LABEL: setult:
1636 ; RV64I:       # %bb.0:
1637 ; RV64I-NEXT:    bltu a0, a1, .LBB29_2
1638 ; RV64I-NEXT:  # %bb.1:
1639 ; RV64I-NEXT:    mv a2, a3
1640 ; RV64I-NEXT:  .LBB29_2:
1641 ; RV64I-NEXT:    mv a0, a2
1642 ; RV64I-NEXT:    ret
1644 ; RV64XVENTANACONDOPS-LABEL: setult:
1645 ; RV64XVENTANACONDOPS:       # %bb.0:
1646 ; RV64XVENTANACONDOPS-NEXT:    sltu a0, a0, a1
1647 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a1, a3, a0
1648 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
1649 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1650 ; RV64XVENTANACONDOPS-NEXT:    ret
1652 ; RV64XTHEADCONDMOV-LABEL: setult:
1653 ; RV64XTHEADCONDMOV:       # %bb.0:
1654 ; RV64XTHEADCONDMOV-NEXT:    sltu a0, a0, a1
1655 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a3, a0
1656 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1657 ; RV64XTHEADCONDMOV-NEXT:    ret
1659 ; RV32ZICOND-LABEL: setult:
1660 ; RV32ZICOND:       # %bb.0:
1661 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1662 ; RV32ZICOND-NEXT:    sltu a1, a1, a3
1663 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1664 ; RV32ZICOND-NEXT:    sltu a0, a0, a2
1665 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1666 ; RV32ZICOND-NEXT:    or a1, a0, a1
1667 ; RV32ZICOND-NEXT:    czero.nez a0, a6, a1
1668 ; RV32ZICOND-NEXT:    czero.eqz a2, a4, a1
1669 ; RV32ZICOND-NEXT:    or a0, a2, a0
1670 ; RV32ZICOND-NEXT:    czero.nez a2, a7, a1
1671 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
1672 ; RV32ZICOND-NEXT:    or a1, a1, a2
1673 ; RV32ZICOND-NEXT:    ret
1675 ; RV64ZICOND-LABEL: setult:
1676 ; RV64ZICOND:       # %bb.0:
1677 ; RV64ZICOND-NEXT:    sltu a0, a0, a1
1678 ; RV64ZICOND-NEXT:    czero.nez a1, a3, a0
1679 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1680 ; RV64ZICOND-NEXT:    or a0, a0, a1
1681 ; RV64ZICOND-NEXT:    ret
1682   %rc = icmp ult i64 %a, %b
1683   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1684   ret i64 %sel
1687 define i64 @setule(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1688 ; RV32I-LABEL: setule:
1689 ; RV32I:       # %bb.0:
1690 ; RV32I-NEXT:    beq a1, a3, .LBB30_2
1691 ; RV32I-NEXT:  # %bb.1:
1692 ; RV32I-NEXT:    sltu a0, a3, a1
1693 ; RV32I-NEXT:    bnez a0, .LBB30_3
1694 ; RV32I-NEXT:    j .LBB30_4
1695 ; RV32I-NEXT:  .LBB30_2:
1696 ; RV32I-NEXT:    sltu a0, a2, a0
1697 ; RV32I-NEXT:    beqz a0, .LBB30_4
1698 ; RV32I-NEXT:  .LBB30_3:
1699 ; RV32I-NEXT:    mv a4, a6
1700 ; RV32I-NEXT:    mv a5, a7
1701 ; RV32I-NEXT:  .LBB30_4:
1702 ; RV32I-NEXT:    mv a0, a4
1703 ; RV32I-NEXT:    mv a1, a5
1704 ; RV32I-NEXT:    ret
1706 ; RV64I-LABEL: setule:
1707 ; RV64I:       # %bb.0:
1708 ; RV64I-NEXT:    bgeu a1, a0, .LBB30_2
1709 ; RV64I-NEXT:  # %bb.1:
1710 ; RV64I-NEXT:    mv a2, a3
1711 ; RV64I-NEXT:  .LBB30_2:
1712 ; RV64I-NEXT:    mv a0, a2
1713 ; RV64I-NEXT:    ret
1715 ; RV64XVENTANACONDOPS-LABEL: setule:
1716 ; RV64XVENTANACONDOPS:       # %bb.0:
1717 ; RV64XVENTANACONDOPS-NEXT:    sltu a0, a1, a0
1718 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a3, a0
1719 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
1720 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1721 ; RV64XVENTANACONDOPS-NEXT:    ret
1723 ; RV64XTHEADCONDMOV-LABEL: setule:
1724 ; RV64XTHEADCONDMOV:       # %bb.0:
1725 ; RV64XTHEADCONDMOV-NEXT:    sltu a0, a1, a0
1726 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a3, a0
1727 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1728 ; RV64XTHEADCONDMOV-NEXT:    ret
1730 ; RV32ZICOND-LABEL: setule:
1731 ; RV32ZICOND:       # %bb.0:
1732 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1733 ; RV32ZICOND-NEXT:    sltu a1, a3, a1
1734 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1735 ; RV32ZICOND-NEXT:    sltu a0, a2, a0
1736 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1737 ; RV32ZICOND-NEXT:    or a1, a0, a1
1738 ; RV32ZICOND-NEXT:    czero.eqz a0, a6, a1
1739 ; RV32ZICOND-NEXT:    czero.nez a2, a4, a1
1740 ; RV32ZICOND-NEXT:    or a0, a2, a0
1741 ; RV32ZICOND-NEXT:    czero.eqz a2, a7, a1
1742 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
1743 ; RV32ZICOND-NEXT:    or a1, a1, a2
1744 ; RV32ZICOND-NEXT:    ret
1746 ; RV64ZICOND-LABEL: setule:
1747 ; RV64ZICOND:       # %bb.0:
1748 ; RV64ZICOND-NEXT:    sltu a0, a1, a0
1749 ; RV64ZICOND-NEXT:    czero.eqz a1, a3, a0
1750 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
1751 ; RV64ZICOND-NEXT:    or a0, a0, a1
1752 ; RV64ZICOND-NEXT:    ret
1753   %rc = icmp ule i64 %a, %b
1754   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1755   ret i64 %sel
1758 define i64 @seteq_zero(i64 %a, i64 %rs1, i64 %rs2) {
1759 ; RV32I-LABEL: seteq_zero:
1760 ; RV32I:       # %bb.0:
1761 ; RV32I-NEXT:    or a6, a0, a1
1762 ; RV32I-NEXT:    mv a1, a3
1763 ; RV32I-NEXT:    mv a0, a2
1764 ; RV32I-NEXT:    beqz a6, .LBB31_2
1765 ; RV32I-NEXT:  # %bb.1:
1766 ; RV32I-NEXT:    mv a0, a4
1767 ; RV32I-NEXT:    mv a1, a5
1768 ; RV32I-NEXT:  .LBB31_2:
1769 ; RV32I-NEXT:    ret
1771 ; RV64I-LABEL: seteq_zero:
1772 ; RV64I:       # %bb.0:
1773 ; RV64I-NEXT:    beqz a0, .LBB31_2
1774 ; RV64I-NEXT:  # %bb.1:
1775 ; RV64I-NEXT:    mv a1, a2
1776 ; RV64I-NEXT:  .LBB31_2:
1777 ; RV64I-NEXT:    mv a0, a1
1778 ; RV64I-NEXT:    ret
1780 ; RV64XVENTANACONDOPS-LABEL: seteq_zero:
1781 ; RV64XVENTANACONDOPS:       # %bb.0:
1782 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a2, a2, a0
1783 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
1784 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
1785 ; RV64XVENTANACONDOPS-NEXT:    ret
1787 ; RV64XTHEADCONDMOV-LABEL: seteq_zero:
1788 ; RV64XTHEADCONDMOV:       # %bb.0:
1789 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, a2, a0
1790 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
1791 ; RV64XTHEADCONDMOV-NEXT:    ret
1793 ; RV32ZICOND-LABEL: seteq_zero:
1794 ; RV32ZICOND:       # %bb.0:
1795 ; RV32ZICOND-NEXT:    or a1, a0, a1
1796 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
1797 ; RV32ZICOND-NEXT:    czero.nez a2, a2, a1
1798 ; RV32ZICOND-NEXT:    or a0, a2, a0
1799 ; RV32ZICOND-NEXT:    czero.eqz a2, a5, a1
1800 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
1801 ; RV32ZICOND-NEXT:    or a1, a1, a2
1802 ; RV32ZICOND-NEXT:    ret
1804 ; RV64ZICOND-LABEL: seteq_zero:
1805 ; RV64ZICOND:       # %bb.0:
1806 ; RV64ZICOND-NEXT:    czero.eqz a2, a2, a0
1807 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
1808 ; RV64ZICOND-NEXT:    or a0, a0, a2
1809 ; RV64ZICOND-NEXT:    ret
1810   %rc = icmp eq i64 %a, 0
1811   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1812   ret i64 %sel
1815 define i64 @setne_zero(i64 %a, i64 %rs1, i64 %rs2) {
1816 ; RV32I-LABEL: setne_zero:
1817 ; RV32I:       # %bb.0:
1818 ; RV32I-NEXT:    or a6, a0, a1
1819 ; RV32I-NEXT:    mv a1, a3
1820 ; RV32I-NEXT:    mv a0, a2
1821 ; RV32I-NEXT:    bnez a6, .LBB32_2
1822 ; RV32I-NEXT:  # %bb.1:
1823 ; RV32I-NEXT:    mv a0, a4
1824 ; RV32I-NEXT:    mv a1, a5
1825 ; RV32I-NEXT:  .LBB32_2:
1826 ; RV32I-NEXT:    ret
1828 ; RV64I-LABEL: setne_zero:
1829 ; RV64I:       # %bb.0:
1830 ; RV64I-NEXT:    bnez a0, .LBB32_2
1831 ; RV64I-NEXT:  # %bb.1:
1832 ; RV64I-NEXT:    mv a1, a2
1833 ; RV64I-NEXT:  .LBB32_2:
1834 ; RV64I-NEXT:    mv a0, a1
1835 ; RV64I-NEXT:    ret
1837 ; RV64XVENTANACONDOPS-LABEL: setne_zero:
1838 ; RV64XVENTANACONDOPS:       # %bb.0:
1839 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a2, a2, a0
1840 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
1841 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
1842 ; RV64XVENTANACONDOPS-NEXT:    ret
1844 ; RV64XTHEADCONDMOV-LABEL: setne_zero:
1845 ; RV64XTHEADCONDMOV:       # %bb.0:
1846 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, a2, a0
1847 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
1848 ; RV64XTHEADCONDMOV-NEXT:    ret
1850 ; RV32ZICOND-LABEL: setne_zero:
1851 ; RV32ZICOND:       # %bb.0:
1852 ; RV32ZICOND-NEXT:    or a1, a0, a1
1853 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a1
1854 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a1
1855 ; RV32ZICOND-NEXT:    or a0, a2, a0
1856 ; RV32ZICOND-NEXT:    czero.nez a2, a5, a1
1857 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
1858 ; RV32ZICOND-NEXT:    or a1, a1, a2
1859 ; RV32ZICOND-NEXT:    ret
1861 ; RV64ZICOND-LABEL: setne_zero:
1862 ; RV64ZICOND:       # %bb.0:
1863 ; RV64ZICOND-NEXT:    czero.nez a2, a2, a0
1864 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
1865 ; RV64ZICOND-NEXT:    or a0, a0, a2
1866 ; RV64ZICOND-NEXT:    ret
1867   %rc = icmp ne i64 %a, 0
1868   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1869   ret i64 %sel
1872 define i64 @seteq_constant(i64 %a, i64 %rs1, i64 %rs2) {
1873 ; RV32I-LABEL: seteq_constant:
1874 ; RV32I:       # %bb.0:
1875 ; RV32I-NEXT:    xori a0, a0, 123
1876 ; RV32I-NEXT:    or a6, a0, a1
1877 ; RV32I-NEXT:    mv a1, a3
1878 ; RV32I-NEXT:    mv a0, a2
1879 ; RV32I-NEXT:    beqz a6, .LBB33_2
1880 ; RV32I-NEXT:  # %bb.1:
1881 ; RV32I-NEXT:    mv a0, a4
1882 ; RV32I-NEXT:    mv a1, a5
1883 ; RV32I-NEXT:  .LBB33_2:
1884 ; RV32I-NEXT:    ret
1886 ; RV64I-LABEL: seteq_constant:
1887 ; RV64I:       # %bb.0:
1888 ; RV64I-NEXT:    li a3, 123
1889 ; RV64I-NEXT:    beq a0, a3, .LBB33_2
1890 ; RV64I-NEXT:  # %bb.1:
1891 ; RV64I-NEXT:    mv a1, a2
1892 ; RV64I-NEXT:  .LBB33_2:
1893 ; RV64I-NEXT:    mv a0, a1
1894 ; RV64I-NEXT:    ret
1896 ; RV64XVENTANACONDOPS-LABEL: seteq_constant:
1897 ; RV64XVENTANACONDOPS:       # %bb.0:
1898 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -123
1899 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a2, a2, a0
1900 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
1901 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
1902 ; RV64XVENTANACONDOPS-NEXT:    ret
1904 ; RV64XTHEADCONDMOV-LABEL: seteq_constant:
1905 ; RV64XTHEADCONDMOV:       # %bb.0:
1906 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, -123
1907 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, a2, a0
1908 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
1909 ; RV64XTHEADCONDMOV-NEXT:    ret
1911 ; RV32ZICOND-LABEL: seteq_constant:
1912 ; RV32ZICOND:       # %bb.0:
1913 ; RV32ZICOND-NEXT:    xori a0, a0, 123
1914 ; RV32ZICOND-NEXT:    or a1, a0, a1
1915 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
1916 ; RV32ZICOND-NEXT:    czero.nez a2, a2, a1
1917 ; RV32ZICOND-NEXT:    or a0, a2, a0
1918 ; RV32ZICOND-NEXT:    czero.eqz a2, a5, a1
1919 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
1920 ; RV32ZICOND-NEXT:    or a1, a1, a2
1921 ; RV32ZICOND-NEXT:    ret
1923 ; RV64ZICOND-LABEL: seteq_constant:
1924 ; RV64ZICOND:       # %bb.0:
1925 ; RV64ZICOND-NEXT:    addi a0, a0, -123
1926 ; RV64ZICOND-NEXT:    czero.eqz a2, a2, a0
1927 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
1928 ; RV64ZICOND-NEXT:    or a0, a0, a2
1929 ; RV64ZICOND-NEXT:    ret
1930   %rc = icmp eq i64 %a, 123
1931   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1932   ret i64 %sel
1935 define i64 @setne_constant(i64 %a, i64 %rs1, i64 %rs2) {
1936 ; RV32I-LABEL: setne_constant:
1937 ; RV32I:       # %bb.0:
1938 ; RV32I-NEXT:    xori a0, a0, 456
1939 ; RV32I-NEXT:    or a6, a0, a1
1940 ; RV32I-NEXT:    mv a1, a3
1941 ; RV32I-NEXT:    mv a0, a2
1942 ; RV32I-NEXT:    bnez a6, .LBB34_2
1943 ; RV32I-NEXT:  # %bb.1:
1944 ; RV32I-NEXT:    mv a0, a4
1945 ; RV32I-NEXT:    mv a1, a5
1946 ; RV32I-NEXT:  .LBB34_2:
1947 ; RV32I-NEXT:    ret
1949 ; RV64I-LABEL: setne_constant:
1950 ; RV64I:       # %bb.0:
1951 ; RV64I-NEXT:    li a3, 456
1952 ; RV64I-NEXT:    bne a0, a3, .LBB34_2
1953 ; RV64I-NEXT:  # %bb.1:
1954 ; RV64I-NEXT:    mv a1, a2
1955 ; RV64I-NEXT:  .LBB34_2:
1956 ; RV64I-NEXT:    mv a0, a1
1957 ; RV64I-NEXT:    ret
1959 ; RV64XVENTANACONDOPS-LABEL: setne_constant:
1960 ; RV64XVENTANACONDOPS:       # %bb.0:
1961 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -456
1962 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a2, a2, a0
1963 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
1964 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
1965 ; RV64XVENTANACONDOPS-NEXT:    ret
1967 ; RV64XTHEADCONDMOV-LABEL: setne_constant:
1968 ; RV64XTHEADCONDMOV:       # %bb.0:
1969 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, -456
1970 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, a2, a0
1971 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
1972 ; RV64XTHEADCONDMOV-NEXT:    ret
1974 ; RV32ZICOND-LABEL: setne_constant:
1975 ; RV32ZICOND:       # %bb.0:
1976 ; RV32ZICOND-NEXT:    xori a0, a0, 456
1977 ; RV32ZICOND-NEXT:    or a1, a0, a1
1978 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a1
1979 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a1
1980 ; RV32ZICOND-NEXT:    or a0, a2, a0
1981 ; RV32ZICOND-NEXT:    czero.nez a2, a5, a1
1982 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
1983 ; RV32ZICOND-NEXT:    or a1, a1, a2
1984 ; RV32ZICOND-NEXT:    ret
1986 ; RV64ZICOND-LABEL: setne_constant:
1987 ; RV64ZICOND:       # %bb.0:
1988 ; RV64ZICOND-NEXT:    addi a0, a0, -456
1989 ; RV64ZICOND-NEXT:    czero.nez a2, a2, a0
1990 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
1991 ; RV64ZICOND-NEXT:    or a0, a0, a2
1992 ; RV64ZICOND-NEXT:    ret
1993   %rc = icmp ne i64 %a, 456
1994   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1995   ret i64 %sel
1998 define i64 @seteq_2048(i64 %a, i64 %rs1, i64 %rs2) {
1999 ; RV32I-LABEL: seteq_2048:
2000 ; RV32I:       # %bb.0:
2001 ; RV32I-NEXT:    li a6, 1
2002 ; RV32I-NEXT:    slli a6, a6, 11
2003 ; RV32I-NEXT:    xor a0, a0, a6
2004 ; RV32I-NEXT:    or a6, a0, a1
2005 ; RV32I-NEXT:    mv a1, a3
2006 ; RV32I-NEXT:    mv a0, a2
2007 ; RV32I-NEXT:    beqz a6, .LBB35_2
2008 ; RV32I-NEXT:  # %bb.1:
2009 ; RV32I-NEXT:    mv a0, a4
2010 ; RV32I-NEXT:    mv a1, a5
2011 ; RV32I-NEXT:  .LBB35_2:
2012 ; RV32I-NEXT:    ret
2014 ; RV64I-LABEL: seteq_2048:
2015 ; RV64I:       # %bb.0:
2016 ; RV64I-NEXT:    li a3, 1
2017 ; RV64I-NEXT:    slli a3, a3, 11
2018 ; RV64I-NEXT:    beq a0, a3, .LBB35_2
2019 ; RV64I-NEXT:  # %bb.1:
2020 ; RV64I-NEXT:    mv a1, a2
2021 ; RV64I-NEXT:  .LBB35_2:
2022 ; RV64I-NEXT:    mv a0, a1
2023 ; RV64I-NEXT:    ret
2025 ; RV64XVENTANACONDOPS-LABEL: seteq_2048:
2026 ; RV64XVENTANACONDOPS:       # %bb.0:
2027 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -2048
2028 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a2, a2, a0
2029 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2030 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
2031 ; RV64XVENTANACONDOPS-NEXT:    ret
2033 ; RV64XTHEADCONDMOV-LABEL: seteq_2048:
2034 ; RV64XTHEADCONDMOV:       # %bb.0:
2035 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, -2048
2036 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, a2, a0
2037 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2038 ; RV64XTHEADCONDMOV-NEXT:    ret
2040 ; RV32ZICOND-LABEL: seteq_2048:
2041 ; RV32ZICOND:       # %bb.0:
2042 ; RV32ZICOND-NEXT:    li a6, 1
2043 ; RV32ZICOND-NEXT:    slli a6, a6, 11
2044 ; RV32ZICOND-NEXT:    xor a0, a0, a6
2045 ; RV32ZICOND-NEXT:    or a1, a0, a1
2046 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
2047 ; RV32ZICOND-NEXT:    czero.nez a2, a2, a1
2048 ; RV32ZICOND-NEXT:    or a0, a2, a0
2049 ; RV32ZICOND-NEXT:    czero.eqz a2, a5, a1
2050 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2051 ; RV32ZICOND-NEXT:    or a1, a1, a2
2052 ; RV32ZICOND-NEXT:    ret
2054 ; RV64ZICOND-LABEL: seteq_2048:
2055 ; RV64ZICOND:       # %bb.0:
2056 ; RV64ZICOND-NEXT:    addi a0, a0, -2048
2057 ; RV64ZICOND-NEXT:    czero.eqz a2, a2, a0
2058 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2059 ; RV64ZICOND-NEXT:    or a0, a0, a2
2060 ; RV64ZICOND-NEXT:    ret
2061   %rc = icmp eq i64 %a, 2048
2062   %sel = select i1 %rc, i64 %rs1, i64 %rs2
2063   ret i64 %sel
2066 define i64 @seteq_neg2048(i64 %a, i64 %rs1, i64 %rs2) {
2067 ; RV32I-LABEL: seteq_neg2048:
2068 ; RV32I:       # %bb.0:
2069 ; RV32I-NEXT:    not a1, a1
2070 ; RV32I-NEXT:    xori a0, a0, -2048
2071 ; RV32I-NEXT:    or a6, a0, a1
2072 ; RV32I-NEXT:    mv a1, a3
2073 ; RV32I-NEXT:    mv a0, a2
2074 ; RV32I-NEXT:    beqz a6, .LBB36_2
2075 ; RV32I-NEXT:  # %bb.1:
2076 ; RV32I-NEXT:    mv a0, a4
2077 ; RV32I-NEXT:    mv a1, a5
2078 ; RV32I-NEXT:  .LBB36_2:
2079 ; RV32I-NEXT:    ret
2081 ; RV64I-LABEL: seteq_neg2048:
2082 ; RV64I:       # %bb.0:
2083 ; RV64I-NEXT:    li a3, -2048
2084 ; RV64I-NEXT:    beq a0, a3, .LBB36_2
2085 ; RV64I-NEXT:  # %bb.1:
2086 ; RV64I-NEXT:    mv a1, a2
2087 ; RV64I-NEXT:  .LBB36_2:
2088 ; RV64I-NEXT:    mv a0, a1
2089 ; RV64I-NEXT:    ret
2091 ; RV64XVENTANACONDOPS-LABEL: seteq_neg2048:
2092 ; RV64XVENTANACONDOPS:       # %bb.0:
2093 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
2094 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a2, a2, a0
2095 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2096 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
2097 ; RV64XVENTANACONDOPS-NEXT:    ret
2099 ; RV64XTHEADCONDMOV-LABEL: seteq_neg2048:
2100 ; RV64XTHEADCONDMOV:       # %bb.0:
2101 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
2102 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, a2, a0
2103 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2104 ; RV64XTHEADCONDMOV-NEXT:    ret
2106 ; RV32ZICOND-LABEL: seteq_neg2048:
2107 ; RV32ZICOND:       # %bb.0:
2108 ; RV32ZICOND-NEXT:    not a1, a1
2109 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
2110 ; RV32ZICOND-NEXT:    or a1, a0, a1
2111 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
2112 ; RV32ZICOND-NEXT:    czero.nez a2, a2, a1
2113 ; RV32ZICOND-NEXT:    or a0, a2, a0
2114 ; RV32ZICOND-NEXT:    czero.eqz a2, a5, a1
2115 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2116 ; RV32ZICOND-NEXT:    or a1, a1, a2
2117 ; RV32ZICOND-NEXT:    ret
2119 ; RV64ZICOND-LABEL: seteq_neg2048:
2120 ; RV64ZICOND:       # %bb.0:
2121 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
2122 ; RV64ZICOND-NEXT:    czero.eqz a2, a2, a0
2123 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2124 ; RV64ZICOND-NEXT:    or a0, a0, a2
2125 ; RV64ZICOND-NEXT:    ret
2126   %rc = icmp eq i64 %a, -2048
2127   %sel = select i1 %rc, i64 %rs1, i64 %rs2
2128   ret i64 %sel
2131 define i64 @setne_neg2048(i64 %a, i64 %rs1, i64 %rs2) {
2132 ; RV32I-LABEL: setne_neg2048:
2133 ; RV32I:       # %bb.0:
2134 ; RV32I-NEXT:    not a1, a1
2135 ; RV32I-NEXT:    xori a0, a0, -2048
2136 ; RV32I-NEXT:    or a6, a0, a1
2137 ; RV32I-NEXT:    mv a1, a3
2138 ; RV32I-NEXT:    mv a0, a2
2139 ; RV32I-NEXT:    bnez a6, .LBB37_2
2140 ; RV32I-NEXT:  # %bb.1:
2141 ; RV32I-NEXT:    mv a0, a4
2142 ; RV32I-NEXT:    mv a1, a5
2143 ; RV32I-NEXT:  .LBB37_2:
2144 ; RV32I-NEXT:    ret
2146 ; RV64I-LABEL: setne_neg2048:
2147 ; RV64I:       # %bb.0:
2148 ; RV64I-NEXT:    li a3, -2048
2149 ; RV64I-NEXT:    bne a0, a3, .LBB37_2
2150 ; RV64I-NEXT:  # %bb.1:
2151 ; RV64I-NEXT:    mv a1, a2
2152 ; RV64I-NEXT:  .LBB37_2:
2153 ; RV64I-NEXT:    mv a0, a1
2154 ; RV64I-NEXT:    ret
2156 ; RV64XVENTANACONDOPS-LABEL: setne_neg2048:
2157 ; RV64XVENTANACONDOPS:       # %bb.0:
2158 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
2159 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a2, a2, a0
2160 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2161 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
2162 ; RV64XVENTANACONDOPS-NEXT:    ret
2164 ; RV64XTHEADCONDMOV-LABEL: setne_neg2048:
2165 ; RV64XTHEADCONDMOV:       # %bb.0:
2166 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
2167 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, a2, a0
2168 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2169 ; RV64XTHEADCONDMOV-NEXT:    ret
2171 ; RV32ZICOND-LABEL: setne_neg2048:
2172 ; RV32ZICOND:       # %bb.0:
2173 ; RV32ZICOND-NEXT:    not a1, a1
2174 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
2175 ; RV32ZICOND-NEXT:    or a1, a0, a1
2176 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a1
2177 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a1
2178 ; RV32ZICOND-NEXT:    or a0, a2, a0
2179 ; RV32ZICOND-NEXT:    czero.nez a2, a5, a1
2180 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2181 ; RV32ZICOND-NEXT:    or a1, a1, a2
2182 ; RV32ZICOND-NEXT:    ret
2184 ; RV64ZICOND-LABEL: setne_neg2048:
2185 ; RV64ZICOND:       # %bb.0:
2186 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
2187 ; RV64ZICOND-NEXT:    czero.nez a2, a2, a0
2188 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2189 ; RV64ZICOND-NEXT:    or a0, a0, a2
2190 ; RV64ZICOND-NEXT:    ret
2191   %rc = icmp ne i64 %a, -2048
2192   %sel = select i1 %rc, i64 %rs1, i64 %rs2
2193   ret i64 %sel
2196 define i64 @zero1_seteq(i64 %a, i64 %b, i64 %rs1) {
2197 ; RV32I-LABEL: zero1_seteq:
2198 ; RV32I:       # %bb.0:
2199 ; RV32I-NEXT:    xor a1, a1, a3
2200 ; RV32I-NEXT:    xor a0, a0, a2
2201 ; RV32I-NEXT:    or a0, a0, a1
2202 ; RV32I-NEXT:    snez a0, a0
2203 ; RV32I-NEXT:    addi a1, a0, -1
2204 ; RV32I-NEXT:    and a0, a1, a4
2205 ; RV32I-NEXT:    and a1, a1, a5
2206 ; RV32I-NEXT:    ret
2208 ; RV64I-LABEL: zero1_seteq:
2209 ; RV64I:       # %bb.0:
2210 ; RV64I-NEXT:    xor a0, a0, a1
2211 ; RV64I-NEXT:    snez a0, a0
2212 ; RV64I-NEXT:    addi a0, a0, -1
2213 ; RV64I-NEXT:    and a0, a0, a2
2214 ; RV64I-NEXT:    ret
2216 ; RV64XVENTANACONDOPS-LABEL: zero1_seteq:
2217 ; RV64XVENTANACONDOPS:       # %bb.0:
2218 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
2219 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
2220 ; RV64XVENTANACONDOPS-NEXT:    ret
2222 ; RV64XTHEADCONDMOV-LABEL: zero1_seteq:
2223 ; RV64XTHEADCONDMOV:       # %bb.0:
2224 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
2225 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
2226 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
2227 ; RV64XTHEADCONDMOV-NEXT:    ret
2229 ; RV32ZICOND-LABEL: zero1_seteq:
2230 ; RV32ZICOND:       # %bb.0:
2231 ; RV32ZICOND-NEXT:    xor a1, a1, a3
2232 ; RV32ZICOND-NEXT:    xor a0, a0, a2
2233 ; RV32ZICOND-NEXT:    or a1, a0, a1
2234 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a1
2235 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
2236 ; RV32ZICOND-NEXT:    ret
2238 ; RV64ZICOND-LABEL: zero1_seteq:
2239 ; RV64ZICOND:       # %bb.0:
2240 ; RV64ZICOND-NEXT:    xor a0, a0, a1
2241 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
2242 ; RV64ZICOND-NEXT:    ret
2243   %rc = icmp eq i64 %a, %b
2244   %sel = select i1 %rc, i64 %rs1, i64 0
2245   ret i64 %sel
2248 define i64 @zero2_seteq(i64 %a, i64 %b, i64 %rs1) {
2249 ; RV32I-LABEL: zero2_seteq:
2250 ; RV32I:       # %bb.0:
2251 ; RV32I-NEXT:    xor a1, a1, a3
2252 ; RV32I-NEXT:    xor a0, a0, a2
2253 ; RV32I-NEXT:    or a0, a0, a1
2254 ; RV32I-NEXT:    seqz a0, a0
2255 ; RV32I-NEXT:    addi a1, a0, -1
2256 ; RV32I-NEXT:    and a0, a1, a4
2257 ; RV32I-NEXT:    and a1, a1, a5
2258 ; RV32I-NEXT:    ret
2260 ; RV64I-LABEL: zero2_seteq:
2261 ; RV64I:       # %bb.0:
2262 ; RV64I-NEXT:    xor a0, a0, a1
2263 ; RV64I-NEXT:    seqz a0, a0
2264 ; RV64I-NEXT:    addi a0, a0, -1
2265 ; RV64I-NEXT:    and a0, a0, a2
2266 ; RV64I-NEXT:    ret
2268 ; RV64XVENTANACONDOPS-LABEL: zero2_seteq:
2269 ; RV64XVENTANACONDOPS:       # %bb.0:
2270 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
2271 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
2272 ; RV64XVENTANACONDOPS-NEXT:    ret
2274 ; RV64XTHEADCONDMOV-LABEL: zero2_seteq:
2275 ; RV64XTHEADCONDMOV:       # %bb.0:
2276 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
2277 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
2278 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
2279 ; RV64XTHEADCONDMOV-NEXT:    ret
2281 ; RV32ZICOND-LABEL: zero2_seteq:
2282 ; RV32ZICOND:       # %bb.0:
2283 ; RV32ZICOND-NEXT:    xor a1, a1, a3
2284 ; RV32ZICOND-NEXT:    xor a0, a0, a2
2285 ; RV32ZICOND-NEXT:    or a1, a0, a1
2286 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
2287 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
2288 ; RV32ZICOND-NEXT:    ret
2290 ; RV64ZICOND-LABEL: zero2_seteq:
2291 ; RV64ZICOND:       # %bb.0:
2292 ; RV64ZICOND-NEXT:    xor a0, a0, a1
2293 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
2294 ; RV64ZICOND-NEXT:    ret
2295   %rc = icmp eq i64 %a, %b
2296   %sel = select i1 %rc, i64 0, i64 %rs1
2297   ret i64 %sel
2300 define i64 @zero1_setne(i64 %a, i64 %b, i64 %rs1) {
2301 ; RV32I-LABEL: zero1_setne:
2302 ; RV32I:       # %bb.0:
2303 ; RV32I-NEXT:    xor a1, a1, a3
2304 ; RV32I-NEXT:    xor a0, a0, a2
2305 ; RV32I-NEXT:    or a0, a0, a1
2306 ; RV32I-NEXT:    seqz a0, a0
2307 ; RV32I-NEXT:    addi a1, a0, -1
2308 ; RV32I-NEXT:    and a0, a1, a4
2309 ; RV32I-NEXT:    and a1, a1, a5
2310 ; RV32I-NEXT:    ret
2312 ; RV64I-LABEL: zero1_setne:
2313 ; RV64I:       # %bb.0:
2314 ; RV64I-NEXT:    xor a0, a0, a1
2315 ; RV64I-NEXT:    seqz a0, a0
2316 ; RV64I-NEXT:    addi a0, a0, -1
2317 ; RV64I-NEXT:    and a0, a0, a2
2318 ; RV64I-NEXT:    ret
2320 ; RV64XVENTANACONDOPS-LABEL: zero1_setne:
2321 ; RV64XVENTANACONDOPS:       # %bb.0:
2322 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
2323 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
2324 ; RV64XVENTANACONDOPS-NEXT:    ret
2326 ; RV64XTHEADCONDMOV-LABEL: zero1_setne:
2327 ; RV64XTHEADCONDMOV:       # %bb.0:
2328 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
2329 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
2330 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
2331 ; RV64XTHEADCONDMOV-NEXT:    ret
2333 ; RV32ZICOND-LABEL: zero1_setne:
2334 ; RV32ZICOND:       # %bb.0:
2335 ; RV32ZICOND-NEXT:    xor a1, a1, a3
2336 ; RV32ZICOND-NEXT:    xor a0, a0, a2
2337 ; RV32ZICOND-NEXT:    or a1, a0, a1
2338 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
2339 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
2340 ; RV32ZICOND-NEXT:    ret
2342 ; RV64ZICOND-LABEL: zero1_setne:
2343 ; RV64ZICOND:       # %bb.0:
2344 ; RV64ZICOND-NEXT:    xor a0, a0, a1
2345 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
2346 ; RV64ZICOND-NEXT:    ret
2347   %rc = icmp ne i64 %a, %b
2348   %sel = select i1 %rc, i64 %rs1, i64 0
2349   ret i64 %sel
2352 define i64 @zero2_setne(i64 %a, i64 %b, i64 %rs1) {
2353 ; RV32I-LABEL: zero2_setne:
2354 ; RV32I:       # %bb.0:
2355 ; RV32I-NEXT:    xor a1, a1, a3
2356 ; RV32I-NEXT:    xor a0, a0, a2
2357 ; RV32I-NEXT:    or a0, a0, a1
2358 ; RV32I-NEXT:    snez a0, a0
2359 ; RV32I-NEXT:    addi a1, a0, -1
2360 ; RV32I-NEXT:    and a0, a1, a4
2361 ; RV32I-NEXT:    and a1, a1, a5
2362 ; RV32I-NEXT:    ret
2364 ; RV64I-LABEL: zero2_setne:
2365 ; RV64I:       # %bb.0:
2366 ; RV64I-NEXT:    xor a0, a0, a1
2367 ; RV64I-NEXT:    snez a0, a0
2368 ; RV64I-NEXT:    addi a0, a0, -1
2369 ; RV64I-NEXT:    and a0, a0, a2
2370 ; RV64I-NEXT:    ret
2372 ; RV64XVENTANACONDOPS-LABEL: zero2_setne:
2373 ; RV64XVENTANACONDOPS:       # %bb.0:
2374 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
2375 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
2376 ; RV64XVENTANACONDOPS-NEXT:    ret
2378 ; RV64XTHEADCONDMOV-LABEL: zero2_setne:
2379 ; RV64XTHEADCONDMOV:       # %bb.0:
2380 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
2381 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
2382 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
2383 ; RV64XTHEADCONDMOV-NEXT:    ret
2385 ; RV32ZICOND-LABEL: zero2_setne:
2386 ; RV32ZICOND:       # %bb.0:
2387 ; RV32ZICOND-NEXT:    xor a1, a1, a3
2388 ; RV32ZICOND-NEXT:    xor a0, a0, a2
2389 ; RV32ZICOND-NEXT:    or a1, a0, a1
2390 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a1
2391 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
2392 ; RV32ZICOND-NEXT:    ret
2394 ; RV64ZICOND-LABEL: zero2_setne:
2395 ; RV64ZICOND:       # %bb.0:
2396 ; RV64ZICOND-NEXT:    xor a0, a0, a1
2397 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
2398 ; RV64ZICOND-NEXT:    ret
2399   %rc = icmp ne i64 %a, %b
2400   %sel = select i1 %rc, i64 0, i64 %rs1
2401   ret i64 %sel
2404 define i64 @zero1_seteq_zero(i64 %a, i64 %rs1) {
2405 ; RV32I-LABEL: zero1_seteq_zero:
2406 ; RV32I:       # %bb.0:
2407 ; RV32I-NEXT:    or a0, a0, a1
2408 ; RV32I-NEXT:    snez a0, a0
2409 ; RV32I-NEXT:    addi a1, a0, -1
2410 ; RV32I-NEXT:    and a0, a1, a2
2411 ; RV32I-NEXT:    and a1, a1, a3
2412 ; RV32I-NEXT:    ret
2414 ; RV64I-LABEL: zero1_seteq_zero:
2415 ; RV64I:       # %bb.0:
2416 ; RV64I-NEXT:    snez a0, a0
2417 ; RV64I-NEXT:    addi a0, a0, -1
2418 ; RV64I-NEXT:    and a0, a0, a1
2419 ; RV64I-NEXT:    ret
2421 ; RV64XVENTANACONDOPS-LABEL: zero1_seteq_zero:
2422 ; RV64XVENTANACONDOPS:       # %bb.0:
2423 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2424 ; RV64XVENTANACONDOPS-NEXT:    ret
2426 ; RV64XTHEADCONDMOV-LABEL: zero1_seteq_zero:
2427 ; RV64XTHEADCONDMOV:       # %bb.0:
2428 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
2429 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2430 ; RV64XTHEADCONDMOV-NEXT:    ret
2432 ; RV32ZICOND-LABEL: zero1_seteq_zero:
2433 ; RV32ZICOND:       # %bb.0:
2434 ; RV32ZICOND-NEXT:    or a1, a0, a1
2435 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
2436 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2437 ; RV32ZICOND-NEXT:    ret
2439 ; RV64ZICOND-LABEL: zero1_seteq_zero:
2440 ; RV64ZICOND:       # %bb.0:
2441 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2442 ; RV64ZICOND-NEXT:    ret
2443   %rc = icmp eq i64 %a, 0
2444   %sel = select i1 %rc, i64 %rs1, i64 0
2445   ret i64 %sel
2448 define i64 @zero2_seteq_zero(i64 %a, i64 %rs1) {
2449 ; RV32I-LABEL: zero2_seteq_zero:
2450 ; RV32I:       # %bb.0:
2451 ; RV32I-NEXT:    or a0, a0, a1
2452 ; RV32I-NEXT:    seqz a0, a0
2453 ; RV32I-NEXT:    addi a1, a0, -1
2454 ; RV32I-NEXT:    and a0, a1, a2
2455 ; RV32I-NEXT:    and a1, a1, a3
2456 ; RV32I-NEXT:    ret
2458 ; RV64I-LABEL: zero2_seteq_zero:
2459 ; RV64I:       # %bb.0:
2460 ; RV64I-NEXT:    seqz a0, a0
2461 ; RV64I-NEXT:    addi a0, a0, -1
2462 ; RV64I-NEXT:    and a0, a0, a1
2463 ; RV64I-NEXT:    ret
2465 ; RV64XVENTANACONDOPS-LABEL: zero2_seteq_zero:
2466 ; RV64XVENTANACONDOPS:       # %bb.0:
2467 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2468 ; RV64XVENTANACONDOPS-NEXT:    ret
2470 ; RV64XTHEADCONDMOV-LABEL: zero2_seteq_zero:
2471 ; RV64XTHEADCONDMOV:       # %bb.0:
2472 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
2473 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2474 ; RV64XTHEADCONDMOV-NEXT:    ret
2476 ; RV32ZICOND-LABEL: zero2_seteq_zero:
2477 ; RV32ZICOND:       # %bb.0:
2478 ; RV32ZICOND-NEXT:    or a1, a0, a1
2479 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
2480 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2481 ; RV32ZICOND-NEXT:    ret
2483 ; RV64ZICOND-LABEL: zero2_seteq_zero:
2484 ; RV64ZICOND:       # %bb.0:
2485 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2486 ; RV64ZICOND-NEXT:    ret
2487   %rc = icmp eq i64 %a, 0
2488   %sel = select i1 %rc, i64 0, i64 %rs1
2489   ret i64 %sel
2492 define i64 @zero1_setne_zero(i64 %a, i64 %rs1) {
2493 ; RV32I-LABEL: zero1_setne_zero:
2494 ; RV32I:       # %bb.0:
2495 ; RV32I-NEXT:    or a0, a0, a1
2496 ; RV32I-NEXT:    seqz a0, a0
2497 ; RV32I-NEXT:    addi a1, a0, -1
2498 ; RV32I-NEXT:    and a0, a1, a2
2499 ; RV32I-NEXT:    and a1, a1, a3
2500 ; RV32I-NEXT:    ret
2502 ; RV64I-LABEL: zero1_setne_zero:
2503 ; RV64I:       # %bb.0:
2504 ; RV64I-NEXT:    seqz a0, a0
2505 ; RV64I-NEXT:    addi a0, a0, -1
2506 ; RV64I-NEXT:    and a0, a0, a1
2507 ; RV64I-NEXT:    ret
2509 ; RV64XVENTANACONDOPS-LABEL: zero1_setne_zero:
2510 ; RV64XVENTANACONDOPS:       # %bb.0:
2511 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2512 ; RV64XVENTANACONDOPS-NEXT:    ret
2514 ; RV64XTHEADCONDMOV-LABEL: zero1_setne_zero:
2515 ; RV64XTHEADCONDMOV:       # %bb.0:
2516 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
2517 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2518 ; RV64XTHEADCONDMOV-NEXT:    ret
2520 ; RV32ZICOND-LABEL: zero1_setne_zero:
2521 ; RV32ZICOND:       # %bb.0:
2522 ; RV32ZICOND-NEXT:    or a1, a0, a1
2523 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
2524 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2525 ; RV32ZICOND-NEXT:    ret
2527 ; RV64ZICOND-LABEL: zero1_setne_zero:
2528 ; RV64ZICOND:       # %bb.0:
2529 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2530 ; RV64ZICOND-NEXT:    ret
2531   %rc = icmp ne i64 %a, 0
2532   %sel = select i1 %rc, i64 %rs1, i64 0
2533   ret i64 %sel
2536 define i64 @zero2_setne_zero(i64 %a, i64 %rs1) {
2537 ; RV32I-LABEL: zero2_setne_zero:
2538 ; RV32I:       # %bb.0:
2539 ; RV32I-NEXT:    or a0, a0, a1
2540 ; RV32I-NEXT:    snez a0, a0
2541 ; RV32I-NEXT:    addi a1, a0, -1
2542 ; RV32I-NEXT:    and a0, a1, a2
2543 ; RV32I-NEXT:    and a1, a1, a3
2544 ; RV32I-NEXT:    ret
2546 ; RV64I-LABEL: zero2_setne_zero:
2547 ; RV64I:       # %bb.0:
2548 ; RV64I-NEXT:    snez a0, a0
2549 ; RV64I-NEXT:    addi a0, a0, -1
2550 ; RV64I-NEXT:    and a0, a0, a1
2551 ; RV64I-NEXT:    ret
2553 ; RV64XVENTANACONDOPS-LABEL: zero2_setne_zero:
2554 ; RV64XVENTANACONDOPS:       # %bb.0:
2555 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2556 ; RV64XVENTANACONDOPS-NEXT:    ret
2558 ; RV64XTHEADCONDMOV-LABEL: zero2_setne_zero:
2559 ; RV64XTHEADCONDMOV:       # %bb.0:
2560 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
2561 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2562 ; RV64XTHEADCONDMOV-NEXT:    ret
2564 ; RV32ZICOND-LABEL: zero2_setne_zero:
2565 ; RV32ZICOND:       # %bb.0:
2566 ; RV32ZICOND-NEXT:    or a1, a0, a1
2567 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
2568 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2569 ; RV32ZICOND-NEXT:    ret
2571 ; RV64ZICOND-LABEL: zero2_setne_zero:
2572 ; RV64ZICOND:       # %bb.0:
2573 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2574 ; RV64ZICOND-NEXT:    ret
2575   %rc = icmp ne i64 %a, 0
2576   %sel = select i1 %rc, i64 0, i64 %rs1
2577   ret i64 %sel
2580 define i64 @zero1_seteq_constant(i64 %a, i64 %rs1) {
2581 ; RV32I-LABEL: zero1_seteq_constant:
2582 ; RV32I:       # %bb.0:
2583 ; RV32I-NEXT:    not a1, a1
2584 ; RV32I-NEXT:    xori a0, a0, -231
2585 ; RV32I-NEXT:    or a0, a0, a1
2586 ; RV32I-NEXT:    snez a0, a0
2587 ; RV32I-NEXT:    addi a1, a0, -1
2588 ; RV32I-NEXT:    and a0, a1, a2
2589 ; RV32I-NEXT:    and a1, a1, a3
2590 ; RV32I-NEXT:    ret
2592 ; RV64I-LABEL: zero1_seteq_constant:
2593 ; RV64I:       # %bb.0:
2594 ; RV64I-NEXT:    addi a0, a0, 231
2595 ; RV64I-NEXT:    snez a0, a0
2596 ; RV64I-NEXT:    addi a0, a0, -1
2597 ; RV64I-NEXT:    and a0, a0, a1
2598 ; RV64I-NEXT:    ret
2600 ; RV64XVENTANACONDOPS-LABEL: zero1_seteq_constant:
2601 ; RV64XVENTANACONDOPS:       # %bb.0:
2602 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, 231
2603 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2604 ; RV64XVENTANACONDOPS-NEXT:    ret
2606 ; RV64XTHEADCONDMOV-LABEL: zero1_seteq_constant:
2607 ; RV64XTHEADCONDMOV:       # %bb.0:
2608 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, 231
2609 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
2610 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2611 ; RV64XTHEADCONDMOV-NEXT:    ret
2613 ; RV32ZICOND-LABEL: zero1_seteq_constant:
2614 ; RV32ZICOND:       # %bb.0:
2615 ; RV32ZICOND-NEXT:    not a1, a1
2616 ; RV32ZICOND-NEXT:    xori a0, a0, -231
2617 ; RV32ZICOND-NEXT:    or a1, a0, a1
2618 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
2619 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2620 ; RV32ZICOND-NEXT:    ret
2622 ; RV64ZICOND-LABEL: zero1_seteq_constant:
2623 ; RV64ZICOND:       # %bb.0:
2624 ; RV64ZICOND-NEXT:    addi a0, a0, 231
2625 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2626 ; RV64ZICOND-NEXT:    ret
2627   %rc = icmp eq i64 %a, -231
2628   %sel = select i1 %rc, i64 %rs1, i64 0
2629   ret i64 %sel
2632 define i64 @zero2_seteq_constant(i64 %a, i64 %rs1) {
2633 ; RV32I-LABEL: zero2_seteq_constant:
2634 ; RV32I:       # %bb.0:
2635 ; RV32I-NEXT:    xori a0, a0, 546
2636 ; RV32I-NEXT:    or a0, a0, a1
2637 ; RV32I-NEXT:    seqz a0, a0
2638 ; RV32I-NEXT:    addi a1, a0, -1
2639 ; RV32I-NEXT:    and a0, a1, a2
2640 ; RV32I-NEXT:    and a1, a1, a3
2641 ; RV32I-NEXT:    ret
2643 ; RV64I-LABEL: zero2_seteq_constant:
2644 ; RV64I:       # %bb.0:
2645 ; RV64I-NEXT:    addi a0, a0, -546
2646 ; RV64I-NEXT:    seqz a0, a0
2647 ; RV64I-NEXT:    addi a0, a0, -1
2648 ; RV64I-NEXT:    and a0, a0, a1
2649 ; RV64I-NEXT:    ret
2651 ; RV64XVENTANACONDOPS-LABEL: zero2_seteq_constant:
2652 ; RV64XVENTANACONDOPS:       # %bb.0:
2653 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -546
2654 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2655 ; RV64XVENTANACONDOPS-NEXT:    ret
2657 ; RV64XTHEADCONDMOV-LABEL: zero2_seteq_constant:
2658 ; RV64XTHEADCONDMOV:       # %bb.0:
2659 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, -546
2660 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
2661 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2662 ; RV64XTHEADCONDMOV-NEXT:    ret
2664 ; RV32ZICOND-LABEL: zero2_seteq_constant:
2665 ; RV32ZICOND:       # %bb.0:
2666 ; RV32ZICOND-NEXT:    xori a0, a0, 546
2667 ; RV32ZICOND-NEXT:    or a1, a0, a1
2668 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
2669 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2670 ; RV32ZICOND-NEXT:    ret
2672 ; RV64ZICOND-LABEL: zero2_seteq_constant:
2673 ; RV64ZICOND:       # %bb.0:
2674 ; RV64ZICOND-NEXT:    addi a0, a0, -546
2675 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2676 ; RV64ZICOND-NEXT:    ret
2677   %rc = icmp eq i64 %a, 546
2678   %sel = select i1 %rc, i64 0, i64 %rs1
2679   ret i64 %sel
2682 define i64 @zero1_setne_constant(i64 %a, i64 %rs1) {
2683 ; RV32I-LABEL: zero1_setne_constant:
2684 ; RV32I:       # %bb.0:
2685 ; RV32I-NEXT:    xori a0, a0, 321
2686 ; RV32I-NEXT:    or a0, a0, a1
2687 ; RV32I-NEXT:    seqz a0, a0
2688 ; RV32I-NEXT:    addi a1, a0, -1
2689 ; RV32I-NEXT:    and a0, a1, a2
2690 ; RV32I-NEXT:    and a1, a1, a3
2691 ; RV32I-NEXT:    ret
2693 ; RV64I-LABEL: zero1_setne_constant:
2694 ; RV64I:       # %bb.0:
2695 ; RV64I-NEXT:    addi a0, a0, -321
2696 ; RV64I-NEXT:    seqz a0, a0
2697 ; RV64I-NEXT:    addi a0, a0, -1
2698 ; RV64I-NEXT:    and a0, a0, a1
2699 ; RV64I-NEXT:    ret
2701 ; RV64XVENTANACONDOPS-LABEL: zero1_setne_constant:
2702 ; RV64XVENTANACONDOPS:       # %bb.0:
2703 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -321
2704 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2705 ; RV64XVENTANACONDOPS-NEXT:    ret
2707 ; RV64XTHEADCONDMOV-LABEL: zero1_setne_constant:
2708 ; RV64XTHEADCONDMOV:       # %bb.0:
2709 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, -321
2710 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
2711 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2712 ; RV64XTHEADCONDMOV-NEXT:    ret
2714 ; RV32ZICOND-LABEL: zero1_setne_constant:
2715 ; RV32ZICOND:       # %bb.0:
2716 ; RV32ZICOND-NEXT:    xori a0, a0, 321
2717 ; RV32ZICOND-NEXT:    or a1, a0, a1
2718 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
2719 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2720 ; RV32ZICOND-NEXT:    ret
2722 ; RV64ZICOND-LABEL: zero1_setne_constant:
2723 ; RV64ZICOND:       # %bb.0:
2724 ; RV64ZICOND-NEXT:    addi a0, a0, -321
2725 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2726 ; RV64ZICOND-NEXT:    ret
2727   %rc = icmp ne i64 %a, 321
2728   %sel = select i1 %rc, i64 %rs1, i64 0
2729   ret i64 %sel
2732 define i64 @zero2_setne_constant(i64 %a, i64 %rs1) {
2733 ; RV32I-LABEL: zero2_setne_constant:
2734 ; RV32I:       # %bb.0:
2735 ; RV32I-NEXT:    not a1, a1
2736 ; RV32I-NEXT:    xori a0, a0, -654
2737 ; RV32I-NEXT:    or a0, a0, a1
2738 ; RV32I-NEXT:    snez a0, a0
2739 ; RV32I-NEXT:    addi a1, a0, -1
2740 ; RV32I-NEXT:    and a0, a1, a2
2741 ; RV32I-NEXT:    and a1, a1, a3
2742 ; RV32I-NEXT:    ret
2744 ; RV64I-LABEL: zero2_setne_constant:
2745 ; RV64I:       # %bb.0:
2746 ; RV64I-NEXT:    addi a0, a0, 654
2747 ; RV64I-NEXT:    snez a0, a0
2748 ; RV64I-NEXT:    addi a0, a0, -1
2749 ; RV64I-NEXT:    and a0, a0, a1
2750 ; RV64I-NEXT:    ret
2752 ; RV64XVENTANACONDOPS-LABEL: zero2_setne_constant:
2753 ; RV64XVENTANACONDOPS:       # %bb.0:
2754 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, 654
2755 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2756 ; RV64XVENTANACONDOPS-NEXT:    ret
2758 ; RV64XTHEADCONDMOV-LABEL: zero2_setne_constant:
2759 ; RV64XTHEADCONDMOV:       # %bb.0:
2760 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, 654
2761 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
2762 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2763 ; RV64XTHEADCONDMOV-NEXT:    ret
2765 ; RV32ZICOND-LABEL: zero2_setne_constant:
2766 ; RV32ZICOND:       # %bb.0:
2767 ; RV32ZICOND-NEXT:    not a1, a1
2768 ; RV32ZICOND-NEXT:    xori a0, a0, -654
2769 ; RV32ZICOND-NEXT:    or a1, a0, a1
2770 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
2771 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2772 ; RV32ZICOND-NEXT:    ret
2774 ; RV64ZICOND-LABEL: zero2_setne_constant:
2775 ; RV64ZICOND:       # %bb.0:
2776 ; RV64ZICOND-NEXT:    addi a0, a0, 654
2777 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2778 ; RV64ZICOND-NEXT:    ret
2779   %rc = icmp ne i64 %a, -654
2780   %sel = select i1 %rc, i64 0, i64 %rs1
2781   ret i64 %sel
2784 define i64 @zero1_seteq_neg2048(i64 %a, i64 %rs1) {
2785 ; RV32I-LABEL: zero1_seteq_neg2048:
2786 ; RV32I:       # %bb.0:
2787 ; RV32I-NEXT:    not a1, a1
2788 ; RV32I-NEXT:    xori a0, a0, -2048
2789 ; RV32I-NEXT:    or a0, a0, a1
2790 ; RV32I-NEXT:    snez a0, a0
2791 ; RV32I-NEXT:    addi a1, a0, -1
2792 ; RV32I-NEXT:    and a0, a1, a2
2793 ; RV32I-NEXT:    and a1, a1, a3
2794 ; RV32I-NEXT:    ret
2796 ; RV64I-LABEL: zero1_seteq_neg2048:
2797 ; RV64I:       # %bb.0:
2798 ; RV64I-NEXT:    xori a0, a0, -2048
2799 ; RV64I-NEXT:    snez a0, a0
2800 ; RV64I-NEXT:    addi a0, a0, -1
2801 ; RV64I-NEXT:    and a0, a0, a1
2802 ; RV64I-NEXT:    ret
2804 ; RV64XVENTANACONDOPS-LABEL: zero1_seteq_neg2048:
2805 ; RV64XVENTANACONDOPS:       # %bb.0:
2806 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
2807 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2808 ; RV64XVENTANACONDOPS-NEXT:    ret
2810 ; RV64XTHEADCONDMOV-LABEL: zero1_seteq_neg2048:
2811 ; RV64XTHEADCONDMOV:       # %bb.0:
2812 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
2813 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
2814 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2815 ; RV64XTHEADCONDMOV-NEXT:    ret
2817 ; RV32ZICOND-LABEL: zero1_seteq_neg2048:
2818 ; RV32ZICOND:       # %bb.0:
2819 ; RV32ZICOND-NEXT:    not a1, a1
2820 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
2821 ; RV32ZICOND-NEXT:    or a1, a0, a1
2822 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
2823 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2824 ; RV32ZICOND-NEXT:    ret
2826 ; RV64ZICOND-LABEL: zero1_seteq_neg2048:
2827 ; RV64ZICOND:       # %bb.0:
2828 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
2829 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2830 ; RV64ZICOND-NEXT:    ret
2831   %rc = icmp eq i64 %a, -2048
2832   %sel = select i1 %rc, i64 %rs1, i64 0
2833   ret i64 %sel
2836 define i64 @zero2_seteq_neg2048(i64 %a, i64 %rs1) {
2837 ; RV32I-LABEL: zero2_seteq_neg2048:
2838 ; RV32I:       # %bb.0:
2839 ; RV32I-NEXT:    not a1, a1
2840 ; RV32I-NEXT:    xori a0, a0, -2048
2841 ; RV32I-NEXT:    or a0, a0, a1
2842 ; RV32I-NEXT:    seqz a0, a0
2843 ; RV32I-NEXT:    addi a1, a0, -1
2844 ; RV32I-NEXT:    and a0, a1, a2
2845 ; RV32I-NEXT:    and a1, a1, a3
2846 ; RV32I-NEXT:    ret
2848 ; RV64I-LABEL: zero2_seteq_neg2048:
2849 ; RV64I:       # %bb.0:
2850 ; RV64I-NEXT:    xori a0, a0, -2048
2851 ; RV64I-NEXT:    seqz a0, a0
2852 ; RV64I-NEXT:    addi a0, a0, -1
2853 ; RV64I-NEXT:    and a0, a0, a1
2854 ; RV64I-NEXT:    ret
2856 ; RV64XVENTANACONDOPS-LABEL: zero2_seteq_neg2048:
2857 ; RV64XVENTANACONDOPS:       # %bb.0:
2858 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
2859 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2860 ; RV64XVENTANACONDOPS-NEXT:    ret
2862 ; RV64XTHEADCONDMOV-LABEL: zero2_seteq_neg2048:
2863 ; RV64XTHEADCONDMOV:       # %bb.0:
2864 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
2865 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
2866 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2867 ; RV64XTHEADCONDMOV-NEXT:    ret
2869 ; RV32ZICOND-LABEL: zero2_seteq_neg2048:
2870 ; RV32ZICOND:       # %bb.0:
2871 ; RV32ZICOND-NEXT:    not a1, a1
2872 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
2873 ; RV32ZICOND-NEXT:    or a1, a0, a1
2874 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
2875 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2876 ; RV32ZICOND-NEXT:    ret
2878 ; RV64ZICOND-LABEL: zero2_seteq_neg2048:
2879 ; RV64ZICOND:       # %bb.0:
2880 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
2881 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2882 ; RV64ZICOND-NEXT:    ret
2883   %rc = icmp eq i64 %a, -2048
2884   %sel = select i1 %rc, i64 0, i64 %rs1
2885   ret i64 %sel
2888 define i64 @zero1_setne_neg2048(i64 %a, i64 %rs1) {
2889 ; RV32I-LABEL: zero1_setne_neg2048:
2890 ; RV32I:       # %bb.0:
2891 ; RV32I-NEXT:    not a1, a1
2892 ; RV32I-NEXT:    xori a0, a0, -2048
2893 ; RV32I-NEXT:    or a0, a0, a1
2894 ; RV32I-NEXT:    seqz a0, a0
2895 ; RV32I-NEXT:    addi a1, a0, -1
2896 ; RV32I-NEXT:    and a0, a1, a2
2897 ; RV32I-NEXT:    and a1, a1, a3
2898 ; RV32I-NEXT:    ret
2900 ; RV64I-LABEL: zero1_setne_neg2048:
2901 ; RV64I:       # %bb.0:
2902 ; RV64I-NEXT:    xori a0, a0, -2048
2903 ; RV64I-NEXT:    seqz a0, a0
2904 ; RV64I-NEXT:    addi a0, a0, -1
2905 ; RV64I-NEXT:    and a0, a0, a1
2906 ; RV64I-NEXT:    ret
2908 ; RV64XVENTANACONDOPS-LABEL: zero1_setne_neg2048:
2909 ; RV64XVENTANACONDOPS:       # %bb.0:
2910 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
2911 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2912 ; RV64XVENTANACONDOPS-NEXT:    ret
2914 ; RV64XTHEADCONDMOV-LABEL: zero1_setne_neg2048:
2915 ; RV64XTHEADCONDMOV:       # %bb.0:
2916 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
2917 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
2918 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2919 ; RV64XTHEADCONDMOV-NEXT:    ret
2921 ; RV32ZICOND-LABEL: zero1_setne_neg2048:
2922 ; RV32ZICOND:       # %bb.0:
2923 ; RV32ZICOND-NEXT:    not a1, a1
2924 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
2925 ; RV32ZICOND-NEXT:    or a1, a0, a1
2926 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
2927 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2928 ; RV32ZICOND-NEXT:    ret
2930 ; RV64ZICOND-LABEL: zero1_setne_neg2048:
2931 ; RV64ZICOND:       # %bb.0:
2932 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
2933 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2934 ; RV64ZICOND-NEXT:    ret
2935   %rc = icmp ne i64 %a, -2048
2936   %sel = select i1 %rc, i64 %rs1, i64 0
2937   ret i64 %sel
2940 define i64 @zero2_setne_neg2048(i64 %a, i64 %rs1) {
2941 ; RV32I-LABEL: zero2_setne_neg2048:
2942 ; RV32I:       # %bb.0:
2943 ; RV32I-NEXT:    not a1, a1
2944 ; RV32I-NEXT:    xori a0, a0, -2048
2945 ; RV32I-NEXT:    or a0, a0, a1
2946 ; RV32I-NEXT:    snez a0, a0
2947 ; RV32I-NEXT:    addi a1, a0, -1
2948 ; RV32I-NEXT:    and a0, a1, a2
2949 ; RV32I-NEXT:    and a1, a1, a3
2950 ; RV32I-NEXT:    ret
2952 ; RV64I-LABEL: zero2_setne_neg2048:
2953 ; RV64I:       # %bb.0:
2954 ; RV64I-NEXT:    xori a0, a0, -2048
2955 ; RV64I-NEXT:    snez a0, a0
2956 ; RV64I-NEXT:    addi a0, a0, -1
2957 ; RV64I-NEXT:    and a0, a0, a1
2958 ; RV64I-NEXT:    ret
2960 ; RV64XVENTANACONDOPS-LABEL: zero2_setne_neg2048:
2961 ; RV64XVENTANACONDOPS:       # %bb.0:
2962 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
2963 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2964 ; RV64XVENTANACONDOPS-NEXT:    ret
2966 ; RV64XTHEADCONDMOV-LABEL: zero2_setne_neg2048:
2967 ; RV64XTHEADCONDMOV:       # %bb.0:
2968 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
2969 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
2970 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2971 ; RV64XTHEADCONDMOV-NEXT:    ret
2973 ; RV32ZICOND-LABEL: zero2_setne_neg2048:
2974 ; RV32ZICOND:       # %bb.0:
2975 ; RV32ZICOND-NEXT:    not a1, a1
2976 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
2977 ; RV32ZICOND-NEXT:    or a1, a0, a1
2978 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
2979 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2980 ; RV32ZICOND-NEXT:    ret
2982 ; RV64ZICOND-LABEL: zero2_setne_neg2048:
2983 ; RV64ZICOND:       # %bb.0:
2984 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
2985 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2986 ; RV64ZICOND-NEXT:    ret
2987   %rc = icmp ne i64 %a, -2048
2988   %sel = select i1 %rc, i64 0, i64 %rs1
2989   ret i64 %sel
2992 define void @sextw_removal_maskc(i1 %c, i32 signext %arg, i32 signext %arg1) nounwind {
2993 ; RV32I-LABEL: sextw_removal_maskc:
2994 ; RV32I:       # %bb.0: # %bb
2995 ; RV32I-NEXT:    addi sp, sp, -16
2996 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2997 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2998 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
2999 ; RV32I-NEXT:    mv s0, a2
3000 ; RV32I-NEXT:    slli a0, a0, 31
3001 ; RV32I-NEXT:    srai a0, a0, 31
3002 ; RV32I-NEXT:    and s1, a0, a1
3003 ; RV32I-NEXT:  .LBB54_1: # %bb2
3004 ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3005 ; RV32I-NEXT:    mv a0, s1
3006 ; RV32I-NEXT:    call bar@plt
3007 ; RV32I-NEXT:    sll s1, s1, s0
3008 ; RV32I-NEXT:    bnez a0, .LBB54_1
3009 ; RV32I-NEXT:  # %bb.2: # %bb7
3010 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3011 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3012 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3013 ; RV32I-NEXT:    addi sp, sp, 16
3014 ; RV32I-NEXT:    ret
3016 ; RV64I-LABEL: sextw_removal_maskc:
3017 ; RV64I:       # %bb.0: # %bb
3018 ; RV64I-NEXT:    addi sp, sp, -32
3019 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3020 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3021 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3022 ; RV64I-NEXT:    mv s0, a2
3023 ; RV64I-NEXT:    slli a0, a0, 63
3024 ; RV64I-NEXT:    srai a0, a0, 63
3025 ; RV64I-NEXT:    and s1, a0, a1
3026 ; RV64I-NEXT:  .LBB54_1: # %bb2
3027 ; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3028 ; RV64I-NEXT:    mv a0, s1
3029 ; RV64I-NEXT:    call bar@plt
3030 ; RV64I-NEXT:    sllw s1, s1, s0
3031 ; RV64I-NEXT:    bnez a0, .LBB54_1
3032 ; RV64I-NEXT:  # %bb.2: # %bb7
3033 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3034 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3035 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3036 ; RV64I-NEXT:    addi sp, sp, 32
3037 ; RV64I-NEXT:    ret
3039 ; RV64XVENTANACONDOPS-LABEL: sextw_removal_maskc:
3040 ; RV64XVENTANACONDOPS:       # %bb.0: # %bb
3041 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, -32
3042 ; RV64XVENTANACONDOPS-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3043 ; RV64XVENTANACONDOPS-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3044 ; RV64XVENTANACONDOPS-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3045 ; RV64XVENTANACONDOPS-NEXT:    mv s0, a2
3046 ; RV64XVENTANACONDOPS-NEXT:    andi a0, a0, 1
3047 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc s1, a1, a0
3048 ; RV64XVENTANACONDOPS-NEXT:  .LBB54_1: # %bb2
3049 ; RV64XVENTANACONDOPS-NEXT:    # =>This Inner Loop Header: Depth=1
3050 ; RV64XVENTANACONDOPS-NEXT:    mv a0, s1
3051 ; RV64XVENTANACONDOPS-NEXT:    call bar@plt
3052 ; RV64XVENTANACONDOPS-NEXT:    sllw s1, s1, s0
3053 ; RV64XVENTANACONDOPS-NEXT:    bnez a0, .LBB54_1
3054 ; RV64XVENTANACONDOPS-NEXT:  # %bb.2: # %bb7
3055 ; RV64XVENTANACONDOPS-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3056 ; RV64XVENTANACONDOPS-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3057 ; RV64XVENTANACONDOPS-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3058 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, 32
3059 ; RV64XVENTANACONDOPS-NEXT:    ret
3061 ; RV64XTHEADCONDMOV-LABEL: sextw_removal_maskc:
3062 ; RV64XTHEADCONDMOV:       # %bb.0: # %bb
3063 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, -32
3064 ; RV64XTHEADCONDMOV-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3065 ; RV64XTHEADCONDMOV-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3066 ; RV64XTHEADCONDMOV-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3067 ; RV64XTHEADCONDMOV-NEXT:    mv s0, a2
3068 ; RV64XTHEADCONDMOV-NEXT:    mv s1, a1
3069 ; RV64XTHEADCONDMOV-NEXT:    andi a0, a0, 1
3070 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz s1, zero, a0
3071 ; RV64XTHEADCONDMOV-NEXT:  .LBB54_1: # %bb2
3072 ; RV64XTHEADCONDMOV-NEXT:    # =>This Inner Loop Header: Depth=1
3073 ; RV64XTHEADCONDMOV-NEXT:    sext.w a0, s1
3074 ; RV64XTHEADCONDMOV-NEXT:    call bar@plt
3075 ; RV64XTHEADCONDMOV-NEXT:    sllw s1, s1, s0
3076 ; RV64XTHEADCONDMOV-NEXT:    bnez a0, .LBB54_1
3077 ; RV64XTHEADCONDMOV-NEXT:  # %bb.2: # %bb7
3078 ; RV64XTHEADCONDMOV-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3079 ; RV64XTHEADCONDMOV-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3080 ; RV64XTHEADCONDMOV-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3081 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, 32
3082 ; RV64XTHEADCONDMOV-NEXT:    ret
3084 ; RV32ZICOND-LABEL: sextw_removal_maskc:
3085 ; RV32ZICOND:       # %bb.0: # %bb
3086 ; RV32ZICOND-NEXT:    addi sp, sp, -16
3087 ; RV32ZICOND-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3088 ; RV32ZICOND-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3089 ; RV32ZICOND-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3090 ; RV32ZICOND-NEXT:    mv s0, a2
3091 ; RV32ZICOND-NEXT:    andi a0, a0, 1
3092 ; RV32ZICOND-NEXT:    czero.eqz s1, a1, a0
3093 ; RV32ZICOND-NEXT:  .LBB54_1: # %bb2
3094 ; RV32ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
3095 ; RV32ZICOND-NEXT:    mv a0, s1
3096 ; RV32ZICOND-NEXT:    call bar@plt
3097 ; RV32ZICOND-NEXT:    sll s1, s1, s0
3098 ; RV32ZICOND-NEXT:    bnez a0, .LBB54_1
3099 ; RV32ZICOND-NEXT:  # %bb.2: # %bb7
3100 ; RV32ZICOND-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3101 ; RV32ZICOND-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3102 ; RV32ZICOND-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3103 ; RV32ZICOND-NEXT:    addi sp, sp, 16
3104 ; RV32ZICOND-NEXT:    ret
3106 ; RV64ZICOND-LABEL: sextw_removal_maskc:
3107 ; RV64ZICOND:       # %bb.0: # %bb
3108 ; RV64ZICOND-NEXT:    addi sp, sp, -32
3109 ; RV64ZICOND-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3110 ; RV64ZICOND-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3111 ; RV64ZICOND-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3112 ; RV64ZICOND-NEXT:    mv s0, a2
3113 ; RV64ZICOND-NEXT:    andi a0, a0, 1
3114 ; RV64ZICOND-NEXT:    czero.eqz s1, a1, a0
3115 ; RV64ZICOND-NEXT:  .LBB54_1: # %bb2
3116 ; RV64ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
3117 ; RV64ZICOND-NEXT:    mv a0, s1
3118 ; RV64ZICOND-NEXT:    call bar@plt
3119 ; RV64ZICOND-NEXT:    sllw s1, s1, s0
3120 ; RV64ZICOND-NEXT:    bnez a0, .LBB54_1
3121 ; RV64ZICOND-NEXT:  # %bb.2: # %bb7
3122 ; RV64ZICOND-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3123 ; RV64ZICOND-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3124 ; RV64ZICOND-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3125 ; RV64ZICOND-NEXT:    addi sp, sp, 32
3126 ; RV64ZICOND-NEXT:    ret
3128   %i = select i1 %c, i32 %arg, i32 0
3129   br label %bb2
3131 bb2:                                              ; preds = %bb2, %bb
3132   %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]
3133   %i4 = tail call signext i32 @bar(i32 signext %i3)
3134   %i5 = shl i32 %i3, %arg1
3135   %i6 = icmp eq i32 %i4, 0
3136   br i1 %i6, label %bb7, label %bb2
3138 bb7:                                              ; preds = %bb2
3139   ret void
3141 declare signext i32 @bar(i32 signext)
3143 define void @sextw_removal_maskcn(i1 %c, i32 signext %arg, i32 signext %arg1) nounwind {
3144 ; RV32I-LABEL: sextw_removal_maskcn:
3145 ; RV32I:       # %bb.0: # %bb
3146 ; RV32I-NEXT:    addi sp, sp, -16
3147 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3148 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3149 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3150 ; RV32I-NEXT:    mv s0, a2
3151 ; RV32I-NEXT:    andi a0, a0, 1
3152 ; RV32I-NEXT:    addi a0, a0, -1
3153 ; RV32I-NEXT:    and s1, a0, a1
3154 ; RV32I-NEXT:  .LBB55_1: # %bb2
3155 ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3156 ; RV32I-NEXT:    mv a0, s1
3157 ; RV32I-NEXT:    call bar@plt
3158 ; RV32I-NEXT:    sll s1, s1, s0
3159 ; RV32I-NEXT:    bnez a0, .LBB55_1
3160 ; RV32I-NEXT:  # %bb.2: # %bb7
3161 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3162 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3163 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3164 ; RV32I-NEXT:    addi sp, sp, 16
3165 ; RV32I-NEXT:    ret
3167 ; RV64I-LABEL: sextw_removal_maskcn:
3168 ; RV64I:       # %bb.0: # %bb
3169 ; RV64I-NEXT:    addi sp, sp, -32
3170 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3171 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3172 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3173 ; RV64I-NEXT:    mv s0, a2
3174 ; RV64I-NEXT:    andi a0, a0, 1
3175 ; RV64I-NEXT:    addiw a0, a0, -1
3176 ; RV64I-NEXT:    and s1, a0, a1
3177 ; RV64I-NEXT:  .LBB55_1: # %bb2
3178 ; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3179 ; RV64I-NEXT:    mv a0, s1
3180 ; RV64I-NEXT:    call bar@plt
3181 ; RV64I-NEXT:    sllw s1, s1, s0
3182 ; RV64I-NEXT:    bnez a0, .LBB55_1
3183 ; RV64I-NEXT:  # %bb.2: # %bb7
3184 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3185 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3186 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3187 ; RV64I-NEXT:    addi sp, sp, 32
3188 ; RV64I-NEXT:    ret
3190 ; RV64XVENTANACONDOPS-LABEL: sextw_removal_maskcn:
3191 ; RV64XVENTANACONDOPS:       # %bb.0: # %bb
3192 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, -32
3193 ; RV64XVENTANACONDOPS-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3194 ; RV64XVENTANACONDOPS-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3195 ; RV64XVENTANACONDOPS-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3196 ; RV64XVENTANACONDOPS-NEXT:    mv s0, a2
3197 ; RV64XVENTANACONDOPS-NEXT:    andi a0, a0, 1
3198 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn s1, a1, a0
3199 ; RV64XVENTANACONDOPS-NEXT:  .LBB55_1: # %bb2
3200 ; RV64XVENTANACONDOPS-NEXT:    # =>This Inner Loop Header: Depth=1
3201 ; RV64XVENTANACONDOPS-NEXT:    mv a0, s1
3202 ; RV64XVENTANACONDOPS-NEXT:    call bar@plt
3203 ; RV64XVENTANACONDOPS-NEXT:    sllw s1, s1, s0
3204 ; RV64XVENTANACONDOPS-NEXT:    bnez a0, .LBB55_1
3205 ; RV64XVENTANACONDOPS-NEXT:  # %bb.2: # %bb7
3206 ; RV64XVENTANACONDOPS-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3207 ; RV64XVENTANACONDOPS-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3208 ; RV64XVENTANACONDOPS-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3209 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, 32
3210 ; RV64XVENTANACONDOPS-NEXT:    ret
3212 ; RV64XTHEADCONDMOV-LABEL: sextw_removal_maskcn:
3213 ; RV64XTHEADCONDMOV:       # %bb.0: # %bb
3214 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, -32
3215 ; RV64XTHEADCONDMOV-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3216 ; RV64XTHEADCONDMOV-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3217 ; RV64XTHEADCONDMOV-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3218 ; RV64XTHEADCONDMOV-NEXT:    mv s0, a2
3219 ; RV64XTHEADCONDMOV-NEXT:    mv s1, a1
3220 ; RV64XTHEADCONDMOV-NEXT:    andi a0, a0, 1
3221 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez s1, zero, a0
3222 ; RV64XTHEADCONDMOV-NEXT:  .LBB55_1: # %bb2
3223 ; RV64XTHEADCONDMOV-NEXT:    # =>This Inner Loop Header: Depth=1
3224 ; RV64XTHEADCONDMOV-NEXT:    sext.w a0, s1
3225 ; RV64XTHEADCONDMOV-NEXT:    call bar@plt
3226 ; RV64XTHEADCONDMOV-NEXT:    sllw s1, s1, s0
3227 ; RV64XTHEADCONDMOV-NEXT:    bnez a0, .LBB55_1
3228 ; RV64XTHEADCONDMOV-NEXT:  # %bb.2: # %bb7
3229 ; RV64XTHEADCONDMOV-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3230 ; RV64XTHEADCONDMOV-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3231 ; RV64XTHEADCONDMOV-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3232 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, 32
3233 ; RV64XTHEADCONDMOV-NEXT:    ret
3235 ; RV32ZICOND-LABEL: sextw_removal_maskcn:
3236 ; RV32ZICOND:       # %bb.0: # %bb
3237 ; RV32ZICOND-NEXT:    addi sp, sp, -16
3238 ; RV32ZICOND-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3239 ; RV32ZICOND-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3240 ; RV32ZICOND-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3241 ; RV32ZICOND-NEXT:    mv s0, a2
3242 ; RV32ZICOND-NEXT:    andi a0, a0, 1
3243 ; RV32ZICOND-NEXT:    czero.nez s1, a1, a0
3244 ; RV32ZICOND-NEXT:  .LBB55_1: # %bb2
3245 ; RV32ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
3246 ; RV32ZICOND-NEXT:    mv a0, s1
3247 ; RV32ZICOND-NEXT:    call bar@plt
3248 ; RV32ZICOND-NEXT:    sll s1, s1, s0
3249 ; RV32ZICOND-NEXT:    bnez a0, .LBB55_1
3250 ; RV32ZICOND-NEXT:  # %bb.2: # %bb7
3251 ; RV32ZICOND-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3252 ; RV32ZICOND-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3253 ; RV32ZICOND-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3254 ; RV32ZICOND-NEXT:    addi sp, sp, 16
3255 ; RV32ZICOND-NEXT:    ret
3257 ; RV64ZICOND-LABEL: sextw_removal_maskcn:
3258 ; RV64ZICOND:       # %bb.0: # %bb
3259 ; RV64ZICOND-NEXT:    addi sp, sp, -32
3260 ; RV64ZICOND-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3261 ; RV64ZICOND-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3262 ; RV64ZICOND-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3263 ; RV64ZICOND-NEXT:    mv s0, a2
3264 ; RV64ZICOND-NEXT:    andi a0, a0, 1
3265 ; RV64ZICOND-NEXT:    czero.nez s1, a1, a0
3266 ; RV64ZICOND-NEXT:  .LBB55_1: # %bb2
3267 ; RV64ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
3268 ; RV64ZICOND-NEXT:    mv a0, s1
3269 ; RV64ZICOND-NEXT:    call bar@plt
3270 ; RV64ZICOND-NEXT:    sllw s1, s1, s0
3271 ; RV64ZICOND-NEXT:    bnez a0, .LBB55_1
3272 ; RV64ZICOND-NEXT:  # %bb.2: # %bb7
3273 ; RV64ZICOND-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3274 ; RV64ZICOND-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3275 ; RV64ZICOND-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3276 ; RV64ZICOND-NEXT:    addi sp, sp, 32
3277 ; RV64ZICOND-NEXT:    ret
3279   %i = select i1 %c, i32 0, i32 %arg
3280   br label %bb2
3282 bb2:                                              ; preds = %bb2, %bb
3283   %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]
3284   %i4 = tail call signext i32 @bar(i32 signext %i3)
3285   %i5 = shl i32 %i3, %arg1
3286   %i6 = icmp eq i32 %i4, 0
3287   br i1 %i6, label %bb7, label %bb2
3289 bb7:                                              ; preds = %bb2
3290   ret void
3293 define i32 @setune_32(float %a, float %b, i32 %rs1, i32 %rs2) {
3294 ; RV32I-LABEL: setune_32:
3295 ; RV32I:       # %bb.0:
3296 ; RV32I-NEXT:    feq.s a2, fa0, fa1
3297 ; RV32I-NEXT:    beqz a2, .LBB56_2
3298 ; RV32I-NEXT:  # %bb.1:
3299 ; RV32I-NEXT:    mv a0, a1
3300 ; RV32I-NEXT:  .LBB56_2:
3301 ; RV32I-NEXT:    ret
3303 ; RV64I-LABEL: setune_32:
3304 ; RV64I:       # %bb.0:
3305 ; RV64I-NEXT:    feq.s a2, fa0, fa1
3306 ; RV64I-NEXT:    beqz a2, .LBB56_2
3307 ; RV64I-NEXT:  # %bb.1:
3308 ; RV64I-NEXT:    mv a0, a1
3309 ; RV64I-NEXT:  .LBB56_2:
3310 ; RV64I-NEXT:    ret
3312 ; RV64XVENTANACONDOPS-LABEL: setune_32:
3313 ; RV64XVENTANACONDOPS:       # %bb.0:
3314 ; RV64XVENTANACONDOPS-NEXT:    feq.s a2, fa0, fa1
3315 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
3316 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a0, a2
3317 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
3318 ; RV64XVENTANACONDOPS-NEXT:    ret
3320 ; RV64XTHEADCONDMOV-LABEL: setune_32:
3321 ; RV64XTHEADCONDMOV:       # %bb.0:
3322 ; RV64XTHEADCONDMOV-NEXT:    feq.s a2, fa0, fa1
3323 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a0, a1, a2
3324 ; RV64XTHEADCONDMOV-NEXT:    ret
3326 ; RV32ZICOND-LABEL: setune_32:
3327 ; RV32ZICOND:       # %bb.0:
3328 ; RV32ZICOND-NEXT:    feq.s a2, fa0, fa1
3329 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
3330 ; RV32ZICOND-NEXT:    czero.nez a0, a0, a2
3331 ; RV32ZICOND-NEXT:    or a0, a0, a1
3332 ; RV32ZICOND-NEXT:    ret
3334 ; RV64ZICOND-LABEL: setune_32:
3335 ; RV64ZICOND:       # %bb.0:
3336 ; RV64ZICOND-NEXT:    feq.s a2, fa0, fa1
3337 ; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
3338 ; RV64ZICOND-NEXT:    czero.nez a0, a0, a2
3339 ; RV64ZICOND-NEXT:    or a0, a0, a1
3340 ; RV64ZICOND-NEXT:    ret
3341   %rc = fcmp une float %a, %b
3342   %sel = select i1 %rc, i32 %rs1, i32 %rs2
3343   ret i32 %sel
3346 define i64 @setune_64(float %a, float %b, i64 %rs1, i64 %rs2) {
3347 ; RV32I-LABEL: setune_64:
3348 ; RV32I:       # %bb.0:
3349 ; RV32I-NEXT:    feq.s a4, fa0, fa1
3350 ; RV32I-NEXT:    beqz a4, .LBB57_2
3351 ; RV32I-NEXT:  # %bb.1:
3352 ; RV32I-NEXT:    mv a0, a2
3353 ; RV32I-NEXT:    mv a1, a3
3354 ; RV32I-NEXT:  .LBB57_2:
3355 ; RV32I-NEXT:    ret
3357 ; RV64I-LABEL: setune_64:
3358 ; RV64I:       # %bb.0:
3359 ; RV64I-NEXT:    feq.s a2, fa0, fa1
3360 ; RV64I-NEXT:    beqz a2, .LBB57_2
3361 ; RV64I-NEXT:  # %bb.1:
3362 ; RV64I-NEXT:    mv a0, a1
3363 ; RV64I-NEXT:  .LBB57_2:
3364 ; RV64I-NEXT:    ret
3366 ; RV64XVENTANACONDOPS-LABEL: setune_64:
3367 ; RV64XVENTANACONDOPS:       # %bb.0:
3368 ; RV64XVENTANACONDOPS-NEXT:    feq.s a2, fa0, fa1
3369 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
3370 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a0, a2
3371 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
3372 ; RV64XVENTANACONDOPS-NEXT:    ret
3374 ; RV64XTHEADCONDMOV-LABEL: setune_64:
3375 ; RV64XTHEADCONDMOV:       # %bb.0:
3376 ; RV64XTHEADCONDMOV-NEXT:    feq.s a2, fa0, fa1
3377 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a0, a1, a2
3378 ; RV64XTHEADCONDMOV-NEXT:    ret
3380 ; RV32ZICOND-LABEL: setune_64:
3381 ; RV32ZICOND:       # %bb.0:
3382 ; RV32ZICOND-NEXT:    feq.s a4, fa0, fa1
3383 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a4
3384 ; RV32ZICOND-NEXT:    czero.nez a0, a0, a4
3385 ; RV32ZICOND-NEXT:    or a0, a0, a2
3386 ; RV32ZICOND-NEXT:    czero.eqz a2, a3, a4
3387 ; RV32ZICOND-NEXT:    czero.nez a1, a1, a4
3388 ; RV32ZICOND-NEXT:    or a1, a1, a2
3389 ; RV32ZICOND-NEXT:    ret
3391 ; RV64ZICOND-LABEL: setune_64:
3392 ; RV64ZICOND:       # %bb.0:
3393 ; RV64ZICOND-NEXT:    feq.s a2, fa0, fa1
3394 ; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
3395 ; RV64ZICOND-NEXT:    czero.nez a0, a0, a2
3396 ; RV64ZICOND-NEXT:    or a0, a0, a1
3397 ; RV64ZICOND-NEXT:    ret
3398   %rc = fcmp une float %a, %b
3399   %sel = select i1 %rc, i64 %rs1, i64 %rs2
3400   ret i64 %sel
3403 ; Test that we can ComputeNumSignBits across basic blocks when the live out is
3404 ; RISCVISD::SELECT_CC. There should be no slli+srai or sext.h in the output.
3405 define signext i16 @numsignbits(i16 signext %0, i16 signext %1, i16 signext %2, i16 signext %3) nounwind {
3406 ; RV32I-LABEL: numsignbits:
3407 ; RV32I:       # %bb.0:
3408 ; RV32I-NEXT:    addi sp, sp, -16
3409 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3410 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3411 ; RV32I-NEXT:    mv s0, a3
3412 ; RV32I-NEXT:    beqz a0, .LBB58_2
3413 ; RV32I-NEXT:  # %bb.1:
3414 ; RV32I-NEXT:    mv s0, a2
3415 ; RV32I-NEXT:  .LBB58_2:
3416 ; RV32I-NEXT:    beqz a1, .LBB58_4
3417 ; RV32I-NEXT:  # %bb.3:
3418 ; RV32I-NEXT:    mv a0, s0
3419 ; RV32I-NEXT:    call bat@plt
3420 ; RV32I-NEXT:  .LBB58_4:
3421 ; RV32I-NEXT:    mv a0, s0
3422 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3423 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3424 ; RV32I-NEXT:    addi sp, sp, 16
3425 ; RV32I-NEXT:    ret
3427 ; RV64I-LABEL: numsignbits:
3428 ; RV64I:       # %bb.0:
3429 ; RV64I-NEXT:    addi sp, sp, -16
3430 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3431 ; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
3432 ; RV64I-NEXT:    mv s0, a3
3433 ; RV64I-NEXT:    beqz a0, .LBB58_2
3434 ; RV64I-NEXT:  # %bb.1:
3435 ; RV64I-NEXT:    mv s0, a2
3436 ; RV64I-NEXT:  .LBB58_2:
3437 ; RV64I-NEXT:    beqz a1, .LBB58_4
3438 ; RV64I-NEXT:  # %bb.3:
3439 ; RV64I-NEXT:    mv a0, s0
3440 ; RV64I-NEXT:    call bat@plt
3441 ; RV64I-NEXT:  .LBB58_4:
3442 ; RV64I-NEXT:    mv a0, s0
3443 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3444 ; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
3445 ; RV64I-NEXT:    addi sp, sp, 16
3446 ; RV64I-NEXT:    ret
3448 ; RV64XVENTANACONDOPS-LABEL: numsignbits:
3449 ; RV64XVENTANACONDOPS:       # %bb.0:
3450 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, -16
3451 ; RV64XVENTANACONDOPS-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3452 ; RV64XVENTANACONDOPS-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
3453 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a2, a2, a0
3454 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn s0, a3, a0
3455 ; RV64XVENTANACONDOPS-NEXT:    or s0, s0, a2
3456 ; RV64XVENTANACONDOPS-NEXT:    beqz a1, .LBB58_2
3457 ; RV64XVENTANACONDOPS-NEXT:  # %bb.1:
3458 ; RV64XVENTANACONDOPS-NEXT:    mv a0, s0
3459 ; RV64XVENTANACONDOPS-NEXT:    call bat@plt
3460 ; RV64XVENTANACONDOPS-NEXT:  .LBB58_2:
3461 ; RV64XVENTANACONDOPS-NEXT:    mv a0, s0
3462 ; RV64XVENTANACONDOPS-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3463 ; RV64XVENTANACONDOPS-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
3464 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, 16
3465 ; RV64XVENTANACONDOPS-NEXT:    ret
3467 ; RV64XTHEADCONDMOV-LABEL: numsignbits:
3468 ; RV64XTHEADCONDMOV:       # %bb.0:
3469 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, -16
3470 ; RV64XTHEADCONDMOV-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3471 ; RV64XTHEADCONDMOV-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
3472 ; RV64XTHEADCONDMOV-NEXT:    mv s0, a2
3473 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz s0, a3, a0
3474 ; RV64XTHEADCONDMOV-NEXT:    beqz a1, .LBB58_2
3475 ; RV64XTHEADCONDMOV-NEXT:  # %bb.1:
3476 ; RV64XTHEADCONDMOV-NEXT:    mv a0, s0
3477 ; RV64XTHEADCONDMOV-NEXT:    call bat@plt
3478 ; RV64XTHEADCONDMOV-NEXT:  .LBB58_2:
3479 ; RV64XTHEADCONDMOV-NEXT:    mv a0, s0
3480 ; RV64XTHEADCONDMOV-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3481 ; RV64XTHEADCONDMOV-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
3482 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, 16
3483 ; RV64XTHEADCONDMOV-NEXT:    ret
3485 ; RV32ZICOND-LABEL: numsignbits:
3486 ; RV32ZICOND:       # %bb.0:
3487 ; RV32ZICOND-NEXT:    addi sp, sp, -16
3488 ; RV32ZICOND-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3489 ; RV32ZICOND-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3490 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a0
3491 ; RV32ZICOND-NEXT:    czero.nez s0, a3, a0
3492 ; RV32ZICOND-NEXT:    or s0, s0, a2
3493 ; RV32ZICOND-NEXT:    beqz a1, .LBB58_2
3494 ; RV32ZICOND-NEXT:  # %bb.1:
3495 ; RV32ZICOND-NEXT:    mv a0, s0
3496 ; RV32ZICOND-NEXT:    call bat@plt
3497 ; RV32ZICOND-NEXT:  .LBB58_2:
3498 ; RV32ZICOND-NEXT:    mv a0, s0
3499 ; RV32ZICOND-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3500 ; RV32ZICOND-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3501 ; RV32ZICOND-NEXT:    addi sp, sp, 16
3502 ; RV32ZICOND-NEXT:    ret
3504 ; RV64ZICOND-LABEL: numsignbits:
3505 ; RV64ZICOND:       # %bb.0:
3506 ; RV64ZICOND-NEXT:    addi sp, sp, -16
3507 ; RV64ZICOND-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3508 ; RV64ZICOND-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
3509 ; RV64ZICOND-NEXT:    czero.eqz a2, a2, a0
3510 ; RV64ZICOND-NEXT:    czero.nez s0, a3, a0
3511 ; RV64ZICOND-NEXT:    or s0, s0, a2
3512 ; RV64ZICOND-NEXT:    beqz a1, .LBB58_2
3513 ; RV64ZICOND-NEXT:  # %bb.1:
3514 ; RV64ZICOND-NEXT:    mv a0, s0
3515 ; RV64ZICOND-NEXT:    call bat@plt
3516 ; RV64ZICOND-NEXT:  .LBB58_2:
3517 ; RV64ZICOND-NEXT:    mv a0, s0
3518 ; RV64ZICOND-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3519 ; RV64ZICOND-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
3520 ; RV64ZICOND-NEXT:    addi sp, sp, 16
3521 ; RV64ZICOND-NEXT:    ret
3522   %5 = icmp eq i16 %0, 0
3523   %6 = select i1 %5, i16 %3, i16 %2
3524   %7 = icmp eq i16 %1, 0
3525   br i1 %7, label %9, label %8
3527 8:                                                ; preds = %4
3528   tail call void @bat(i16 signext %6)
3529   br label %9
3531 9:                                                ; preds = %8, %4
3532   ret i16 %6
3535 declare void @bat(i16 signext)