Skip to content

Commit 2a23721

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

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
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+
define dso_local signext i32 @icmp_and(i64 noundef %0, i64 noundef %1) #0 {
6+
; RV32ZICOND-LABEL: icmp_and:
7+
; RV32ZICOND: # %bb.0:
8+
; RV32ZICOND-NEXT: or a2, a2, a3
9+
; RV32ZICOND-NEXT: or a0, a0, a1
10+
; RV32ZICOND-NEXT: snez a1, a2
11+
; RV32ZICOND-NEXT: snez a0, a0
12+
; RV32ZICOND-NEXT: and a0, a0, a1
13+
; RV32ZICOND-NEXT: ret
14+
;
15+
; RV64ZICOND-LABEL: icmp_and:
16+
; RV64ZICOND: # %bb.0:
17+
; RV64ZICOND-NEXT: snez a1, a1
18+
; RV64ZICOND-NEXT: snez a0, a0
19+
; RV64ZICOND-NEXT: and a0, a0, a1
20+
; RV64ZICOND-NEXT: ret
21+
%3 = icmp ne i64 %1, 0
22+
%4 = icmp ne i64 %0, 0
23+
%5 = and i1 %4, %3
24+
%6 = zext i1 %5 to i32
25+
ret i32 %6
26+
}
27+
28+
define dso_local signext i32 @icmp_and_and(i64 noundef %0, i64 noundef %1, i64 noundef %2) #0 {
29+
; RV32ZICOND-LABEL: icmp_and_and:
30+
; RV32ZICOND: # %bb.0:
31+
; RV32ZICOND-NEXT: or a2, a2, a3
32+
; RV32ZICOND-NEXT: or a0, a0, a1
33+
; RV32ZICOND-NEXT: or a4, a4, a5
34+
; RV32ZICOND-NEXT: snez a1, a2
35+
; RV32ZICOND-NEXT: snez a0, a0
36+
; RV32ZICOND-NEXT: and a0, a1, a0
37+
; RV32ZICOND-NEXT: snez a1, a4
38+
; RV32ZICOND-NEXT: and a0, a1, a0
39+
; RV32ZICOND-NEXT: ret
40+
;
41+
; RV64ZICOND-LABEL: icmp_and_and:
42+
; RV64ZICOND: # %bb.0:
43+
; RV64ZICOND-NEXT: snez a1, a1
44+
; RV64ZICOND-NEXT: snez a0, a0
45+
; RV64ZICOND-NEXT: and a0, a1, a0
46+
; RV64ZICOND-NEXT: snez a1, a2
47+
; RV64ZICOND-NEXT: and a0, a1, a0
48+
; RV64ZICOND-NEXT: ret
49+
%4 = icmp ne i64 %1, 0
50+
%5 = icmp ne i64 %0, 0
51+
%6 = and i1 %4, %5
52+
%7 = icmp ne i64 %2, 0
53+
%8 = and i1 %7, %6
54+
%9 = zext i1 %8 to i32
55+
ret i32 %9
56+
}
57+
58+
define dso_local i64 @RotateL_eqz(i64 noundef %0, i64 noundef %1, i64 noundef %2, i64 noundef %3) local_unnamed_addr #0 {
59+
; RV32ZICOND-LABEL: RotateL_eqz:
60+
; RV32ZICOND: # %bb.0:
61+
; RV32ZICOND-NEXT: or a0, a6, a7
62+
; RV32ZICOND-NEXT: bexti a1, a4, 5
63+
; RV32ZICOND-NEXT: not a5, a4
64+
; RV32ZICOND-NEXT: czero.nez a6, a3, a1
65+
; RV32ZICOND-NEXT: czero.eqz a7, a2, a1
66+
; RV32ZICOND-NEXT: czero.nez t0, a2, a1
67+
; RV32ZICOND-NEXT: czero.eqz a1, a3, a1
68+
; RV32ZICOND-NEXT: czero.nez a2, a2, a0
69+
; RV32ZICOND-NEXT: czero.nez a3, a3, a0
70+
; RV32ZICOND-NEXT: or a6, a7, a6
71+
; RV32ZICOND-NEXT: or a1, a1, t0
72+
; RV32ZICOND-NEXT: sll a7, a6, a4
73+
; RV32ZICOND-NEXT: srli t0, a1, 1
74+
; RV32ZICOND-NEXT: sll a1, a1, a4
75+
; RV32ZICOND-NEXT: srli a4, a6, 1
76+
; RV32ZICOND-NEXT: srl a6, t0, a5
77+
; RV32ZICOND-NEXT: srl a4, a4, a5
78+
; RV32ZICOND-NEXT: or a5, a7, a6
79+
; RV32ZICOND-NEXT: or a1, a1, a4
80+
; RV32ZICOND-NEXT: czero.eqz a1, a1, a0
81+
; RV32ZICOND-NEXT: czero.eqz a4, a5, a0
82+
; RV32ZICOND-NEXT: or a0, a2, a1
83+
; RV32ZICOND-NEXT: or a1, a3, a4
84+
; RV32ZICOND-NEXT: ret
85+
;
86+
; RV64ZICOND-LABEL: RotateL_eqz:
87+
; RV64ZICOND: # %bb.0:
88+
; RV64ZICOND-NEXT: rol a0, a1, a2
89+
; RV64ZICOND-NEXT: czero.nez a1, a1, a3
90+
; RV64ZICOND-NEXT: czero.eqz a0, a0, a3
91+
; RV64ZICOND-NEXT: or a0, a1, a0
92+
; RV64ZICOND-NEXT: ret
93+
%5 = icmp eq i64 %3, 0
94+
%6 = call i64 @llvm.fshl.i64(i64 %1, i64 %1, i64 %2)
95+
%7 = select i1 %5, i64 %1, i64 %6
96+
ret i64 %7
97+
}
98+
99+
define dso_local noundef i64 @select_imm_reg(i64 noundef %0, i64 noundef %1) local_unnamed_addr #0 {
100+
; RV32ZICOND-LABEL: select_imm_reg:
101+
; RV32ZICOND: # %bb.0:
102+
; RV32ZICOND-NEXT: xori a0, a0, 2
103+
; RV32ZICOND-NEXT: or a1, a0, a1
104+
; RV32ZICOND-NEXT: li a0, 3
105+
; RV32ZICOND-NEXT: czero.eqz a2, a2, a1
106+
; RV32ZICOND-NEXT: czero.nez a0, a0, a1
107+
; RV32ZICOND-NEXT: or a0, a0, a2
108+
; RV32ZICOND-NEXT: czero.eqz a1, a3, a1
109+
; RV32ZICOND-NEXT: ret
110+
;
111+
; RV64ZICOND-LABEL: select_imm_reg:
112+
; RV64ZICOND: # %bb.0:
113+
; RV64ZICOND-NEXT: addi a0, a0, -2
114+
; RV64ZICOND-NEXT: li a2, 3
115+
; RV64ZICOND-NEXT: czero.eqz a1, a1, a0
116+
; RV64ZICOND-NEXT: czero.nez a0, a2, a0
117+
; RV64ZICOND-NEXT: or a0, a0, a1
118+
; RV64ZICOND-NEXT: ret
119+
%3 = icmp eq i64 %0, 2
120+
%4 = select i1 %3, i64 3, i64 %1
121+
ret i64 %4
122+
}
123+
124+
define dso_local noundef i64 @test_InvAnd_eqz_001(i64 noundef %1, i64 noundef %2, i64 noundef %3) local_unnamed_addr #0 {
125+
; RV32ZICOND-LABEL: test_InvAnd_eqz_001:
126+
; RV32ZICOND: # %bb.0: # %entry
127+
; RV32ZICOND-NEXT: or a4, a4, a5
128+
; RV32ZICOND-NEXT: snez a4, a4
129+
; RV32ZICOND-NEXT: addi a4, a4, -1
130+
; RV32ZICOND-NEXT: orn a3, a4, a3
131+
; RV32ZICOND-NEXT: orn a2, a4, a2
132+
; RV32ZICOND-NEXT: and a0, a2, a0
133+
; RV32ZICOND-NEXT: and a1, a3, a1
134+
; RV32ZICOND-NEXT: ret
135+
;
136+
; RV64ZICOND-LABEL: test_InvAnd_eqz_001:
137+
; RV64ZICOND: # %bb.0: # %entry
138+
; RV64ZICOND-NEXT: czero.nez a2, a0, a2
139+
; RV64ZICOND-NEXT: andn a0, a0, a1
140+
; RV64ZICOND-NEXT: or a0, a0, a2
141+
; RV64ZICOND-NEXT: ret
142+
entry:
143+
%4 = icmp ne i64 %3, 0
144+
%5 = xor i64 %2, -1
145+
%6 = select i1 %4, i64 %5, i64 -1
146+
%7 = and i64 %6, %1
147+
ret i64 %7
148+
}

0 commit comments

Comments
 (0)