xref: /llvm-project/llvm/test/CodeGen/RISCV/rv32zbb-zbkb.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1182aa0cbSCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2182aa0cbSCraig Topper; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3182aa0cbSCraig Topper; RUN:   | FileCheck %s -check-prefixes=CHECK,RV32I
4182aa0cbSCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+zbb -verify-machineinstrs < %s \
5182aa0cbSCraig Topper; RUN:   | FileCheck %s -check-prefixes=CHECK,RV32ZBB-ZBKB
6182aa0cbSCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+zbkb -verify-machineinstrs < %s \
7182aa0cbSCraig Topper; RUN:   | FileCheck %s -check-prefixes=CHECK,RV32ZBB-ZBKB
8182aa0cbSCraig Topper
9182aa0cbSCraig Topperdefine i32 @andn_i32(i32 %a, i32 %b) nounwind {
10182aa0cbSCraig Topper; RV32I-LABEL: andn_i32:
11182aa0cbSCraig Topper; RV32I:       # %bb.0:
12182aa0cbSCraig Topper; RV32I-NEXT:    not a1, a1
13182aa0cbSCraig Topper; RV32I-NEXT:    and a0, a1, a0
14182aa0cbSCraig Topper; RV32I-NEXT:    ret
15182aa0cbSCraig Topper;
16182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: andn_i32:
17182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
18182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    andn a0, a0, a1
19182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
20182aa0cbSCraig Topper  %neg = xor i32 %b, -1
21182aa0cbSCraig Topper  %and = and i32 %neg, %a
22182aa0cbSCraig Topper  ret i32 %and
23182aa0cbSCraig Topper}
24182aa0cbSCraig Topper
25182aa0cbSCraig Topperdefine i64 @andn_i64(i64 %a, i64 %b) nounwind {
26182aa0cbSCraig Topper; RV32I-LABEL: andn_i64:
27182aa0cbSCraig Topper; RV32I:       # %bb.0:
28182aa0cbSCraig Topper; RV32I-NEXT:    not a3, a3
29182aa0cbSCraig Topper; RV32I-NEXT:    not a2, a2
30182aa0cbSCraig Topper; RV32I-NEXT:    and a0, a2, a0
31182aa0cbSCraig Topper; RV32I-NEXT:    and a1, a3, a1
32182aa0cbSCraig Topper; RV32I-NEXT:    ret
33182aa0cbSCraig Topper;
34182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: andn_i64:
35182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
36182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    andn a0, a0, a2
37182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    andn a1, a1, a3
38182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
39182aa0cbSCraig Topper  %neg = xor i64 %b, -1
40182aa0cbSCraig Topper  %and = and i64 %neg, %a
41182aa0cbSCraig Topper  ret i64 %and
42182aa0cbSCraig Topper}
43182aa0cbSCraig Topper
44182aa0cbSCraig Topperdefine i32 @orn_i32(i32 %a, i32 %b) nounwind {
45182aa0cbSCraig Topper; RV32I-LABEL: orn_i32:
46182aa0cbSCraig Topper; RV32I:       # %bb.0:
47182aa0cbSCraig Topper; RV32I-NEXT:    not a1, a1
48182aa0cbSCraig Topper; RV32I-NEXT:    or a0, a1, a0
49182aa0cbSCraig Topper; RV32I-NEXT:    ret
50182aa0cbSCraig Topper;
51182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: orn_i32:
52182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
53182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    orn a0, a0, a1
54182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
55182aa0cbSCraig Topper  %neg = xor i32 %b, -1
56182aa0cbSCraig Topper  %or = or i32 %neg, %a
57182aa0cbSCraig Topper  ret i32 %or
58182aa0cbSCraig Topper}
59182aa0cbSCraig Topper
60182aa0cbSCraig Topperdefine i64 @orn_i64(i64 %a, i64 %b) nounwind {
61182aa0cbSCraig Topper; RV32I-LABEL: orn_i64:
62182aa0cbSCraig Topper; RV32I:       # %bb.0:
63182aa0cbSCraig Topper; RV32I-NEXT:    not a3, a3
64182aa0cbSCraig Topper; RV32I-NEXT:    not a2, a2
65182aa0cbSCraig Topper; RV32I-NEXT:    or a0, a2, a0
66182aa0cbSCraig Topper; RV32I-NEXT:    or a1, a3, a1
67182aa0cbSCraig Topper; RV32I-NEXT:    ret
68182aa0cbSCraig Topper;
69182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: orn_i64:
70182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
71182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    orn a0, a0, a2
72182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    orn a1, a1, a3
73182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
74182aa0cbSCraig Topper  %neg = xor i64 %b, -1
75182aa0cbSCraig Topper  %or = or i64 %neg, %a
76182aa0cbSCraig Topper  ret i64 %or
77182aa0cbSCraig Topper}
78182aa0cbSCraig Topper
79182aa0cbSCraig Topperdefine i32 @xnor_i32(i32 %a, i32 %b) nounwind {
80182aa0cbSCraig Topper; RV32I-LABEL: xnor_i32:
81182aa0cbSCraig Topper; RV32I:       # %bb.0:
82182aa0cbSCraig Topper; RV32I-NEXT:    xor a0, a0, a1
83182aa0cbSCraig Topper; RV32I-NEXT:    not a0, a0
84182aa0cbSCraig Topper; RV32I-NEXT:    ret
85182aa0cbSCraig Topper;
86182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: xnor_i32:
87182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
88182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    xnor a0, a0, a1
89182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
90182aa0cbSCraig Topper  %neg = xor i32 %a, -1
91182aa0cbSCraig Topper  %xor = xor i32 %neg, %b
92182aa0cbSCraig Topper  ret i32 %xor
93182aa0cbSCraig Topper}
94182aa0cbSCraig Topper
95182aa0cbSCraig Topperdefine i64 @xnor_i64(i64 %a, i64 %b) nounwind {
96182aa0cbSCraig Topper; RV32I-LABEL: xnor_i64:
97182aa0cbSCraig Topper; RV32I:       # %bb.0:
98182aa0cbSCraig Topper; RV32I-NEXT:    xor a1, a1, a3
99182aa0cbSCraig Topper; RV32I-NEXT:    xor a0, a0, a2
100182aa0cbSCraig Topper; RV32I-NEXT:    not a0, a0
101182aa0cbSCraig Topper; RV32I-NEXT:    not a1, a1
102182aa0cbSCraig Topper; RV32I-NEXT:    ret
103182aa0cbSCraig Topper;
104182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: xnor_i64:
105182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
106182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    xnor a0, a0, a2
107182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    xnor a1, a1, a3
108182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
109182aa0cbSCraig Topper  %neg = xor i64 %a, -1
110182aa0cbSCraig Topper  %xor = xor i64 %neg, %b
111182aa0cbSCraig Topper  ret i64 %xor
112182aa0cbSCraig Topper}
113182aa0cbSCraig Topper
114182aa0cbSCraig Topperdeclare i32 @llvm.fshl.i32(i32, i32, i32)
115182aa0cbSCraig Topper
116182aa0cbSCraig Topperdefine i32 @rol_i32(i32 %a, i32 %b) nounwind {
117182aa0cbSCraig Topper; RV32I-LABEL: rol_i32:
118182aa0cbSCraig Topper; RV32I:       # %bb.0:
119182aa0cbSCraig Topper; RV32I-NEXT:    sll a2, a0, a1
120182aa0cbSCraig Topper; RV32I-NEXT:    neg a1, a1
121182aa0cbSCraig Topper; RV32I-NEXT:    srl a0, a0, a1
122182aa0cbSCraig Topper; RV32I-NEXT:    or a0, a2, a0
123182aa0cbSCraig Topper; RV32I-NEXT:    ret
124182aa0cbSCraig Topper;
125182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: rol_i32:
126182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
127182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    rol a0, a0, a1
128182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
129182aa0cbSCraig Topper  %or = tail call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 %b)
130182aa0cbSCraig Topper  ret i32 %or
131182aa0cbSCraig Topper}
132182aa0cbSCraig Topper
133182aa0cbSCraig Topper; This test is presented here in case future expansions of the Bitmanip
134182aa0cbSCraig Topper; extensions introduce instructions suitable for this pattern.
135182aa0cbSCraig Topper
136182aa0cbSCraig Topperdeclare i64 @llvm.fshl.i64(i64, i64, i64)
137182aa0cbSCraig Topper
138182aa0cbSCraig Topperdefine i64 @rol_i64(i64 %a, i64 %b) nounwind {
139182aa0cbSCraig Topper; CHECK-LABEL: rol_i64:
140182aa0cbSCraig Topper; CHECK:       # %bb.0:
141*9122c523SPengcheng Wang; CHECK-NEXT:    slli a5, a2, 26
142*9122c523SPengcheng Wang; CHECK-NEXT:    srli a5, a5, 31
143*9122c523SPengcheng Wang; CHECK-NEXT:    mv a3, a1
144*9122c523SPengcheng Wang; CHECK-NEXT:    bnez a5, .LBB7_2
145182aa0cbSCraig Topper; CHECK-NEXT:  # %bb.1:
146*9122c523SPengcheng Wang; CHECK-NEXT:    mv a3, a0
147182aa0cbSCraig Topper; CHECK-NEXT:  .LBB7_2:
148*9122c523SPengcheng Wang; CHECK-NEXT:    sll a4, a3, a2
149*9122c523SPengcheng Wang; CHECK-NEXT:    bnez a5, .LBB7_4
150182aa0cbSCraig Topper; CHECK-NEXT:  # %bb.3:
151182aa0cbSCraig Topper; CHECK-NEXT:    mv a0, a1
152182aa0cbSCraig Topper; CHECK-NEXT:  .LBB7_4:
153182aa0cbSCraig Topper; CHECK-NEXT:    srli a1, a0, 1
154*9122c523SPengcheng Wang; CHECK-NEXT:    not a5, a2
155*9122c523SPengcheng Wang; CHECK-NEXT:    sll a2, a0, a2
156*9122c523SPengcheng Wang; CHECK-NEXT:    srli a3, a3, 1
157*9122c523SPengcheng Wang; CHECK-NEXT:    srl a0, a1, a5
158*9122c523SPengcheng Wang; CHECK-NEXT:    srl a1, a3, a5
159*9122c523SPengcheng Wang; CHECK-NEXT:    or a0, a4, a0
160*9122c523SPengcheng Wang; CHECK-NEXT:    or a1, a2, a1
161182aa0cbSCraig Topper; CHECK-NEXT:    ret
162182aa0cbSCraig Topper  %or = tail call i64 @llvm.fshl.i64(i64 %a, i64 %a, i64 %b)
163182aa0cbSCraig Topper  ret i64 %or
164182aa0cbSCraig Topper}
165182aa0cbSCraig Topper
166182aa0cbSCraig Topperdeclare i32 @llvm.fshr.i32(i32, i32, i32)
167182aa0cbSCraig Topper
168182aa0cbSCraig Topperdefine i32 @ror_i32(i32 %a, i32 %b) nounwind {
169182aa0cbSCraig Topper; RV32I-LABEL: ror_i32:
170182aa0cbSCraig Topper; RV32I:       # %bb.0:
171182aa0cbSCraig Topper; RV32I-NEXT:    srl a2, a0, a1
172182aa0cbSCraig Topper; RV32I-NEXT:    neg a1, a1
173182aa0cbSCraig Topper; RV32I-NEXT:    sll a0, a0, a1
174182aa0cbSCraig Topper; RV32I-NEXT:    or a0, a2, a0
175182aa0cbSCraig Topper; RV32I-NEXT:    ret
176182aa0cbSCraig Topper;
177182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: ror_i32:
178182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
179182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ror a0, a0, a1
180182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
181182aa0cbSCraig Topper  %or = tail call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 %b)
182182aa0cbSCraig Topper  ret i32 %or
183182aa0cbSCraig Topper}
184182aa0cbSCraig Topper
185182aa0cbSCraig Topper; This test is presented here in case future expansions of the Bitmanip
186182aa0cbSCraig Topper; extensions introduce instructions suitable for this pattern.
187182aa0cbSCraig Topper
188182aa0cbSCraig Topperdeclare i64 @llvm.fshr.i64(i64, i64, i64)
189182aa0cbSCraig Topper
190182aa0cbSCraig Topperdefine i64 @ror_i64(i64 %a, i64 %b) nounwind {
191182aa0cbSCraig Topper; CHECK-LABEL: ror_i64:
192182aa0cbSCraig Topper; CHECK:       # %bb.0:
193*9122c523SPengcheng Wang; CHECK-NEXT:    andi a5, a2, 32
194182aa0cbSCraig Topper; CHECK-NEXT:    mv a3, a0
195*9122c523SPengcheng Wang; CHECK-NEXT:    beqz a5, .LBB9_2
196182aa0cbSCraig Topper; CHECK-NEXT:  # %bb.1:
197182aa0cbSCraig Topper; CHECK-NEXT:    mv a3, a1
198182aa0cbSCraig Topper; CHECK-NEXT:  .LBB9_2:
199*9122c523SPengcheng Wang; CHECK-NEXT:    srl a4, a3, a2
200*9122c523SPengcheng Wang; CHECK-NEXT:    beqz a5, .LBB9_4
201182aa0cbSCraig Topper; CHECK-NEXT:  # %bb.3:
202182aa0cbSCraig Topper; CHECK-NEXT:    mv a1, a0
203182aa0cbSCraig Topper; CHECK-NEXT:  .LBB9_4:
204182aa0cbSCraig Topper; CHECK-NEXT:    slli a0, a1, 1
205*9122c523SPengcheng Wang; CHECK-NEXT:    not a5, a2
206182aa0cbSCraig Topper; CHECK-NEXT:    srl a1, a1, a2
207a2b5b584SCraig Topper; CHECK-NEXT:    slli a3, a3, 1
208*9122c523SPengcheng Wang; CHECK-NEXT:    sll a0, a0, a5
209*9122c523SPengcheng Wang; CHECK-NEXT:    sll a2, a3, a5
210*9122c523SPengcheng Wang; CHECK-NEXT:    or a0, a0, a4
211182aa0cbSCraig Topper; CHECK-NEXT:    or a1, a2, a1
212182aa0cbSCraig Topper; CHECK-NEXT:    ret
213182aa0cbSCraig Topper  %or = tail call i64 @llvm.fshr.i64(i64 %a, i64 %a, i64 %b)
214182aa0cbSCraig Topper  ret i64 %or
215182aa0cbSCraig Topper}
216182aa0cbSCraig Topper
217182aa0cbSCraig Topperdefine i32 @rori_i32_fshl(i32 %a) nounwind {
218182aa0cbSCraig Topper; RV32I-LABEL: rori_i32_fshl:
219182aa0cbSCraig Topper; RV32I:       # %bb.0:
220182aa0cbSCraig Topper; RV32I-NEXT:    srli a1, a0, 1
221182aa0cbSCraig Topper; RV32I-NEXT:    slli a0, a0, 31
222182aa0cbSCraig Topper; RV32I-NEXT:    or a0, a0, a1
223182aa0cbSCraig Topper; RV32I-NEXT:    ret
224182aa0cbSCraig Topper;
225182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: rori_i32_fshl:
226182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
227182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    rori a0, a0, 1
228182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
229182aa0cbSCraig Topper  %1 = tail call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 31)
230182aa0cbSCraig Topper  ret i32 %1
231182aa0cbSCraig Topper}
232182aa0cbSCraig Topper
233182aa0cbSCraig Topperdefine i32 @rori_i32_fshr(i32 %a) nounwind {
234182aa0cbSCraig Topper; RV32I-LABEL: rori_i32_fshr:
235182aa0cbSCraig Topper; RV32I:       # %bb.0:
236182aa0cbSCraig Topper; RV32I-NEXT:    slli a1, a0, 1
237182aa0cbSCraig Topper; RV32I-NEXT:    srli a0, a0, 31
238182aa0cbSCraig Topper; RV32I-NEXT:    or a0, a0, a1
239182aa0cbSCraig Topper; RV32I-NEXT:    ret
240182aa0cbSCraig Topper;
241182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: rori_i32_fshr:
242182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
243182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    rori a0, a0, 31
244182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
245182aa0cbSCraig Topper  %1 = tail call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 31)
246182aa0cbSCraig Topper  ret i32 %1
247182aa0cbSCraig Topper}
248182aa0cbSCraig Topper
249182aa0cbSCraig Topperdefine i64 @rori_i64(i64 %a) nounwind {
250182aa0cbSCraig Topper; CHECK-LABEL: rori_i64:
251182aa0cbSCraig Topper; CHECK:       # %bb.0:
252182aa0cbSCraig Topper; CHECK-NEXT:    srli a2, a0, 1
253182aa0cbSCraig Topper; CHECK-NEXT:    slli a3, a1, 31
254182aa0cbSCraig Topper; CHECK-NEXT:    srli a1, a1, 1
255*9122c523SPengcheng Wang; CHECK-NEXT:    slli a4, a0, 31
256*9122c523SPengcheng Wang; CHECK-NEXT:    or a0, a3, a2
257*9122c523SPengcheng Wang; CHECK-NEXT:    or a1, a4, a1
258182aa0cbSCraig Topper; CHECK-NEXT:    ret
259182aa0cbSCraig Topper  %1 = tail call i64 @llvm.fshl.i64(i64 %a, i64 %a, i64 63)
260182aa0cbSCraig Topper  ret i64 %1
261182aa0cbSCraig Topper}
262182aa0cbSCraig Topper
263182aa0cbSCraig Topperdefine i64 @rori_i64_fshr(i64 %a) nounwind {
264182aa0cbSCraig Topper; CHECK-LABEL: rori_i64_fshr:
265182aa0cbSCraig Topper; CHECK:       # %bb.0:
266182aa0cbSCraig Topper; CHECK-NEXT:    srli a2, a1, 31
267182aa0cbSCraig Topper; CHECK-NEXT:    slli a3, a0, 1
268*9122c523SPengcheng Wang; CHECK-NEXT:    srli a4, a0, 31
269182aa0cbSCraig Topper; CHECK-NEXT:    slli a1, a1, 1
270*9122c523SPengcheng Wang; CHECK-NEXT:    or a0, a3, a2
271*9122c523SPengcheng Wang; CHECK-NEXT:    or a1, a1, a4
272182aa0cbSCraig Topper; CHECK-NEXT:    ret
273182aa0cbSCraig Topper  %1 = tail call i64 @llvm.fshr.i64(i64 %a, i64 %a, i64 63)
274182aa0cbSCraig Topper  ret i64 %1
275182aa0cbSCraig Topper}
276182aa0cbSCraig Topper
277182aa0cbSCraig Topperdefine i32 @not_shl_one_i32(i32 %x) {
278182aa0cbSCraig Topper; RV32I-LABEL: not_shl_one_i32:
279182aa0cbSCraig Topper; RV32I:       # %bb.0:
280182aa0cbSCraig Topper; RV32I-NEXT:    li a1, 1
281182aa0cbSCraig Topper; RV32I-NEXT:    sll a0, a1, a0
282182aa0cbSCraig Topper; RV32I-NEXT:    not a0, a0
283182aa0cbSCraig Topper; RV32I-NEXT:    ret
284182aa0cbSCraig Topper;
285182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: not_shl_one_i32:
286182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
287182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    li a1, -2
288182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    rol a0, a1, a0
289182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
290182aa0cbSCraig Topper  %1 = shl i32 1, %x
291182aa0cbSCraig Topper  %2 = xor i32 %1, -1
292182aa0cbSCraig Topper  ret i32 %2
293182aa0cbSCraig Topper}
294182aa0cbSCraig Topper
295182aa0cbSCraig Topperdefine i64 @not_shl_one_i64(i64 %x) {
2961c41d0cbSPhilip Reames; CHECK-LABEL: not_shl_one_i64:
2971c41d0cbSPhilip Reames; CHECK:       # %bb.0:
298909ab0e0SCraig Topper; CHECK-NEXT:    addi a1, a0, -32
299*9122c523SPengcheng Wang; CHECK-NEXT:    li a2, 1
300909ab0e0SCraig Topper; CHECK-NEXT:    slti a1, a1, 0
301*9122c523SPengcheng Wang; CHECK-NEXT:    sll a0, a2, a0
302909ab0e0SCraig Topper; CHECK-NEXT:    neg a2, a1
303909ab0e0SCraig Topper; CHECK-NEXT:    addi a1, a1, -1
304*9122c523SPengcheng Wang; CHECK-NEXT:    and a2, a2, a0
305909ab0e0SCraig Topper; CHECK-NEXT:    and a1, a1, a0
3061c41d0cbSPhilip Reames; CHECK-NEXT:    not a0, a2
307e50976e5SCraig Topper; CHECK-NEXT:    not a1, a1
3081c41d0cbSPhilip Reames; CHECK-NEXT:    ret
309182aa0cbSCraig Topper  %1 = shl i64 1, %x
310182aa0cbSCraig Topper  %2 = xor i64 %1, -1
311182aa0cbSCraig Topper  ret i64 %2
312182aa0cbSCraig Topper}
313182aa0cbSCraig Topper
314182aa0cbSCraig Topperdefine i8 @srli_i8(i8 %a) nounwind {
315182aa0cbSCraig Topper; CHECK-LABEL: srli_i8:
316182aa0cbSCraig Topper; CHECK:       # %bb.0:
317182aa0cbSCraig Topper; CHECK-NEXT:    slli a0, a0, 24
318182aa0cbSCraig Topper; CHECK-NEXT:    srli a0, a0, 30
319182aa0cbSCraig Topper; CHECK-NEXT:    ret
320182aa0cbSCraig Topper  %1 = lshr i8 %a, 6
321182aa0cbSCraig Topper  ret i8 %1
322182aa0cbSCraig Topper}
323182aa0cbSCraig Topper
324182aa0cbSCraig Topper; We could use sext.b+srai, but slli+srai offers more opportunities for
325182aa0cbSCraig Topper; comppressed instructions.
326182aa0cbSCraig Topperdefine i8 @srai_i8(i8 %a) nounwind {
327182aa0cbSCraig Topper; CHECK-LABEL: srai_i8:
328182aa0cbSCraig Topper; CHECK:       # %bb.0:
329182aa0cbSCraig Topper; CHECK-NEXT:    slli a0, a0, 24
330182aa0cbSCraig Topper; CHECK-NEXT:    srai a0, a0, 29
331182aa0cbSCraig Topper; CHECK-NEXT:    ret
332182aa0cbSCraig Topper  %1 = ashr i8 %a, 5
333182aa0cbSCraig Topper  ret i8 %1
334182aa0cbSCraig Topper}
335182aa0cbSCraig Topper
336182aa0cbSCraig Topper; We could use zext.h+srli, but slli+srli offers more opportunities for
337182aa0cbSCraig Topper; comppressed instructions.
338182aa0cbSCraig Topperdefine i16 @srli_i16(i16 %a) nounwind {
339182aa0cbSCraig Topper; CHECK-LABEL: srli_i16:
340182aa0cbSCraig Topper; CHECK:       # %bb.0:
341182aa0cbSCraig Topper; CHECK-NEXT:    slli a0, a0, 16
342182aa0cbSCraig Topper; CHECK-NEXT:    srli a0, a0, 22
343182aa0cbSCraig Topper; CHECK-NEXT:    ret
344182aa0cbSCraig Topper  %1 = lshr i16 %a, 6
345182aa0cbSCraig Topper  ret i16 %1
346182aa0cbSCraig Topper}
347182aa0cbSCraig Topper
348182aa0cbSCraig Topper; We could use sext.h+srai, but slli+srai offers more opportunities for
349182aa0cbSCraig Topper; comppressed instructions.
350182aa0cbSCraig Topperdefine i16 @srai_i16(i16 %a) nounwind {
351182aa0cbSCraig Topper; CHECK-LABEL: srai_i16:
352182aa0cbSCraig Topper; CHECK:       # %bb.0:
353182aa0cbSCraig Topper; CHECK-NEXT:    slli a0, a0, 16
354182aa0cbSCraig Topper; CHECK-NEXT:    srai a0, a0, 25
355182aa0cbSCraig Topper; CHECK-NEXT:    ret
356182aa0cbSCraig Topper  %1 = ashr i16 %a, 9
357182aa0cbSCraig Topper  ret i16 %1
358182aa0cbSCraig Topper}
359182aa0cbSCraig Topper
360182aa0cbSCraig Topperdefine i1 @andn_seqz_i32(i32 %a, i32 %b) nounwind {
361182aa0cbSCraig Topper; RV32I-LABEL: andn_seqz_i32:
362182aa0cbSCraig Topper; RV32I:       # %bb.0:
363182aa0cbSCraig Topper; RV32I-NEXT:    and a0, a0, a1
364182aa0cbSCraig Topper; RV32I-NEXT:    xor a0, a0, a1
365182aa0cbSCraig Topper; RV32I-NEXT:    seqz a0, a0
366182aa0cbSCraig Topper; RV32I-NEXT:    ret
367182aa0cbSCraig Topper;
368182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: andn_seqz_i32:
369182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
370182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    andn a0, a1, a0
371182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    seqz a0, a0
372182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
373182aa0cbSCraig Topper  %and = and i32 %a, %b
374182aa0cbSCraig Topper  %cmpeq = icmp eq i32 %and, %b
375182aa0cbSCraig Topper  ret i1 %cmpeq
376182aa0cbSCraig Topper}
377182aa0cbSCraig Topper
378182aa0cbSCraig Topperdefine i1 @andn_seqz_i64(i64 %a, i64 %b) nounwind {
379182aa0cbSCraig Topper; RV32I-LABEL: andn_seqz_i64:
380182aa0cbSCraig Topper; RV32I:       # %bb.0:
381182aa0cbSCraig Topper; RV32I-NEXT:    not a0, a0
382182aa0cbSCraig Topper; RV32I-NEXT:    not a1, a1
383182aa0cbSCraig Topper; RV32I-NEXT:    and a1, a1, a3
384182aa0cbSCraig Topper; RV32I-NEXT:    and a0, a0, a2
385182aa0cbSCraig Topper; RV32I-NEXT:    or a0, a0, a1
386182aa0cbSCraig Topper; RV32I-NEXT:    seqz a0, a0
387182aa0cbSCraig Topper; RV32I-NEXT:    ret
388182aa0cbSCraig Topper;
389182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: andn_seqz_i64:
390182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
391182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    andn a1, a3, a1
392182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    andn a0, a2, a0
393182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    or a0, a0, a1
394182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    seqz a0, a0
395182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
396182aa0cbSCraig Topper  %and = and i64 %a, %b
397182aa0cbSCraig Topper  %cmpeq = icmp eq i64 %and, %b
398182aa0cbSCraig Topper  ret i1 %cmpeq
399182aa0cbSCraig Topper}
400182aa0cbSCraig Topper
401182aa0cbSCraig Topperdefine i1 @andn_snez_i32(i32 %a, i32 %b) nounwind {
402182aa0cbSCraig Topper; RV32I-LABEL: andn_snez_i32:
403182aa0cbSCraig Topper; RV32I:       # %bb.0:
404182aa0cbSCraig Topper; RV32I-NEXT:    and a0, a0, a1
405182aa0cbSCraig Topper; RV32I-NEXT:    xor a0, a0, a1
406182aa0cbSCraig Topper; RV32I-NEXT:    snez a0, a0
407182aa0cbSCraig Topper; RV32I-NEXT:    ret
408182aa0cbSCraig Topper;
409182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: andn_snez_i32:
410182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
411182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    andn a0, a1, a0
412182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    snez a0, a0
413182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
414182aa0cbSCraig Topper  %and = and i32 %a, %b
415182aa0cbSCraig Topper  %cmpeq = icmp ne i32 %and, %b
416182aa0cbSCraig Topper  ret i1 %cmpeq
417182aa0cbSCraig Topper}
418182aa0cbSCraig Topper
419182aa0cbSCraig Topperdefine i1 @andn_snez_i64(i64 %a, i64 %b) nounwind {
420182aa0cbSCraig Topper; RV32I-LABEL: andn_snez_i64:
421182aa0cbSCraig Topper; RV32I:       # %bb.0:
422182aa0cbSCraig Topper; RV32I-NEXT:    not a0, a0
423182aa0cbSCraig Topper; RV32I-NEXT:    not a1, a1
424182aa0cbSCraig Topper; RV32I-NEXT:    and a1, a1, a3
425182aa0cbSCraig Topper; RV32I-NEXT:    and a0, a0, a2
426182aa0cbSCraig Topper; RV32I-NEXT:    or a0, a0, a1
427182aa0cbSCraig Topper; RV32I-NEXT:    snez a0, a0
428182aa0cbSCraig Topper; RV32I-NEXT:    ret
429182aa0cbSCraig Topper;
430182aa0cbSCraig Topper; RV32ZBB-ZBKB-LABEL: andn_snez_i64:
431182aa0cbSCraig Topper; RV32ZBB-ZBKB:       # %bb.0:
432182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    andn a1, a3, a1
433182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    andn a0, a2, a0
434182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    or a0, a0, a1
435182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    snez a0, a0
436182aa0cbSCraig Topper; RV32ZBB-ZBKB-NEXT:    ret
437182aa0cbSCraig Topper  %and = and i64 %a, %b
438182aa0cbSCraig Topper  %cmpeq = icmp ne i64 %and, %b
439182aa0cbSCraig Topper  ret i1 %cmpeq
440182aa0cbSCraig Topper}
441