Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / condops.ll
blob23f219c2487ebc50ff4b58ebaa8583ea338985de
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,+zbs < %s | FileCheck %s -check-prefix=RV32I
3 ; RUN: llc -mtriple=riscv64 -target-abi=lp64f -mattr=+f,+zbs < %s | FileCheck %s -check-prefix=RV64I
4 ; RUN: llc -mtriple=riscv64 -target-abi=lp64f -mattr=+f,+zbs,+xventanacondops < %s | FileCheck %s -check-prefix=RV64XVENTANACONDOPS
5 ; RUN: llc -mtriple=riscv64 -target-abi=lp64f -mattr=+f,+zbs,+xtheadcondmov < %s | FileCheck %s -check-prefix=RV64XTHEADCONDMOV
6 ; RUN: llc -mtriple=riscv32 -target-abi=ilp32f -mattr=+f,+zbs,+experimental-zicond < %s | FileCheck %s -check-prefix=RV32ZICOND
7 ; RUN: llc -mtriple=riscv64 -target-abi=lp64f -mattr=+f,+zbs,+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 @zero_singlebit1(i64 %rs1, i64 %rs2) {
86 ; RV32I-LABEL: zero_singlebit1:
87 ; RV32I:       # %bb.0:
88 ; RV32I-NEXT:    bexti a2, a2, 12
89 ; RV32I-NEXT:    addi a2, a2, -1
90 ; RV32I-NEXT:    and a0, a2, a0
91 ; RV32I-NEXT:    and a1, a2, a1
92 ; RV32I-NEXT:    ret
94 ; RV64I-LABEL: zero_singlebit1:
95 ; RV64I:       # %bb.0:
96 ; RV64I-NEXT:    bexti a1, a1, 12
97 ; RV64I-NEXT:    addi a1, a1, -1
98 ; RV64I-NEXT:    and a0, a1, a0
99 ; RV64I-NEXT:    ret
101 ; RV64XVENTANACONDOPS-LABEL: zero_singlebit1:
102 ; RV64XVENTANACONDOPS:       # %bb.0:
103 ; RV64XVENTANACONDOPS-NEXT:    bexti a1, a1, 12
104 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a0, a1
105 ; RV64XVENTANACONDOPS-NEXT:    ret
107 ; RV64XTHEADCONDMOV-LABEL: zero_singlebit1:
108 ; RV64XTHEADCONDMOV:       # %bb.0:
109 ; RV64XTHEADCONDMOV-NEXT:    lui a2, 1
110 ; RV64XTHEADCONDMOV-NEXT:    and a1, a1, a2
111 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a0, zero, a1
112 ; RV64XTHEADCONDMOV-NEXT:    ret
114 ; RV32ZICOND-LABEL: zero_singlebit1:
115 ; RV32ZICOND:       # %bb.0:
116 ; RV32ZICOND-NEXT:    bexti a2, a2, 12
117 ; RV32ZICOND-NEXT:    czero.nez a0, a0, a2
118 ; RV32ZICOND-NEXT:    czero.nez a1, a1, a2
119 ; RV32ZICOND-NEXT:    ret
121 ; RV64ZICOND-LABEL: zero_singlebit1:
122 ; RV64ZICOND:       # %bb.0:
123 ; RV64ZICOND-NEXT:    bexti a1, a1, 12
124 ; RV64ZICOND-NEXT:    czero.nez a0, a0, a1
125 ; RV64ZICOND-NEXT:    ret
126   %and = and i64 %rs2, 4096
127   %rc = icmp eq i64 %and, 0
128   %sel = select i1 %rc, i64 %rs1, i64 0
129   ret i64 %sel
132 define i64 @zero_singlebit2(i64 %rs1, i64 %rs2) {
133 ; RV32I-LABEL: zero_singlebit2:
134 ; RV32I:       # %bb.0:
135 ; RV32I-NEXT:    slli a2, a2, 19
136 ; RV32I-NEXT:    srai a2, a2, 31
137 ; RV32I-NEXT:    and a0, a2, a0
138 ; RV32I-NEXT:    and a1, a2, a1
139 ; RV32I-NEXT:    ret
141 ; RV64I-LABEL: zero_singlebit2:
142 ; RV64I:       # %bb.0:
143 ; RV64I-NEXT:    slli a1, a1, 51
144 ; RV64I-NEXT:    srai a1, a1, 63
145 ; RV64I-NEXT:    and a0, a1, a0
146 ; RV64I-NEXT:    ret
148 ; RV64XVENTANACONDOPS-LABEL: zero_singlebit2:
149 ; RV64XVENTANACONDOPS:       # %bb.0:
150 ; RV64XVENTANACONDOPS-NEXT:    bexti a1, a1, 12
151 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a0, a1
152 ; RV64XVENTANACONDOPS-NEXT:    ret
154 ; RV64XTHEADCONDMOV-LABEL: zero_singlebit2:
155 ; RV64XTHEADCONDMOV:       # %bb.0:
156 ; RV64XTHEADCONDMOV-NEXT:    slli a1, a1, 51
157 ; RV64XTHEADCONDMOV-NEXT:    srai a1, a1, 63
158 ; RV64XTHEADCONDMOV-NEXT:    and a0, a1, a0
159 ; RV64XTHEADCONDMOV-NEXT:    ret
161 ; RV32ZICOND-LABEL: zero_singlebit2:
162 ; RV32ZICOND:       # %bb.0:
163 ; RV32ZICOND-NEXT:    bexti a2, a2, 12
164 ; RV32ZICOND-NEXT:    czero.eqz a0, a0, a2
165 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
166 ; RV32ZICOND-NEXT:    ret
168 ; RV64ZICOND-LABEL: zero_singlebit2:
169 ; RV64ZICOND:       # %bb.0:
170 ; RV64ZICOND-NEXT:    bexti a1, a1, 12
171 ; RV64ZICOND-NEXT:    czero.eqz a0, a0, a1
172 ; RV64ZICOND-NEXT:    ret
173   %and = and i64 %rs2, 4096
174   %rc = icmp eq i64 %and, 0
175   %sel = select i1 %rc, i64 0, i64 %rs1
176   ret i64 %sel
179 define i64 @add1(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
180 ; RV32I-LABEL: add1:
181 ; RV32I:       # %bb.0:
182 ; RV32I-NEXT:    neg a0, a0
183 ; RV32I-NEXT:    and a4, a0, a4
184 ; RV32I-NEXT:    add a2, a2, a4
185 ; RV32I-NEXT:    and a0, a0, a3
186 ; RV32I-NEXT:    add a0, a1, a0
187 ; RV32I-NEXT:    sltu a1, a0, a1
188 ; RV32I-NEXT:    add a1, a2, a1
189 ; RV32I-NEXT:    ret
191 ; RV64I-LABEL: add1:
192 ; RV64I:       # %bb.0:
193 ; RV64I-NEXT:    neg a0, a0
194 ; RV64I-NEXT:    and a0, a0, a2
195 ; RV64I-NEXT:    add a0, a1, a0
196 ; RV64I-NEXT:    ret
198 ; RV64XVENTANACONDOPS-LABEL: add1:
199 ; RV64XVENTANACONDOPS:       # %bb.0:
200 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
201 ; RV64XVENTANACONDOPS-NEXT:    add a0, a1, a0
202 ; RV64XVENTANACONDOPS-NEXT:    ret
204 ; RV64XTHEADCONDMOV-LABEL: add1:
205 ; RV64XTHEADCONDMOV:       # %bb.0:
206 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
207 ; RV64XTHEADCONDMOV-NEXT:    add a0, a1, a2
208 ; RV64XTHEADCONDMOV-NEXT:    ret
210 ; RV32ZICOND-LABEL: add1:
211 ; RV32ZICOND:       # %bb.0:
212 ; RV32ZICOND-NEXT:    czero.eqz a4, a4, a0
213 ; RV32ZICOND-NEXT:    add a2, a2, a4
214 ; RV32ZICOND-NEXT:    czero.eqz a0, a3, a0
215 ; RV32ZICOND-NEXT:    add a0, a1, a0
216 ; RV32ZICOND-NEXT:    sltu a1, a0, a1
217 ; RV32ZICOND-NEXT:    add a1, a2, a1
218 ; RV32ZICOND-NEXT:    ret
220 ; RV64ZICOND-LABEL: add1:
221 ; RV64ZICOND:       # %bb.0:
222 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
223 ; RV64ZICOND-NEXT:    add a0, a1, a0
224 ; RV64ZICOND-NEXT:    ret
225   %add = add i64 %rs1, %rs2
226   %sel = select i1 %rc, i64 %add, i64 %rs1
227   ret i64 %sel
230 define i64 @add2(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
231 ; RV32I-LABEL: add2:
232 ; RV32I:       # %bb.0:
233 ; RV32I-NEXT:    neg a0, a0
234 ; RV32I-NEXT:    and a2, a0, a2
235 ; RV32I-NEXT:    add a2, a4, a2
236 ; RV32I-NEXT:    and a0, a0, a1
237 ; RV32I-NEXT:    add a0, a3, a0
238 ; RV32I-NEXT:    sltu a1, a0, a3
239 ; RV32I-NEXT:    add a1, a2, a1
240 ; RV32I-NEXT:    ret
242 ; RV64I-LABEL: add2:
243 ; RV64I:       # %bb.0:
244 ; RV64I-NEXT:    neg a0, a0
245 ; RV64I-NEXT:    and a0, a0, a1
246 ; RV64I-NEXT:    add a0, a2, a0
247 ; RV64I-NEXT:    ret
249 ; RV64XVENTANACONDOPS-LABEL: add2:
250 ; RV64XVENTANACONDOPS:       # %bb.0:
251 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
252 ; RV64XVENTANACONDOPS-NEXT:    add a0, a2, a0
253 ; RV64XVENTANACONDOPS-NEXT:    ret
255 ; RV64XTHEADCONDMOV-LABEL: add2:
256 ; RV64XTHEADCONDMOV:       # %bb.0:
257 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
258 ; RV64XTHEADCONDMOV-NEXT:    add a0, a2, a1
259 ; RV64XTHEADCONDMOV-NEXT:    ret
261 ; RV32ZICOND-LABEL: add2:
262 ; RV32ZICOND:       # %bb.0:
263 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a0
264 ; RV32ZICOND-NEXT:    add a2, a4, a2
265 ; RV32ZICOND-NEXT:    czero.eqz a0, a1, a0
266 ; RV32ZICOND-NEXT:    add a0, a3, a0
267 ; RV32ZICOND-NEXT:    sltu a1, a0, a3
268 ; RV32ZICOND-NEXT:    add a1, a2, a1
269 ; RV32ZICOND-NEXT:    ret
271 ; RV64ZICOND-LABEL: add2:
272 ; RV64ZICOND:       # %bb.0:
273 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
274 ; RV64ZICOND-NEXT:    add a0, a2, a0
275 ; RV64ZICOND-NEXT:    ret
276   %add = add i64 %rs1, %rs2
277   %sel = select i1 %rc, i64 %add, i64 %rs2
278   ret i64 %sel
281 define i64 @add3(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
282 ; RV32I-LABEL: add3:
283 ; RV32I:       # %bb.0:
284 ; RV32I-NEXT:    addi a0, a0, -1
285 ; RV32I-NEXT:    and a4, a0, a4
286 ; RV32I-NEXT:    add a2, a2, a4
287 ; RV32I-NEXT:    and a0, a0, a3
288 ; RV32I-NEXT:    add a0, a1, a0
289 ; RV32I-NEXT:    sltu a1, a0, a1
290 ; RV32I-NEXT:    add a1, a2, a1
291 ; RV32I-NEXT:    ret
293 ; RV64I-LABEL: add3:
294 ; RV64I:       # %bb.0:
295 ; RV64I-NEXT:    addi a0, a0, -1
296 ; RV64I-NEXT:    and a0, a0, a2
297 ; RV64I-NEXT:    add a0, a1, a0
298 ; RV64I-NEXT:    ret
300 ; RV64XVENTANACONDOPS-LABEL: add3:
301 ; RV64XVENTANACONDOPS:       # %bb.0:
302 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
303 ; RV64XVENTANACONDOPS-NEXT:    add a0, a1, a0
304 ; RV64XVENTANACONDOPS-NEXT:    ret
306 ; RV64XTHEADCONDMOV-LABEL: add3:
307 ; RV64XTHEADCONDMOV:       # %bb.0:
308 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
309 ; RV64XTHEADCONDMOV-NEXT:    add a0, a1, a2
310 ; RV64XTHEADCONDMOV-NEXT:    ret
312 ; RV32ZICOND-LABEL: add3:
313 ; RV32ZICOND:       # %bb.0:
314 ; RV32ZICOND-NEXT:    czero.nez a4, a4, a0
315 ; RV32ZICOND-NEXT:    add a2, a2, a4
316 ; RV32ZICOND-NEXT:    czero.nez a0, a3, a0
317 ; RV32ZICOND-NEXT:    add a0, a1, a0
318 ; RV32ZICOND-NEXT:    sltu a1, a0, a1
319 ; RV32ZICOND-NEXT:    add a1, a2, a1
320 ; RV32ZICOND-NEXT:    ret
322 ; RV64ZICOND-LABEL: add3:
323 ; RV64ZICOND:       # %bb.0:
324 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
325 ; RV64ZICOND-NEXT:    add a0, a1, a0
326 ; RV64ZICOND-NEXT:    ret
327   %add = add i64 %rs1, %rs2
328   %sel = select i1 %rc, i64 %rs1, i64 %add
329   ret i64 %sel
332 define i64 @add4(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
333 ; RV32I-LABEL: add4:
334 ; RV32I:       # %bb.0:
335 ; RV32I-NEXT:    addi a0, a0, -1
336 ; RV32I-NEXT:    and a2, a0, a2
337 ; RV32I-NEXT:    add a2, a4, a2
338 ; RV32I-NEXT:    and a0, a0, a1
339 ; RV32I-NEXT:    add a0, a3, a0
340 ; RV32I-NEXT:    sltu a1, a0, a3
341 ; RV32I-NEXT:    add a1, a2, a1
342 ; RV32I-NEXT:    ret
344 ; RV64I-LABEL: add4:
345 ; RV64I:       # %bb.0:
346 ; RV64I-NEXT:    addi a0, a0, -1
347 ; RV64I-NEXT:    and a0, a0, a1
348 ; RV64I-NEXT:    add a0, a2, a0
349 ; RV64I-NEXT:    ret
351 ; RV64XVENTANACONDOPS-LABEL: add4:
352 ; RV64XVENTANACONDOPS:       # %bb.0:
353 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
354 ; RV64XVENTANACONDOPS-NEXT:    add a0, a2, a0
355 ; RV64XVENTANACONDOPS-NEXT:    ret
357 ; RV64XTHEADCONDMOV-LABEL: add4:
358 ; RV64XTHEADCONDMOV:       # %bb.0:
359 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
360 ; RV64XTHEADCONDMOV-NEXT:    add a0, a2, a1
361 ; RV64XTHEADCONDMOV-NEXT:    ret
363 ; RV32ZICOND-LABEL: add4:
364 ; RV32ZICOND:       # %bb.0:
365 ; RV32ZICOND-NEXT:    czero.nez a2, a2, a0
366 ; RV32ZICOND-NEXT:    add a2, a4, a2
367 ; RV32ZICOND-NEXT:    czero.nez a0, a1, a0
368 ; RV32ZICOND-NEXT:    add a0, a3, a0
369 ; RV32ZICOND-NEXT:    sltu a1, a0, a3
370 ; RV32ZICOND-NEXT:    add a1, a2, a1
371 ; RV32ZICOND-NEXT:    ret
373 ; RV64ZICOND-LABEL: add4:
374 ; RV64ZICOND:       # %bb.0:
375 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
376 ; RV64ZICOND-NEXT:    add a0, a2, a0
377 ; RV64ZICOND-NEXT:    ret
378   %add = add i64 %rs1, %rs2
379   %sel = select i1 %rc, i64 %rs2, i64 %add
380   ret i64 %sel
383 define i64 @sub1(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
384 ; RV32I-LABEL: sub1:
385 ; RV32I:       # %bb.0:
386 ; RV32I-NEXT:    neg a0, a0
387 ; RV32I-NEXT:    and a3, a0, a3
388 ; RV32I-NEXT:    sltu a5, a1, a3
389 ; RV32I-NEXT:    and a0, a0, a4
390 ; RV32I-NEXT:    sub a2, a2, a0
391 ; RV32I-NEXT:    sub a2, a2, a5
392 ; RV32I-NEXT:    sub a0, a1, a3
393 ; RV32I-NEXT:    mv a1, a2
394 ; RV32I-NEXT:    ret
396 ; RV64I-LABEL: sub1:
397 ; RV64I:       # %bb.0:
398 ; RV64I-NEXT:    neg a0, a0
399 ; RV64I-NEXT:    and a0, a0, a2
400 ; RV64I-NEXT:    sub a0, a1, a0
401 ; RV64I-NEXT:    ret
403 ; RV64XVENTANACONDOPS-LABEL: sub1:
404 ; RV64XVENTANACONDOPS:       # %bb.0:
405 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
406 ; RV64XVENTANACONDOPS-NEXT:    sub a0, a1, a0
407 ; RV64XVENTANACONDOPS-NEXT:    ret
409 ; RV64XTHEADCONDMOV-LABEL: sub1:
410 ; RV64XTHEADCONDMOV:       # %bb.0:
411 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
412 ; RV64XTHEADCONDMOV-NEXT:    sub a0, a1, a2
413 ; RV64XTHEADCONDMOV-NEXT:    ret
415 ; RV32ZICOND-LABEL: sub1:
416 ; RV32ZICOND:       # %bb.0:
417 ; RV32ZICOND-NEXT:    czero.eqz a3, a3, a0
418 ; RV32ZICOND-NEXT:    sltu a5, a1, a3
419 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a0
420 ; RV32ZICOND-NEXT:    sub a2, a2, a0
421 ; RV32ZICOND-NEXT:    sub a2, a2, a5
422 ; RV32ZICOND-NEXT:    sub a0, a1, a3
423 ; RV32ZICOND-NEXT:    mv a1, a2
424 ; RV32ZICOND-NEXT:    ret
426 ; RV64ZICOND-LABEL: sub1:
427 ; RV64ZICOND:       # %bb.0:
428 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
429 ; RV64ZICOND-NEXT:    sub a0, a1, a0
430 ; RV64ZICOND-NEXT:    ret
431   %sub = sub i64 %rs1, %rs2
432   %sel = select i1 %rc, i64 %sub, i64 %rs1
433   ret i64 %sel
436 define i64 @sub2(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
437 ; RV32I-LABEL: sub2:
438 ; RV32I:       # %bb.0:
439 ; RV32I-NEXT:    addi a0, a0, -1
440 ; RV32I-NEXT:    and a3, a0, a3
441 ; RV32I-NEXT:    sltu a5, a1, a3
442 ; RV32I-NEXT:    and a0, a0, a4
443 ; RV32I-NEXT:    sub a2, a2, a0
444 ; RV32I-NEXT:    sub a2, a2, a5
445 ; RV32I-NEXT:    sub a0, a1, a3
446 ; RV32I-NEXT:    mv a1, a2
447 ; RV32I-NEXT:    ret
449 ; RV64I-LABEL: sub2:
450 ; RV64I:       # %bb.0:
451 ; RV64I-NEXT:    addi a0, a0, -1
452 ; RV64I-NEXT:    and a0, a0, a2
453 ; RV64I-NEXT:    sub a0, a1, a0
454 ; RV64I-NEXT:    ret
456 ; RV64XVENTANACONDOPS-LABEL: sub2:
457 ; RV64XVENTANACONDOPS:       # %bb.0:
458 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
459 ; RV64XVENTANACONDOPS-NEXT:    sub a0, a1, a0
460 ; RV64XVENTANACONDOPS-NEXT:    ret
462 ; RV64XTHEADCONDMOV-LABEL: sub2:
463 ; RV64XTHEADCONDMOV:       # %bb.0:
464 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
465 ; RV64XTHEADCONDMOV-NEXT:    sub a0, a1, a2
466 ; RV64XTHEADCONDMOV-NEXT:    ret
468 ; RV32ZICOND-LABEL: sub2:
469 ; RV32ZICOND:       # %bb.0:
470 ; RV32ZICOND-NEXT:    czero.nez a3, a3, a0
471 ; RV32ZICOND-NEXT:    sltu a5, a1, a3
472 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a0
473 ; RV32ZICOND-NEXT:    sub a2, a2, a0
474 ; RV32ZICOND-NEXT:    sub a2, a2, a5
475 ; RV32ZICOND-NEXT:    sub a0, a1, a3
476 ; RV32ZICOND-NEXT:    mv a1, a2
477 ; RV32ZICOND-NEXT:    ret
479 ; RV64ZICOND-LABEL: sub2:
480 ; RV64ZICOND:       # %bb.0:
481 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
482 ; RV64ZICOND-NEXT:    sub a0, a1, a0
483 ; RV64ZICOND-NEXT:    ret
484   %sub = sub i64 %rs1, %rs2
485   %sel = select i1 %rc, i64 %rs1, i64 %sub
486   ret i64 %sel
489 define i64 @or1(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
490 ; RV32I-LABEL: or1:
491 ; RV32I:       # %bb.0:
492 ; RV32I-NEXT:    neg a5, a0
493 ; RV32I-NEXT:    and a0, a5, a3
494 ; RV32I-NEXT:    or a0, a1, a0
495 ; RV32I-NEXT:    and a1, a5, a4
496 ; RV32I-NEXT:    or a1, a2, a1
497 ; RV32I-NEXT:    ret
499 ; RV64I-LABEL: or1:
500 ; RV64I:       # %bb.0:
501 ; RV64I-NEXT:    neg a0, a0
502 ; RV64I-NEXT:    and a0, a0, a2
503 ; RV64I-NEXT:    or a0, a1, a0
504 ; RV64I-NEXT:    ret
506 ; RV64XVENTANACONDOPS-LABEL: or1:
507 ; RV64XVENTANACONDOPS:       # %bb.0:
508 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
509 ; RV64XVENTANACONDOPS-NEXT:    or a0, a1, a0
510 ; RV64XVENTANACONDOPS-NEXT:    ret
512 ; RV64XTHEADCONDMOV-LABEL: or1:
513 ; RV64XTHEADCONDMOV:       # %bb.0:
514 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
515 ; RV64XTHEADCONDMOV-NEXT:    or a0, a1, a2
516 ; RV64XTHEADCONDMOV-NEXT:    ret
518 ; RV32ZICOND-LABEL: or1:
519 ; RV32ZICOND:       # %bb.0:
520 ; RV32ZICOND-NEXT:    czero.eqz a3, a3, a0
521 ; RV32ZICOND-NEXT:    or a3, a1, a3
522 ; RV32ZICOND-NEXT:    czero.eqz a1, a4, a0
523 ; RV32ZICOND-NEXT:    or a1, a2, a1
524 ; RV32ZICOND-NEXT:    mv a0, a3
525 ; RV32ZICOND-NEXT:    ret
527 ; RV64ZICOND-LABEL: or1:
528 ; RV64ZICOND:       # %bb.0:
529 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
530 ; RV64ZICOND-NEXT:    or a0, a1, a0
531 ; RV64ZICOND-NEXT:    ret
532   %or = or i64 %rs1, %rs2
533   %sel = select i1 %rc, i64 %or, i64 %rs1
534   ret i64 %sel
537 define i64 @or2(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
538 ; RV32I-LABEL: or2:
539 ; RV32I:       # %bb.0:
540 ; RV32I-NEXT:    neg a5, a0
541 ; RV32I-NEXT:    and a0, a5, a1
542 ; RV32I-NEXT:    or a0, a3, a0
543 ; RV32I-NEXT:    and a1, a5, a2
544 ; RV32I-NEXT:    or a1, a4, a1
545 ; RV32I-NEXT:    ret
547 ; RV64I-LABEL: or2:
548 ; RV64I:       # %bb.0:
549 ; RV64I-NEXT:    neg a0, a0
550 ; RV64I-NEXT:    and a0, a0, a1
551 ; RV64I-NEXT:    or a0, a2, a0
552 ; RV64I-NEXT:    ret
554 ; RV64XVENTANACONDOPS-LABEL: or2:
555 ; RV64XVENTANACONDOPS:       # %bb.0:
556 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
557 ; RV64XVENTANACONDOPS-NEXT:    or a0, a2, a0
558 ; RV64XVENTANACONDOPS-NEXT:    ret
560 ; RV64XTHEADCONDMOV-LABEL: or2:
561 ; RV64XTHEADCONDMOV:       # %bb.0:
562 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
563 ; RV64XTHEADCONDMOV-NEXT:    or a0, a2, a1
564 ; RV64XTHEADCONDMOV-NEXT:    ret
566 ; RV32ZICOND-LABEL: or2:
567 ; RV32ZICOND:       # %bb.0:
568 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a0
569 ; RV32ZICOND-NEXT:    or a3, a3, a1
570 ; RV32ZICOND-NEXT:    czero.eqz a1, a2, a0
571 ; RV32ZICOND-NEXT:    or a1, a4, a1
572 ; RV32ZICOND-NEXT:    mv a0, a3
573 ; RV32ZICOND-NEXT:    ret
575 ; RV64ZICOND-LABEL: or2:
576 ; RV64ZICOND:       # %bb.0:
577 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
578 ; RV64ZICOND-NEXT:    or a0, a2, a0
579 ; RV64ZICOND-NEXT:    ret
580   %or = or i64 %rs1, %rs2
581   %sel = select i1 %rc, i64 %or, i64 %rs2
582   ret i64 %sel
585 define i64 @or3(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
586 ; RV32I-LABEL: or3:
587 ; RV32I:       # %bb.0:
588 ; RV32I-NEXT:    addi a5, a0, -1
589 ; RV32I-NEXT:    and a0, a5, a3
590 ; RV32I-NEXT:    or a0, a1, a0
591 ; RV32I-NEXT:    and a1, a5, a4
592 ; RV32I-NEXT:    or a1, a2, a1
593 ; RV32I-NEXT:    ret
595 ; RV64I-LABEL: or3:
596 ; RV64I:       # %bb.0:
597 ; RV64I-NEXT:    addi a0, a0, -1
598 ; RV64I-NEXT:    and a0, a0, a2
599 ; RV64I-NEXT:    or a0, a1, a0
600 ; RV64I-NEXT:    ret
602 ; RV64XVENTANACONDOPS-LABEL: or3:
603 ; RV64XVENTANACONDOPS:       # %bb.0:
604 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
605 ; RV64XVENTANACONDOPS-NEXT:    or a0, a1, a0
606 ; RV64XVENTANACONDOPS-NEXT:    ret
608 ; RV64XTHEADCONDMOV-LABEL: or3:
609 ; RV64XTHEADCONDMOV:       # %bb.0:
610 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
611 ; RV64XTHEADCONDMOV-NEXT:    or a0, a1, a2
612 ; RV64XTHEADCONDMOV-NEXT:    ret
614 ; RV32ZICOND-LABEL: or3:
615 ; RV32ZICOND:       # %bb.0:
616 ; RV32ZICOND-NEXT:    czero.nez a3, a3, a0
617 ; RV32ZICOND-NEXT:    or a3, a1, a3
618 ; RV32ZICOND-NEXT:    czero.nez a1, a4, a0
619 ; RV32ZICOND-NEXT:    or a1, a2, a1
620 ; RV32ZICOND-NEXT:    mv a0, a3
621 ; RV32ZICOND-NEXT:    ret
623 ; RV64ZICOND-LABEL: or3:
624 ; RV64ZICOND:       # %bb.0:
625 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
626 ; RV64ZICOND-NEXT:    or a0, a1, a0
627 ; RV64ZICOND-NEXT:    ret
628   %or = or i64 %rs1, %rs2
629   %sel = select i1 %rc, i64 %rs1, i64 %or
630   ret i64 %sel
633 define i64 @or4(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
634 ; RV32I-LABEL: or4:
635 ; RV32I:       # %bb.0:
636 ; RV32I-NEXT:    addi a5, a0, -1
637 ; RV32I-NEXT:    and a0, a5, a1
638 ; RV32I-NEXT:    or a0, a3, a0
639 ; RV32I-NEXT:    and a1, a5, a2
640 ; RV32I-NEXT:    or a1, a4, a1
641 ; RV32I-NEXT:    ret
643 ; RV64I-LABEL: or4:
644 ; RV64I:       # %bb.0:
645 ; RV64I-NEXT:    addi a0, a0, -1
646 ; RV64I-NEXT:    and a0, a0, a1
647 ; RV64I-NEXT:    or a0, a2, a0
648 ; RV64I-NEXT:    ret
650 ; RV64XVENTANACONDOPS-LABEL: or4:
651 ; RV64XVENTANACONDOPS:       # %bb.0:
652 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
653 ; RV64XVENTANACONDOPS-NEXT:    or a0, a2, a0
654 ; RV64XVENTANACONDOPS-NEXT:    ret
656 ; RV64XTHEADCONDMOV-LABEL: or4:
657 ; RV64XTHEADCONDMOV:       # %bb.0:
658 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
659 ; RV64XTHEADCONDMOV-NEXT:    or a0, a2, a1
660 ; RV64XTHEADCONDMOV-NEXT:    ret
662 ; RV32ZICOND-LABEL: or4:
663 ; RV32ZICOND:       # %bb.0:
664 ; RV32ZICOND-NEXT:    czero.nez a1, a1, a0
665 ; RV32ZICOND-NEXT:    or a3, a3, a1
666 ; RV32ZICOND-NEXT:    czero.nez a1, a2, a0
667 ; RV32ZICOND-NEXT:    or a1, a4, a1
668 ; RV32ZICOND-NEXT:    mv a0, a3
669 ; RV32ZICOND-NEXT:    ret
671 ; RV64ZICOND-LABEL: or4:
672 ; RV64ZICOND:       # %bb.0:
673 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
674 ; RV64ZICOND-NEXT:    or a0, a2, a0
675 ; RV64ZICOND-NEXT:    ret
676   %or = or i64 %rs1, %rs2
677   %sel = select i1 %rc, i64 %rs2, i64 %or
678   ret i64 %sel
681 define i64 @xor1(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
682 ; RV32I-LABEL: xor1:
683 ; RV32I:       # %bb.0:
684 ; RV32I-NEXT:    neg a5, a0
685 ; RV32I-NEXT:    and a0, a5, a3
686 ; RV32I-NEXT:    xor a0, a1, a0
687 ; RV32I-NEXT:    and a1, a5, a4
688 ; RV32I-NEXT:    xor a1, a2, a1
689 ; RV32I-NEXT:    ret
691 ; RV64I-LABEL: xor1:
692 ; RV64I:       # %bb.0:
693 ; RV64I-NEXT:    neg a0, a0
694 ; RV64I-NEXT:    and a0, a0, a2
695 ; RV64I-NEXT:    xor a0, a1, a0
696 ; RV64I-NEXT:    ret
698 ; RV64XVENTANACONDOPS-LABEL: xor1:
699 ; RV64XVENTANACONDOPS:       # %bb.0:
700 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
701 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a1, a0
702 ; RV64XVENTANACONDOPS-NEXT:    ret
704 ; RV64XTHEADCONDMOV-LABEL: xor1:
705 ; RV64XTHEADCONDMOV:       # %bb.0:
706 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
707 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a1, a2
708 ; RV64XTHEADCONDMOV-NEXT:    ret
710 ; RV32ZICOND-LABEL: xor1:
711 ; RV32ZICOND:       # %bb.0:
712 ; RV32ZICOND-NEXT:    czero.eqz a3, a3, a0
713 ; RV32ZICOND-NEXT:    xor a3, a1, a3
714 ; RV32ZICOND-NEXT:    czero.eqz a1, a4, a0
715 ; RV32ZICOND-NEXT:    xor a1, a2, a1
716 ; RV32ZICOND-NEXT:    mv a0, a3
717 ; RV32ZICOND-NEXT:    ret
719 ; RV64ZICOND-LABEL: xor1:
720 ; RV64ZICOND:       # %bb.0:
721 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
722 ; RV64ZICOND-NEXT:    xor a0, a1, a0
723 ; RV64ZICOND-NEXT:    ret
724   %xor = xor i64 %rs1, %rs2
725   %sel = select i1 %rc, i64 %xor, i64 %rs1
726   ret i64 %sel
729 define i64 @xor2(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
730 ; RV32I-LABEL: xor2:
731 ; RV32I:       # %bb.0:
732 ; RV32I-NEXT:    neg a5, a0
733 ; RV32I-NEXT:    and a0, a5, a1
734 ; RV32I-NEXT:    xor a0, a3, a0
735 ; RV32I-NEXT:    and a1, a5, a2
736 ; RV32I-NEXT:    xor a1, a4, a1
737 ; RV32I-NEXT:    ret
739 ; RV64I-LABEL: xor2:
740 ; RV64I:       # %bb.0:
741 ; RV64I-NEXT:    neg a0, a0
742 ; RV64I-NEXT:    and a0, a0, a1
743 ; RV64I-NEXT:    xor a0, a2, a0
744 ; RV64I-NEXT:    ret
746 ; RV64XVENTANACONDOPS-LABEL: xor2:
747 ; RV64XVENTANACONDOPS:       # %bb.0:
748 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
749 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a2, a0
750 ; RV64XVENTANACONDOPS-NEXT:    ret
752 ; RV64XTHEADCONDMOV-LABEL: xor2:
753 ; RV64XTHEADCONDMOV:       # %bb.0:
754 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
755 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a2, a1
756 ; RV64XTHEADCONDMOV-NEXT:    ret
758 ; RV32ZICOND-LABEL: xor2:
759 ; RV32ZICOND:       # %bb.0:
760 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a0
761 ; RV32ZICOND-NEXT:    xor a3, a3, a1
762 ; RV32ZICOND-NEXT:    czero.eqz a1, a2, a0
763 ; RV32ZICOND-NEXT:    xor a1, a4, a1
764 ; RV32ZICOND-NEXT:    mv a0, a3
765 ; RV32ZICOND-NEXT:    ret
767 ; RV64ZICOND-LABEL: xor2:
768 ; RV64ZICOND:       # %bb.0:
769 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
770 ; RV64ZICOND-NEXT:    xor a0, a2, a0
771 ; RV64ZICOND-NEXT:    ret
772   %xor = xor i64 %rs1, %rs2
773   %sel = select i1 %rc, i64 %xor, i64 %rs2
774   ret i64 %sel
777 define i64 @xor3(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
778 ; RV32I-LABEL: xor3:
779 ; RV32I:       # %bb.0:
780 ; RV32I-NEXT:    addi a5, a0, -1
781 ; RV32I-NEXT:    and a0, a5, a3
782 ; RV32I-NEXT:    xor a0, a1, a0
783 ; RV32I-NEXT:    and a1, a5, a4
784 ; RV32I-NEXT:    xor a1, a2, a1
785 ; RV32I-NEXT:    ret
787 ; RV64I-LABEL: xor3:
788 ; RV64I:       # %bb.0:
789 ; RV64I-NEXT:    addi a0, a0, -1
790 ; RV64I-NEXT:    and a0, a0, a2
791 ; RV64I-NEXT:    xor a0, a1, a0
792 ; RV64I-NEXT:    ret
794 ; RV64XVENTANACONDOPS-LABEL: xor3:
795 ; RV64XVENTANACONDOPS:       # %bb.0:
796 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
797 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a1, a0
798 ; RV64XVENTANACONDOPS-NEXT:    ret
800 ; RV64XTHEADCONDMOV-LABEL: xor3:
801 ; RV64XTHEADCONDMOV:       # %bb.0:
802 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
803 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a1, a2
804 ; RV64XTHEADCONDMOV-NEXT:    ret
806 ; RV32ZICOND-LABEL: xor3:
807 ; RV32ZICOND:       # %bb.0:
808 ; RV32ZICOND-NEXT:    czero.nez a3, a3, a0
809 ; RV32ZICOND-NEXT:    xor a3, a1, a3
810 ; RV32ZICOND-NEXT:    czero.nez a1, a4, a0
811 ; RV32ZICOND-NEXT:    xor a1, a2, a1
812 ; RV32ZICOND-NEXT:    mv a0, a3
813 ; RV32ZICOND-NEXT:    ret
815 ; RV64ZICOND-LABEL: xor3:
816 ; RV64ZICOND:       # %bb.0:
817 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
818 ; RV64ZICOND-NEXT:    xor a0, a1, a0
819 ; RV64ZICOND-NEXT:    ret
820   %xor = xor i64 %rs1, %rs2
821   %sel = select i1 %rc, i64 %rs1, i64 %xor
822   ret i64 %sel
825 define i64 @xor4(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
826 ; RV32I-LABEL: xor4:
827 ; RV32I:       # %bb.0:
828 ; RV32I-NEXT:    addi a5, a0, -1
829 ; RV32I-NEXT:    and a0, a5, a1
830 ; RV32I-NEXT:    xor a0, a3, a0
831 ; RV32I-NEXT:    and a1, a5, a2
832 ; RV32I-NEXT:    xor a1, a4, a1
833 ; RV32I-NEXT:    ret
835 ; RV64I-LABEL: xor4:
836 ; RV64I:       # %bb.0:
837 ; RV64I-NEXT:    addi a0, a0, -1
838 ; RV64I-NEXT:    and a0, a0, a1
839 ; RV64I-NEXT:    xor a0, a2, a0
840 ; RV64I-NEXT:    ret
842 ; RV64XVENTANACONDOPS-LABEL: xor4:
843 ; RV64XVENTANACONDOPS:       # %bb.0:
844 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
845 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a2, a0
846 ; RV64XVENTANACONDOPS-NEXT:    ret
848 ; RV64XTHEADCONDMOV-LABEL: xor4:
849 ; RV64XTHEADCONDMOV:       # %bb.0:
850 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
851 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a2, a1
852 ; RV64XTHEADCONDMOV-NEXT:    ret
854 ; RV32ZICOND-LABEL: xor4:
855 ; RV32ZICOND:       # %bb.0:
856 ; RV32ZICOND-NEXT:    czero.nez a1, a1, a0
857 ; RV32ZICOND-NEXT:    xor a3, a3, a1
858 ; RV32ZICOND-NEXT:    czero.nez a1, a2, a0
859 ; RV32ZICOND-NEXT:    xor a1, a4, a1
860 ; RV32ZICOND-NEXT:    mv a0, a3
861 ; RV32ZICOND-NEXT:    ret
863 ; RV64ZICOND-LABEL: xor4:
864 ; RV64ZICOND:       # %bb.0:
865 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
866 ; RV64ZICOND-NEXT:    xor a0, a2, a0
867 ; RV64ZICOND-NEXT:    ret
868   %xor = xor i64 %rs1, %rs2
869   %sel = select i1 %rc, i64 %rs2, i64 %xor
870   ret i64 %sel
873 define i64 @and1(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
874 ; RV32I-LABEL: and1:
875 ; RV32I:       # %bb.0:
876 ; RV32I-NEXT:    beqz a0, .LBB18_2
877 ; RV32I-NEXT:  # %bb.1:
878 ; RV32I-NEXT:    and a2, a2, a4
879 ; RV32I-NEXT:    and a1, a1, a3
880 ; RV32I-NEXT:  .LBB18_2:
881 ; RV32I-NEXT:    mv a0, a1
882 ; RV32I-NEXT:    mv a1, a2
883 ; RV32I-NEXT:    ret
885 ; RV64I-LABEL: and1:
886 ; RV64I:       # %bb.0:
887 ; RV64I-NEXT:    beqz a0, .LBB18_2
888 ; RV64I-NEXT:  # %bb.1:
889 ; RV64I-NEXT:    and a1, a1, a2
890 ; RV64I-NEXT:  .LBB18_2:
891 ; RV64I-NEXT:    mv a0, a1
892 ; RV64I-NEXT:    ret
894 ; RV64XVENTANACONDOPS-LABEL: and1:
895 ; RV64XVENTANACONDOPS:       # %bb.0:
896 ; RV64XVENTANACONDOPS-NEXT:    and a2, a1, a2
897 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
898 ; RV64XVENTANACONDOPS-NEXT:    or a0, a2, a0
899 ; RV64XVENTANACONDOPS-NEXT:    ret
901 ; RV64XTHEADCONDMOV-LABEL: and1:
902 ; RV64XTHEADCONDMOV:       # %bb.0:
903 ; RV64XTHEADCONDMOV-NEXT:    and a2, a1, a2
904 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a1, a0
905 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
906 ; RV64XTHEADCONDMOV-NEXT:    ret
908 ; RV32ZICOND-LABEL: and1:
909 ; RV32ZICOND:       # %bb.0:
910 ; RV32ZICOND-NEXT:    and a4, a2, a4
911 ; RV32ZICOND-NEXT:    and a3, a1, a3
912 ; RV32ZICOND-NEXT:    czero.nez a1, a1, a0
913 ; RV32ZICOND-NEXT:    or a3, a3, a1
914 ; RV32ZICOND-NEXT:    czero.nez a1, a2, a0
915 ; RV32ZICOND-NEXT:    or a1, a4, a1
916 ; RV32ZICOND-NEXT:    mv a0, a3
917 ; RV32ZICOND-NEXT:    ret
919 ; RV64ZICOND-LABEL: and1:
920 ; RV64ZICOND:       # %bb.0:
921 ; RV64ZICOND-NEXT:    and a2, a1, a2
922 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
923 ; RV64ZICOND-NEXT:    or a0, a2, a0
924 ; RV64ZICOND-NEXT:    ret
925   %and = and i64 %rs1, %rs2
926   %sel = select i1 %rc, i64 %and, i64 %rs1
927   ret i64 %sel
930 define i64 @and2(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
931 ; RV32I-LABEL: and2:
932 ; RV32I:       # %bb.0:
933 ; RV32I-NEXT:    beqz a0, .LBB19_2
934 ; RV32I-NEXT:  # %bb.1:
935 ; RV32I-NEXT:    and a4, a2, a4
936 ; RV32I-NEXT:    and a3, a1, a3
937 ; RV32I-NEXT:  .LBB19_2:
938 ; RV32I-NEXT:    mv a0, a3
939 ; RV32I-NEXT:    mv a1, a4
940 ; RV32I-NEXT:    ret
942 ; RV64I-LABEL: and2:
943 ; RV64I:       # %bb.0:
944 ; RV64I-NEXT:    beqz a0, .LBB19_2
945 ; RV64I-NEXT:  # %bb.1:
946 ; RV64I-NEXT:    and a2, a1, a2
947 ; RV64I-NEXT:  .LBB19_2:
948 ; RV64I-NEXT:    mv a0, a2
949 ; RV64I-NEXT:    ret
951 ; RV64XVENTANACONDOPS-LABEL: and2:
952 ; RV64XVENTANACONDOPS:       # %bb.0:
953 ; RV64XVENTANACONDOPS-NEXT:    and a1, a1, a2
954 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
955 ; RV64XVENTANACONDOPS-NEXT:    or a0, a1, a0
956 ; RV64XVENTANACONDOPS-NEXT:    ret
958 ; RV64XTHEADCONDMOV-LABEL: and2:
959 ; RV64XTHEADCONDMOV:       # %bb.0:
960 ; RV64XTHEADCONDMOV-NEXT:    and a1, a1, a2
961 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, a2, a0
962 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
963 ; RV64XTHEADCONDMOV-NEXT:    ret
965 ; RV32ZICOND-LABEL: and2:
966 ; RV32ZICOND:       # %bb.0:
967 ; RV32ZICOND-NEXT:    and a5, a2, a4
968 ; RV32ZICOND-NEXT:    and a1, a1, a3
969 ; RV32ZICOND-NEXT:    czero.nez a2, a3, a0
970 ; RV32ZICOND-NEXT:    or a2, a1, a2
971 ; RV32ZICOND-NEXT:    czero.nez a1, a4, a0
972 ; RV32ZICOND-NEXT:    or a1, a5, a1
973 ; RV32ZICOND-NEXT:    mv a0, a2
974 ; RV32ZICOND-NEXT:    ret
976 ; RV64ZICOND-LABEL: and2:
977 ; RV64ZICOND:       # %bb.0:
978 ; RV64ZICOND-NEXT:    and a1, a1, a2
979 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
980 ; RV64ZICOND-NEXT:    or a0, a1, a0
981 ; RV64ZICOND-NEXT:    ret
982   %and = and i64 %rs1, %rs2
983   %sel = select i1 %rc, i64 %and, i64 %rs2
984   ret i64 %sel
987 define i64 @and3(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
988 ; RV32I-LABEL: and3:
989 ; RV32I:       # %bb.0:
990 ; RV32I-NEXT:    bnez a0, .LBB20_2
991 ; RV32I-NEXT:  # %bb.1:
992 ; RV32I-NEXT:    and a2, a2, a4
993 ; RV32I-NEXT:    and a1, a1, a3
994 ; RV32I-NEXT:  .LBB20_2:
995 ; RV32I-NEXT:    mv a0, a1
996 ; RV32I-NEXT:    mv a1, a2
997 ; RV32I-NEXT:    ret
999 ; RV64I-LABEL: and3:
1000 ; RV64I:       # %bb.0:
1001 ; RV64I-NEXT:    bnez a0, .LBB20_2
1002 ; RV64I-NEXT:  # %bb.1:
1003 ; RV64I-NEXT:    and a1, a1, a2
1004 ; RV64I-NEXT:  .LBB20_2:
1005 ; RV64I-NEXT:    mv a0, a1
1006 ; RV64I-NEXT:    ret
1008 ; RV64XVENTANACONDOPS-LABEL: and3:
1009 ; RV64XVENTANACONDOPS:       # %bb.0:
1010 ; RV64XVENTANACONDOPS-NEXT:    and a2, a1, a2
1011 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
1012 ; RV64XVENTANACONDOPS-NEXT:    or a0, a2, a0
1013 ; RV64XVENTANACONDOPS-NEXT:    ret
1015 ; RV64XTHEADCONDMOV-LABEL: and3:
1016 ; RV64XTHEADCONDMOV:       # %bb.0:
1017 ; RV64XTHEADCONDMOV-NEXT:    and a2, a1, a2
1018 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a1, a0
1019 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1020 ; RV64XTHEADCONDMOV-NEXT:    ret
1022 ; RV32ZICOND-LABEL: and3:
1023 ; RV32ZICOND:       # %bb.0:
1024 ; RV32ZICOND-NEXT:    and a4, a2, a4
1025 ; RV32ZICOND-NEXT:    and a3, a1, a3
1026 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a0
1027 ; RV32ZICOND-NEXT:    or a3, a3, a1
1028 ; RV32ZICOND-NEXT:    czero.eqz a1, a2, a0
1029 ; RV32ZICOND-NEXT:    or a1, a4, a1
1030 ; RV32ZICOND-NEXT:    mv a0, a3
1031 ; RV32ZICOND-NEXT:    ret
1033 ; RV64ZICOND-LABEL: and3:
1034 ; RV64ZICOND:       # %bb.0:
1035 ; RV64ZICOND-NEXT:    and a2, a1, a2
1036 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
1037 ; RV64ZICOND-NEXT:    or a0, a2, a0
1038 ; RV64ZICOND-NEXT:    ret
1039   %and = and i64 %rs1, %rs2
1040   %sel = select i1 %rc, i64 %rs1, i64 %and
1041   ret i64 %sel
1044 define i64 @and4(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
1045 ; RV32I-LABEL: and4:
1046 ; RV32I:       # %bb.0:
1047 ; RV32I-NEXT:    bnez a0, .LBB21_2
1048 ; RV32I-NEXT:  # %bb.1:
1049 ; RV32I-NEXT:    and a4, a2, a4
1050 ; RV32I-NEXT:    and a3, a1, a3
1051 ; RV32I-NEXT:  .LBB21_2:
1052 ; RV32I-NEXT:    mv a0, a3
1053 ; RV32I-NEXT:    mv a1, a4
1054 ; RV32I-NEXT:    ret
1056 ; RV64I-LABEL: and4:
1057 ; RV64I:       # %bb.0:
1058 ; RV64I-NEXT:    bnez a0, .LBB21_2
1059 ; RV64I-NEXT:  # %bb.1:
1060 ; RV64I-NEXT:    and a2, a1, a2
1061 ; RV64I-NEXT:  .LBB21_2:
1062 ; RV64I-NEXT:    mv a0, a2
1063 ; RV64I-NEXT:    ret
1065 ; RV64XVENTANACONDOPS-LABEL: and4:
1066 ; RV64XVENTANACONDOPS:       # %bb.0:
1067 ; RV64XVENTANACONDOPS-NEXT:    and a1, a1, a2
1068 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
1069 ; RV64XVENTANACONDOPS-NEXT:    or a0, a1, a0
1070 ; RV64XVENTANACONDOPS-NEXT:    ret
1072 ; RV64XTHEADCONDMOV-LABEL: and4:
1073 ; RV64XTHEADCONDMOV:       # %bb.0:
1074 ; RV64XTHEADCONDMOV-NEXT:    and a1, a1, a2
1075 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, a2, a0
1076 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
1077 ; RV64XTHEADCONDMOV-NEXT:    ret
1079 ; RV32ZICOND-LABEL: and4:
1080 ; RV32ZICOND:       # %bb.0:
1081 ; RV32ZICOND-NEXT:    and a5, a2, a4
1082 ; RV32ZICOND-NEXT:    and a1, a1, a3
1083 ; RV32ZICOND-NEXT:    czero.eqz a2, a3, a0
1084 ; RV32ZICOND-NEXT:    or a2, a1, a2
1085 ; RV32ZICOND-NEXT:    czero.eqz a1, a4, a0
1086 ; RV32ZICOND-NEXT:    or a1, a5, a1
1087 ; RV32ZICOND-NEXT:    mv a0, a2
1088 ; RV32ZICOND-NEXT:    ret
1090 ; RV64ZICOND-LABEL: and4:
1091 ; RV64ZICOND:       # %bb.0:
1092 ; RV64ZICOND-NEXT:    and a1, a1, a2
1093 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1094 ; RV64ZICOND-NEXT:    or a0, a1, a0
1095 ; RV64ZICOND-NEXT:    ret
1096   %and = and i64 %rs1, %rs2
1097   %sel = select i1 %rc, i64 %rs2, i64 %and
1098   ret i64 %sel
1101 define i64 @basic(i1 zeroext %rc, i64 %rs1, i64 %rs2) {
1102 ; RV32I-LABEL: basic:
1103 ; RV32I:       # %bb.0:
1104 ; RV32I-NEXT:    bnez a0, .LBB22_2
1105 ; RV32I-NEXT:  # %bb.1:
1106 ; RV32I-NEXT:    mv a1, a3
1107 ; RV32I-NEXT:    mv a2, a4
1108 ; RV32I-NEXT:  .LBB22_2:
1109 ; RV32I-NEXT:    mv a0, a1
1110 ; RV32I-NEXT:    mv a1, a2
1111 ; RV32I-NEXT:    ret
1113 ; RV64I-LABEL: basic:
1114 ; RV64I:       # %bb.0:
1115 ; RV64I-NEXT:    bnez a0, .LBB22_2
1116 ; RV64I-NEXT:  # %bb.1:
1117 ; RV64I-NEXT:    mv a1, a2
1118 ; RV64I-NEXT:  .LBB22_2:
1119 ; RV64I-NEXT:    mv a0, a1
1120 ; RV64I-NEXT:    ret
1122 ; RV64XVENTANACONDOPS-LABEL: basic:
1123 ; RV64XVENTANACONDOPS:       # %bb.0:
1124 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a2, a2, a0
1125 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
1126 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
1127 ; RV64XVENTANACONDOPS-NEXT:    ret
1129 ; RV64XTHEADCONDMOV-LABEL: basic:
1130 ; RV64XTHEADCONDMOV:       # %bb.0:
1131 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, a2, a0
1132 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
1133 ; RV64XTHEADCONDMOV-NEXT:    ret
1135 ; RV32ZICOND-LABEL: basic:
1136 ; RV32ZICOND:       # %bb.0:
1137 ; RV32ZICOND-NEXT:    czero.nez a3, a3, a0
1138 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a0
1139 ; RV32ZICOND-NEXT:    or a3, a1, a3
1140 ; RV32ZICOND-NEXT:    czero.nez a1, a4, a0
1141 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a0
1142 ; RV32ZICOND-NEXT:    or a1, a0, a1
1143 ; RV32ZICOND-NEXT:    mv a0, a3
1144 ; RV32ZICOND-NEXT:    ret
1146 ; RV64ZICOND-LABEL: basic:
1147 ; RV64ZICOND:       # %bb.0:
1148 ; RV64ZICOND-NEXT:    czero.nez a2, a2, a0
1149 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
1150 ; RV64ZICOND-NEXT:    or a0, a0, a2
1151 ; RV64ZICOND-NEXT:    ret
1152   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1153   ret i64 %sel
1156 define i64 @seteq(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1157 ; RV32I-LABEL: seteq:
1158 ; RV32I:       # %bb.0:
1159 ; RV32I-NEXT:    xor a1, a1, a3
1160 ; RV32I-NEXT:    xor a0, a0, a2
1161 ; RV32I-NEXT:    or a2, a0, a1
1162 ; RV32I-NEXT:    mv a1, a5
1163 ; RV32I-NEXT:    mv a0, a4
1164 ; RV32I-NEXT:    beqz a2, .LBB23_2
1165 ; RV32I-NEXT:  # %bb.1:
1166 ; RV32I-NEXT:    mv a0, a6
1167 ; RV32I-NEXT:    mv a1, a7
1168 ; RV32I-NEXT:  .LBB23_2:
1169 ; RV32I-NEXT:    ret
1171 ; RV64I-LABEL: seteq:
1172 ; RV64I:       # %bb.0:
1173 ; RV64I-NEXT:    beq a0, a1, .LBB23_2
1174 ; RV64I-NEXT:  # %bb.1:
1175 ; RV64I-NEXT:    mv a2, a3
1176 ; RV64I-NEXT:  .LBB23_2:
1177 ; RV64I-NEXT:    mv a0, a2
1178 ; RV64I-NEXT:    ret
1180 ; RV64XVENTANACONDOPS-LABEL: seteq:
1181 ; RV64XVENTANACONDOPS:       # %bb.0:
1182 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
1183 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a3, a0
1184 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
1185 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1186 ; RV64XVENTANACONDOPS-NEXT:    ret
1188 ; RV64XTHEADCONDMOV-LABEL: seteq:
1189 ; RV64XTHEADCONDMOV:       # %bb.0:
1190 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
1191 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a3, a0
1192 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1193 ; RV64XTHEADCONDMOV-NEXT:    ret
1195 ; RV32ZICOND-LABEL: seteq:
1196 ; RV32ZICOND:       # %bb.0:
1197 ; RV32ZICOND-NEXT:    xor a1, a1, a3
1198 ; RV32ZICOND-NEXT:    xor a0, a0, a2
1199 ; RV32ZICOND-NEXT:    or a1, a0, a1
1200 ; RV32ZICOND-NEXT:    czero.eqz a0, a6, a1
1201 ; RV32ZICOND-NEXT:    czero.nez a2, a4, a1
1202 ; RV32ZICOND-NEXT:    or a0, a2, a0
1203 ; RV32ZICOND-NEXT:    czero.eqz a2, a7, a1
1204 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
1205 ; RV32ZICOND-NEXT:    or a1, a1, a2
1206 ; RV32ZICOND-NEXT:    ret
1208 ; RV64ZICOND-LABEL: seteq:
1209 ; RV64ZICOND:       # %bb.0:
1210 ; RV64ZICOND-NEXT:    xor a0, a0, a1
1211 ; RV64ZICOND-NEXT:    czero.eqz a1, a3, a0
1212 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
1213 ; RV64ZICOND-NEXT:    or a0, a0, a1
1214 ; RV64ZICOND-NEXT:    ret
1215   %rc = icmp eq i64 %a, %b
1216   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1217   ret i64 %sel
1220 define i64 @setne(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1221 ; RV32I-LABEL: setne:
1222 ; RV32I:       # %bb.0:
1223 ; RV32I-NEXT:    xor a1, a1, a3
1224 ; RV32I-NEXT:    xor a0, a0, a2
1225 ; RV32I-NEXT:    or a2, a0, a1
1226 ; RV32I-NEXT:    mv a1, a5
1227 ; RV32I-NEXT:    mv a0, a4
1228 ; RV32I-NEXT:    bnez a2, .LBB24_2
1229 ; RV32I-NEXT:  # %bb.1:
1230 ; RV32I-NEXT:    mv a0, a6
1231 ; RV32I-NEXT:    mv a1, a7
1232 ; RV32I-NEXT:  .LBB24_2:
1233 ; RV32I-NEXT:    ret
1235 ; RV64I-LABEL: setne:
1236 ; RV64I:       # %bb.0:
1237 ; RV64I-NEXT:    bne a0, a1, .LBB24_2
1238 ; RV64I-NEXT:  # %bb.1:
1239 ; RV64I-NEXT:    mv a2, a3
1240 ; RV64I-NEXT:  .LBB24_2:
1241 ; RV64I-NEXT:    mv a0, a2
1242 ; RV64I-NEXT:    ret
1244 ; RV64XVENTANACONDOPS-LABEL: setne:
1245 ; RV64XVENTANACONDOPS:       # %bb.0:
1246 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
1247 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a1, a3, a0
1248 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
1249 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1250 ; RV64XVENTANACONDOPS-NEXT:    ret
1252 ; RV64XTHEADCONDMOV-LABEL: setne:
1253 ; RV64XTHEADCONDMOV:       # %bb.0:
1254 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
1255 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a3, a0
1256 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1257 ; RV64XTHEADCONDMOV-NEXT:    ret
1259 ; RV32ZICOND-LABEL: setne:
1260 ; RV32ZICOND:       # %bb.0:
1261 ; RV32ZICOND-NEXT:    xor a1, a1, a3
1262 ; RV32ZICOND-NEXT:    xor a0, a0, a2
1263 ; RV32ZICOND-NEXT:    or a1, a0, a1
1264 ; RV32ZICOND-NEXT:    czero.nez a0, a6, a1
1265 ; RV32ZICOND-NEXT:    czero.eqz a2, a4, a1
1266 ; RV32ZICOND-NEXT:    or a0, a2, a0
1267 ; RV32ZICOND-NEXT:    czero.nez a2, a7, a1
1268 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
1269 ; RV32ZICOND-NEXT:    or a1, a1, a2
1270 ; RV32ZICOND-NEXT:    ret
1272 ; RV64ZICOND-LABEL: setne:
1273 ; RV64ZICOND:       # %bb.0:
1274 ; RV64ZICOND-NEXT:    xor a0, a0, a1
1275 ; RV64ZICOND-NEXT:    czero.nez a1, a3, a0
1276 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1277 ; RV64ZICOND-NEXT:    or a0, a0, a1
1278 ; RV64ZICOND-NEXT:    ret
1279   %rc = icmp ne i64 %a, %b
1280   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1281   ret i64 %sel
1284 define i64 @setgt(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1285 ; RV32I-LABEL: setgt:
1286 ; RV32I:       # %bb.0:
1287 ; RV32I-NEXT:    beq a1, a3, .LBB25_2
1288 ; RV32I-NEXT:  # %bb.1:
1289 ; RV32I-NEXT:    slt a0, a3, a1
1290 ; RV32I-NEXT:    beqz a0, .LBB25_3
1291 ; RV32I-NEXT:    j .LBB25_4
1292 ; RV32I-NEXT:  .LBB25_2:
1293 ; RV32I-NEXT:    sltu a0, a2, a0
1294 ; RV32I-NEXT:    bnez a0, .LBB25_4
1295 ; RV32I-NEXT:  .LBB25_3:
1296 ; RV32I-NEXT:    mv a4, a6
1297 ; RV32I-NEXT:    mv a5, a7
1298 ; RV32I-NEXT:  .LBB25_4:
1299 ; RV32I-NEXT:    mv a0, a4
1300 ; RV32I-NEXT:    mv a1, a5
1301 ; RV32I-NEXT:    ret
1303 ; RV64I-LABEL: setgt:
1304 ; RV64I:       # %bb.0:
1305 ; RV64I-NEXT:    blt a1, a0, .LBB25_2
1306 ; RV64I-NEXT:  # %bb.1:
1307 ; RV64I-NEXT:    mv a2, a3
1308 ; RV64I-NEXT:  .LBB25_2:
1309 ; RV64I-NEXT:    mv a0, a2
1310 ; RV64I-NEXT:    ret
1312 ; RV64XVENTANACONDOPS-LABEL: setgt:
1313 ; RV64XVENTANACONDOPS:       # %bb.0:
1314 ; RV64XVENTANACONDOPS-NEXT:    slt a0, a1, a0
1315 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a1, a3, a0
1316 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
1317 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1318 ; RV64XVENTANACONDOPS-NEXT:    ret
1320 ; RV64XTHEADCONDMOV-LABEL: setgt:
1321 ; RV64XTHEADCONDMOV:       # %bb.0:
1322 ; RV64XTHEADCONDMOV-NEXT:    slt a0, a1, a0
1323 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a3, a0
1324 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1325 ; RV64XTHEADCONDMOV-NEXT:    ret
1327 ; RV32ZICOND-LABEL: setgt:
1328 ; RV32ZICOND:       # %bb.0:
1329 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1330 ; RV32ZICOND-NEXT:    slt a1, a3, a1
1331 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1332 ; RV32ZICOND-NEXT:    sltu a0, a2, a0
1333 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1334 ; RV32ZICOND-NEXT:    or a1, a0, a1
1335 ; RV32ZICOND-NEXT:    czero.nez a0, a6, a1
1336 ; RV32ZICOND-NEXT:    czero.eqz a2, a4, a1
1337 ; RV32ZICOND-NEXT:    or a0, a2, a0
1338 ; RV32ZICOND-NEXT:    czero.nez a2, a7, a1
1339 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
1340 ; RV32ZICOND-NEXT:    or a1, a1, a2
1341 ; RV32ZICOND-NEXT:    ret
1343 ; RV64ZICOND-LABEL: setgt:
1344 ; RV64ZICOND:       # %bb.0:
1345 ; RV64ZICOND-NEXT:    slt a0, a1, a0
1346 ; RV64ZICOND-NEXT:    czero.nez a1, a3, a0
1347 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1348 ; RV64ZICOND-NEXT:    or a0, a0, a1
1349 ; RV64ZICOND-NEXT:    ret
1350   %rc = icmp sgt i64 %a, %b
1351   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1352   ret i64 %sel
1355 define i64 @setge(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1356 ; RV32I-LABEL: setge:
1357 ; RV32I:       # %bb.0:
1358 ; RV32I-NEXT:    beq a1, a3, .LBB26_2
1359 ; RV32I-NEXT:  # %bb.1:
1360 ; RV32I-NEXT:    slt a0, a1, a3
1361 ; RV32I-NEXT:    bnez a0, .LBB26_3
1362 ; RV32I-NEXT:    j .LBB26_4
1363 ; RV32I-NEXT:  .LBB26_2:
1364 ; RV32I-NEXT:    sltu a0, a0, a2
1365 ; RV32I-NEXT:    beqz a0, .LBB26_4
1366 ; RV32I-NEXT:  .LBB26_3:
1367 ; RV32I-NEXT:    mv a4, a6
1368 ; RV32I-NEXT:    mv a5, a7
1369 ; RV32I-NEXT:  .LBB26_4:
1370 ; RV32I-NEXT:    mv a0, a4
1371 ; RV32I-NEXT:    mv a1, a5
1372 ; RV32I-NEXT:    ret
1374 ; RV64I-LABEL: setge:
1375 ; RV64I:       # %bb.0:
1376 ; RV64I-NEXT:    bge a0, a1, .LBB26_2
1377 ; RV64I-NEXT:  # %bb.1:
1378 ; RV64I-NEXT:    mv a2, a3
1379 ; RV64I-NEXT:  .LBB26_2:
1380 ; RV64I-NEXT:    mv a0, a2
1381 ; RV64I-NEXT:    ret
1383 ; RV64XVENTANACONDOPS-LABEL: setge:
1384 ; RV64XVENTANACONDOPS:       # %bb.0:
1385 ; RV64XVENTANACONDOPS-NEXT:    slt a0, a0, a1
1386 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a3, a0
1387 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
1388 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1389 ; RV64XVENTANACONDOPS-NEXT:    ret
1391 ; RV64XTHEADCONDMOV-LABEL: setge:
1392 ; RV64XTHEADCONDMOV:       # %bb.0:
1393 ; RV64XTHEADCONDMOV-NEXT:    slt a0, a0, a1
1394 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a3, a0
1395 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1396 ; RV64XTHEADCONDMOV-NEXT:    ret
1398 ; RV32ZICOND-LABEL: setge:
1399 ; RV32ZICOND:       # %bb.0:
1400 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1401 ; RV32ZICOND-NEXT:    slt a1, a1, a3
1402 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1403 ; RV32ZICOND-NEXT:    sltu a0, a0, a2
1404 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1405 ; RV32ZICOND-NEXT:    or a1, a0, a1
1406 ; RV32ZICOND-NEXT:    czero.eqz a0, a6, a1
1407 ; RV32ZICOND-NEXT:    czero.nez a2, a4, a1
1408 ; RV32ZICOND-NEXT:    or a0, a2, a0
1409 ; RV32ZICOND-NEXT:    czero.eqz a2, a7, a1
1410 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
1411 ; RV32ZICOND-NEXT:    or a1, a1, a2
1412 ; RV32ZICOND-NEXT:    ret
1414 ; RV64ZICOND-LABEL: setge:
1415 ; RV64ZICOND:       # %bb.0:
1416 ; RV64ZICOND-NEXT:    slt a0, a0, a1
1417 ; RV64ZICOND-NEXT:    czero.eqz a1, a3, a0
1418 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
1419 ; RV64ZICOND-NEXT:    or a0, a0, a1
1420 ; RV64ZICOND-NEXT:    ret
1421   %rc = icmp sge i64 %a, %b
1422   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1423   ret i64 %sel
1426 define i64 @setlt(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1427 ; RV32I-LABEL: setlt:
1428 ; RV32I:       # %bb.0:
1429 ; RV32I-NEXT:    beq a1, a3, .LBB27_2
1430 ; RV32I-NEXT:  # %bb.1:
1431 ; RV32I-NEXT:    slt a0, a1, a3
1432 ; RV32I-NEXT:    beqz a0, .LBB27_3
1433 ; RV32I-NEXT:    j .LBB27_4
1434 ; RV32I-NEXT:  .LBB27_2:
1435 ; RV32I-NEXT:    sltu a0, a0, a2
1436 ; RV32I-NEXT:    bnez a0, .LBB27_4
1437 ; RV32I-NEXT:  .LBB27_3:
1438 ; RV32I-NEXT:    mv a4, a6
1439 ; RV32I-NEXT:    mv a5, a7
1440 ; RV32I-NEXT:  .LBB27_4:
1441 ; RV32I-NEXT:    mv a0, a4
1442 ; RV32I-NEXT:    mv a1, a5
1443 ; RV32I-NEXT:    ret
1445 ; RV64I-LABEL: setlt:
1446 ; RV64I:       # %bb.0:
1447 ; RV64I-NEXT:    blt a0, a1, .LBB27_2
1448 ; RV64I-NEXT:  # %bb.1:
1449 ; RV64I-NEXT:    mv a2, a3
1450 ; RV64I-NEXT:  .LBB27_2:
1451 ; RV64I-NEXT:    mv a0, a2
1452 ; RV64I-NEXT:    ret
1454 ; RV64XVENTANACONDOPS-LABEL: setlt:
1455 ; RV64XVENTANACONDOPS:       # %bb.0:
1456 ; RV64XVENTANACONDOPS-NEXT:    slt a0, a0, a1
1457 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a1, a3, a0
1458 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
1459 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1460 ; RV64XVENTANACONDOPS-NEXT:    ret
1462 ; RV64XTHEADCONDMOV-LABEL: setlt:
1463 ; RV64XTHEADCONDMOV:       # %bb.0:
1464 ; RV64XTHEADCONDMOV-NEXT:    slt a0, a0, a1
1465 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a3, a0
1466 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1467 ; RV64XTHEADCONDMOV-NEXT:    ret
1469 ; RV32ZICOND-LABEL: setlt:
1470 ; RV32ZICOND:       # %bb.0:
1471 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1472 ; RV32ZICOND-NEXT:    slt a1, a1, a3
1473 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1474 ; RV32ZICOND-NEXT:    sltu a0, a0, a2
1475 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1476 ; RV32ZICOND-NEXT:    or a1, a0, a1
1477 ; RV32ZICOND-NEXT:    czero.nez a0, a6, a1
1478 ; RV32ZICOND-NEXT:    czero.eqz a2, a4, a1
1479 ; RV32ZICOND-NEXT:    or a0, a2, a0
1480 ; RV32ZICOND-NEXT:    czero.nez a2, a7, a1
1481 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
1482 ; RV32ZICOND-NEXT:    or a1, a1, a2
1483 ; RV32ZICOND-NEXT:    ret
1485 ; RV64ZICOND-LABEL: setlt:
1486 ; RV64ZICOND:       # %bb.0:
1487 ; RV64ZICOND-NEXT:    slt a0, a0, a1
1488 ; RV64ZICOND-NEXT:    czero.nez a1, a3, a0
1489 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1490 ; RV64ZICOND-NEXT:    or a0, a0, a1
1491 ; RV64ZICOND-NEXT:    ret
1492   %rc = icmp slt i64 %a, %b
1493   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1494   ret i64 %sel
1497 define i64 @setle(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1498 ; RV32I-LABEL: setle:
1499 ; RV32I:       # %bb.0:
1500 ; RV32I-NEXT:    beq a1, a3, .LBB28_2
1501 ; RV32I-NEXT:  # %bb.1:
1502 ; RV32I-NEXT:    slt a0, a3, a1
1503 ; RV32I-NEXT:    bnez a0, .LBB28_3
1504 ; RV32I-NEXT:    j .LBB28_4
1505 ; RV32I-NEXT:  .LBB28_2:
1506 ; RV32I-NEXT:    sltu a0, a2, a0
1507 ; RV32I-NEXT:    beqz a0, .LBB28_4
1508 ; RV32I-NEXT:  .LBB28_3:
1509 ; RV32I-NEXT:    mv a4, a6
1510 ; RV32I-NEXT:    mv a5, a7
1511 ; RV32I-NEXT:  .LBB28_4:
1512 ; RV32I-NEXT:    mv a0, a4
1513 ; RV32I-NEXT:    mv a1, a5
1514 ; RV32I-NEXT:    ret
1516 ; RV64I-LABEL: setle:
1517 ; RV64I:       # %bb.0:
1518 ; RV64I-NEXT:    bge a1, a0, .LBB28_2
1519 ; RV64I-NEXT:  # %bb.1:
1520 ; RV64I-NEXT:    mv a2, a3
1521 ; RV64I-NEXT:  .LBB28_2:
1522 ; RV64I-NEXT:    mv a0, a2
1523 ; RV64I-NEXT:    ret
1525 ; RV64XVENTANACONDOPS-LABEL: setle:
1526 ; RV64XVENTANACONDOPS:       # %bb.0:
1527 ; RV64XVENTANACONDOPS-NEXT:    slt a0, a1, a0
1528 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a3, a0
1529 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
1530 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1531 ; RV64XVENTANACONDOPS-NEXT:    ret
1533 ; RV64XTHEADCONDMOV-LABEL: setle:
1534 ; RV64XTHEADCONDMOV:       # %bb.0:
1535 ; RV64XTHEADCONDMOV-NEXT:    slt a0, a1, a0
1536 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a3, a0
1537 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1538 ; RV64XTHEADCONDMOV-NEXT:    ret
1540 ; RV32ZICOND-LABEL: setle:
1541 ; RV32ZICOND:       # %bb.0:
1542 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1543 ; RV32ZICOND-NEXT:    slt a1, a3, a1
1544 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1545 ; RV32ZICOND-NEXT:    sltu a0, a2, a0
1546 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1547 ; RV32ZICOND-NEXT:    or a1, a0, a1
1548 ; RV32ZICOND-NEXT:    czero.eqz a0, a6, a1
1549 ; RV32ZICOND-NEXT:    czero.nez a2, a4, a1
1550 ; RV32ZICOND-NEXT:    or a0, a2, a0
1551 ; RV32ZICOND-NEXT:    czero.eqz a2, a7, a1
1552 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
1553 ; RV32ZICOND-NEXT:    or a1, a1, a2
1554 ; RV32ZICOND-NEXT:    ret
1556 ; RV64ZICOND-LABEL: setle:
1557 ; RV64ZICOND:       # %bb.0:
1558 ; RV64ZICOND-NEXT:    slt a0, a1, a0
1559 ; RV64ZICOND-NEXT:    czero.eqz a1, a3, a0
1560 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
1561 ; RV64ZICOND-NEXT:    or a0, a0, a1
1562 ; RV64ZICOND-NEXT:    ret
1563   %rc = icmp sle i64 %a, %b
1564   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1565   ret i64 %sel
1568 define i64 @setugt(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1569 ; RV32I-LABEL: setugt:
1570 ; RV32I:       # %bb.0:
1571 ; RV32I-NEXT:    beq a1, a3, .LBB29_2
1572 ; RV32I-NEXT:  # %bb.1:
1573 ; RV32I-NEXT:    sltu a0, a3, a1
1574 ; RV32I-NEXT:    beqz a0, .LBB29_3
1575 ; RV32I-NEXT:    j .LBB29_4
1576 ; RV32I-NEXT:  .LBB29_2:
1577 ; RV32I-NEXT:    sltu a0, a2, a0
1578 ; RV32I-NEXT:    bnez a0, .LBB29_4
1579 ; RV32I-NEXT:  .LBB29_3:
1580 ; RV32I-NEXT:    mv a4, a6
1581 ; RV32I-NEXT:    mv a5, a7
1582 ; RV32I-NEXT:  .LBB29_4:
1583 ; RV32I-NEXT:    mv a0, a4
1584 ; RV32I-NEXT:    mv a1, a5
1585 ; RV32I-NEXT:    ret
1587 ; RV64I-LABEL: setugt:
1588 ; RV64I:       # %bb.0:
1589 ; RV64I-NEXT:    bltu a1, a0, .LBB29_2
1590 ; RV64I-NEXT:  # %bb.1:
1591 ; RV64I-NEXT:    mv a2, a3
1592 ; RV64I-NEXT:  .LBB29_2:
1593 ; RV64I-NEXT:    mv a0, a2
1594 ; RV64I-NEXT:    ret
1596 ; RV64XVENTANACONDOPS-LABEL: setugt:
1597 ; RV64XVENTANACONDOPS:       # %bb.0:
1598 ; RV64XVENTANACONDOPS-NEXT:    sltu a0, a1, a0
1599 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a1, a3, a0
1600 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
1601 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1602 ; RV64XVENTANACONDOPS-NEXT:    ret
1604 ; RV64XTHEADCONDMOV-LABEL: setugt:
1605 ; RV64XTHEADCONDMOV:       # %bb.0:
1606 ; RV64XTHEADCONDMOV-NEXT:    sltu a0, a1, a0
1607 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a3, a0
1608 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1609 ; RV64XTHEADCONDMOV-NEXT:    ret
1611 ; RV32ZICOND-LABEL: setugt:
1612 ; RV32ZICOND:       # %bb.0:
1613 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1614 ; RV32ZICOND-NEXT:    sltu a1, a3, a1
1615 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1616 ; RV32ZICOND-NEXT:    sltu a0, a2, a0
1617 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1618 ; RV32ZICOND-NEXT:    or a1, a0, a1
1619 ; RV32ZICOND-NEXT:    czero.nez a0, a6, a1
1620 ; RV32ZICOND-NEXT:    czero.eqz a2, a4, a1
1621 ; RV32ZICOND-NEXT:    or a0, a2, a0
1622 ; RV32ZICOND-NEXT:    czero.nez a2, a7, a1
1623 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
1624 ; RV32ZICOND-NEXT:    or a1, a1, a2
1625 ; RV32ZICOND-NEXT:    ret
1627 ; RV64ZICOND-LABEL: setugt:
1628 ; RV64ZICOND:       # %bb.0:
1629 ; RV64ZICOND-NEXT:    sltu a0, a1, a0
1630 ; RV64ZICOND-NEXT:    czero.nez a1, a3, a0
1631 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1632 ; RV64ZICOND-NEXT:    or a0, a0, a1
1633 ; RV64ZICOND-NEXT:    ret
1634   %rc = icmp ugt i64 %a, %b
1635   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1636   ret i64 %sel
1639 define i64 @setuge(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1640 ; RV32I-LABEL: setuge:
1641 ; RV32I:       # %bb.0:
1642 ; RV32I-NEXT:    beq a1, a3, .LBB30_2
1643 ; RV32I-NEXT:  # %bb.1:
1644 ; RV32I-NEXT:    sltu a0, a1, a3
1645 ; RV32I-NEXT:    bnez a0, .LBB30_3
1646 ; RV32I-NEXT:    j .LBB30_4
1647 ; RV32I-NEXT:  .LBB30_2:
1648 ; RV32I-NEXT:    sltu a0, a0, a2
1649 ; RV32I-NEXT:    beqz a0, .LBB30_4
1650 ; RV32I-NEXT:  .LBB30_3:
1651 ; RV32I-NEXT:    mv a4, a6
1652 ; RV32I-NEXT:    mv a5, a7
1653 ; RV32I-NEXT:  .LBB30_4:
1654 ; RV32I-NEXT:    mv a0, a4
1655 ; RV32I-NEXT:    mv a1, a5
1656 ; RV32I-NEXT:    ret
1658 ; RV64I-LABEL: setuge:
1659 ; RV64I:       # %bb.0:
1660 ; RV64I-NEXT:    bgeu a0, a1, .LBB30_2
1661 ; RV64I-NEXT:  # %bb.1:
1662 ; RV64I-NEXT:    mv a2, a3
1663 ; RV64I-NEXT:  .LBB30_2:
1664 ; RV64I-NEXT:    mv a0, a2
1665 ; RV64I-NEXT:    ret
1667 ; RV64XVENTANACONDOPS-LABEL: setuge:
1668 ; RV64XVENTANACONDOPS:       # %bb.0:
1669 ; RV64XVENTANACONDOPS-NEXT:    sltu a0, a0, a1
1670 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a3, a0
1671 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
1672 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1673 ; RV64XVENTANACONDOPS-NEXT:    ret
1675 ; RV64XTHEADCONDMOV-LABEL: setuge:
1676 ; RV64XTHEADCONDMOV:       # %bb.0:
1677 ; RV64XTHEADCONDMOV-NEXT:    sltu a0, a0, a1
1678 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a3, a0
1679 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1680 ; RV64XTHEADCONDMOV-NEXT:    ret
1682 ; RV32ZICOND-LABEL: setuge:
1683 ; RV32ZICOND:       # %bb.0:
1684 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1685 ; RV32ZICOND-NEXT:    sltu a1, a1, a3
1686 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1687 ; RV32ZICOND-NEXT:    sltu a0, a0, a2
1688 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1689 ; RV32ZICOND-NEXT:    or a1, a0, a1
1690 ; RV32ZICOND-NEXT:    czero.eqz a0, a6, a1
1691 ; RV32ZICOND-NEXT:    czero.nez a2, a4, a1
1692 ; RV32ZICOND-NEXT:    or a0, a2, a0
1693 ; RV32ZICOND-NEXT:    czero.eqz a2, a7, a1
1694 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
1695 ; RV32ZICOND-NEXT:    or a1, a1, a2
1696 ; RV32ZICOND-NEXT:    ret
1698 ; RV64ZICOND-LABEL: setuge:
1699 ; RV64ZICOND:       # %bb.0:
1700 ; RV64ZICOND-NEXT:    sltu a0, a0, a1
1701 ; RV64ZICOND-NEXT:    czero.eqz a1, a3, a0
1702 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
1703 ; RV64ZICOND-NEXT:    or a0, a0, a1
1704 ; RV64ZICOND-NEXT:    ret
1705   %rc = icmp uge i64 %a, %b
1706   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1707   ret i64 %sel
1710 define i64 @setult(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1711 ; RV32I-LABEL: setult:
1712 ; RV32I:       # %bb.0:
1713 ; RV32I-NEXT:    beq a1, a3, .LBB31_2
1714 ; RV32I-NEXT:  # %bb.1:
1715 ; RV32I-NEXT:    sltu a0, a1, a3
1716 ; RV32I-NEXT:    beqz a0, .LBB31_3
1717 ; RV32I-NEXT:    j .LBB31_4
1718 ; RV32I-NEXT:  .LBB31_2:
1719 ; RV32I-NEXT:    sltu a0, a0, a2
1720 ; RV32I-NEXT:    bnez a0, .LBB31_4
1721 ; RV32I-NEXT:  .LBB31_3:
1722 ; RV32I-NEXT:    mv a4, a6
1723 ; RV32I-NEXT:    mv a5, a7
1724 ; RV32I-NEXT:  .LBB31_4:
1725 ; RV32I-NEXT:    mv a0, a4
1726 ; RV32I-NEXT:    mv a1, a5
1727 ; RV32I-NEXT:    ret
1729 ; RV64I-LABEL: setult:
1730 ; RV64I:       # %bb.0:
1731 ; RV64I-NEXT:    bltu a0, a1, .LBB31_2
1732 ; RV64I-NEXT:  # %bb.1:
1733 ; RV64I-NEXT:    mv a2, a3
1734 ; RV64I-NEXT:  .LBB31_2:
1735 ; RV64I-NEXT:    mv a0, a2
1736 ; RV64I-NEXT:    ret
1738 ; RV64XVENTANACONDOPS-LABEL: setult:
1739 ; RV64XVENTANACONDOPS:       # %bb.0:
1740 ; RV64XVENTANACONDOPS-NEXT:    sltu a0, a0, a1
1741 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a1, a3, a0
1742 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
1743 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1744 ; RV64XVENTANACONDOPS-NEXT:    ret
1746 ; RV64XTHEADCONDMOV-LABEL: setult:
1747 ; RV64XTHEADCONDMOV:       # %bb.0:
1748 ; RV64XTHEADCONDMOV-NEXT:    sltu a0, a0, a1
1749 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, a3, a0
1750 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1751 ; RV64XTHEADCONDMOV-NEXT:    ret
1753 ; RV32ZICOND-LABEL: setult:
1754 ; RV32ZICOND:       # %bb.0:
1755 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1756 ; RV32ZICOND-NEXT:    sltu a1, a1, a3
1757 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1758 ; RV32ZICOND-NEXT:    sltu a0, a0, a2
1759 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1760 ; RV32ZICOND-NEXT:    or a1, a0, a1
1761 ; RV32ZICOND-NEXT:    czero.nez a0, a6, a1
1762 ; RV32ZICOND-NEXT:    czero.eqz a2, a4, a1
1763 ; RV32ZICOND-NEXT:    or a0, a2, a0
1764 ; RV32ZICOND-NEXT:    czero.nez a2, a7, a1
1765 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
1766 ; RV32ZICOND-NEXT:    or a1, a1, a2
1767 ; RV32ZICOND-NEXT:    ret
1769 ; RV64ZICOND-LABEL: setult:
1770 ; RV64ZICOND:       # %bb.0:
1771 ; RV64ZICOND-NEXT:    sltu a0, a0, a1
1772 ; RV64ZICOND-NEXT:    czero.nez a1, a3, a0
1773 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
1774 ; RV64ZICOND-NEXT:    or a0, a0, a1
1775 ; RV64ZICOND-NEXT:    ret
1776   %rc = icmp ult i64 %a, %b
1777   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1778   ret i64 %sel
1781 define i64 @setule(i64 %a, i64 %b, i64 %rs1, i64 %rs2) {
1782 ; RV32I-LABEL: setule:
1783 ; RV32I:       # %bb.0:
1784 ; RV32I-NEXT:    beq a1, a3, .LBB32_2
1785 ; RV32I-NEXT:  # %bb.1:
1786 ; RV32I-NEXT:    sltu a0, a3, a1
1787 ; RV32I-NEXT:    bnez a0, .LBB32_3
1788 ; RV32I-NEXT:    j .LBB32_4
1789 ; RV32I-NEXT:  .LBB32_2:
1790 ; RV32I-NEXT:    sltu a0, a2, a0
1791 ; RV32I-NEXT:    beqz a0, .LBB32_4
1792 ; RV32I-NEXT:  .LBB32_3:
1793 ; RV32I-NEXT:    mv a4, a6
1794 ; RV32I-NEXT:    mv a5, a7
1795 ; RV32I-NEXT:  .LBB32_4:
1796 ; RV32I-NEXT:    mv a0, a4
1797 ; RV32I-NEXT:    mv a1, a5
1798 ; RV32I-NEXT:    ret
1800 ; RV64I-LABEL: setule:
1801 ; RV64I:       # %bb.0:
1802 ; RV64I-NEXT:    bgeu a1, a0, .LBB32_2
1803 ; RV64I-NEXT:  # %bb.1:
1804 ; RV64I-NEXT:    mv a2, a3
1805 ; RV64I-NEXT:  .LBB32_2:
1806 ; RV64I-NEXT:    mv a0, a2
1807 ; RV64I-NEXT:    ret
1809 ; RV64XVENTANACONDOPS-LABEL: setule:
1810 ; RV64XVENTANACONDOPS:       # %bb.0:
1811 ; RV64XVENTANACONDOPS-NEXT:    sltu a0, a1, a0
1812 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a3, a0
1813 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
1814 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
1815 ; RV64XVENTANACONDOPS-NEXT:    ret
1817 ; RV64XTHEADCONDMOV-LABEL: setule:
1818 ; RV64XTHEADCONDMOV:       # %bb.0:
1819 ; RV64XTHEADCONDMOV-NEXT:    sltu a0, a1, a0
1820 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, a3, a0
1821 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
1822 ; RV64XTHEADCONDMOV-NEXT:    ret
1824 ; RV32ZICOND-LABEL: setule:
1825 ; RV32ZICOND:       # %bb.0:
1826 ; RV32ZICOND-NEXT:    xor t0, a1, a3
1827 ; RV32ZICOND-NEXT:    sltu a1, a3, a1
1828 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, t0
1829 ; RV32ZICOND-NEXT:    sltu a0, a2, a0
1830 ; RV32ZICOND-NEXT:    czero.nez a0, a0, t0
1831 ; RV32ZICOND-NEXT:    or a1, a0, a1
1832 ; RV32ZICOND-NEXT:    czero.eqz a0, a6, a1
1833 ; RV32ZICOND-NEXT:    czero.nez a2, a4, a1
1834 ; RV32ZICOND-NEXT:    or a0, a2, a0
1835 ; RV32ZICOND-NEXT:    czero.eqz a2, a7, a1
1836 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
1837 ; RV32ZICOND-NEXT:    or a1, a1, a2
1838 ; RV32ZICOND-NEXT:    ret
1840 ; RV64ZICOND-LABEL: setule:
1841 ; RV64ZICOND:       # %bb.0:
1842 ; RV64ZICOND-NEXT:    sltu a0, a1, a0
1843 ; RV64ZICOND-NEXT:    czero.eqz a1, a3, a0
1844 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
1845 ; RV64ZICOND-NEXT:    or a0, a0, a1
1846 ; RV64ZICOND-NEXT:    ret
1847   %rc = icmp ule i64 %a, %b
1848   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1849   ret i64 %sel
1852 define i64 @seteq_zero(i64 %a, i64 %rs1, i64 %rs2) {
1853 ; RV32I-LABEL: seteq_zero:
1854 ; RV32I:       # %bb.0:
1855 ; RV32I-NEXT:    or a6, a0, a1
1856 ; RV32I-NEXT:    mv a1, a3
1857 ; RV32I-NEXT:    mv a0, a2
1858 ; RV32I-NEXT:    beqz a6, .LBB33_2
1859 ; RV32I-NEXT:  # %bb.1:
1860 ; RV32I-NEXT:    mv a0, a4
1861 ; RV32I-NEXT:    mv a1, a5
1862 ; RV32I-NEXT:  .LBB33_2:
1863 ; RV32I-NEXT:    ret
1865 ; RV64I-LABEL: seteq_zero:
1866 ; RV64I:       # %bb.0:
1867 ; RV64I-NEXT:    beqz a0, .LBB33_2
1868 ; RV64I-NEXT:  # %bb.1:
1869 ; RV64I-NEXT:    mv a1, a2
1870 ; RV64I-NEXT:  .LBB33_2:
1871 ; RV64I-NEXT:    mv a0, a1
1872 ; RV64I-NEXT:    ret
1874 ; RV64XVENTANACONDOPS-LABEL: seteq_zero:
1875 ; RV64XVENTANACONDOPS:       # %bb.0:
1876 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a2, a2, a0
1877 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
1878 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
1879 ; RV64XVENTANACONDOPS-NEXT:    ret
1881 ; RV64XTHEADCONDMOV-LABEL: seteq_zero:
1882 ; RV64XTHEADCONDMOV:       # %bb.0:
1883 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, a2, a0
1884 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
1885 ; RV64XTHEADCONDMOV-NEXT:    ret
1887 ; RV32ZICOND-LABEL: seteq_zero:
1888 ; RV32ZICOND:       # %bb.0:
1889 ; RV32ZICOND-NEXT:    or a1, a0, a1
1890 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
1891 ; RV32ZICOND-NEXT:    czero.nez a2, a2, a1
1892 ; RV32ZICOND-NEXT:    or a0, a2, a0
1893 ; RV32ZICOND-NEXT:    czero.eqz a2, a5, a1
1894 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
1895 ; RV32ZICOND-NEXT:    or a1, a1, a2
1896 ; RV32ZICOND-NEXT:    ret
1898 ; RV64ZICOND-LABEL: seteq_zero:
1899 ; RV64ZICOND:       # %bb.0:
1900 ; RV64ZICOND-NEXT:    czero.eqz a2, a2, a0
1901 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
1902 ; RV64ZICOND-NEXT:    or a0, a0, a2
1903 ; RV64ZICOND-NEXT:    ret
1904   %rc = icmp eq i64 %a, 0
1905   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1906   ret i64 %sel
1909 define i64 @setne_zero(i64 %a, i64 %rs1, i64 %rs2) {
1910 ; RV32I-LABEL: setne_zero:
1911 ; RV32I:       # %bb.0:
1912 ; RV32I-NEXT:    or a6, a0, a1
1913 ; RV32I-NEXT:    mv a1, a3
1914 ; RV32I-NEXT:    mv a0, a2
1915 ; RV32I-NEXT:    bnez a6, .LBB34_2
1916 ; RV32I-NEXT:  # %bb.1:
1917 ; RV32I-NEXT:    mv a0, a4
1918 ; RV32I-NEXT:    mv a1, a5
1919 ; RV32I-NEXT:  .LBB34_2:
1920 ; RV32I-NEXT:    ret
1922 ; RV64I-LABEL: setne_zero:
1923 ; RV64I:       # %bb.0:
1924 ; RV64I-NEXT:    bnez a0, .LBB34_2
1925 ; RV64I-NEXT:  # %bb.1:
1926 ; RV64I-NEXT:    mv a1, a2
1927 ; RV64I-NEXT:  .LBB34_2:
1928 ; RV64I-NEXT:    mv a0, a1
1929 ; RV64I-NEXT:    ret
1931 ; RV64XVENTANACONDOPS-LABEL: setne_zero:
1932 ; RV64XVENTANACONDOPS:       # %bb.0:
1933 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a2, a2, a0
1934 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
1935 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
1936 ; RV64XVENTANACONDOPS-NEXT:    ret
1938 ; RV64XTHEADCONDMOV-LABEL: setne_zero:
1939 ; RV64XTHEADCONDMOV:       # %bb.0:
1940 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, a2, a0
1941 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
1942 ; RV64XTHEADCONDMOV-NEXT:    ret
1944 ; RV32ZICOND-LABEL: setne_zero:
1945 ; RV32ZICOND:       # %bb.0:
1946 ; RV32ZICOND-NEXT:    or a1, a0, a1
1947 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a1
1948 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a1
1949 ; RV32ZICOND-NEXT:    or a0, a2, a0
1950 ; RV32ZICOND-NEXT:    czero.nez a2, a5, a1
1951 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
1952 ; RV32ZICOND-NEXT:    or a1, a1, a2
1953 ; RV32ZICOND-NEXT:    ret
1955 ; RV64ZICOND-LABEL: setne_zero:
1956 ; RV64ZICOND:       # %bb.0:
1957 ; RV64ZICOND-NEXT:    czero.nez a2, a2, a0
1958 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
1959 ; RV64ZICOND-NEXT:    or a0, a0, a2
1960 ; RV64ZICOND-NEXT:    ret
1961   %rc = icmp ne i64 %a, 0
1962   %sel = select i1 %rc, i64 %rs1, i64 %rs2
1963   ret i64 %sel
1966 define i64 @seteq_constant(i64 %a, i64 %rs1, i64 %rs2) {
1967 ; RV32I-LABEL: seteq_constant:
1968 ; RV32I:       # %bb.0:
1969 ; RV32I-NEXT:    xori a0, a0, 123
1970 ; RV32I-NEXT:    or a6, a0, a1
1971 ; RV32I-NEXT:    mv a1, a3
1972 ; RV32I-NEXT:    mv a0, a2
1973 ; RV32I-NEXT:    beqz a6, .LBB35_2
1974 ; RV32I-NEXT:  # %bb.1:
1975 ; RV32I-NEXT:    mv a0, a4
1976 ; RV32I-NEXT:    mv a1, a5
1977 ; RV32I-NEXT:  .LBB35_2:
1978 ; RV32I-NEXT:    ret
1980 ; RV64I-LABEL: seteq_constant:
1981 ; RV64I:       # %bb.0:
1982 ; RV64I-NEXT:    li a3, 123
1983 ; RV64I-NEXT:    beq a0, a3, .LBB35_2
1984 ; RV64I-NEXT:  # %bb.1:
1985 ; RV64I-NEXT:    mv a1, a2
1986 ; RV64I-NEXT:  .LBB35_2:
1987 ; RV64I-NEXT:    mv a0, a1
1988 ; RV64I-NEXT:    ret
1990 ; RV64XVENTANACONDOPS-LABEL: seteq_constant:
1991 ; RV64XVENTANACONDOPS:       # %bb.0:
1992 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -123
1993 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a2, a2, a0
1994 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
1995 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
1996 ; RV64XVENTANACONDOPS-NEXT:    ret
1998 ; RV64XTHEADCONDMOV-LABEL: seteq_constant:
1999 ; RV64XTHEADCONDMOV:       # %bb.0:
2000 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, -123
2001 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, a2, a0
2002 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2003 ; RV64XTHEADCONDMOV-NEXT:    ret
2005 ; RV32ZICOND-LABEL: seteq_constant:
2006 ; RV32ZICOND:       # %bb.0:
2007 ; RV32ZICOND-NEXT:    xori a0, a0, 123
2008 ; RV32ZICOND-NEXT:    or a1, a0, a1
2009 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
2010 ; RV32ZICOND-NEXT:    czero.nez a2, a2, a1
2011 ; RV32ZICOND-NEXT:    or a0, a2, a0
2012 ; RV32ZICOND-NEXT:    czero.eqz a2, a5, a1
2013 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2014 ; RV32ZICOND-NEXT:    or a1, a1, a2
2015 ; RV32ZICOND-NEXT:    ret
2017 ; RV64ZICOND-LABEL: seteq_constant:
2018 ; RV64ZICOND:       # %bb.0:
2019 ; RV64ZICOND-NEXT:    addi a0, a0, -123
2020 ; RV64ZICOND-NEXT:    czero.eqz a2, a2, a0
2021 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2022 ; RV64ZICOND-NEXT:    or a0, a0, a2
2023 ; RV64ZICOND-NEXT:    ret
2024   %rc = icmp eq i64 %a, 123
2025   %sel = select i1 %rc, i64 %rs1, i64 %rs2
2026   ret i64 %sel
2029 define i64 @setne_constant(i64 %a, i64 %rs1, i64 %rs2) {
2030 ; RV32I-LABEL: setne_constant:
2031 ; RV32I:       # %bb.0:
2032 ; RV32I-NEXT:    xori a0, a0, 456
2033 ; RV32I-NEXT:    or a6, a0, a1
2034 ; RV32I-NEXT:    mv a1, a3
2035 ; RV32I-NEXT:    mv a0, a2
2036 ; RV32I-NEXT:    bnez a6, .LBB36_2
2037 ; RV32I-NEXT:  # %bb.1:
2038 ; RV32I-NEXT:    mv a0, a4
2039 ; RV32I-NEXT:    mv a1, a5
2040 ; RV32I-NEXT:  .LBB36_2:
2041 ; RV32I-NEXT:    ret
2043 ; RV64I-LABEL: setne_constant:
2044 ; RV64I:       # %bb.0:
2045 ; RV64I-NEXT:    li a3, 456
2046 ; RV64I-NEXT:    bne a0, a3, .LBB36_2
2047 ; RV64I-NEXT:  # %bb.1:
2048 ; RV64I-NEXT:    mv a1, a2
2049 ; RV64I-NEXT:  .LBB36_2:
2050 ; RV64I-NEXT:    mv a0, a1
2051 ; RV64I-NEXT:    ret
2053 ; RV64XVENTANACONDOPS-LABEL: setne_constant:
2054 ; RV64XVENTANACONDOPS:       # %bb.0:
2055 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -456
2056 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a2, a2, a0
2057 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2058 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
2059 ; RV64XVENTANACONDOPS-NEXT:    ret
2061 ; RV64XTHEADCONDMOV-LABEL: setne_constant:
2062 ; RV64XTHEADCONDMOV:       # %bb.0:
2063 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, -456
2064 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, a2, a0
2065 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2066 ; RV64XTHEADCONDMOV-NEXT:    ret
2068 ; RV32ZICOND-LABEL: setne_constant:
2069 ; RV32ZICOND:       # %bb.0:
2070 ; RV32ZICOND-NEXT:    xori a0, a0, 456
2071 ; RV32ZICOND-NEXT:    or a1, a0, a1
2072 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a1
2073 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a1
2074 ; RV32ZICOND-NEXT:    or a0, a2, a0
2075 ; RV32ZICOND-NEXT:    czero.nez a2, a5, a1
2076 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2077 ; RV32ZICOND-NEXT:    or a1, a1, a2
2078 ; RV32ZICOND-NEXT:    ret
2080 ; RV64ZICOND-LABEL: setne_constant:
2081 ; RV64ZICOND:       # %bb.0:
2082 ; RV64ZICOND-NEXT:    addi a0, a0, -456
2083 ; RV64ZICOND-NEXT:    czero.nez a2, a2, a0
2084 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2085 ; RV64ZICOND-NEXT:    or a0, a0, a2
2086 ; RV64ZICOND-NEXT:    ret
2087   %rc = icmp ne i64 %a, 456
2088   %sel = select i1 %rc, i64 %rs1, i64 %rs2
2089   ret i64 %sel
2092 define i64 @seteq_2048(i64 %a, i64 %rs1, i64 %rs2) {
2093 ; RV32I-LABEL: seteq_2048:
2094 ; RV32I:       # %bb.0:
2095 ; RV32I-NEXT:    binvi a0, a0, 11
2096 ; RV32I-NEXT:    or a6, a0, a1
2097 ; RV32I-NEXT:    mv a1, a3
2098 ; RV32I-NEXT:    mv a0, a2
2099 ; RV32I-NEXT:    beqz a6, .LBB37_2
2100 ; RV32I-NEXT:  # %bb.1:
2101 ; RV32I-NEXT:    mv a0, a4
2102 ; RV32I-NEXT:    mv a1, a5
2103 ; RV32I-NEXT:  .LBB37_2:
2104 ; RV32I-NEXT:    ret
2106 ; RV64I-LABEL: seteq_2048:
2107 ; RV64I:       # %bb.0:
2108 ; RV64I-NEXT:    bseti a3, zero, 11
2109 ; RV64I-NEXT:    beq a0, a3, .LBB37_2
2110 ; RV64I-NEXT:  # %bb.1:
2111 ; RV64I-NEXT:    mv a1, a2
2112 ; RV64I-NEXT:  .LBB37_2:
2113 ; RV64I-NEXT:    mv a0, a1
2114 ; RV64I-NEXT:    ret
2116 ; RV64XVENTANACONDOPS-LABEL: seteq_2048:
2117 ; RV64XVENTANACONDOPS:       # %bb.0:
2118 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -2048
2119 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a2, a2, a0
2120 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2121 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
2122 ; RV64XVENTANACONDOPS-NEXT:    ret
2124 ; RV64XTHEADCONDMOV-LABEL: seteq_2048:
2125 ; RV64XTHEADCONDMOV:       # %bb.0:
2126 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, -2048
2127 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, a2, a0
2128 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2129 ; RV64XTHEADCONDMOV-NEXT:    ret
2131 ; RV32ZICOND-LABEL: seteq_2048:
2132 ; RV32ZICOND:       # %bb.0:
2133 ; RV32ZICOND-NEXT:    binvi a0, a0, 11
2134 ; RV32ZICOND-NEXT:    or a1, a0, a1
2135 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
2136 ; RV32ZICOND-NEXT:    czero.nez a2, a2, a1
2137 ; RV32ZICOND-NEXT:    or a0, a2, a0
2138 ; RV32ZICOND-NEXT:    czero.eqz a2, a5, a1
2139 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2140 ; RV32ZICOND-NEXT:    or a1, a1, a2
2141 ; RV32ZICOND-NEXT:    ret
2143 ; RV64ZICOND-LABEL: seteq_2048:
2144 ; RV64ZICOND:       # %bb.0:
2145 ; RV64ZICOND-NEXT:    addi a0, a0, -2048
2146 ; RV64ZICOND-NEXT:    czero.eqz a2, a2, a0
2147 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2148 ; RV64ZICOND-NEXT:    or a0, a0, a2
2149 ; RV64ZICOND-NEXT:    ret
2150   %rc = icmp eq i64 %a, 2048
2151   %sel = select i1 %rc, i64 %rs1, i64 %rs2
2152   ret i64 %sel
2155 define i64 @seteq_neg2048(i64 %a, i64 %rs1, i64 %rs2) {
2156 ; RV32I-LABEL: seteq_neg2048:
2157 ; RV32I:       # %bb.0:
2158 ; RV32I-NEXT:    not a1, a1
2159 ; RV32I-NEXT:    xori a0, a0, -2048
2160 ; RV32I-NEXT:    or a6, a0, a1
2161 ; RV32I-NEXT:    mv a1, a3
2162 ; RV32I-NEXT:    mv a0, a2
2163 ; RV32I-NEXT:    beqz a6, .LBB38_2
2164 ; RV32I-NEXT:  # %bb.1:
2165 ; RV32I-NEXT:    mv a0, a4
2166 ; RV32I-NEXT:    mv a1, a5
2167 ; RV32I-NEXT:  .LBB38_2:
2168 ; RV32I-NEXT:    ret
2170 ; RV64I-LABEL: seteq_neg2048:
2171 ; RV64I:       # %bb.0:
2172 ; RV64I-NEXT:    li a3, -2048
2173 ; RV64I-NEXT:    beq a0, a3, .LBB38_2
2174 ; RV64I-NEXT:  # %bb.1:
2175 ; RV64I-NEXT:    mv a1, a2
2176 ; RV64I-NEXT:  .LBB38_2:
2177 ; RV64I-NEXT:    mv a0, a1
2178 ; RV64I-NEXT:    ret
2180 ; RV64XVENTANACONDOPS-LABEL: seteq_neg2048:
2181 ; RV64XVENTANACONDOPS:       # %bb.0:
2182 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
2183 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a2, a2, a0
2184 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2185 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
2186 ; RV64XVENTANACONDOPS-NEXT:    ret
2188 ; RV64XTHEADCONDMOV-LABEL: seteq_neg2048:
2189 ; RV64XTHEADCONDMOV:       # %bb.0:
2190 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
2191 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, a2, a0
2192 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2193 ; RV64XTHEADCONDMOV-NEXT:    ret
2195 ; RV32ZICOND-LABEL: seteq_neg2048:
2196 ; RV32ZICOND:       # %bb.0:
2197 ; RV32ZICOND-NEXT:    not a1, a1
2198 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
2199 ; RV32ZICOND-NEXT:    or a1, a0, a1
2200 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
2201 ; RV32ZICOND-NEXT:    czero.nez a2, a2, a1
2202 ; RV32ZICOND-NEXT:    or a0, a2, a0
2203 ; RV32ZICOND-NEXT:    czero.eqz a2, a5, a1
2204 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2205 ; RV32ZICOND-NEXT:    or a1, a1, a2
2206 ; RV32ZICOND-NEXT:    ret
2208 ; RV64ZICOND-LABEL: seteq_neg2048:
2209 ; RV64ZICOND:       # %bb.0:
2210 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
2211 ; RV64ZICOND-NEXT:    czero.eqz a2, a2, a0
2212 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2213 ; RV64ZICOND-NEXT:    or a0, a0, a2
2214 ; RV64ZICOND-NEXT:    ret
2215   %rc = icmp eq i64 %a, -2048
2216   %sel = select i1 %rc, i64 %rs1, i64 %rs2
2217   ret i64 %sel
2220 define i64 @setne_neg2048(i64 %a, i64 %rs1, i64 %rs2) {
2221 ; RV32I-LABEL: setne_neg2048:
2222 ; RV32I:       # %bb.0:
2223 ; RV32I-NEXT:    not a1, a1
2224 ; RV32I-NEXT:    xori a0, a0, -2048
2225 ; RV32I-NEXT:    or a6, a0, a1
2226 ; RV32I-NEXT:    mv a1, a3
2227 ; RV32I-NEXT:    mv a0, a2
2228 ; RV32I-NEXT:    bnez a6, .LBB39_2
2229 ; RV32I-NEXT:  # %bb.1:
2230 ; RV32I-NEXT:    mv a0, a4
2231 ; RV32I-NEXT:    mv a1, a5
2232 ; RV32I-NEXT:  .LBB39_2:
2233 ; RV32I-NEXT:    ret
2235 ; RV64I-LABEL: setne_neg2048:
2236 ; RV64I:       # %bb.0:
2237 ; RV64I-NEXT:    li a3, -2048
2238 ; RV64I-NEXT:    bne a0, a3, .LBB39_2
2239 ; RV64I-NEXT:  # %bb.1:
2240 ; RV64I-NEXT:    mv a1, a2
2241 ; RV64I-NEXT:  .LBB39_2:
2242 ; RV64I-NEXT:    mv a0, a1
2243 ; RV64I-NEXT:    ret
2245 ; RV64XVENTANACONDOPS-LABEL: setne_neg2048:
2246 ; RV64XVENTANACONDOPS:       # %bb.0:
2247 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
2248 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a2, a2, a0
2249 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2250 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a2
2251 ; RV64XVENTANACONDOPS-NEXT:    ret
2253 ; RV64XTHEADCONDMOV-LABEL: setne_neg2048:
2254 ; RV64XTHEADCONDMOV:       # %bb.0:
2255 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
2256 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, a2, a0
2257 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2258 ; RV64XTHEADCONDMOV-NEXT:    ret
2260 ; RV32ZICOND-LABEL: setne_neg2048:
2261 ; RV32ZICOND:       # %bb.0:
2262 ; RV32ZICOND-NEXT:    not a1, a1
2263 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
2264 ; RV32ZICOND-NEXT:    or a1, a0, a1
2265 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a1
2266 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a1
2267 ; RV32ZICOND-NEXT:    or a0, a2, a0
2268 ; RV32ZICOND-NEXT:    czero.nez a2, a5, a1
2269 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2270 ; RV32ZICOND-NEXT:    or a1, a1, a2
2271 ; RV32ZICOND-NEXT:    ret
2273 ; RV64ZICOND-LABEL: setne_neg2048:
2274 ; RV64ZICOND:       # %bb.0:
2275 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
2276 ; RV64ZICOND-NEXT:    czero.nez a2, a2, a0
2277 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2278 ; RV64ZICOND-NEXT:    or a0, a0, a2
2279 ; RV64ZICOND-NEXT:    ret
2280   %rc = icmp ne i64 %a, -2048
2281   %sel = select i1 %rc, i64 %rs1, i64 %rs2
2282   ret i64 %sel
2285 define i64 @zero1_seteq(i64 %a, i64 %b, i64 %rs1) {
2286 ; RV32I-LABEL: zero1_seteq:
2287 ; RV32I:       # %bb.0:
2288 ; RV32I-NEXT:    xor a1, a1, a3
2289 ; RV32I-NEXT:    xor a0, a0, a2
2290 ; RV32I-NEXT:    or a0, a0, a1
2291 ; RV32I-NEXT:    snez a0, a0
2292 ; RV32I-NEXT:    addi a1, a0, -1
2293 ; RV32I-NEXT:    and a0, a1, a4
2294 ; RV32I-NEXT:    and a1, a1, a5
2295 ; RV32I-NEXT:    ret
2297 ; RV64I-LABEL: zero1_seteq:
2298 ; RV64I:       # %bb.0:
2299 ; RV64I-NEXT:    xor a0, a0, a1
2300 ; RV64I-NEXT:    snez a0, a0
2301 ; RV64I-NEXT:    addi a0, a0, -1
2302 ; RV64I-NEXT:    and a0, a0, a2
2303 ; RV64I-NEXT:    ret
2305 ; RV64XVENTANACONDOPS-LABEL: zero1_seteq:
2306 ; RV64XVENTANACONDOPS:       # %bb.0:
2307 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
2308 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
2309 ; RV64XVENTANACONDOPS-NEXT:    ret
2311 ; RV64XTHEADCONDMOV-LABEL: zero1_seteq:
2312 ; RV64XTHEADCONDMOV:       # %bb.0:
2313 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
2314 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
2315 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
2316 ; RV64XTHEADCONDMOV-NEXT:    ret
2318 ; RV32ZICOND-LABEL: zero1_seteq:
2319 ; RV32ZICOND:       # %bb.0:
2320 ; RV32ZICOND-NEXT:    xor a1, a1, a3
2321 ; RV32ZICOND-NEXT:    xor a0, a0, a2
2322 ; RV32ZICOND-NEXT:    or a1, a0, a1
2323 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a1
2324 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
2325 ; RV32ZICOND-NEXT:    ret
2327 ; RV64ZICOND-LABEL: zero1_seteq:
2328 ; RV64ZICOND:       # %bb.0:
2329 ; RV64ZICOND-NEXT:    xor a0, a0, a1
2330 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
2331 ; RV64ZICOND-NEXT:    ret
2332   %rc = icmp eq i64 %a, %b
2333   %sel = select i1 %rc, i64 %rs1, i64 0
2334   ret i64 %sel
2337 define i64 @zero2_seteq(i64 %a, i64 %b, i64 %rs1) {
2338 ; RV32I-LABEL: zero2_seteq:
2339 ; RV32I:       # %bb.0:
2340 ; RV32I-NEXT:    xor a1, a1, a3
2341 ; RV32I-NEXT:    xor a0, a0, a2
2342 ; RV32I-NEXT:    or a0, a0, a1
2343 ; RV32I-NEXT:    seqz a0, a0
2344 ; RV32I-NEXT:    addi a1, a0, -1
2345 ; RV32I-NEXT:    and a0, a1, a4
2346 ; RV32I-NEXT:    and a1, a1, a5
2347 ; RV32I-NEXT:    ret
2349 ; RV64I-LABEL: zero2_seteq:
2350 ; RV64I:       # %bb.0:
2351 ; RV64I-NEXT:    xor a0, a0, a1
2352 ; RV64I-NEXT:    seqz a0, a0
2353 ; RV64I-NEXT:    addi a0, a0, -1
2354 ; RV64I-NEXT:    and a0, a0, a2
2355 ; RV64I-NEXT:    ret
2357 ; RV64XVENTANACONDOPS-LABEL: zero2_seteq:
2358 ; RV64XVENTANACONDOPS:       # %bb.0:
2359 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
2360 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
2361 ; RV64XVENTANACONDOPS-NEXT:    ret
2363 ; RV64XTHEADCONDMOV-LABEL: zero2_seteq:
2364 ; RV64XTHEADCONDMOV:       # %bb.0:
2365 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
2366 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
2367 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
2368 ; RV64XTHEADCONDMOV-NEXT:    ret
2370 ; RV32ZICOND-LABEL: zero2_seteq:
2371 ; RV32ZICOND:       # %bb.0:
2372 ; RV32ZICOND-NEXT:    xor a1, a1, a3
2373 ; RV32ZICOND-NEXT:    xor a0, a0, a2
2374 ; RV32ZICOND-NEXT:    or a1, a0, a1
2375 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
2376 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
2377 ; RV32ZICOND-NEXT:    ret
2379 ; RV64ZICOND-LABEL: zero2_seteq:
2380 ; RV64ZICOND:       # %bb.0:
2381 ; RV64ZICOND-NEXT:    xor a0, a0, a1
2382 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
2383 ; RV64ZICOND-NEXT:    ret
2384   %rc = icmp eq i64 %a, %b
2385   %sel = select i1 %rc, i64 0, i64 %rs1
2386   ret i64 %sel
2389 define i64 @zero1_setne(i64 %a, i64 %b, i64 %rs1) {
2390 ; RV32I-LABEL: zero1_setne:
2391 ; RV32I:       # %bb.0:
2392 ; RV32I-NEXT:    xor a1, a1, a3
2393 ; RV32I-NEXT:    xor a0, a0, a2
2394 ; RV32I-NEXT:    or a0, a0, a1
2395 ; RV32I-NEXT:    seqz a0, a0
2396 ; RV32I-NEXT:    addi a1, a0, -1
2397 ; RV32I-NEXT:    and a0, a1, a4
2398 ; RV32I-NEXT:    and a1, a1, a5
2399 ; RV32I-NEXT:    ret
2401 ; RV64I-LABEL: zero1_setne:
2402 ; RV64I:       # %bb.0:
2403 ; RV64I-NEXT:    xor a0, a0, a1
2404 ; RV64I-NEXT:    seqz a0, a0
2405 ; RV64I-NEXT:    addi a0, a0, -1
2406 ; RV64I-NEXT:    and a0, a0, a2
2407 ; RV64I-NEXT:    ret
2409 ; RV64XVENTANACONDOPS-LABEL: zero1_setne:
2410 ; RV64XVENTANACONDOPS:       # %bb.0:
2411 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
2412 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
2413 ; RV64XVENTANACONDOPS-NEXT:    ret
2415 ; RV64XTHEADCONDMOV-LABEL: zero1_setne:
2416 ; RV64XTHEADCONDMOV:       # %bb.0:
2417 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
2418 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a2, zero, a0
2419 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
2420 ; RV64XTHEADCONDMOV-NEXT:    ret
2422 ; RV32ZICOND-LABEL: zero1_setne:
2423 ; RV32ZICOND:       # %bb.0:
2424 ; RV32ZICOND-NEXT:    xor a1, a1, a3
2425 ; RV32ZICOND-NEXT:    xor a0, a0, a2
2426 ; RV32ZICOND-NEXT:    or a1, a0, a1
2427 ; RV32ZICOND-NEXT:    czero.eqz a0, a4, a1
2428 ; RV32ZICOND-NEXT:    czero.eqz a1, a5, a1
2429 ; RV32ZICOND-NEXT:    ret
2431 ; RV64ZICOND-LABEL: zero1_setne:
2432 ; RV64ZICOND:       # %bb.0:
2433 ; RV64ZICOND-NEXT:    xor a0, a0, a1
2434 ; RV64ZICOND-NEXT:    czero.eqz a0, a2, a0
2435 ; RV64ZICOND-NEXT:    ret
2436   %rc = icmp ne i64 %a, %b
2437   %sel = select i1 %rc, i64 %rs1, i64 0
2438   ret i64 %sel
2441 define i64 @zero2_setne(i64 %a, i64 %b, i64 %rs1) {
2442 ; RV32I-LABEL: zero2_setne:
2443 ; RV32I:       # %bb.0:
2444 ; RV32I-NEXT:    xor a1, a1, a3
2445 ; RV32I-NEXT:    xor a0, a0, a2
2446 ; RV32I-NEXT:    or a0, a0, a1
2447 ; RV32I-NEXT:    snez a0, a0
2448 ; RV32I-NEXT:    addi a1, a0, -1
2449 ; RV32I-NEXT:    and a0, a1, a4
2450 ; RV32I-NEXT:    and a1, a1, a5
2451 ; RV32I-NEXT:    ret
2453 ; RV64I-LABEL: zero2_setne:
2454 ; RV64I:       # %bb.0:
2455 ; RV64I-NEXT:    xor a0, a0, a1
2456 ; RV64I-NEXT:    snez a0, a0
2457 ; RV64I-NEXT:    addi a0, a0, -1
2458 ; RV64I-NEXT:    and a0, a0, a2
2459 ; RV64I-NEXT:    ret
2461 ; RV64XVENTANACONDOPS-LABEL: zero2_setne:
2462 ; RV64XVENTANACONDOPS:       # %bb.0:
2463 ; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
2464 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a2, a0
2465 ; RV64XVENTANACONDOPS-NEXT:    ret
2467 ; RV64XTHEADCONDMOV-LABEL: zero2_setne:
2468 ; RV64XTHEADCONDMOV:       # %bb.0:
2469 ; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
2470 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a2, zero, a0
2471 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a2
2472 ; RV64XTHEADCONDMOV-NEXT:    ret
2474 ; RV32ZICOND-LABEL: zero2_setne:
2475 ; RV32ZICOND:       # %bb.0:
2476 ; RV32ZICOND-NEXT:    xor a1, a1, a3
2477 ; RV32ZICOND-NEXT:    xor a0, a0, a2
2478 ; RV32ZICOND-NEXT:    or a1, a0, a1
2479 ; RV32ZICOND-NEXT:    czero.nez a0, a4, a1
2480 ; RV32ZICOND-NEXT:    czero.nez a1, a5, a1
2481 ; RV32ZICOND-NEXT:    ret
2483 ; RV64ZICOND-LABEL: zero2_setne:
2484 ; RV64ZICOND:       # %bb.0:
2485 ; RV64ZICOND-NEXT:    xor a0, a0, a1
2486 ; RV64ZICOND-NEXT:    czero.nez a0, a2, a0
2487 ; RV64ZICOND-NEXT:    ret
2488   %rc = icmp ne i64 %a, %b
2489   %sel = select i1 %rc, i64 0, i64 %rs1
2490   ret i64 %sel
2493 define i64 @zero1_seteq_zero(i64 %a, i64 %rs1) {
2494 ; RV32I-LABEL: zero1_seteq_zero:
2495 ; RV32I:       # %bb.0:
2496 ; RV32I-NEXT:    or a0, a0, a1
2497 ; RV32I-NEXT:    snez a0, a0
2498 ; RV32I-NEXT:    addi a1, a0, -1
2499 ; RV32I-NEXT:    and a0, a1, a2
2500 ; RV32I-NEXT:    and a1, a1, a3
2501 ; RV32I-NEXT:    ret
2503 ; RV64I-LABEL: zero1_seteq_zero:
2504 ; RV64I:       # %bb.0:
2505 ; RV64I-NEXT:    snez a0, a0
2506 ; RV64I-NEXT:    addi a0, a0, -1
2507 ; RV64I-NEXT:    and a0, a0, a1
2508 ; RV64I-NEXT:    ret
2510 ; RV64XVENTANACONDOPS-LABEL: zero1_seteq_zero:
2511 ; RV64XVENTANACONDOPS:       # %bb.0:
2512 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2513 ; RV64XVENTANACONDOPS-NEXT:    ret
2515 ; RV64XTHEADCONDMOV-LABEL: zero1_seteq_zero:
2516 ; RV64XTHEADCONDMOV:       # %bb.0:
2517 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
2518 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2519 ; RV64XTHEADCONDMOV-NEXT:    ret
2521 ; RV32ZICOND-LABEL: zero1_seteq_zero:
2522 ; RV32ZICOND:       # %bb.0:
2523 ; RV32ZICOND-NEXT:    or a1, a0, a1
2524 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
2525 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2526 ; RV32ZICOND-NEXT:    ret
2528 ; RV64ZICOND-LABEL: zero1_seteq_zero:
2529 ; RV64ZICOND:       # %bb.0:
2530 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2531 ; RV64ZICOND-NEXT:    ret
2532   %rc = icmp eq i64 %a, 0
2533   %sel = select i1 %rc, i64 %rs1, i64 0
2534   ret i64 %sel
2537 define i64 @zero2_seteq_zero(i64 %a, i64 %rs1) {
2538 ; RV32I-LABEL: zero2_seteq_zero:
2539 ; RV32I:       # %bb.0:
2540 ; RV32I-NEXT:    or a0, a0, a1
2541 ; RV32I-NEXT:    seqz a0, a0
2542 ; RV32I-NEXT:    addi a1, a0, -1
2543 ; RV32I-NEXT:    and a0, a1, a2
2544 ; RV32I-NEXT:    and a1, a1, a3
2545 ; RV32I-NEXT:    ret
2547 ; RV64I-LABEL: zero2_seteq_zero:
2548 ; RV64I:       # %bb.0:
2549 ; RV64I-NEXT:    seqz a0, a0
2550 ; RV64I-NEXT:    addi a0, a0, -1
2551 ; RV64I-NEXT:    and a0, a0, a1
2552 ; RV64I-NEXT:    ret
2554 ; RV64XVENTANACONDOPS-LABEL: zero2_seteq_zero:
2555 ; RV64XVENTANACONDOPS:       # %bb.0:
2556 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2557 ; RV64XVENTANACONDOPS-NEXT:    ret
2559 ; RV64XTHEADCONDMOV-LABEL: zero2_seteq_zero:
2560 ; RV64XTHEADCONDMOV:       # %bb.0:
2561 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
2562 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2563 ; RV64XTHEADCONDMOV-NEXT:    ret
2565 ; RV32ZICOND-LABEL: zero2_seteq_zero:
2566 ; RV32ZICOND:       # %bb.0:
2567 ; RV32ZICOND-NEXT:    or a1, a0, a1
2568 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
2569 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2570 ; RV32ZICOND-NEXT:    ret
2572 ; RV64ZICOND-LABEL: zero2_seteq_zero:
2573 ; RV64ZICOND:       # %bb.0:
2574 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2575 ; RV64ZICOND-NEXT:    ret
2576   %rc = icmp eq i64 %a, 0
2577   %sel = select i1 %rc, i64 0, i64 %rs1
2578   ret i64 %sel
2581 define i64 @zero1_setne_zero(i64 %a, i64 %rs1) {
2582 ; RV32I-LABEL: zero1_setne_zero:
2583 ; RV32I:       # %bb.0:
2584 ; RV32I-NEXT:    or a0, a0, a1
2585 ; RV32I-NEXT:    seqz a0, a0
2586 ; RV32I-NEXT:    addi a1, a0, -1
2587 ; RV32I-NEXT:    and a0, a1, a2
2588 ; RV32I-NEXT:    and a1, a1, a3
2589 ; RV32I-NEXT:    ret
2591 ; RV64I-LABEL: zero1_setne_zero:
2592 ; RV64I:       # %bb.0:
2593 ; RV64I-NEXT:    seqz a0, a0
2594 ; RV64I-NEXT:    addi a0, a0, -1
2595 ; RV64I-NEXT:    and a0, a0, a1
2596 ; RV64I-NEXT:    ret
2598 ; RV64XVENTANACONDOPS-LABEL: zero1_setne_zero:
2599 ; RV64XVENTANACONDOPS:       # %bb.0:
2600 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2601 ; RV64XVENTANACONDOPS-NEXT:    ret
2603 ; RV64XTHEADCONDMOV-LABEL: zero1_setne_zero:
2604 ; RV64XTHEADCONDMOV:       # %bb.0:
2605 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
2606 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2607 ; RV64XTHEADCONDMOV-NEXT:    ret
2609 ; RV32ZICOND-LABEL: zero1_setne_zero:
2610 ; RV32ZICOND:       # %bb.0:
2611 ; RV32ZICOND-NEXT:    or a1, a0, a1
2612 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
2613 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2614 ; RV32ZICOND-NEXT:    ret
2616 ; RV64ZICOND-LABEL: zero1_setne_zero:
2617 ; RV64ZICOND:       # %bb.0:
2618 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2619 ; RV64ZICOND-NEXT:    ret
2620   %rc = icmp ne i64 %a, 0
2621   %sel = select i1 %rc, i64 %rs1, i64 0
2622   ret i64 %sel
2625 define i64 @zero2_setne_zero(i64 %a, i64 %rs1) {
2626 ; RV32I-LABEL: zero2_setne_zero:
2627 ; RV32I:       # %bb.0:
2628 ; RV32I-NEXT:    or a0, a0, a1
2629 ; RV32I-NEXT:    snez a0, a0
2630 ; RV32I-NEXT:    addi a1, a0, -1
2631 ; RV32I-NEXT:    and a0, a1, a2
2632 ; RV32I-NEXT:    and a1, a1, a3
2633 ; RV32I-NEXT:    ret
2635 ; RV64I-LABEL: zero2_setne_zero:
2636 ; RV64I:       # %bb.0:
2637 ; RV64I-NEXT:    snez a0, a0
2638 ; RV64I-NEXT:    addi a0, a0, -1
2639 ; RV64I-NEXT:    and a0, a0, a1
2640 ; RV64I-NEXT:    ret
2642 ; RV64XVENTANACONDOPS-LABEL: zero2_setne_zero:
2643 ; RV64XVENTANACONDOPS:       # %bb.0:
2644 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2645 ; RV64XVENTANACONDOPS-NEXT:    ret
2647 ; RV64XTHEADCONDMOV-LABEL: zero2_setne_zero:
2648 ; RV64XTHEADCONDMOV:       # %bb.0:
2649 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
2650 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2651 ; RV64XTHEADCONDMOV-NEXT:    ret
2653 ; RV32ZICOND-LABEL: zero2_setne_zero:
2654 ; RV32ZICOND:       # %bb.0:
2655 ; RV32ZICOND-NEXT:    or a1, a0, a1
2656 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
2657 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2658 ; RV32ZICOND-NEXT:    ret
2660 ; RV64ZICOND-LABEL: zero2_setne_zero:
2661 ; RV64ZICOND:       # %bb.0:
2662 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2663 ; RV64ZICOND-NEXT:    ret
2664   %rc = icmp ne i64 %a, 0
2665   %sel = select i1 %rc, i64 0, i64 %rs1
2666   ret i64 %sel
2669 define i64 @zero1_seteq_constant(i64 %a, i64 %rs1) {
2670 ; RV32I-LABEL: zero1_seteq_constant:
2671 ; RV32I:       # %bb.0:
2672 ; RV32I-NEXT:    not a1, a1
2673 ; RV32I-NEXT:    xori a0, a0, -231
2674 ; RV32I-NEXT:    or a0, a0, a1
2675 ; RV32I-NEXT:    snez a0, a0
2676 ; RV32I-NEXT:    addi a1, a0, -1
2677 ; RV32I-NEXT:    and a0, a1, a2
2678 ; RV32I-NEXT:    and a1, a1, a3
2679 ; RV32I-NEXT:    ret
2681 ; RV64I-LABEL: zero1_seteq_constant:
2682 ; RV64I:       # %bb.0:
2683 ; RV64I-NEXT:    addi a0, a0, 231
2684 ; RV64I-NEXT:    snez a0, a0
2685 ; RV64I-NEXT:    addi a0, a0, -1
2686 ; RV64I-NEXT:    and a0, a0, a1
2687 ; RV64I-NEXT:    ret
2689 ; RV64XVENTANACONDOPS-LABEL: zero1_seteq_constant:
2690 ; RV64XVENTANACONDOPS:       # %bb.0:
2691 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, 231
2692 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2693 ; RV64XVENTANACONDOPS-NEXT:    ret
2695 ; RV64XTHEADCONDMOV-LABEL: zero1_seteq_constant:
2696 ; RV64XTHEADCONDMOV:       # %bb.0:
2697 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, 231
2698 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
2699 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2700 ; RV64XTHEADCONDMOV-NEXT:    ret
2702 ; RV32ZICOND-LABEL: zero1_seteq_constant:
2703 ; RV32ZICOND:       # %bb.0:
2704 ; RV32ZICOND-NEXT:    not a1, a1
2705 ; RV32ZICOND-NEXT:    xori a0, a0, -231
2706 ; RV32ZICOND-NEXT:    or a1, a0, a1
2707 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
2708 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2709 ; RV32ZICOND-NEXT:    ret
2711 ; RV64ZICOND-LABEL: zero1_seteq_constant:
2712 ; RV64ZICOND:       # %bb.0:
2713 ; RV64ZICOND-NEXT:    addi a0, a0, 231
2714 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2715 ; RV64ZICOND-NEXT:    ret
2716   %rc = icmp eq i64 %a, -231
2717   %sel = select i1 %rc, i64 %rs1, i64 0
2718   ret i64 %sel
2721 define i64 @zero2_seteq_constant(i64 %a, i64 %rs1) {
2722 ; RV32I-LABEL: zero2_seteq_constant:
2723 ; RV32I:       # %bb.0:
2724 ; RV32I-NEXT:    xori a0, a0, 546
2725 ; RV32I-NEXT:    or a0, a0, a1
2726 ; RV32I-NEXT:    seqz a0, a0
2727 ; RV32I-NEXT:    addi a1, a0, -1
2728 ; RV32I-NEXT:    and a0, a1, a2
2729 ; RV32I-NEXT:    and a1, a1, a3
2730 ; RV32I-NEXT:    ret
2732 ; RV64I-LABEL: zero2_seteq_constant:
2733 ; RV64I:       # %bb.0:
2734 ; RV64I-NEXT:    addi a0, a0, -546
2735 ; RV64I-NEXT:    seqz a0, a0
2736 ; RV64I-NEXT:    addi a0, a0, -1
2737 ; RV64I-NEXT:    and a0, a0, a1
2738 ; RV64I-NEXT:    ret
2740 ; RV64XVENTANACONDOPS-LABEL: zero2_seteq_constant:
2741 ; RV64XVENTANACONDOPS:       # %bb.0:
2742 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -546
2743 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2744 ; RV64XVENTANACONDOPS-NEXT:    ret
2746 ; RV64XTHEADCONDMOV-LABEL: zero2_seteq_constant:
2747 ; RV64XTHEADCONDMOV:       # %bb.0:
2748 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, -546
2749 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
2750 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2751 ; RV64XTHEADCONDMOV-NEXT:    ret
2753 ; RV32ZICOND-LABEL: zero2_seteq_constant:
2754 ; RV32ZICOND:       # %bb.0:
2755 ; RV32ZICOND-NEXT:    xori a0, a0, 546
2756 ; RV32ZICOND-NEXT:    or a1, a0, a1
2757 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
2758 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2759 ; RV32ZICOND-NEXT:    ret
2761 ; RV64ZICOND-LABEL: zero2_seteq_constant:
2762 ; RV64ZICOND:       # %bb.0:
2763 ; RV64ZICOND-NEXT:    addi a0, a0, -546
2764 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2765 ; RV64ZICOND-NEXT:    ret
2766   %rc = icmp eq i64 %a, 546
2767   %sel = select i1 %rc, i64 0, i64 %rs1
2768   ret i64 %sel
2771 define i64 @zero1_setne_constant(i64 %a, i64 %rs1) {
2772 ; RV32I-LABEL: zero1_setne_constant:
2773 ; RV32I:       # %bb.0:
2774 ; RV32I-NEXT:    xori a0, a0, 321
2775 ; RV32I-NEXT:    or a0, a0, a1
2776 ; RV32I-NEXT:    seqz a0, a0
2777 ; RV32I-NEXT:    addi a1, a0, -1
2778 ; RV32I-NEXT:    and a0, a1, a2
2779 ; RV32I-NEXT:    and a1, a1, a3
2780 ; RV32I-NEXT:    ret
2782 ; RV64I-LABEL: zero1_setne_constant:
2783 ; RV64I:       # %bb.0:
2784 ; RV64I-NEXT:    addi a0, a0, -321
2785 ; RV64I-NEXT:    seqz a0, a0
2786 ; RV64I-NEXT:    addi a0, a0, -1
2787 ; RV64I-NEXT:    and a0, a0, a1
2788 ; RV64I-NEXT:    ret
2790 ; RV64XVENTANACONDOPS-LABEL: zero1_setne_constant:
2791 ; RV64XVENTANACONDOPS:       # %bb.0:
2792 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -321
2793 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2794 ; RV64XVENTANACONDOPS-NEXT:    ret
2796 ; RV64XTHEADCONDMOV-LABEL: zero1_setne_constant:
2797 ; RV64XTHEADCONDMOV:       # %bb.0:
2798 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, -321
2799 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
2800 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2801 ; RV64XTHEADCONDMOV-NEXT:    ret
2803 ; RV32ZICOND-LABEL: zero1_setne_constant:
2804 ; RV32ZICOND:       # %bb.0:
2805 ; RV32ZICOND-NEXT:    xori a0, a0, 321
2806 ; RV32ZICOND-NEXT:    or a1, a0, a1
2807 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
2808 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2809 ; RV32ZICOND-NEXT:    ret
2811 ; RV64ZICOND-LABEL: zero1_setne_constant:
2812 ; RV64ZICOND:       # %bb.0:
2813 ; RV64ZICOND-NEXT:    addi a0, a0, -321
2814 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2815 ; RV64ZICOND-NEXT:    ret
2816   %rc = icmp ne i64 %a, 321
2817   %sel = select i1 %rc, i64 %rs1, i64 0
2818   ret i64 %sel
2821 define i64 @zero2_setne_constant(i64 %a, i64 %rs1) {
2822 ; RV32I-LABEL: zero2_setne_constant:
2823 ; RV32I:       # %bb.0:
2824 ; RV32I-NEXT:    not a1, a1
2825 ; RV32I-NEXT:    xori a0, a0, -654
2826 ; RV32I-NEXT:    or a0, a0, a1
2827 ; RV32I-NEXT:    snez a0, a0
2828 ; RV32I-NEXT:    addi a1, a0, -1
2829 ; RV32I-NEXT:    and a0, a1, a2
2830 ; RV32I-NEXT:    and a1, a1, a3
2831 ; RV32I-NEXT:    ret
2833 ; RV64I-LABEL: zero2_setne_constant:
2834 ; RV64I:       # %bb.0:
2835 ; RV64I-NEXT:    addi a0, a0, 654
2836 ; RV64I-NEXT:    snez a0, a0
2837 ; RV64I-NEXT:    addi a0, a0, -1
2838 ; RV64I-NEXT:    and a0, a0, a1
2839 ; RV64I-NEXT:    ret
2841 ; RV64XVENTANACONDOPS-LABEL: zero2_setne_constant:
2842 ; RV64XVENTANACONDOPS:       # %bb.0:
2843 ; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, 654
2844 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2845 ; RV64XVENTANACONDOPS-NEXT:    ret
2847 ; RV64XTHEADCONDMOV-LABEL: zero2_setne_constant:
2848 ; RV64XTHEADCONDMOV:       # %bb.0:
2849 ; RV64XTHEADCONDMOV-NEXT:    addi a0, a0, 654
2850 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
2851 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2852 ; RV64XTHEADCONDMOV-NEXT:    ret
2854 ; RV32ZICOND-LABEL: zero2_setne_constant:
2855 ; RV32ZICOND:       # %bb.0:
2856 ; RV32ZICOND-NEXT:    not a1, a1
2857 ; RV32ZICOND-NEXT:    xori a0, a0, -654
2858 ; RV32ZICOND-NEXT:    or a1, a0, a1
2859 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
2860 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2861 ; RV32ZICOND-NEXT:    ret
2863 ; RV64ZICOND-LABEL: zero2_setne_constant:
2864 ; RV64ZICOND:       # %bb.0:
2865 ; RV64ZICOND-NEXT:    addi a0, a0, 654
2866 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2867 ; RV64ZICOND-NEXT:    ret
2868   %rc = icmp ne i64 %a, -654
2869   %sel = select i1 %rc, i64 0, i64 %rs1
2870   ret i64 %sel
2873 define i64 @zero1_seteq_neg2048(i64 %a, i64 %rs1) {
2874 ; RV32I-LABEL: zero1_seteq_neg2048:
2875 ; RV32I:       # %bb.0:
2876 ; RV32I-NEXT:    not a1, a1
2877 ; RV32I-NEXT:    xori a0, a0, -2048
2878 ; RV32I-NEXT:    or a0, a0, a1
2879 ; RV32I-NEXT:    snez a0, a0
2880 ; RV32I-NEXT:    addi a1, a0, -1
2881 ; RV32I-NEXT:    and a0, a1, a2
2882 ; RV32I-NEXT:    and a1, a1, a3
2883 ; RV32I-NEXT:    ret
2885 ; RV64I-LABEL: zero1_seteq_neg2048:
2886 ; RV64I:       # %bb.0:
2887 ; RV64I-NEXT:    xori a0, a0, -2048
2888 ; RV64I-NEXT:    snez a0, a0
2889 ; RV64I-NEXT:    addi a0, a0, -1
2890 ; RV64I-NEXT:    and a0, a0, a1
2891 ; RV64I-NEXT:    ret
2893 ; RV64XVENTANACONDOPS-LABEL: zero1_seteq_neg2048:
2894 ; RV64XVENTANACONDOPS:       # %bb.0:
2895 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
2896 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
2897 ; RV64XVENTANACONDOPS-NEXT:    ret
2899 ; RV64XTHEADCONDMOV-LABEL: zero1_seteq_neg2048:
2900 ; RV64XTHEADCONDMOV:       # %bb.0:
2901 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
2902 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
2903 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2904 ; RV64XTHEADCONDMOV-NEXT:    ret
2906 ; RV32ZICOND-LABEL: zero1_seteq_neg2048:
2907 ; RV32ZICOND:       # %bb.0:
2908 ; RV32ZICOND-NEXT:    not a1, a1
2909 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
2910 ; RV32ZICOND-NEXT:    or a1, a0, a1
2911 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
2912 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
2913 ; RV32ZICOND-NEXT:    ret
2915 ; RV64ZICOND-LABEL: zero1_seteq_neg2048:
2916 ; RV64ZICOND:       # %bb.0:
2917 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
2918 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
2919 ; RV64ZICOND-NEXT:    ret
2920   %rc = icmp eq i64 %a, -2048
2921   %sel = select i1 %rc, i64 %rs1, i64 0
2922   ret i64 %sel
2925 define i64 @zero2_seteq_neg2048(i64 %a, i64 %rs1) {
2926 ; RV32I-LABEL: zero2_seteq_neg2048:
2927 ; RV32I:       # %bb.0:
2928 ; RV32I-NEXT:    not a1, a1
2929 ; RV32I-NEXT:    xori a0, a0, -2048
2930 ; RV32I-NEXT:    or a0, a0, a1
2931 ; RV32I-NEXT:    seqz a0, a0
2932 ; RV32I-NEXT:    addi a1, a0, -1
2933 ; RV32I-NEXT:    and a0, a1, a2
2934 ; RV32I-NEXT:    and a1, a1, a3
2935 ; RV32I-NEXT:    ret
2937 ; RV64I-LABEL: zero2_seteq_neg2048:
2938 ; RV64I:       # %bb.0:
2939 ; RV64I-NEXT:    xori a0, a0, -2048
2940 ; RV64I-NEXT:    seqz a0, a0
2941 ; RV64I-NEXT:    addi a0, a0, -1
2942 ; RV64I-NEXT:    and a0, a0, a1
2943 ; RV64I-NEXT:    ret
2945 ; RV64XVENTANACONDOPS-LABEL: zero2_seteq_neg2048:
2946 ; RV64XVENTANACONDOPS:       # %bb.0:
2947 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
2948 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
2949 ; RV64XVENTANACONDOPS-NEXT:    ret
2951 ; RV64XTHEADCONDMOV-LABEL: zero2_seteq_neg2048:
2952 ; RV64XTHEADCONDMOV:       # %bb.0:
2953 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
2954 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
2955 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
2956 ; RV64XTHEADCONDMOV-NEXT:    ret
2958 ; RV32ZICOND-LABEL: zero2_seteq_neg2048:
2959 ; RV32ZICOND:       # %bb.0:
2960 ; RV32ZICOND-NEXT:    not a1, a1
2961 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
2962 ; RV32ZICOND-NEXT:    or a1, a0, a1
2963 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
2964 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
2965 ; RV32ZICOND-NEXT:    ret
2967 ; RV64ZICOND-LABEL: zero2_seteq_neg2048:
2968 ; RV64ZICOND:       # %bb.0:
2969 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
2970 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
2971 ; RV64ZICOND-NEXT:    ret
2972   %rc = icmp eq i64 %a, -2048
2973   %sel = select i1 %rc, i64 0, i64 %rs1
2974   ret i64 %sel
2977 define i64 @zero1_setne_neg2048(i64 %a, i64 %rs1) {
2978 ; RV32I-LABEL: zero1_setne_neg2048:
2979 ; RV32I:       # %bb.0:
2980 ; RV32I-NEXT:    not a1, a1
2981 ; RV32I-NEXT:    xori a0, a0, -2048
2982 ; RV32I-NEXT:    or a0, a0, a1
2983 ; RV32I-NEXT:    seqz a0, a0
2984 ; RV32I-NEXT:    addi a1, a0, -1
2985 ; RV32I-NEXT:    and a0, a1, a2
2986 ; RV32I-NEXT:    and a1, a1, a3
2987 ; RV32I-NEXT:    ret
2989 ; RV64I-LABEL: zero1_setne_neg2048:
2990 ; RV64I:       # %bb.0:
2991 ; RV64I-NEXT:    xori a0, a0, -2048
2992 ; RV64I-NEXT:    seqz a0, a0
2993 ; RV64I-NEXT:    addi a0, a0, -1
2994 ; RV64I-NEXT:    and a0, a0, a1
2995 ; RV64I-NEXT:    ret
2997 ; RV64XVENTANACONDOPS-LABEL: zero1_setne_neg2048:
2998 ; RV64XVENTANACONDOPS:       # %bb.0:
2999 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
3000 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
3001 ; RV64XVENTANACONDOPS-NEXT:    ret
3003 ; RV64XTHEADCONDMOV-LABEL: zero1_setne_neg2048:
3004 ; RV64XTHEADCONDMOV:       # %bb.0:
3005 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
3006 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a0
3007 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
3008 ; RV64XTHEADCONDMOV-NEXT:    ret
3010 ; RV32ZICOND-LABEL: zero1_setne_neg2048:
3011 ; RV32ZICOND:       # %bb.0:
3012 ; RV32ZICOND-NEXT:    not a1, a1
3013 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
3014 ; RV32ZICOND-NEXT:    or a1, a0, a1
3015 ; RV32ZICOND-NEXT:    czero.eqz a0, a2, a1
3016 ; RV32ZICOND-NEXT:    czero.eqz a1, a3, a1
3017 ; RV32ZICOND-NEXT:    ret
3019 ; RV64ZICOND-LABEL: zero1_setne_neg2048:
3020 ; RV64ZICOND:       # %bb.0:
3021 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
3022 ; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
3023 ; RV64ZICOND-NEXT:    ret
3024   %rc = icmp ne i64 %a, -2048
3025   %sel = select i1 %rc, i64 %rs1, i64 0
3026   ret i64 %sel
3029 define i64 @zero2_setne_neg2048(i64 %a, i64 %rs1) {
3030 ; RV32I-LABEL: zero2_setne_neg2048:
3031 ; RV32I:       # %bb.0:
3032 ; RV32I-NEXT:    not a1, a1
3033 ; RV32I-NEXT:    xori a0, a0, -2048
3034 ; RV32I-NEXT:    or a0, a0, a1
3035 ; RV32I-NEXT:    snez a0, a0
3036 ; RV32I-NEXT:    addi a1, a0, -1
3037 ; RV32I-NEXT:    and a0, a1, a2
3038 ; RV32I-NEXT:    and a1, a1, a3
3039 ; RV32I-NEXT:    ret
3041 ; RV64I-LABEL: zero2_setne_neg2048:
3042 ; RV64I:       # %bb.0:
3043 ; RV64I-NEXT:    xori a0, a0, -2048
3044 ; RV64I-NEXT:    snez a0, a0
3045 ; RV64I-NEXT:    addi a0, a0, -1
3046 ; RV64I-NEXT:    and a0, a0, a1
3047 ; RV64I-NEXT:    ret
3049 ; RV64XVENTANACONDOPS-LABEL: zero2_setne_neg2048:
3050 ; RV64XVENTANACONDOPS:       # %bb.0:
3051 ; RV64XVENTANACONDOPS-NEXT:    xori a0, a0, -2048
3052 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
3053 ; RV64XVENTANACONDOPS-NEXT:    ret
3055 ; RV64XTHEADCONDMOV-LABEL: zero2_setne_neg2048:
3056 ; RV64XTHEADCONDMOV:       # %bb.0:
3057 ; RV64XTHEADCONDMOV-NEXT:    xori a0, a0, -2048
3058 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a1, zero, a0
3059 ; RV64XTHEADCONDMOV-NEXT:    mv a0, a1
3060 ; RV64XTHEADCONDMOV-NEXT:    ret
3062 ; RV32ZICOND-LABEL: zero2_setne_neg2048:
3063 ; RV32ZICOND:       # %bb.0:
3064 ; RV32ZICOND-NEXT:    not a1, a1
3065 ; RV32ZICOND-NEXT:    xori a0, a0, -2048
3066 ; RV32ZICOND-NEXT:    or a1, a0, a1
3067 ; RV32ZICOND-NEXT:    czero.nez a0, a2, a1
3068 ; RV32ZICOND-NEXT:    czero.nez a1, a3, a1
3069 ; RV32ZICOND-NEXT:    ret
3071 ; RV64ZICOND-LABEL: zero2_setne_neg2048:
3072 ; RV64ZICOND:       # %bb.0:
3073 ; RV64ZICOND-NEXT:    xori a0, a0, -2048
3074 ; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
3075 ; RV64ZICOND-NEXT:    ret
3076   %rc = icmp ne i64 %a, -2048
3077   %sel = select i1 %rc, i64 0, i64 %rs1
3078   ret i64 %sel
3081 define void @sextw_removal_maskc(i1 %c, i32 signext %arg, i32 signext %arg1) nounwind {
3082 ; RV32I-LABEL: sextw_removal_maskc:
3083 ; RV32I:       # %bb.0: # %bb
3084 ; RV32I-NEXT:    addi sp, sp, -16
3085 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3086 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3087 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3088 ; RV32I-NEXT:    mv s0, a2
3089 ; RV32I-NEXT:    slli a0, a0, 31
3090 ; RV32I-NEXT:    srai a0, a0, 31
3091 ; RV32I-NEXT:    and s1, a0, a1
3092 ; RV32I-NEXT:  .LBB56_1: # %bb2
3093 ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3094 ; RV32I-NEXT:    mv a0, s1
3095 ; RV32I-NEXT:    call bar
3096 ; RV32I-NEXT:    sll s1, s1, s0
3097 ; RV32I-NEXT:    bnez a0, .LBB56_1
3098 ; RV32I-NEXT:  # %bb.2: # %bb7
3099 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3100 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3101 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3102 ; RV32I-NEXT:    addi sp, sp, 16
3103 ; RV32I-NEXT:    ret
3105 ; RV64I-LABEL: sextw_removal_maskc:
3106 ; RV64I:       # %bb.0: # %bb
3107 ; RV64I-NEXT:    addi sp, sp, -32
3108 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3109 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3110 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3111 ; RV64I-NEXT:    mv s0, a2
3112 ; RV64I-NEXT:    slli a0, a0, 63
3113 ; RV64I-NEXT:    srai a0, a0, 63
3114 ; RV64I-NEXT:    and s1, a0, a1
3115 ; RV64I-NEXT:  .LBB56_1: # %bb2
3116 ; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3117 ; RV64I-NEXT:    mv a0, s1
3118 ; RV64I-NEXT:    call bar
3119 ; RV64I-NEXT:    sllw s1, s1, s0
3120 ; RV64I-NEXT:    bnez a0, .LBB56_1
3121 ; RV64I-NEXT:  # %bb.2: # %bb7
3122 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3123 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3124 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3125 ; RV64I-NEXT:    addi sp, sp, 32
3126 ; RV64I-NEXT:    ret
3128 ; RV64XVENTANACONDOPS-LABEL: sextw_removal_maskc:
3129 ; RV64XVENTANACONDOPS:       # %bb.0: # %bb
3130 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, -32
3131 ; RV64XVENTANACONDOPS-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3132 ; RV64XVENTANACONDOPS-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3133 ; RV64XVENTANACONDOPS-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3134 ; RV64XVENTANACONDOPS-NEXT:    mv s0, a2
3135 ; RV64XVENTANACONDOPS-NEXT:    andi a0, a0, 1
3136 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc s1, a1, a0
3137 ; RV64XVENTANACONDOPS-NEXT:  .LBB56_1: # %bb2
3138 ; RV64XVENTANACONDOPS-NEXT:    # =>This Inner Loop Header: Depth=1
3139 ; RV64XVENTANACONDOPS-NEXT:    mv a0, s1
3140 ; RV64XVENTANACONDOPS-NEXT:    call bar
3141 ; RV64XVENTANACONDOPS-NEXT:    sllw s1, s1, s0
3142 ; RV64XVENTANACONDOPS-NEXT:    bnez a0, .LBB56_1
3143 ; RV64XVENTANACONDOPS-NEXT:  # %bb.2: # %bb7
3144 ; RV64XVENTANACONDOPS-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3145 ; RV64XVENTANACONDOPS-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3146 ; RV64XVENTANACONDOPS-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3147 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, 32
3148 ; RV64XVENTANACONDOPS-NEXT:    ret
3150 ; RV64XTHEADCONDMOV-LABEL: sextw_removal_maskc:
3151 ; RV64XTHEADCONDMOV:       # %bb.0: # %bb
3152 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, -32
3153 ; RV64XTHEADCONDMOV-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3154 ; RV64XTHEADCONDMOV-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3155 ; RV64XTHEADCONDMOV-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3156 ; RV64XTHEADCONDMOV-NEXT:    mv s0, a2
3157 ; RV64XTHEADCONDMOV-NEXT:    mv s1, a1
3158 ; RV64XTHEADCONDMOV-NEXT:    andi a0, a0, 1
3159 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz s1, zero, a0
3160 ; RV64XTHEADCONDMOV-NEXT:  .LBB56_1: # %bb2
3161 ; RV64XTHEADCONDMOV-NEXT:    # =>This Inner Loop Header: Depth=1
3162 ; RV64XTHEADCONDMOV-NEXT:    sext.w a0, s1
3163 ; RV64XTHEADCONDMOV-NEXT:    call bar
3164 ; RV64XTHEADCONDMOV-NEXT:    sllw s1, s1, s0
3165 ; RV64XTHEADCONDMOV-NEXT:    bnez a0, .LBB56_1
3166 ; RV64XTHEADCONDMOV-NEXT:  # %bb.2: # %bb7
3167 ; RV64XTHEADCONDMOV-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3168 ; RV64XTHEADCONDMOV-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3169 ; RV64XTHEADCONDMOV-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3170 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, 32
3171 ; RV64XTHEADCONDMOV-NEXT:    ret
3173 ; RV32ZICOND-LABEL: sextw_removal_maskc:
3174 ; RV32ZICOND:       # %bb.0: # %bb
3175 ; RV32ZICOND-NEXT:    addi sp, sp, -16
3176 ; RV32ZICOND-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3177 ; RV32ZICOND-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3178 ; RV32ZICOND-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3179 ; RV32ZICOND-NEXT:    mv s0, a2
3180 ; RV32ZICOND-NEXT:    andi a0, a0, 1
3181 ; RV32ZICOND-NEXT:    czero.eqz s1, a1, a0
3182 ; RV32ZICOND-NEXT:  .LBB56_1: # %bb2
3183 ; RV32ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
3184 ; RV32ZICOND-NEXT:    mv a0, s1
3185 ; RV32ZICOND-NEXT:    call bar
3186 ; RV32ZICOND-NEXT:    sll s1, s1, s0
3187 ; RV32ZICOND-NEXT:    bnez a0, .LBB56_1
3188 ; RV32ZICOND-NEXT:  # %bb.2: # %bb7
3189 ; RV32ZICOND-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3190 ; RV32ZICOND-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3191 ; RV32ZICOND-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3192 ; RV32ZICOND-NEXT:    addi sp, sp, 16
3193 ; RV32ZICOND-NEXT:    ret
3195 ; RV64ZICOND-LABEL: sextw_removal_maskc:
3196 ; RV64ZICOND:       # %bb.0: # %bb
3197 ; RV64ZICOND-NEXT:    addi sp, sp, -32
3198 ; RV64ZICOND-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3199 ; RV64ZICOND-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3200 ; RV64ZICOND-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3201 ; RV64ZICOND-NEXT:    mv s0, a2
3202 ; RV64ZICOND-NEXT:    andi a0, a0, 1
3203 ; RV64ZICOND-NEXT:    czero.eqz s1, a1, a0
3204 ; RV64ZICOND-NEXT:  .LBB56_1: # %bb2
3205 ; RV64ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
3206 ; RV64ZICOND-NEXT:    mv a0, s1
3207 ; RV64ZICOND-NEXT:    call bar
3208 ; RV64ZICOND-NEXT:    sllw s1, s1, s0
3209 ; RV64ZICOND-NEXT:    bnez a0, .LBB56_1
3210 ; RV64ZICOND-NEXT:  # %bb.2: # %bb7
3211 ; RV64ZICOND-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3212 ; RV64ZICOND-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3213 ; RV64ZICOND-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3214 ; RV64ZICOND-NEXT:    addi sp, sp, 32
3215 ; RV64ZICOND-NEXT:    ret
3217   %i = select i1 %c, i32 %arg, i32 0
3218   br label %bb2
3220 bb2:                                              ; preds = %bb2, %bb
3221   %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]
3222   %i4 = tail call signext i32 @bar(i32 signext %i3)
3223   %i5 = shl i32 %i3, %arg1
3224   %i6 = icmp eq i32 %i4, 0
3225   br i1 %i6, label %bb7, label %bb2
3227 bb7:                                              ; preds = %bb2
3228   ret void
3230 declare signext i32 @bar(i32 signext)
3232 define void @sextw_removal_maskcn(i1 %c, i32 signext %arg, i32 signext %arg1) nounwind {
3233 ; RV32I-LABEL: sextw_removal_maskcn:
3234 ; RV32I:       # %bb.0: # %bb
3235 ; RV32I-NEXT:    addi sp, sp, -16
3236 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3237 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3238 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3239 ; RV32I-NEXT:    mv s0, a2
3240 ; RV32I-NEXT:    andi a0, a0, 1
3241 ; RV32I-NEXT:    addi a0, a0, -1
3242 ; RV32I-NEXT:    and s1, a0, a1
3243 ; RV32I-NEXT:  .LBB57_1: # %bb2
3244 ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
3245 ; RV32I-NEXT:    mv a0, s1
3246 ; RV32I-NEXT:    call bar
3247 ; RV32I-NEXT:    sll s1, s1, s0
3248 ; RV32I-NEXT:    bnez a0, .LBB57_1
3249 ; RV32I-NEXT:  # %bb.2: # %bb7
3250 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3251 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3252 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3253 ; RV32I-NEXT:    addi sp, sp, 16
3254 ; RV32I-NEXT:    ret
3256 ; RV64I-LABEL: sextw_removal_maskcn:
3257 ; RV64I:       # %bb.0: # %bb
3258 ; RV64I-NEXT:    addi sp, sp, -32
3259 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3260 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3261 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3262 ; RV64I-NEXT:    mv s0, a2
3263 ; RV64I-NEXT:    andi a0, a0, 1
3264 ; RV64I-NEXT:    addiw a0, a0, -1
3265 ; RV64I-NEXT:    and s1, a0, a1
3266 ; RV64I-NEXT:  .LBB57_1: # %bb2
3267 ; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
3268 ; RV64I-NEXT:    mv a0, s1
3269 ; RV64I-NEXT:    call bar
3270 ; RV64I-NEXT:    sllw s1, s1, s0
3271 ; RV64I-NEXT:    bnez a0, .LBB57_1
3272 ; RV64I-NEXT:  # %bb.2: # %bb7
3273 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3274 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3275 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3276 ; RV64I-NEXT:    addi sp, sp, 32
3277 ; RV64I-NEXT:    ret
3279 ; RV64XVENTANACONDOPS-LABEL: sextw_removal_maskcn:
3280 ; RV64XVENTANACONDOPS:       # %bb.0: # %bb
3281 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, -32
3282 ; RV64XVENTANACONDOPS-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3283 ; RV64XVENTANACONDOPS-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3284 ; RV64XVENTANACONDOPS-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3285 ; RV64XVENTANACONDOPS-NEXT:    mv s0, a2
3286 ; RV64XVENTANACONDOPS-NEXT:    andi a0, a0, 1
3287 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn s1, a1, a0
3288 ; RV64XVENTANACONDOPS-NEXT:  .LBB57_1: # %bb2
3289 ; RV64XVENTANACONDOPS-NEXT:    # =>This Inner Loop Header: Depth=1
3290 ; RV64XVENTANACONDOPS-NEXT:    mv a0, s1
3291 ; RV64XVENTANACONDOPS-NEXT:    call bar
3292 ; RV64XVENTANACONDOPS-NEXT:    sllw s1, s1, s0
3293 ; RV64XVENTANACONDOPS-NEXT:    bnez a0, .LBB57_1
3294 ; RV64XVENTANACONDOPS-NEXT:  # %bb.2: # %bb7
3295 ; RV64XVENTANACONDOPS-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3296 ; RV64XVENTANACONDOPS-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3297 ; RV64XVENTANACONDOPS-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3298 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, 32
3299 ; RV64XVENTANACONDOPS-NEXT:    ret
3301 ; RV64XTHEADCONDMOV-LABEL: sextw_removal_maskcn:
3302 ; RV64XTHEADCONDMOV:       # %bb.0: # %bb
3303 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, -32
3304 ; RV64XTHEADCONDMOV-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3305 ; RV64XTHEADCONDMOV-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3306 ; RV64XTHEADCONDMOV-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3307 ; RV64XTHEADCONDMOV-NEXT:    mv s0, a2
3308 ; RV64XTHEADCONDMOV-NEXT:    mv s1, a1
3309 ; RV64XTHEADCONDMOV-NEXT:    andi a0, a0, 1
3310 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez s1, zero, a0
3311 ; RV64XTHEADCONDMOV-NEXT:  .LBB57_1: # %bb2
3312 ; RV64XTHEADCONDMOV-NEXT:    # =>This Inner Loop Header: Depth=1
3313 ; RV64XTHEADCONDMOV-NEXT:    sext.w a0, s1
3314 ; RV64XTHEADCONDMOV-NEXT:    call bar
3315 ; RV64XTHEADCONDMOV-NEXT:    sllw s1, s1, s0
3316 ; RV64XTHEADCONDMOV-NEXT:    bnez a0, .LBB57_1
3317 ; RV64XTHEADCONDMOV-NEXT:  # %bb.2: # %bb7
3318 ; RV64XTHEADCONDMOV-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3319 ; RV64XTHEADCONDMOV-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3320 ; RV64XTHEADCONDMOV-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3321 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, 32
3322 ; RV64XTHEADCONDMOV-NEXT:    ret
3324 ; RV32ZICOND-LABEL: sextw_removal_maskcn:
3325 ; RV32ZICOND:       # %bb.0: # %bb
3326 ; RV32ZICOND-NEXT:    addi sp, sp, -16
3327 ; RV32ZICOND-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3328 ; RV32ZICOND-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3329 ; RV32ZICOND-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
3330 ; RV32ZICOND-NEXT:    mv s0, a2
3331 ; RV32ZICOND-NEXT:    andi a0, a0, 1
3332 ; RV32ZICOND-NEXT:    czero.nez s1, a1, a0
3333 ; RV32ZICOND-NEXT:  .LBB57_1: # %bb2
3334 ; RV32ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
3335 ; RV32ZICOND-NEXT:    mv a0, s1
3336 ; RV32ZICOND-NEXT:    call bar
3337 ; RV32ZICOND-NEXT:    sll s1, s1, s0
3338 ; RV32ZICOND-NEXT:    bnez a0, .LBB57_1
3339 ; RV32ZICOND-NEXT:  # %bb.2: # %bb7
3340 ; RV32ZICOND-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3341 ; RV32ZICOND-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3342 ; RV32ZICOND-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
3343 ; RV32ZICOND-NEXT:    addi sp, sp, 16
3344 ; RV32ZICOND-NEXT:    ret
3346 ; RV64ZICOND-LABEL: sextw_removal_maskcn:
3347 ; RV64ZICOND:       # %bb.0: # %bb
3348 ; RV64ZICOND-NEXT:    addi sp, sp, -32
3349 ; RV64ZICOND-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
3350 ; RV64ZICOND-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
3351 ; RV64ZICOND-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
3352 ; RV64ZICOND-NEXT:    mv s0, a2
3353 ; RV64ZICOND-NEXT:    andi a0, a0, 1
3354 ; RV64ZICOND-NEXT:    czero.nez s1, a1, a0
3355 ; RV64ZICOND-NEXT:  .LBB57_1: # %bb2
3356 ; RV64ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
3357 ; RV64ZICOND-NEXT:    mv a0, s1
3358 ; RV64ZICOND-NEXT:    call bar
3359 ; RV64ZICOND-NEXT:    sllw s1, s1, s0
3360 ; RV64ZICOND-NEXT:    bnez a0, .LBB57_1
3361 ; RV64ZICOND-NEXT:  # %bb.2: # %bb7
3362 ; RV64ZICOND-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
3363 ; RV64ZICOND-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
3364 ; RV64ZICOND-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
3365 ; RV64ZICOND-NEXT:    addi sp, sp, 32
3366 ; RV64ZICOND-NEXT:    ret
3368   %i = select i1 %c, i32 0, i32 %arg
3369   br label %bb2
3371 bb2:                                              ; preds = %bb2, %bb
3372   %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]
3373   %i4 = tail call signext i32 @bar(i32 signext %i3)
3374   %i5 = shl i32 %i3, %arg1
3375   %i6 = icmp eq i32 %i4, 0
3376   br i1 %i6, label %bb7, label %bb2
3378 bb7:                                              ; preds = %bb2
3379   ret void
3382 define i32 @setune_32(float %a, float %b, i32 %rs1, i32 %rs2) {
3383 ; RV32I-LABEL: setune_32:
3384 ; RV32I:       # %bb.0:
3385 ; RV32I-NEXT:    feq.s a2, fa0, fa1
3386 ; RV32I-NEXT:    beqz a2, .LBB58_2
3387 ; RV32I-NEXT:  # %bb.1:
3388 ; RV32I-NEXT:    mv a0, a1
3389 ; RV32I-NEXT:  .LBB58_2:
3390 ; RV32I-NEXT:    ret
3392 ; RV64I-LABEL: setune_32:
3393 ; RV64I:       # %bb.0:
3394 ; RV64I-NEXT:    feq.s a2, fa0, fa1
3395 ; RV64I-NEXT:    beqz a2, .LBB58_2
3396 ; RV64I-NEXT:  # %bb.1:
3397 ; RV64I-NEXT:    mv a0, a1
3398 ; RV64I-NEXT:  .LBB58_2:
3399 ; RV64I-NEXT:    ret
3401 ; RV64XVENTANACONDOPS-LABEL: setune_32:
3402 ; RV64XVENTANACONDOPS:       # %bb.0:
3403 ; RV64XVENTANACONDOPS-NEXT:    feq.s a2, fa0, fa1
3404 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
3405 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a0, a2
3406 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
3407 ; RV64XVENTANACONDOPS-NEXT:    ret
3409 ; RV64XTHEADCONDMOV-LABEL: setune_32:
3410 ; RV64XTHEADCONDMOV:       # %bb.0:
3411 ; RV64XTHEADCONDMOV-NEXT:    feq.s a2, fa0, fa1
3412 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a0, a1, a2
3413 ; RV64XTHEADCONDMOV-NEXT:    ret
3415 ; RV32ZICOND-LABEL: setune_32:
3416 ; RV32ZICOND:       # %bb.0:
3417 ; RV32ZICOND-NEXT:    feq.s a2, fa0, fa1
3418 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
3419 ; RV32ZICOND-NEXT:    czero.nez a0, a0, a2
3420 ; RV32ZICOND-NEXT:    or a0, a0, a1
3421 ; RV32ZICOND-NEXT:    ret
3423 ; RV64ZICOND-LABEL: setune_32:
3424 ; RV64ZICOND:       # %bb.0:
3425 ; RV64ZICOND-NEXT:    feq.s a2, fa0, fa1
3426 ; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
3427 ; RV64ZICOND-NEXT:    czero.nez a0, a0, a2
3428 ; RV64ZICOND-NEXT:    or a0, a0, a1
3429 ; RV64ZICOND-NEXT:    ret
3430   %rc = fcmp une float %a, %b
3431   %sel = select i1 %rc, i32 %rs1, i32 %rs2
3432   ret i32 %sel
3435 define i64 @setune_64(float %a, float %b, i64 %rs1, i64 %rs2) {
3436 ; RV32I-LABEL: setune_64:
3437 ; RV32I:       # %bb.0:
3438 ; RV32I-NEXT:    feq.s a4, fa0, fa1
3439 ; RV32I-NEXT:    beqz a4, .LBB59_2
3440 ; RV32I-NEXT:  # %bb.1:
3441 ; RV32I-NEXT:    mv a0, a2
3442 ; RV32I-NEXT:    mv a1, a3
3443 ; RV32I-NEXT:  .LBB59_2:
3444 ; RV32I-NEXT:    ret
3446 ; RV64I-LABEL: setune_64:
3447 ; RV64I:       # %bb.0:
3448 ; RV64I-NEXT:    feq.s a2, fa0, fa1
3449 ; RV64I-NEXT:    beqz a2, .LBB59_2
3450 ; RV64I-NEXT:  # %bb.1:
3451 ; RV64I-NEXT:    mv a0, a1
3452 ; RV64I-NEXT:  .LBB59_2:
3453 ; RV64I-NEXT:    ret
3455 ; RV64XVENTANACONDOPS-LABEL: setune_64:
3456 ; RV64XVENTANACONDOPS:       # %bb.0:
3457 ; RV64XVENTANACONDOPS-NEXT:    feq.s a2, fa0, fa1
3458 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
3459 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a0, a2
3460 ; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
3461 ; RV64XVENTANACONDOPS-NEXT:    ret
3463 ; RV64XTHEADCONDMOV-LABEL: setune_64:
3464 ; RV64XTHEADCONDMOV:       # %bb.0:
3465 ; RV64XTHEADCONDMOV-NEXT:    feq.s a2, fa0, fa1
3466 ; RV64XTHEADCONDMOV-NEXT:    th.mvnez a0, a1, a2
3467 ; RV64XTHEADCONDMOV-NEXT:    ret
3469 ; RV32ZICOND-LABEL: setune_64:
3470 ; RV32ZICOND:       # %bb.0:
3471 ; RV32ZICOND-NEXT:    feq.s a4, fa0, fa1
3472 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a4
3473 ; RV32ZICOND-NEXT:    czero.nez a0, a0, a4
3474 ; RV32ZICOND-NEXT:    or a0, a0, a2
3475 ; RV32ZICOND-NEXT:    czero.eqz a2, a3, a4
3476 ; RV32ZICOND-NEXT:    czero.nez a1, a1, a4
3477 ; RV32ZICOND-NEXT:    or a1, a1, a2
3478 ; RV32ZICOND-NEXT:    ret
3480 ; RV64ZICOND-LABEL: setune_64:
3481 ; RV64ZICOND:       # %bb.0:
3482 ; RV64ZICOND-NEXT:    feq.s a2, fa0, fa1
3483 ; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
3484 ; RV64ZICOND-NEXT:    czero.nez a0, a0, a2
3485 ; RV64ZICOND-NEXT:    or a0, a0, a1
3486 ; RV64ZICOND-NEXT:    ret
3487   %rc = fcmp une float %a, %b
3488   %sel = select i1 %rc, i64 %rs1, i64 %rs2
3489   ret i64 %sel
3492 ; Test that we can ComputeNumSignBits across basic blocks when the live out is
3493 ; RISCVISD::SELECT_CC. There should be no slli+srai or sext.h in the output.
3494 define signext i16 @numsignbits(i16 signext %0, i16 signext %1, i16 signext %2, i16 signext %3) nounwind {
3495 ; RV32I-LABEL: numsignbits:
3496 ; RV32I:       # %bb.0:
3497 ; RV32I-NEXT:    addi sp, sp, -16
3498 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3499 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3500 ; RV32I-NEXT:    mv s0, a3
3501 ; RV32I-NEXT:    beqz a0, .LBB60_2
3502 ; RV32I-NEXT:  # %bb.1:
3503 ; RV32I-NEXT:    mv s0, a2
3504 ; RV32I-NEXT:  .LBB60_2:
3505 ; RV32I-NEXT:    beqz a1, .LBB60_4
3506 ; RV32I-NEXT:  # %bb.3:
3507 ; RV32I-NEXT:    mv a0, s0
3508 ; RV32I-NEXT:    call bat
3509 ; RV32I-NEXT:  .LBB60_4:
3510 ; RV32I-NEXT:    mv a0, s0
3511 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3512 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3513 ; RV32I-NEXT:    addi sp, sp, 16
3514 ; RV32I-NEXT:    ret
3516 ; RV64I-LABEL: numsignbits:
3517 ; RV64I:       # %bb.0:
3518 ; RV64I-NEXT:    addi sp, sp, -16
3519 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3520 ; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
3521 ; RV64I-NEXT:    mv s0, a3
3522 ; RV64I-NEXT:    beqz a0, .LBB60_2
3523 ; RV64I-NEXT:  # %bb.1:
3524 ; RV64I-NEXT:    mv s0, a2
3525 ; RV64I-NEXT:  .LBB60_2:
3526 ; RV64I-NEXT:    beqz a1, .LBB60_4
3527 ; RV64I-NEXT:  # %bb.3:
3528 ; RV64I-NEXT:    mv a0, s0
3529 ; RV64I-NEXT:    call bat
3530 ; RV64I-NEXT:  .LBB60_4:
3531 ; RV64I-NEXT:    mv a0, s0
3532 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3533 ; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
3534 ; RV64I-NEXT:    addi sp, sp, 16
3535 ; RV64I-NEXT:    ret
3537 ; RV64XVENTANACONDOPS-LABEL: numsignbits:
3538 ; RV64XVENTANACONDOPS:       # %bb.0:
3539 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, -16
3540 ; RV64XVENTANACONDOPS-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3541 ; RV64XVENTANACONDOPS-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
3542 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a2, a2, a0
3543 ; RV64XVENTANACONDOPS-NEXT:    vt.maskcn s0, a3, a0
3544 ; RV64XVENTANACONDOPS-NEXT:    or s0, s0, a2
3545 ; RV64XVENTANACONDOPS-NEXT:    beqz a1, .LBB60_2
3546 ; RV64XVENTANACONDOPS-NEXT:  # %bb.1:
3547 ; RV64XVENTANACONDOPS-NEXT:    mv a0, s0
3548 ; RV64XVENTANACONDOPS-NEXT:    call bat
3549 ; RV64XVENTANACONDOPS-NEXT:  .LBB60_2:
3550 ; RV64XVENTANACONDOPS-NEXT:    mv a0, s0
3551 ; RV64XVENTANACONDOPS-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3552 ; RV64XVENTANACONDOPS-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
3553 ; RV64XVENTANACONDOPS-NEXT:    addi sp, sp, 16
3554 ; RV64XVENTANACONDOPS-NEXT:    ret
3556 ; RV64XTHEADCONDMOV-LABEL: numsignbits:
3557 ; RV64XTHEADCONDMOV:       # %bb.0:
3558 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, -16
3559 ; RV64XTHEADCONDMOV-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3560 ; RV64XTHEADCONDMOV-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
3561 ; RV64XTHEADCONDMOV-NEXT:    mv s0, a2
3562 ; RV64XTHEADCONDMOV-NEXT:    th.mveqz s0, a3, a0
3563 ; RV64XTHEADCONDMOV-NEXT:    beqz a1, .LBB60_2
3564 ; RV64XTHEADCONDMOV-NEXT:  # %bb.1:
3565 ; RV64XTHEADCONDMOV-NEXT:    mv a0, s0
3566 ; RV64XTHEADCONDMOV-NEXT:    call bat
3567 ; RV64XTHEADCONDMOV-NEXT:  .LBB60_2:
3568 ; RV64XTHEADCONDMOV-NEXT:    mv a0, s0
3569 ; RV64XTHEADCONDMOV-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3570 ; RV64XTHEADCONDMOV-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
3571 ; RV64XTHEADCONDMOV-NEXT:    addi sp, sp, 16
3572 ; RV64XTHEADCONDMOV-NEXT:    ret
3574 ; RV32ZICOND-LABEL: numsignbits:
3575 ; RV32ZICOND:       # %bb.0:
3576 ; RV32ZICOND-NEXT:    addi sp, sp, -16
3577 ; RV32ZICOND-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
3578 ; RV32ZICOND-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
3579 ; RV32ZICOND-NEXT:    czero.eqz a2, a2, a0
3580 ; RV32ZICOND-NEXT:    czero.nez s0, a3, a0
3581 ; RV32ZICOND-NEXT:    or s0, s0, a2
3582 ; RV32ZICOND-NEXT:    beqz a1, .LBB60_2
3583 ; RV32ZICOND-NEXT:  # %bb.1:
3584 ; RV32ZICOND-NEXT:    mv a0, s0
3585 ; RV32ZICOND-NEXT:    call bat
3586 ; RV32ZICOND-NEXT:  .LBB60_2:
3587 ; RV32ZICOND-NEXT:    mv a0, s0
3588 ; RV32ZICOND-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3589 ; RV32ZICOND-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
3590 ; RV32ZICOND-NEXT:    addi sp, sp, 16
3591 ; RV32ZICOND-NEXT:    ret
3593 ; RV64ZICOND-LABEL: numsignbits:
3594 ; RV64ZICOND:       # %bb.0:
3595 ; RV64ZICOND-NEXT:    addi sp, sp, -16
3596 ; RV64ZICOND-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3597 ; RV64ZICOND-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
3598 ; RV64ZICOND-NEXT:    czero.eqz a2, a2, a0
3599 ; RV64ZICOND-NEXT:    czero.nez s0, a3, a0
3600 ; RV64ZICOND-NEXT:    or s0, s0, a2
3601 ; RV64ZICOND-NEXT:    beqz a1, .LBB60_2
3602 ; RV64ZICOND-NEXT:  # %bb.1:
3603 ; RV64ZICOND-NEXT:    mv a0, s0
3604 ; RV64ZICOND-NEXT:    call bat
3605 ; RV64ZICOND-NEXT:  .LBB60_2:
3606 ; RV64ZICOND-NEXT:    mv a0, s0
3607 ; RV64ZICOND-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3608 ; RV64ZICOND-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
3609 ; RV64ZICOND-NEXT:    addi sp, sp, 16
3610 ; RV64ZICOND-NEXT:    ret
3611   %5 = icmp eq i16 %0, 0
3612   %6 = select i1 %5, i16 %3, i16 %2
3613   %7 = icmp eq i16 %1, 0
3614   br i1 %7, label %9, label %8
3616 8:                                                ; preds = %4
3617   tail call void @bat(i16 signext %6)
3618   br label %9
3620 9:                                                ; preds = %8, %4
3621   ret i16 %6
3624 declare void @bat(i16 signext)
3626 define i64 @single_bit(i64 %x) {
3627 ; RV32I-LABEL: single_bit:
3628 ; RV32I:       # %bb.0: # %entry
3629 ; RV32I-NEXT:    slli a2, a0, 21
3630 ; RV32I-NEXT:    srai a2, a2, 31
3631 ; RV32I-NEXT:    and a0, a2, a0
3632 ; RV32I-NEXT:    and a1, a2, a1
3633 ; RV32I-NEXT:    ret
3635 ; RV64I-LABEL: single_bit:
3636 ; RV64I:       # %bb.0: # %entry
3637 ; RV64I-NEXT:    slli a1, a0, 53
3638 ; RV64I-NEXT:    srai a1, a1, 63
3639 ; RV64I-NEXT:    and a0, a1, a0
3640 ; RV64I-NEXT:    ret
3642 ; RV64XVENTANACONDOPS-LABEL: single_bit:
3643 ; RV64XVENTANACONDOPS:       # %bb.0: # %entry
3644 ; RV64XVENTANACONDOPS-NEXT:    andi a1, a0, 1024
3645 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a0, a1
3646 ; RV64XVENTANACONDOPS-NEXT:    ret
3648 ; RV64XTHEADCONDMOV-LABEL: single_bit:
3649 ; RV64XTHEADCONDMOV:       # %bb.0: # %entry
3650 ; RV64XTHEADCONDMOV-NEXT:    slli a1, a0, 53
3651 ; RV64XTHEADCONDMOV-NEXT:    srai a1, a1, 63
3652 ; RV64XTHEADCONDMOV-NEXT:    and a0, a1, a0
3653 ; RV64XTHEADCONDMOV-NEXT:    ret
3655 ; RV32ZICOND-LABEL: single_bit:
3656 ; RV32ZICOND:       # %bb.0: # %entry
3657 ; RV32ZICOND-NEXT:    andi a2, a0, 1024
3658 ; RV32ZICOND-NEXT:    czero.eqz a0, a0, a2
3659 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
3660 ; RV32ZICOND-NEXT:    ret
3662 ; RV64ZICOND-LABEL: single_bit:
3663 ; RV64ZICOND:       # %bb.0: # %entry
3664 ; RV64ZICOND-NEXT:    andi a1, a0, 1024
3665 ; RV64ZICOND-NEXT:    czero.eqz a0, a0, a1
3666 ; RV64ZICOND-NEXT:    ret
3667 entry:
3668   %and = and i64 %x, 1024
3669   %tobool.not = icmp eq i64 %and, 0
3670   %cond = select i1 %tobool.not, i64 0, i64 %x
3671   ret i64 %cond
3674 ; Test to fold select with single bit check to (and (sra (shl x))).
3675 define i64 @single_bit2(i64 %x) {
3676 ; RV32I-LABEL: single_bit2:
3677 ; RV32I:       # %bb.0: # %entry
3678 ; RV32I-NEXT:    slli a2, a0, 20
3679 ; RV32I-NEXT:    srai a2, a2, 31
3680 ; RV32I-NEXT:    and a0, a2, a0
3681 ; RV32I-NEXT:    and a1, a2, a1
3682 ; RV32I-NEXT:    ret
3684 ; RV64I-LABEL: single_bit2:
3685 ; RV64I:       # %bb.0: # %entry
3686 ; RV64I-NEXT:    slli a1, a0, 52
3687 ; RV64I-NEXT:    srai a1, a1, 63
3688 ; RV64I-NEXT:    and a0, a1, a0
3689 ; RV64I-NEXT:    ret
3691 ; RV64XVENTANACONDOPS-LABEL: single_bit2:
3692 ; RV64XVENTANACONDOPS:       # %bb.0: # %entry
3693 ; RV64XVENTANACONDOPS-NEXT:    bexti a1, a0, 11
3694 ; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a0, a1
3695 ; RV64XVENTANACONDOPS-NEXT:    ret
3697 ; RV64XTHEADCONDMOV-LABEL: single_bit2:
3698 ; RV64XTHEADCONDMOV:       # %bb.0: # %entry
3699 ; RV64XTHEADCONDMOV-NEXT:    slli a1, a0, 52
3700 ; RV64XTHEADCONDMOV-NEXT:    srai a1, a1, 63
3701 ; RV64XTHEADCONDMOV-NEXT:    and a0, a1, a0
3702 ; RV64XTHEADCONDMOV-NEXT:    ret
3704 ; RV32ZICOND-LABEL: single_bit2:
3705 ; RV32ZICOND:       # %bb.0: # %entry
3706 ; RV32ZICOND-NEXT:    bexti a2, a0, 11
3707 ; RV32ZICOND-NEXT:    czero.eqz a0, a0, a2
3708 ; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
3709 ; RV32ZICOND-NEXT:    ret
3711 ; RV64ZICOND-LABEL: single_bit2:
3712 ; RV64ZICOND:       # %bb.0: # %entry
3713 ; RV64ZICOND-NEXT:    bexti a1, a0, 11
3714 ; RV64ZICOND-NEXT:    czero.eqz a0, a0, a1
3715 ; RV64ZICOND-NEXT:    ret
3716 entry:
3717   %and = and i64 %x, 2048
3718   %tobool.not = icmp eq i64 %and, 0
3719   %cond = select i1 %tobool.not, i64 0, i64 %x
3720   ret i64 %cond