xref: /llvm-project/llvm/test/CodeGen/RISCV/condbinops.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -mtriple=riscv32 < %s | FileCheck %s -check-prefix=RV32I
3; RUN: llc -mtriple=riscv64 < %s | FileCheck %s -check-prefix=RV64I
4; RUN: llc -mtriple=riscv64 -mattr=+xventanacondops < %s | FileCheck %s -check-prefix=RV64XVENTANACONDOPS
5; RUN: llc -mtriple=riscv64 -mattr=+xtheadcondmov < %s | FileCheck %s -check-prefix=RV64XTHEADCONDMOV
6; RUN: llc -mtriple=riscv32 -mattr=+zicond < %s | FileCheck %s -check-prefix=RV32ZICOND
7; RUN: llc -mtriple=riscv64 -mattr=+zicond < %s | FileCheck %s -check-prefix=RV64ZICOND
8
9define i32 @shl32(i32 %x, i32 %y, i1 %c) {
10; RV32I-LABEL: shl32:
11; RV32I:       # %bb.0:
12; RV32I-NEXT:    slli a2, a2, 31
13; RV32I-NEXT:    srai a2, a2, 31
14; RV32I-NEXT:    and a1, a2, a1
15; RV32I-NEXT:    sll a0, a0, a1
16; RV32I-NEXT:    ret
17;
18; RV64I-LABEL: shl32:
19; RV64I:       # %bb.0:
20; RV64I-NEXT:    slli a2, a2, 63
21; RV64I-NEXT:    srai a2, a2, 63
22; RV64I-NEXT:    and a1, a2, a1
23; RV64I-NEXT:    sllw a0, a0, a1
24; RV64I-NEXT:    ret
25;
26; RV64XVENTANACONDOPS-LABEL: shl32:
27; RV64XVENTANACONDOPS:       # %bb.0:
28; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
29; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
30; RV64XVENTANACONDOPS-NEXT:    sllw a0, a0, a1
31; RV64XVENTANACONDOPS-NEXT:    ret
32;
33; RV64XTHEADCONDMOV-LABEL: shl32:
34; RV64XTHEADCONDMOV:       # %bb.0:
35; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
36; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
37; RV64XTHEADCONDMOV-NEXT:    sllw a0, a0, a1
38; RV64XTHEADCONDMOV-NEXT:    ret
39;
40; RV32ZICOND-LABEL: shl32:
41; RV32ZICOND:       # %bb.0:
42; RV32ZICOND-NEXT:    andi a2, a2, 1
43; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
44; RV32ZICOND-NEXT:    sll a0, a0, a1
45; RV32ZICOND-NEXT:    ret
46;
47; RV64ZICOND-LABEL: shl32:
48; RV64ZICOND:       # %bb.0:
49; RV64ZICOND-NEXT:    andi a2, a2, 1
50; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
51; RV64ZICOND-NEXT:    sllw a0, a0, a1
52; RV64ZICOND-NEXT:    ret
53  %binop = shl i32 %x, %y
54  %select_ = select i1 %c, i32 %binop, i32 %x
55  ret i32 %select_
56}
57
58define i32 @ashr32(i32 %x, i32 %y, i1 %c) {
59; RV32I-LABEL: ashr32:
60; RV32I:       # %bb.0:
61; RV32I-NEXT:    slli a2, a2, 31
62; RV32I-NEXT:    srai a2, a2, 31
63; RV32I-NEXT:    and a1, a2, a1
64; RV32I-NEXT:    sra a0, a0, a1
65; RV32I-NEXT:    ret
66;
67; RV64I-LABEL: ashr32:
68; RV64I:       # %bb.0:
69; RV64I-NEXT:    slli a2, a2, 63
70; RV64I-NEXT:    srai a2, a2, 63
71; RV64I-NEXT:    and a1, a2, a1
72; RV64I-NEXT:    sraw a0, a0, a1
73; RV64I-NEXT:    ret
74;
75; RV64XVENTANACONDOPS-LABEL: ashr32:
76; RV64XVENTANACONDOPS:       # %bb.0:
77; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
78; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
79; RV64XVENTANACONDOPS-NEXT:    sraw a0, a0, a1
80; RV64XVENTANACONDOPS-NEXT:    ret
81;
82; RV64XTHEADCONDMOV-LABEL: ashr32:
83; RV64XTHEADCONDMOV:       # %bb.0:
84; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
85; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
86; RV64XTHEADCONDMOV-NEXT:    sraw a0, a0, a1
87; RV64XTHEADCONDMOV-NEXT:    ret
88;
89; RV32ZICOND-LABEL: ashr32:
90; RV32ZICOND:       # %bb.0:
91; RV32ZICOND-NEXT:    andi a2, a2, 1
92; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
93; RV32ZICOND-NEXT:    sra a0, a0, a1
94; RV32ZICOND-NEXT:    ret
95;
96; RV64ZICOND-LABEL: ashr32:
97; RV64ZICOND:       # %bb.0:
98; RV64ZICOND-NEXT:    andi a2, a2, 1
99; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
100; RV64ZICOND-NEXT:    sraw a0, a0, a1
101; RV64ZICOND-NEXT:    ret
102  %binop = ashr i32 %x, %y
103  %select_ = select i1 %c, i32 %binop, i32 %x
104  ret i32 %select_
105}
106
107define i32 @lshr32(i32 %x, i32 %y, i1 %c) {
108; RV32I-LABEL: lshr32:
109; RV32I:       # %bb.0:
110; RV32I-NEXT:    slli a2, a2, 31
111; RV32I-NEXT:    srai a2, a2, 31
112; RV32I-NEXT:    and a1, a2, a1
113; RV32I-NEXT:    srl a0, a0, a1
114; RV32I-NEXT:    ret
115;
116; RV64I-LABEL: lshr32:
117; RV64I:       # %bb.0:
118; RV64I-NEXT:    slli a2, a2, 63
119; RV64I-NEXT:    srai a2, a2, 63
120; RV64I-NEXT:    and a1, a2, a1
121; RV64I-NEXT:    srlw a0, a0, a1
122; RV64I-NEXT:    ret
123;
124; RV64XVENTANACONDOPS-LABEL: lshr32:
125; RV64XVENTANACONDOPS:       # %bb.0:
126; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
127; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
128; RV64XVENTANACONDOPS-NEXT:    srlw a0, a0, a1
129; RV64XVENTANACONDOPS-NEXT:    ret
130;
131; RV64XTHEADCONDMOV-LABEL: lshr32:
132; RV64XTHEADCONDMOV:       # %bb.0:
133; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
134; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
135; RV64XTHEADCONDMOV-NEXT:    srlw a0, a0, a1
136; RV64XTHEADCONDMOV-NEXT:    ret
137;
138; RV32ZICOND-LABEL: lshr32:
139; RV32ZICOND:       # %bb.0:
140; RV32ZICOND-NEXT:    andi a2, a2, 1
141; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
142; RV32ZICOND-NEXT:    srl a0, a0, a1
143; RV32ZICOND-NEXT:    ret
144;
145; RV64ZICOND-LABEL: lshr32:
146; RV64ZICOND:       # %bb.0:
147; RV64ZICOND-NEXT:    andi a2, a2, 1
148; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
149; RV64ZICOND-NEXT:    srlw a0, a0, a1
150; RV64ZICOND-NEXT:    ret
151  %binop = lshr i32 %x, %y
152  %select_ = select i1 %c, i32 %binop, i32 %x
153  ret i32 %select_
154}
155
156define i32 @sub32(i32 %x, i32 %y, i1 %c) {
157; RV32I-LABEL: sub32:
158; RV32I:       # %bb.0:
159; RV32I-NEXT:    slli a2, a2, 31
160; RV32I-NEXT:    srai a2, a2, 31
161; RV32I-NEXT:    and a1, a2, a1
162; RV32I-NEXT:    sub a0, a0, a1
163; RV32I-NEXT:    ret
164;
165; RV64I-LABEL: sub32:
166; RV64I:       # %bb.0:
167; RV64I-NEXT:    slli a2, a2, 63
168; RV64I-NEXT:    srai a2, a2, 63
169; RV64I-NEXT:    and a1, a2, a1
170; RV64I-NEXT:    subw a0, a0, a1
171; RV64I-NEXT:    ret
172;
173; RV64XVENTANACONDOPS-LABEL: sub32:
174; RV64XVENTANACONDOPS:       # %bb.0:
175; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
176; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
177; RV64XVENTANACONDOPS-NEXT:    subw a0, a0, a1
178; RV64XVENTANACONDOPS-NEXT:    ret
179;
180; RV64XTHEADCONDMOV-LABEL: sub32:
181; RV64XTHEADCONDMOV:       # %bb.0:
182; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
183; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
184; RV64XTHEADCONDMOV-NEXT:    subw a0, a0, a1
185; RV64XTHEADCONDMOV-NEXT:    ret
186;
187; RV32ZICOND-LABEL: sub32:
188; RV32ZICOND:       # %bb.0:
189; RV32ZICOND-NEXT:    andi a2, a2, 1
190; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
191; RV32ZICOND-NEXT:    sub a0, a0, a1
192; RV32ZICOND-NEXT:    ret
193;
194; RV64ZICOND-LABEL: sub32:
195; RV64ZICOND:       # %bb.0:
196; RV64ZICOND-NEXT:    andi a2, a2, 1
197; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
198; RV64ZICOND-NEXT:    subw a0, a0, a1
199; RV64ZICOND-NEXT:    ret
200  %binop = sub i32 %x, %y
201  %select_ = select i1 %c, i32 %binop, i32 %x
202  ret i32 %select_
203}
204
205define i32 @and32(i32 %x, i32 %y, i1 %c) {
206; RV32I-LABEL: and32:
207; RV32I:       # %bb.0:
208; RV32I-NEXT:    andi a2, a2, 1
209; RV32I-NEXT:    beqz a2, .LBB4_2
210; RV32I-NEXT:  # %bb.1:
211; RV32I-NEXT:    and a0, a0, a1
212; RV32I-NEXT:  .LBB4_2:
213; RV32I-NEXT:    ret
214;
215; RV64I-LABEL: and32:
216; RV64I:       # %bb.0:
217; RV64I-NEXT:    andi a2, a2, 1
218; RV64I-NEXT:    beqz a2, .LBB4_2
219; RV64I-NEXT:  # %bb.1:
220; RV64I-NEXT:    and a0, a0, a1
221; RV64I-NEXT:  .LBB4_2:
222; RV64I-NEXT:    ret
223;
224; RV64XVENTANACONDOPS-LABEL: and32:
225; RV64XVENTANACONDOPS:       # %bb.0:
226; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
227; RV64XVENTANACONDOPS-NEXT:    and a1, a0, a1
228; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a0, a2
229; RV64XVENTANACONDOPS-NEXT:    or a0, a1, a0
230; RV64XVENTANACONDOPS-NEXT:    ret
231;
232; RV64XTHEADCONDMOV-LABEL: and32:
233; RV64XTHEADCONDMOV:       # %bb.0:
234; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
235; RV64XTHEADCONDMOV-NEXT:    and a1, a0, a1
236; RV64XTHEADCONDMOV-NEXT:    th.mvnez a0, a1, a2
237; RV64XTHEADCONDMOV-NEXT:    ret
238;
239; RV32ZICOND-LABEL: and32:
240; RV32ZICOND:       # %bb.0:
241; RV32ZICOND-NEXT:    andi a2, a2, 1
242; RV32ZICOND-NEXT:    and a1, a0, a1
243; RV32ZICOND-NEXT:    czero.nez a0, a0, a2
244; RV32ZICOND-NEXT:    or a0, a1, a0
245; RV32ZICOND-NEXT:    ret
246;
247; RV64ZICOND-LABEL: and32:
248; RV64ZICOND:       # %bb.0:
249; RV64ZICOND-NEXT:    andi a2, a2, 1
250; RV64ZICOND-NEXT:    and a1, a0, a1
251; RV64ZICOND-NEXT:    czero.nez a0, a0, a2
252; RV64ZICOND-NEXT:    or a0, a1, a0
253; RV64ZICOND-NEXT:    ret
254  %binop = and i32 %x, %y
255  %select_ = select i1 %c, i32 %binop, i32 %x
256  ret i32 %select_
257}
258
259
260define i32 @add32(i32 %x, i32 %y, i1 %c) {
261; RV32I-LABEL: add32:
262; RV32I:       # %bb.0:
263; RV32I-NEXT:    slli a2, a2, 31
264; RV32I-NEXT:    srai a2, a2, 31
265; RV32I-NEXT:    and a1, a2, a1
266; RV32I-NEXT:    add a0, a0, a1
267; RV32I-NEXT:    ret
268;
269; RV64I-LABEL: add32:
270; RV64I:       # %bb.0:
271; RV64I-NEXT:    slli a2, a2, 63
272; RV64I-NEXT:    srai a2, a2, 63
273; RV64I-NEXT:    and a1, a2, a1
274; RV64I-NEXT:    addw a0, a0, a1
275; RV64I-NEXT:    ret
276;
277; RV64XVENTANACONDOPS-LABEL: add32:
278; RV64XVENTANACONDOPS:       # %bb.0:
279; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
280; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
281; RV64XVENTANACONDOPS-NEXT:    addw a0, a0, a1
282; RV64XVENTANACONDOPS-NEXT:    ret
283;
284; RV64XTHEADCONDMOV-LABEL: add32:
285; RV64XTHEADCONDMOV:       # %bb.0:
286; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
287; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
288; RV64XTHEADCONDMOV-NEXT:    addw a0, a0, a1
289; RV64XTHEADCONDMOV-NEXT:    ret
290;
291; RV32ZICOND-LABEL: add32:
292; RV32ZICOND:       # %bb.0:
293; RV32ZICOND-NEXT:    andi a2, a2, 1
294; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
295; RV32ZICOND-NEXT:    add a0, a0, a1
296; RV32ZICOND-NEXT:    ret
297;
298; RV64ZICOND-LABEL: add32:
299; RV64ZICOND:       # %bb.0:
300; RV64ZICOND-NEXT:    andi a2, a2, 1
301; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
302; RV64ZICOND-NEXT:    addw a0, a0, a1
303; RV64ZICOND-NEXT:    ret
304  %binop = add i32 %x, %y
305  %select_ = select i1 %c, i32 %binop, i32 %x
306  ret i32 %select_
307}
308
309
310define i32 @or32(i32 %x, i32 %y, i1 %c) {
311; RV32I-LABEL: or32:
312; RV32I:       # %bb.0:
313; RV32I-NEXT:    slli a2, a2, 31
314; RV32I-NEXT:    srai a2, a2, 31
315; RV32I-NEXT:    and a1, a2, a1
316; RV32I-NEXT:    or a0, a0, a1
317; RV32I-NEXT:    ret
318;
319; RV64I-LABEL: or32:
320; RV64I:       # %bb.0:
321; RV64I-NEXT:    slli a2, a2, 63
322; RV64I-NEXT:    srai a2, a2, 63
323; RV64I-NEXT:    and a1, a2, a1
324; RV64I-NEXT:    or a0, a0, a1
325; RV64I-NEXT:    ret
326;
327; RV64XVENTANACONDOPS-LABEL: or32:
328; RV64XVENTANACONDOPS:       # %bb.0:
329; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
330; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
331; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
332; RV64XVENTANACONDOPS-NEXT:    ret
333;
334; RV64XTHEADCONDMOV-LABEL: or32:
335; RV64XTHEADCONDMOV:       # %bb.0:
336; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
337; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
338; RV64XTHEADCONDMOV-NEXT:    or a0, a0, a1
339; RV64XTHEADCONDMOV-NEXT:    ret
340;
341; RV32ZICOND-LABEL: or32:
342; RV32ZICOND:       # %bb.0:
343; RV32ZICOND-NEXT:    andi a2, a2, 1
344; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
345; RV32ZICOND-NEXT:    or a0, a0, a1
346; RV32ZICOND-NEXT:    ret
347;
348; RV64ZICOND-LABEL: or32:
349; RV64ZICOND:       # %bb.0:
350; RV64ZICOND-NEXT:    andi a2, a2, 1
351; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
352; RV64ZICOND-NEXT:    or a0, a0, a1
353; RV64ZICOND-NEXT:    ret
354  %binop = or i32 %x, %y
355  %select_ = select i1 %c, i32 %binop, i32 %x
356  ret i32 %select_
357}
358
359define i32 @xor32(i32 %x, i32 %y, i1 %c) {
360; RV32I-LABEL: xor32:
361; RV32I:       # %bb.0:
362; RV32I-NEXT:    slli a2, a2, 31
363; RV32I-NEXT:    srai a2, a2, 31
364; RV32I-NEXT:    and a1, a2, a1
365; RV32I-NEXT:    xor a0, a0, a1
366; RV32I-NEXT:    ret
367;
368; RV64I-LABEL: xor32:
369; RV64I:       # %bb.0:
370; RV64I-NEXT:    slli a2, a2, 63
371; RV64I-NEXT:    srai a2, a2, 63
372; RV64I-NEXT:    and a1, a2, a1
373; RV64I-NEXT:    xor a0, a0, a1
374; RV64I-NEXT:    ret
375;
376; RV64XVENTANACONDOPS-LABEL: xor32:
377; RV64XVENTANACONDOPS:       # %bb.0:
378; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
379; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
380; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
381; RV64XVENTANACONDOPS-NEXT:    ret
382;
383; RV64XTHEADCONDMOV-LABEL: xor32:
384; RV64XTHEADCONDMOV:       # %bb.0:
385; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
386; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
387; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
388; RV64XTHEADCONDMOV-NEXT:    ret
389;
390; RV32ZICOND-LABEL: xor32:
391; RV32ZICOND:       # %bb.0:
392; RV32ZICOND-NEXT:    andi a2, a2, 1
393; RV32ZICOND-NEXT:    czero.eqz a1, a1, a2
394; RV32ZICOND-NEXT:    xor a0, a0, a1
395; RV32ZICOND-NEXT:    ret
396;
397; RV64ZICOND-LABEL: xor32:
398; RV64ZICOND:       # %bb.0:
399; RV64ZICOND-NEXT:    andi a2, a2, 1
400; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
401; RV64ZICOND-NEXT:    xor a0, a0, a1
402; RV64ZICOND-NEXT:    ret
403  %binop = xor i32 %x, %y
404  %select_ = select i1 %c, i32 %binop, i32 %x
405  ret i32 %select_
406}
407
408define i64 @shl64(i64 %x, i64 %y, i1 %c) {
409; RV32I-LABEL: shl64:
410; RV32I:       # %bb.0:
411; RV32I-NEXT:    slli a4, a4, 31
412; RV32I-NEXT:    srai a4, a4, 31
413; RV32I-NEXT:    and a4, a4, a2
414; RV32I-NEXT:    addi a3, a4, -32
415; RV32I-NEXT:    sll a2, a0, a4
416; RV32I-NEXT:    bltz a3, .LBB8_2
417; RV32I-NEXT:  # %bb.1:
418; RV32I-NEXT:    mv a1, a2
419; RV32I-NEXT:    j .LBB8_3
420; RV32I-NEXT:  .LBB8_2:
421; RV32I-NEXT:    sll a1, a1, a4
422; RV32I-NEXT:    not a4, a4
423; RV32I-NEXT:    srli a0, a0, 1
424; RV32I-NEXT:    srl a0, a0, a4
425; RV32I-NEXT:    or a1, a1, a0
426; RV32I-NEXT:  .LBB8_3:
427; RV32I-NEXT:    srai a0, a3, 31
428; RV32I-NEXT:    and a0, a0, a2
429; RV32I-NEXT:    ret
430;
431; RV64I-LABEL: shl64:
432; RV64I:       # %bb.0:
433; RV64I-NEXT:    slli a2, a2, 63
434; RV64I-NEXT:    srai a2, a2, 63
435; RV64I-NEXT:    and a1, a2, a1
436; RV64I-NEXT:    sll a0, a0, a1
437; RV64I-NEXT:    ret
438;
439; RV64XVENTANACONDOPS-LABEL: shl64:
440; RV64XVENTANACONDOPS:       # %bb.0:
441; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
442; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
443; RV64XVENTANACONDOPS-NEXT:    sll a0, a0, a1
444; RV64XVENTANACONDOPS-NEXT:    ret
445;
446; RV64XTHEADCONDMOV-LABEL: shl64:
447; RV64XTHEADCONDMOV:       # %bb.0:
448; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
449; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
450; RV64XTHEADCONDMOV-NEXT:    sll a0, a0, a1
451; RV64XTHEADCONDMOV-NEXT:    ret
452;
453; RV32ZICOND-LABEL: shl64:
454; RV32ZICOND:       # %bb.0:
455; RV32ZICOND-NEXT:    andi a4, a4, 1
456; RV32ZICOND-NEXT:    srli a3, a0, 1
457; RV32ZICOND-NEXT:    czero.eqz a2, a2, a4
458; RV32ZICOND-NEXT:    sll a0, a0, a2
459; RV32ZICOND-NEXT:    addi a4, a2, -32
460; RV32ZICOND-NEXT:    sll a1, a1, a2
461; RV32ZICOND-NEXT:    not a2, a2
462; RV32ZICOND-NEXT:    slti a4, a4, 0
463; RV32ZICOND-NEXT:    srl a2, a3, a2
464; RV32ZICOND-NEXT:    czero.nez a3, a0, a4
465; RV32ZICOND-NEXT:    or a1, a1, a2
466; RV32ZICOND-NEXT:    czero.eqz a1, a1, a4
467; RV32ZICOND-NEXT:    or a1, a1, a3
468; RV32ZICOND-NEXT:    czero.eqz a0, a0, a4
469; RV32ZICOND-NEXT:    ret
470;
471; RV64ZICOND-LABEL: shl64:
472; RV64ZICOND:       # %bb.0:
473; RV64ZICOND-NEXT:    andi a2, a2, 1
474; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
475; RV64ZICOND-NEXT:    sll a0, a0, a1
476; RV64ZICOND-NEXT:    ret
477  %binop = shl i64 %x, %y
478  %select_ = select i1 %c, i64 %binop, i64 %x
479  ret i64 %select_
480}
481
482define i64 @ashr64(i64 %x, i64 %y, i1 %c) {
483; RV32I-LABEL: ashr64:
484; RV32I:       # %bb.0:
485; RV32I-NEXT:    mv a3, a0
486; RV32I-NEXT:    slli a4, a4, 31
487; RV32I-NEXT:    srai a4, a4, 31
488; RV32I-NEXT:    and a2, a4, a2
489; RV32I-NEXT:    addi a4, a2, -32
490; RV32I-NEXT:    sra a0, a1, a2
491; RV32I-NEXT:    bltz a4, .LBB9_2
492; RV32I-NEXT:  # %bb.1:
493; RV32I-NEXT:    srai a1, a1, 31
494; RV32I-NEXT:    ret
495; RV32I-NEXT:  .LBB9_2:
496; RV32I-NEXT:    srl a3, a3, a2
497; RV32I-NEXT:    not a2, a2
498; RV32I-NEXT:    slli a1, a1, 1
499; RV32I-NEXT:    sll a1, a1, a2
500; RV32I-NEXT:    or a3, a3, a1
501; RV32I-NEXT:    mv a1, a0
502; RV32I-NEXT:    mv a0, a3
503; RV32I-NEXT:    ret
504;
505; RV64I-LABEL: ashr64:
506; RV64I:       # %bb.0:
507; RV64I-NEXT:    slli a2, a2, 63
508; RV64I-NEXT:    srai a2, a2, 63
509; RV64I-NEXT:    and a1, a2, a1
510; RV64I-NEXT:    sra a0, a0, a1
511; RV64I-NEXT:    ret
512;
513; RV64XVENTANACONDOPS-LABEL: ashr64:
514; RV64XVENTANACONDOPS:       # %bb.0:
515; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
516; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
517; RV64XVENTANACONDOPS-NEXT:    sra a0, a0, a1
518; RV64XVENTANACONDOPS-NEXT:    ret
519;
520; RV64XTHEADCONDMOV-LABEL: ashr64:
521; RV64XTHEADCONDMOV:       # %bb.0:
522; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
523; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
524; RV64XTHEADCONDMOV-NEXT:    sra a0, a0, a1
525; RV64XTHEADCONDMOV-NEXT:    ret
526;
527; RV32ZICOND-LABEL: ashr64:
528; RV32ZICOND:       # %bb.0:
529; RV32ZICOND-NEXT:    andi a4, a4, 1
530; RV32ZICOND-NEXT:    slli a3, a1, 1
531; RV32ZICOND-NEXT:    srai a5, a1, 31
532; RV32ZICOND-NEXT:    czero.eqz a2, a2, a4
533; RV32ZICOND-NEXT:    sra a1, a1, a2
534; RV32ZICOND-NEXT:    addi a4, a2, -32
535; RV32ZICOND-NEXT:    srl a0, a0, a2
536; RV32ZICOND-NEXT:    not a2, a2
537; RV32ZICOND-NEXT:    slti a4, a4, 0
538; RV32ZICOND-NEXT:    sll a2, a3, a2
539; RV32ZICOND-NEXT:    czero.nez a3, a1, a4
540; RV32ZICOND-NEXT:    or a0, a0, a2
541; RV32ZICOND-NEXT:    czero.eqz a1, a1, a4
542; RV32ZICOND-NEXT:    czero.nez a2, a5, a4
543; RV32ZICOND-NEXT:    czero.eqz a0, a0, a4
544; RV32ZICOND-NEXT:    or a0, a0, a3
545; RV32ZICOND-NEXT:    or a1, a1, a2
546; RV32ZICOND-NEXT:    ret
547;
548; RV64ZICOND-LABEL: ashr64:
549; RV64ZICOND:       # %bb.0:
550; RV64ZICOND-NEXT:    andi a2, a2, 1
551; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
552; RV64ZICOND-NEXT:    sra a0, a0, a1
553; RV64ZICOND-NEXT:    ret
554  %binop = ashr i64 %x, %y
555  %select_ = select i1 %c, i64 %binop, i64 %x
556  ret i64 %select_
557}
558
559define i64 @lshr64(i64 %x, i64 %y, i1 %c) {
560; RV32I-LABEL: lshr64:
561; RV32I:       # %bb.0:
562; RV32I-NEXT:    slli a4, a4, 31
563; RV32I-NEXT:    srai a4, a4, 31
564; RV32I-NEXT:    and a4, a4, a2
565; RV32I-NEXT:    addi a3, a4, -32
566; RV32I-NEXT:    srl a2, a1, a4
567; RV32I-NEXT:    bltz a3, .LBB10_2
568; RV32I-NEXT:  # %bb.1:
569; RV32I-NEXT:    mv a0, a2
570; RV32I-NEXT:    j .LBB10_3
571; RV32I-NEXT:  .LBB10_2:
572; RV32I-NEXT:    srl a0, a0, a4
573; RV32I-NEXT:    not a4, a4
574; RV32I-NEXT:    slli a1, a1, 1
575; RV32I-NEXT:    sll a1, a1, a4
576; RV32I-NEXT:    or a0, a0, a1
577; RV32I-NEXT:  .LBB10_3:
578; RV32I-NEXT:    srai a1, a3, 31
579; RV32I-NEXT:    and a1, a1, a2
580; RV32I-NEXT:    ret
581;
582; RV64I-LABEL: lshr64:
583; RV64I:       # %bb.0:
584; RV64I-NEXT:    slli a2, a2, 63
585; RV64I-NEXT:    srai a2, a2, 63
586; RV64I-NEXT:    and a1, a2, a1
587; RV64I-NEXT:    srl a0, a0, a1
588; RV64I-NEXT:    ret
589;
590; RV64XVENTANACONDOPS-LABEL: lshr64:
591; RV64XVENTANACONDOPS:       # %bb.0:
592; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
593; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
594; RV64XVENTANACONDOPS-NEXT:    srl a0, a0, a1
595; RV64XVENTANACONDOPS-NEXT:    ret
596;
597; RV64XTHEADCONDMOV-LABEL: lshr64:
598; RV64XTHEADCONDMOV:       # %bb.0:
599; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
600; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
601; RV64XTHEADCONDMOV-NEXT:    srl a0, a0, a1
602; RV64XTHEADCONDMOV-NEXT:    ret
603;
604; RV32ZICOND-LABEL: lshr64:
605; RV32ZICOND:       # %bb.0:
606; RV32ZICOND-NEXT:    andi a4, a4, 1
607; RV32ZICOND-NEXT:    slli a3, a1, 1
608; RV32ZICOND-NEXT:    czero.eqz a2, a2, a4
609; RV32ZICOND-NEXT:    srl a1, a1, a2
610; RV32ZICOND-NEXT:    addi a4, a2, -32
611; RV32ZICOND-NEXT:    srl a0, a0, a2
612; RV32ZICOND-NEXT:    not a2, a2
613; RV32ZICOND-NEXT:    slti a4, a4, 0
614; RV32ZICOND-NEXT:    sll a2, a3, a2
615; RV32ZICOND-NEXT:    czero.nez a3, a1, a4
616; RV32ZICOND-NEXT:    or a0, a0, a2
617; RV32ZICOND-NEXT:    czero.eqz a0, a0, a4
618; RV32ZICOND-NEXT:    or a0, a0, a3
619; RV32ZICOND-NEXT:    czero.eqz a1, a1, a4
620; RV32ZICOND-NEXT:    ret
621;
622; RV64ZICOND-LABEL: lshr64:
623; RV64ZICOND:       # %bb.0:
624; RV64ZICOND-NEXT:    andi a2, a2, 1
625; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
626; RV64ZICOND-NEXT:    srl a0, a0, a1
627; RV64ZICOND-NEXT:    ret
628  %binop = lshr i64 %x, %y
629  %select_ = select i1 %c, i64 %binop, i64 %x
630  ret i64 %select_
631}
632
633define i64 @sub64(i64 %x, i64 %y, i1 %c) {
634; RV32I-LABEL: sub64:
635; RV32I:       # %bb.0:
636; RV32I-NEXT:    slli a4, a4, 31
637; RV32I-NEXT:    srai a4, a4, 31
638; RV32I-NEXT:    and a2, a4, a2
639; RV32I-NEXT:    and a3, a4, a3
640; RV32I-NEXT:    sltu a4, a0, a2
641; RV32I-NEXT:    sub a1, a1, a3
642; RV32I-NEXT:    sub a1, a1, a4
643; RV32I-NEXT:    sub a0, a0, a2
644; RV32I-NEXT:    ret
645;
646; RV64I-LABEL: sub64:
647; RV64I:       # %bb.0:
648; RV64I-NEXT:    slli a2, a2, 63
649; RV64I-NEXT:    srai a2, a2, 63
650; RV64I-NEXT:    and a1, a2, a1
651; RV64I-NEXT:    sub a0, a0, a1
652; RV64I-NEXT:    ret
653;
654; RV64XVENTANACONDOPS-LABEL: sub64:
655; RV64XVENTANACONDOPS:       # %bb.0:
656; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
657; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
658; RV64XVENTANACONDOPS-NEXT:    sub a0, a0, a1
659; RV64XVENTANACONDOPS-NEXT:    ret
660;
661; RV64XTHEADCONDMOV-LABEL: sub64:
662; RV64XTHEADCONDMOV:       # %bb.0:
663; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
664; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
665; RV64XTHEADCONDMOV-NEXT:    sub a0, a0, a1
666; RV64XTHEADCONDMOV-NEXT:    ret
667;
668; RV32ZICOND-LABEL: sub64:
669; RV32ZICOND:       # %bb.0:
670; RV32ZICOND-NEXT:    andi a4, a4, 1
671; RV32ZICOND-NEXT:    czero.eqz a2, a2, a4
672; RV32ZICOND-NEXT:    czero.eqz a3, a3, a4
673; RV32ZICOND-NEXT:    sltu a4, a0, a2
674; RV32ZICOND-NEXT:    sub a1, a1, a3
675; RV32ZICOND-NEXT:    sub a1, a1, a4
676; RV32ZICOND-NEXT:    sub a0, a0, a2
677; RV32ZICOND-NEXT:    ret
678;
679; RV64ZICOND-LABEL: sub64:
680; RV64ZICOND:       # %bb.0:
681; RV64ZICOND-NEXT:    andi a2, a2, 1
682; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
683; RV64ZICOND-NEXT:    sub a0, a0, a1
684; RV64ZICOND-NEXT:    ret
685  %binop = sub i64 %x, %y
686  %select_ = select i1 %c, i64 %binop, i64 %x
687  ret i64 %select_
688}
689
690define i64 @and64(i64 %x, i64 %y, i1 %c) {
691; RV32I-LABEL: and64:
692; RV32I:       # %bb.0:
693; RV32I-NEXT:    andi a4, a4, 1
694; RV32I-NEXT:    beqz a4, .LBB12_2
695; RV32I-NEXT:  # %bb.1:
696; RV32I-NEXT:    and a1, a1, a3
697; RV32I-NEXT:    and a0, a0, a2
698; RV32I-NEXT:  .LBB12_2:
699; RV32I-NEXT:    ret
700;
701; RV64I-LABEL: and64:
702; RV64I:       # %bb.0:
703; RV64I-NEXT:    andi a2, a2, 1
704; RV64I-NEXT:    beqz a2, .LBB12_2
705; RV64I-NEXT:  # %bb.1:
706; RV64I-NEXT:    and a0, a0, a1
707; RV64I-NEXT:  .LBB12_2:
708; RV64I-NEXT:    ret
709;
710; RV64XVENTANACONDOPS-LABEL: and64:
711; RV64XVENTANACONDOPS:       # %bb.0:
712; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
713; RV64XVENTANACONDOPS-NEXT:    and a1, a0, a1
714; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a0, a2
715; RV64XVENTANACONDOPS-NEXT:    or a0, a1, a0
716; RV64XVENTANACONDOPS-NEXT:    ret
717;
718; RV64XTHEADCONDMOV-LABEL: and64:
719; RV64XTHEADCONDMOV:       # %bb.0:
720; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
721; RV64XTHEADCONDMOV-NEXT:    and a1, a0, a1
722; RV64XTHEADCONDMOV-NEXT:    th.mvnez a0, a1, a2
723; RV64XTHEADCONDMOV-NEXT:    ret
724;
725; RV32ZICOND-LABEL: and64:
726; RV32ZICOND:       # %bb.0:
727; RV32ZICOND-NEXT:    andi a4, a4, 1
728; RV32ZICOND-NEXT:    and a3, a1, a3
729; RV32ZICOND-NEXT:    and a2, a0, a2
730; RV32ZICOND-NEXT:    czero.nez a0, a0, a4
731; RV32ZICOND-NEXT:    czero.nez a1, a1, a4
732; RV32ZICOND-NEXT:    or a0, a2, a0
733; RV32ZICOND-NEXT:    or a1, a3, a1
734; RV32ZICOND-NEXT:    ret
735;
736; RV64ZICOND-LABEL: and64:
737; RV64ZICOND:       # %bb.0:
738; RV64ZICOND-NEXT:    andi a2, a2, 1
739; RV64ZICOND-NEXT:    and a1, a0, a1
740; RV64ZICOND-NEXT:    czero.nez a0, a0, a2
741; RV64ZICOND-NEXT:    or a0, a1, a0
742; RV64ZICOND-NEXT:    ret
743  %binop = and i64 %x, %y
744  %select_ = select i1 %c, i64 %binop, i64 %x
745  ret i64 %select_
746}
747
748
749define i64 @add64(i64 %x, i64 %y, i1 %c) {
750; RV32I-LABEL: add64:
751; RV32I:       # %bb.0:
752; RV32I-NEXT:    slli a4, a4, 31
753; RV32I-NEXT:    srai a4, a4, 31
754; RV32I-NEXT:    and a3, a4, a3
755; RV32I-NEXT:    and a2, a4, a2
756; RV32I-NEXT:    add a1, a1, a3
757; RV32I-NEXT:    add a2, a0, a2
758; RV32I-NEXT:    sltu a0, a2, a0
759; RV32I-NEXT:    add a1, a1, a0
760; RV32I-NEXT:    mv a0, a2
761; RV32I-NEXT:    ret
762;
763; RV64I-LABEL: add64:
764; RV64I:       # %bb.0:
765; RV64I-NEXT:    slli a2, a2, 63
766; RV64I-NEXT:    srai a2, a2, 63
767; RV64I-NEXT:    and a1, a2, a1
768; RV64I-NEXT:    add a0, a0, a1
769; RV64I-NEXT:    ret
770;
771; RV64XVENTANACONDOPS-LABEL: add64:
772; RV64XVENTANACONDOPS:       # %bb.0:
773; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
774; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
775; RV64XVENTANACONDOPS-NEXT:    add a0, a0, a1
776; RV64XVENTANACONDOPS-NEXT:    ret
777;
778; RV64XTHEADCONDMOV-LABEL: add64:
779; RV64XTHEADCONDMOV:       # %bb.0:
780; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
781; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
782; RV64XTHEADCONDMOV-NEXT:    add a0, a0, a1
783; RV64XTHEADCONDMOV-NEXT:    ret
784;
785; RV32ZICOND-LABEL: add64:
786; RV32ZICOND:       # %bb.0:
787; RV32ZICOND-NEXT:    andi a4, a4, 1
788; RV32ZICOND-NEXT:    czero.eqz a3, a3, a4
789; RV32ZICOND-NEXT:    czero.eqz a2, a2, a4
790; RV32ZICOND-NEXT:    add a1, a1, a3
791; RV32ZICOND-NEXT:    add a2, a0, a2
792; RV32ZICOND-NEXT:    sltu a0, a2, a0
793; RV32ZICOND-NEXT:    add a1, a1, a0
794; RV32ZICOND-NEXT:    mv a0, a2
795; RV32ZICOND-NEXT:    ret
796;
797; RV64ZICOND-LABEL: add64:
798; RV64ZICOND:       # %bb.0:
799; RV64ZICOND-NEXT:    andi a2, a2, 1
800; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
801; RV64ZICOND-NEXT:    add a0, a0, a1
802; RV64ZICOND-NEXT:    ret
803  %binop = add i64 %x, %y
804  %select_ = select i1 %c, i64 %binop, i64 %x
805  ret i64 %select_
806}
807
808
809define i64 @or64(i64 %x, i64 %y, i1 %c) {
810; RV32I-LABEL: or64:
811; RV32I:       # %bb.0:
812; RV32I-NEXT:    slli a4, a4, 31
813; RV32I-NEXT:    srai a4, a4, 31
814; RV32I-NEXT:    and a2, a4, a2
815; RV32I-NEXT:    and a3, a4, a3
816; RV32I-NEXT:    or a0, a0, a2
817; RV32I-NEXT:    or a1, a1, a3
818; RV32I-NEXT:    ret
819;
820; RV64I-LABEL: or64:
821; RV64I:       # %bb.0:
822; RV64I-NEXT:    slli a2, a2, 63
823; RV64I-NEXT:    srai a2, a2, 63
824; RV64I-NEXT:    and a1, a2, a1
825; RV64I-NEXT:    or a0, a0, a1
826; RV64I-NEXT:    ret
827;
828; RV64XVENTANACONDOPS-LABEL: or64:
829; RV64XVENTANACONDOPS:       # %bb.0:
830; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
831; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
832; RV64XVENTANACONDOPS-NEXT:    or a0, a0, a1
833; RV64XVENTANACONDOPS-NEXT:    ret
834;
835; RV64XTHEADCONDMOV-LABEL: or64:
836; RV64XTHEADCONDMOV:       # %bb.0:
837; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
838; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
839; RV64XTHEADCONDMOV-NEXT:    or a0, a0, a1
840; RV64XTHEADCONDMOV-NEXT:    ret
841;
842; RV32ZICOND-LABEL: or64:
843; RV32ZICOND:       # %bb.0:
844; RV32ZICOND-NEXT:    andi a4, a4, 1
845; RV32ZICOND-NEXT:    czero.eqz a2, a2, a4
846; RV32ZICOND-NEXT:    czero.eqz a3, a3, a4
847; RV32ZICOND-NEXT:    or a0, a0, a2
848; RV32ZICOND-NEXT:    or a1, a1, a3
849; RV32ZICOND-NEXT:    ret
850;
851; RV64ZICOND-LABEL: or64:
852; RV64ZICOND:       # %bb.0:
853; RV64ZICOND-NEXT:    andi a2, a2, 1
854; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
855; RV64ZICOND-NEXT:    or a0, a0, a1
856; RV64ZICOND-NEXT:    ret
857  %binop = or i64 %x, %y
858  %select_ = select i1 %c, i64 %binop, i64 %x
859  ret i64 %select_
860}
861
862define i64 @xor64(i64 %x, i64 %y, i1 %c) {
863; RV32I-LABEL: xor64:
864; RV32I:       # %bb.0:
865; RV32I-NEXT:    slli a4, a4, 31
866; RV32I-NEXT:    srai a4, a4, 31
867; RV32I-NEXT:    and a2, a4, a2
868; RV32I-NEXT:    and a3, a4, a3
869; RV32I-NEXT:    xor a0, a0, a2
870; RV32I-NEXT:    xor a1, a1, a3
871; RV32I-NEXT:    ret
872;
873; RV64I-LABEL: xor64:
874; RV64I:       # %bb.0:
875; RV64I-NEXT:    slli a2, a2, 63
876; RV64I-NEXT:    srai a2, a2, 63
877; RV64I-NEXT:    and a1, a2, a1
878; RV64I-NEXT:    xor a0, a0, a1
879; RV64I-NEXT:    ret
880;
881; RV64XVENTANACONDOPS-LABEL: xor64:
882; RV64XVENTANACONDOPS:       # %bb.0:
883; RV64XVENTANACONDOPS-NEXT:    andi a2, a2, 1
884; RV64XVENTANACONDOPS-NEXT:    vt.maskc a1, a1, a2
885; RV64XVENTANACONDOPS-NEXT:    xor a0, a0, a1
886; RV64XVENTANACONDOPS-NEXT:    ret
887;
888; RV64XTHEADCONDMOV-LABEL: xor64:
889; RV64XTHEADCONDMOV:       # %bb.0:
890; RV64XTHEADCONDMOV-NEXT:    andi a2, a2, 1
891; RV64XTHEADCONDMOV-NEXT:    th.mveqz a1, zero, a2
892; RV64XTHEADCONDMOV-NEXT:    xor a0, a0, a1
893; RV64XTHEADCONDMOV-NEXT:    ret
894;
895; RV32ZICOND-LABEL: xor64:
896; RV32ZICOND:       # %bb.0:
897; RV32ZICOND-NEXT:    andi a4, a4, 1
898; RV32ZICOND-NEXT:    czero.eqz a2, a2, a4
899; RV32ZICOND-NEXT:    czero.eqz a3, a3, a4
900; RV32ZICOND-NEXT:    xor a0, a0, a2
901; RV32ZICOND-NEXT:    xor a1, a1, a3
902; RV32ZICOND-NEXT:    ret
903;
904; RV64ZICOND-LABEL: xor64:
905; RV64ZICOND:       # %bb.0:
906; RV64ZICOND-NEXT:    andi a2, a2, 1
907; RV64ZICOND-NEXT:    czero.eqz a1, a1, a2
908; RV64ZICOND-NEXT:    xor a0, a0, a1
909; RV64ZICOND-NEXT:    ret
910  %binop = xor i64 %x, %y
911  %select_ = select i1 %c, i64 %binop, i64 %x
912  ret i64 %select_
913}
914