Skip to content

Commit cff8037

Browse files
bababuckRyan Buchner
authored andcommitted
[RISCV] Add new tests for RISCV zicond extension
1 parent d099d95 commit cff8037

File tree

1 file changed

+289
-0
lines changed

1 file changed

+289
-0
lines changed
Lines changed: 289 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,289 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=riscv32 -O2 -verify-machineinstrs -mattr=+b,+zicond < %s | FileCheck %s -check-prefix=RV32ZICOND
3+
; RUN: llc -mtriple=riscv64 -O2 -verify-machineinstrs -mattr=+b,+zicond < %s | FileCheck %s -check-prefix=RV64ZICOND
4+
5+
; (and (icmp x. 0, ne), (icmp y, 0, ne)) -> (czero.eqz (icmp x, 0, ne), y)
6+
define i32 @icmp_and(i64 %x, i64 %y) {
7+
; RV32ZICOND-LABEL: icmp_and:
8+
; RV32ZICOND: # %bb.0:
9+
; RV32ZICOND-NEXT: or a2, a2, a3
10+
; RV32ZICOND-NEXT: or a0, a0, a1
11+
; RV32ZICOND-NEXT: snez a1, a2
12+
; RV32ZICOND-NEXT: snez a0, a0
13+
; RV32ZICOND-NEXT: and a0, a0, a1
14+
; RV32ZICOND-NEXT: ret
15+
;
16+
; RV64ZICOND-LABEL: icmp_and:
17+
; RV64ZICOND: # %bb.0:
18+
; RV64ZICOND-NEXT: snez a1, a1
19+
; RV64ZICOND-NEXT: snez a0, a0
20+
; RV64ZICOND-NEXT: and a0, a0, a1
21+
; RV64ZICOND-NEXT: ret
22+
%3 = icmp ne i64 %y, 0
23+
%4 = icmp ne i64 %x, 0
24+
%5 = and i1 %4, %3
25+
%6 = zext i1 %5 to i32
26+
ret i32 %6
27+
}
28+
29+
; (and (and (icmp x, 0, ne), (icmp y, 0, ne)), (icmp z, 0, ne)) -> (czero.eqz (czero.eqz (icmp x, 0, ne), y), z)
30+
define i32 @icmp_and_and(i64 %x, i64 %y, i64 %z) {
31+
; RV32ZICOND-LABEL: icmp_and_and:
32+
; RV32ZICOND: # %bb.0:
33+
; RV32ZICOND-NEXT: or a2, a2, a3
34+
; RV32ZICOND-NEXT: or a0, a0, a1
35+
; RV32ZICOND-NEXT: or a4, a4, a5
36+
; RV32ZICOND-NEXT: snez a1, a2
37+
; RV32ZICOND-NEXT: snez a0, a0
38+
; RV32ZICOND-NEXT: and a0, a1, a0
39+
; RV32ZICOND-NEXT: snez a1, a4
40+
; RV32ZICOND-NEXT: and a0, a1, a0
41+
; RV32ZICOND-NEXT: ret
42+
;
43+
; RV64ZICOND-LABEL: icmp_and_and:
44+
; RV64ZICOND: # %bb.0:
45+
; RV64ZICOND-NEXT: snez a1, a1
46+
; RV64ZICOND-NEXT: snez a0, a0
47+
; RV64ZICOND-NEXT: and a0, a1, a0
48+
; RV64ZICOND-NEXT: snez a1, a2
49+
; RV64ZICOND-NEXT: and a0, a1, a0
50+
; RV64ZICOND-NEXT: ret
51+
%4 = icmp ne i64 %y, 0
52+
%5 = icmp ne i64 %x, 0
53+
%6 = and i1 %4, %5
54+
%7 = icmp ne i64 %z, 0
55+
%8 = and i1 %7, %6
56+
%9 = zext i1 %8 to i32
57+
ret i32 %9
58+
}
59+
60+
; (select cond, x, rotl(x, rot.amt)) -> (rotl x, (czero_nez rot.amt, cond))
61+
define i64 @rotate_l_nez(i64 %x, i64 %rot.amt, i1 %cond) {
62+
; RV32ZICOND-LABEL: rotate_l_nez:
63+
; RV32ZICOND: # %bb.0:
64+
; RV32ZICOND-NEXT: andi a4, a4, 1
65+
; RV32ZICOND-NEXT: bexti a3, a2, 5
66+
; RV32ZICOND-NEXT: not a5, a2
67+
; RV32ZICOND-NEXT: czero.nez a6, a1, a3
68+
; RV32ZICOND-NEXT: czero.eqz a7, a0, a3
69+
; RV32ZICOND-NEXT: czero.nez t0, a0, a3
70+
; RV32ZICOND-NEXT: czero.eqz a3, a1, a3
71+
; RV32ZICOND-NEXT: czero.eqz a0, a0, a4
72+
; RV32ZICOND-NEXT: czero.eqz a1, a1, a4
73+
; RV32ZICOND-NEXT: or a6, a7, a6
74+
; RV32ZICOND-NEXT: or a3, a3, t0
75+
; RV32ZICOND-NEXT: sll a7, a6, a2
76+
; RV32ZICOND-NEXT: srli t0, a3, 1
77+
; RV32ZICOND-NEXT: sll a2, a3, a2
78+
; RV32ZICOND-NEXT: srli a3, a6, 1
79+
; RV32ZICOND-NEXT: srl a6, t0, a5
80+
; RV32ZICOND-NEXT: srl a3, a3, a5
81+
; RV32ZICOND-NEXT: or a5, a7, a6
82+
; RV32ZICOND-NEXT: or a2, a2, a3
83+
; RV32ZICOND-NEXT: czero.nez a2, a2, a4
84+
; RV32ZICOND-NEXT: czero.nez a3, a5, a4
85+
; RV32ZICOND-NEXT: or a0, a0, a2
86+
; RV32ZICOND-NEXT: or a1, a1, a3
87+
; RV32ZICOND-NEXT: ret
88+
;
89+
; RV64ZICOND-LABEL: rotate_l_nez:
90+
; RV64ZICOND: # %bb.0:
91+
; RV64ZICOND-NEXT: andi a2, a2, 1
92+
; RV64ZICOND-NEXT: rol a1, a0, a1
93+
; RV64ZICOND-NEXT: czero.nez a1, a1, a2
94+
; RV64ZICOND-NEXT: czero.eqz a0, a0, a2
95+
; RV64ZICOND-NEXT: or a0, a0, a1
96+
; RV64ZICOND-NEXT: ret
97+
%6 = call i64 @llvm.fshl.i64(i64 %x, i64 %x, i64 %rot.amt)
98+
%7 = select i1 %cond, i64 %x, i64 %6
99+
ret i64 %7
100+
}
101+
102+
; (select cond, rotl(x, rot.amt), x) -> (rotl x, (czero_eqz rot.amt, cond))
103+
define i64 @rotate_l_eqz(i64 %x, i64 %rot.amt, i1 %cond) {
104+
; RV32ZICOND-LABEL: rotate_l_eqz:
105+
; RV32ZICOND: # %bb.0:
106+
; RV32ZICOND-NEXT: andi a4, a4, 1
107+
; RV32ZICOND-NEXT: bexti a3, a2, 5
108+
; RV32ZICOND-NEXT: not a5, a2
109+
; RV32ZICOND-NEXT: czero.nez a6, a1, a3
110+
; RV32ZICOND-NEXT: czero.eqz a7, a0, a3
111+
; RV32ZICOND-NEXT: czero.nez t0, a0, a3
112+
; RV32ZICOND-NEXT: czero.eqz a3, a1, a3
113+
; RV32ZICOND-NEXT: czero.eqz a0, a0, a4
114+
; RV32ZICOND-NEXT: czero.eqz a1, a1, a4
115+
; RV32ZICOND-NEXT: or a6, a7, a6
116+
; RV32ZICOND-NEXT: or a3, a3, t0
117+
; RV32ZICOND-NEXT: sll a7, a6, a2
118+
; RV32ZICOND-NEXT: srli t0, a3, 1
119+
; RV32ZICOND-NEXT: sll a2, a3, a2
120+
; RV32ZICOND-NEXT: srli a3, a6, 1
121+
; RV32ZICOND-NEXT: srl a6, t0, a5
122+
; RV32ZICOND-NEXT: srl a3, a3, a5
123+
; RV32ZICOND-NEXT: or a5, a7, a6
124+
; RV32ZICOND-NEXT: or a2, a2, a3
125+
; RV32ZICOND-NEXT: czero.nez a2, a2, a4
126+
; RV32ZICOND-NEXT: czero.nez a3, a5, a4
127+
; RV32ZICOND-NEXT: or a0, a0, a2
128+
; RV32ZICOND-NEXT: or a1, a1, a3
129+
; RV32ZICOND-NEXT: ret
130+
;
131+
; RV64ZICOND-LABEL: rotate_l_eqz:
132+
; RV64ZICOND: # %bb.0:
133+
; RV64ZICOND-NEXT: andi a2, a2, 1
134+
; RV64ZICOND-NEXT: rol a1, a0, a1
135+
; RV64ZICOND-NEXT: czero.nez a1, a1, a2
136+
; RV64ZICOND-NEXT: czero.eqz a0, a0, a2
137+
; RV64ZICOND-NEXT: or a0, a0, a1
138+
; RV64ZICOND-NEXT: ret
139+
%6 = call i64 @llvm.fshl.i64(i64 %x, i64 %x, i64 %rot.amt)
140+
%7 = select i1 %cond, i64 %x, i64 %6
141+
ret i64 %7
142+
}
143+
144+
; (select cond, const, t) -> (add (czero_nez t - const, cond), const)
145+
define i64 @select_imm_reg(i64 %t, i1 %cond) {
146+
; RV32ZICOND-LABEL: select_imm_reg:
147+
; RV32ZICOND: # %bb.0:
148+
; RV32ZICOND-NEXT: andi a2, a2, 1
149+
; RV32ZICOND-NEXT: li a3, 3
150+
; RV32ZICOND-NEXT: czero.nez a0, a0, a2
151+
; RV32ZICOND-NEXT: czero.eqz a3, a3, a2
152+
; RV32ZICOND-NEXT: or a0, a3, a0
153+
; RV32ZICOND-NEXT: czero.nez a1, a1, a2
154+
; RV32ZICOND-NEXT: ret
155+
;
156+
; RV64ZICOND-LABEL: select_imm_reg:
157+
; RV64ZICOND: # %bb.0:
158+
; RV64ZICOND-NEXT: andi a1, a1, 1
159+
; RV64ZICOND-NEXT: li a2, 3
160+
; RV64ZICOND-NEXT: czero.nez a0, a0, a1
161+
; RV64ZICOND-NEXT: czero.eqz a1, a2, a1
162+
; RV64ZICOND-NEXT: or a0, a1, a0
163+
; RV64ZICOND-NEXT: ret
164+
%4 = select i1 %cond, i64 3, i64 %t
165+
ret i64 %4
166+
}
167+
168+
; (select cond, t, const) -> (add (czero_eqz t - const, cond), const)
169+
define i64 @select_reg_imm(i64 %t, i1 %cond) {
170+
; RV32ZICOND-LABEL: select_reg_imm:
171+
; RV32ZICOND: # %bb.0:
172+
; RV32ZICOND-NEXT: andi a2, a2, 1
173+
; RV32ZICOND-NEXT: li a3, 3
174+
; RV32ZICOND-NEXT: czero.nez a3, a3, a2
175+
; RV32ZICOND-NEXT: czero.eqz a0, a0, a2
176+
; RV32ZICOND-NEXT: or a0, a0, a3
177+
; RV32ZICOND-NEXT: czero.eqz a1, a1, a2
178+
; RV32ZICOND-NEXT: ret
179+
;
180+
; RV64ZICOND-LABEL: select_reg_imm:
181+
; RV64ZICOND: # %bb.0:
182+
; RV64ZICOND-NEXT: andi a1, a1, 1
183+
; RV64ZICOND-NEXT: li a2, 3
184+
; RV64ZICOND-NEXT: czero.nez a2, a2, a1
185+
; RV64ZICOND-NEXT: czero.eqz a0, a0, a1
186+
; RV64ZICOND-NEXT: or a0, a0, a2
187+
; RV64ZICOND-NEXT: ret
188+
%4 = select i1 %cond, i64 %t, i64 3
189+
ret i64 %4
190+
}
191+
192+
; (select cond, -2048, t) -> (xor (czero_nez (xor t, -2048), cond), -2048)
193+
define i64 @select_imm_reg_neg_2048(i64 %t, i1 %cond) {
194+
; RV32ZICOND-LABEL: select_imm_reg_neg_2048:
195+
; RV32ZICOND: # %bb.0:
196+
; RV32ZICOND-NEXT: andi a2, a2, 1
197+
; RV32ZICOND-NEXT: li a3, -2048
198+
; RV32ZICOND-NEXT: czero.nez a0, a0, a2
199+
; RV32ZICOND-NEXT: czero.eqz a3, a3, a2
200+
; RV32ZICOND-NEXT: neg a2, a2
201+
; RV32ZICOND-NEXT: or a0, a3, a0
202+
; RV32ZICOND-NEXT: or a1, a2, a1
203+
; RV32ZICOND-NEXT: ret
204+
;
205+
; RV64ZICOND-LABEL: select_imm_reg_neg_2048:
206+
; RV64ZICOND: # %bb.0:
207+
; RV64ZICOND-NEXT: andi a1, a1, 1
208+
; RV64ZICOND-NEXT: li a2, -2048
209+
; RV64ZICOND-NEXT: czero.nez a0, a0, a1
210+
; RV64ZICOND-NEXT: czero.eqz a1, a2, a1
211+
; RV64ZICOND-NEXT: or a0, a1, a0
212+
; RV64ZICOND-NEXT: ret
213+
%4 = select i1 %cond, i64 -2048, i64 %t
214+
ret i64 %4
215+
}
216+
217+
; (select cond, 2048, t) -> no transform
218+
define i64 @select_imm_reg_2048(i64 %t, i1 %cond) {
219+
; RV32ZICOND-LABEL: select_imm_reg_2048:
220+
; RV32ZICOND: # %bb.0:
221+
; RV32ZICOND-NEXT: andi a2, a2, 1
222+
; RV32ZICOND-NEXT: bseti a3, zero, 11
223+
; RV32ZICOND-NEXT: czero.nez a0, a0, a2
224+
; RV32ZICOND-NEXT: czero.eqz a3, a3, a2
225+
; RV32ZICOND-NEXT: or a0, a3, a0
226+
; RV32ZICOND-NEXT: czero.nez a1, a1, a2
227+
; RV32ZICOND-NEXT: ret
228+
;
229+
; RV64ZICOND-LABEL: select_imm_reg_2048:
230+
; RV64ZICOND: # %bb.0:
231+
; RV64ZICOND-NEXT: andi a1, a1, 1
232+
; RV64ZICOND-NEXT: bseti a2, zero, 11
233+
; RV64ZICOND-NEXT: czero.nez a0, a0, a1
234+
; RV64ZICOND-NEXT: czero.eqz a1, a2, a1
235+
; RV64ZICOND-NEXT: or a0, a1, a0
236+
; RV64ZICOND-NEXT: ret
237+
%4 = select i1 %cond, i64 2048, i64 %t
238+
ret i64 %4
239+
}
240+
241+
; (select cond, (and f, ~x), f) -> (andn f, (czero_eqz x, cond))
242+
define i64 @test_inv_and_nez(i64 %f, i64 %x, i1 %cond) {
243+
; RV32ZICOND-LABEL: test_inv_and_nez:
244+
; RV32ZICOND: # %bb.0:
245+
; RV32ZICOND-NEXT: andi a4, a4, 1
246+
; RV32ZICOND-NEXT: addi a4, a4, -1
247+
; RV32ZICOND-NEXT: orn a3, a4, a3
248+
; RV32ZICOND-NEXT: orn a2, a4, a2
249+
; RV32ZICOND-NEXT: and a0, a2, a0
250+
; RV32ZICOND-NEXT: and a1, a3, a1
251+
; RV32ZICOND-NEXT: ret
252+
;
253+
; RV64ZICOND-LABEL: test_inv_and_nez:
254+
; RV64ZICOND: # %bb.0:
255+
; RV64ZICOND-NEXT: andi a2, a2, 1
256+
; RV64ZICOND-NEXT: andn a1, a0, a1
257+
; RV64ZICOND-NEXT: czero.nez a0, a0, a2
258+
; RV64ZICOND-NEXT: or a0, a1, a0
259+
; RV64ZICOND-NEXT: ret
260+
%5 = xor i64 %x, -1
261+
%6 = select i1 %cond, i64 %5, i64 -1
262+
%7 = and i64 %6, %f
263+
ret i64 %7
264+
}
265+
266+
; (select cond, f, (and f, ~x)) -> (andn f, (czero_nez x, cond))
267+
define i64 @test_inv_and_eqz(i64 %f, i64 %x, i1 %cond) {
268+
; RV32ZICOND-LABEL: test_inv_and_eqz:
269+
; RV32ZICOND: # %bb.0:
270+
; RV32ZICOND-NEXT: slli a4, a4, 31
271+
; RV32ZICOND-NEXT: srai a4, a4, 31
272+
; RV32ZICOND-NEXT: orn a3, a4, a3
273+
; RV32ZICOND-NEXT: orn a2, a4, a2
274+
; RV32ZICOND-NEXT: and a0, a2, a0
275+
; RV32ZICOND-NEXT: and a1, a3, a1
276+
; RV32ZICOND-NEXT: ret
277+
;
278+
; RV64ZICOND-LABEL: test_inv_and_eqz:
279+
; RV64ZICOND: # %bb.0:
280+
; RV64ZICOND-NEXT: andi a2, a2, 1
281+
; RV64ZICOND-NEXT: andn a1, a0, a1
282+
; RV64ZICOND-NEXT: czero.eqz a0, a0, a2
283+
; RV64ZICOND-NEXT: or a0, a1, a0
284+
; RV64ZICOND-NEXT: ret
285+
%5 = xor i64 %x, -1
286+
%6 = select i1 %cond, i64 -1, i64 %5
287+
%7 = and i64 %6, %f
288+
ret i64 %7
289+
}

0 commit comments

Comments
 (0)