xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/fast-isel-logic-op.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel=0                    -verify-machineinstrs < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel=1 -fast-isel-abort=1 -verify-machineinstrs < %s | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; AND
5*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @and_rr_i1(i1 signext %a, i1 signext %b) {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_rr_i1
7*9880d681SAndroid Build Coastguard Worker; CHECK:       and [[REG:w[0-9]+]], w0, w1
8*9880d681SAndroid Build Coastguard Worker  %1 = and i1 %a, %b
9*9880d681SAndroid Build Coastguard Worker  ret i1 %1
10*9880d681SAndroid Build Coastguard Worker}
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @and_rr_i8(i8 signext %a, i8 signext %b) {
13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_rr_i8
14*9880d681SAndroid Build Coastguard Worker; CHECK:       and [[REG:w[0-9]+]], w0, w1
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xff
16*9880d681SAndroid Build Coastguard Worker  %1 = and i8 %a, %b
17*9880d681SAndroid Build Coastguard Worker  ret i8 %1
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @and_rr_i16(i16 signext %a, i16 signext %b) {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_rr_i16
22*9880d681SAndroid Build Coastguard Worker; CHECK:       and [[REG:w[0-9]+]], w0, w1
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xffff
24*9880d681SAndroid Build Coastguard Worker  %1 = and i16 %a, %b
25*9880d681SAndroid Build Coastguard Worker  ret i16 %1
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine i32 @and_rr_i32(i32 %a, i32 %b) {
29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_rr_i32
30*9880d681SAndroid Build Coastguard Worker; CHECK:       and w0, w0, w1
31*9880d681SAndroid Build Coastguard Worker  %1 = and i32 %a, %b
32*9880d681SAndroid Build Coastguard Worker  ret i32 %1
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine i64 @and_rr_i64(i64 %a, i64 %b) {
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_rr_i64
37*9880d681SAndroid Build Coastguard Worker; CHECK:       and x0, x0, x1
38*9880d681SAndroid Build Coastguard Worker  %1 = and i64 %a, %b
39*9880d681SAndroid Build Coastguard Worker  ret i64 %1
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @and_ri_i1(i1 signext %a) {
43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_ri_i1
44*9880d681SAndroid Build Coastguard Worker; CHECK:       and {{w[0-9]+}}, w0, #0x1
45*9880d681SAndroid Build Coastguard Worker  %1 = and i1 %a, 1
46*9880d681SAndroid Build Coastguard Worker  ret i1 %1
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @and_ri_i8(i8 signext %a) {
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_ri_i8
51*9880d681SAndroid Build Coastguard Worker; CHECK:       and {{w[0-9]+}}, w0, #0xf
52*9880d681SAndroid Build Coastguard Worker  %1 = and i8 %a, 15
53*9880d681SAndroid Build Coastguard Worker  ret i8 %1
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @and_ri_i16(i16 signext %a) {
57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_ri_i16
58*9880d681SAndroid Build Coastguard Worker; CHECK:       and {{w[0-9]+}}, w0, #0xff
59*9880d681SAndroid Build Coastguard Worker  %1 = and i16 %a, 255
60*9880d681SAndroid Build Coastguard Worker  ret i16 %1
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine i32 @and_ri_i32(i32 %a) {
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_ri_i32
65*9880d681SAndroid Build Coastguard Worker; CHECK:       and w0, w0, #0xff
66*9880d681SAndroid Build Coastguard Worker  %1 = and i32 %a, 255
67*9880d681SAndroid Build Coastguard Worker  ret i32 %1
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerdefine i64 @and_ri_i64(i64 %a) {
71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_ri_i64
72*9880d681SAndroid Build Coastguard Worker; CHECK:       and x0, x0, #0xff
73*9880d681SAndroid Build Coastguard Worker  %1 = and i64 %a, 255
74*9880d681SAndroid Build Coastguard Worker  ret i64 %1
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @and_rs_i8(i8 signext %a, i8 signext %b) {
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_rs_i8
79*9880d681SAndroid Build Coastguard Worker; CHECK:       and [[REG:w[0-9]+]], w0, w1, lsl #4
80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], {{#0xff|#0xf0}}
81*9880d681SAndroid Build Coastguard Worker  %1 = shl i8 %b, 4
82*9880d681SAndroid Build Coastguard Worker  %2 = and i8 %a, %1
83*9880d681SAndroid Build Coastguard Worker  ret i8 %2
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @and_rs_i16(i16 signext %a, i16 signext %b) {
87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_rs_i16
88*9880d681SAndroid Build Coastguard Worker; CHECK:       and [[REG:w[0-9]+]], w0, w1, lsl #8
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], {{#0xffff|#0xff00}}
90*9880d681SAndroid Build Coastguard Worker  %1 = shl i16 %b, 8
91*9880d681SAndroid Build Coastguard Worker  %2 = and i16 %a, %1
92*9880d681SAndroid Build Coastguard Worker  ret i16 %2
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine i32 @and_rs_i32(i32 %a, i32 %b) {
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_rs_i32
97*9880d681SAndroid Build Coastguard Worker; CHECK:       and w0, w0, w1, lsl #8
98*9880d681SAndroid Build Coastguard Worker  %1 = shl i32 %b, 8
99*9880d681SAndroid Build Coastguard Worker  %2 = and i32 %a, %1
100*9880d681SAndroid Build Coastguard Worker  ret i32 %2
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine i64 @and_rs_i64(i64 %a, i64 %b) {
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_rs_i64
105*9880d681SAndroid Build Coastguard Worker; CHECK:       and x0, x0, x1, lsl #8
106*9880d681SAndroid Build Coastguard Worker  %1 = shl i64 %b, 8
107*9880d681SAndroid Build Coastguard Worker  %2 = and i64 %a, %1
108*9880d681SAndroid Build Coastguard Worker  ret i64 %2
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine i32 @and_mul_i32(i32 %a, i32 %b) {
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_mul_i32
113*9880d681SAndroid Build Coastguard Worker; CHECK:       and w0, w0, w1, lsl #2
114*9880d681SAndroid Build Coastguard Worker  %1 = mul i32 %b, 4
115*9880d681SAndroid Build Coastguard Worker  %2 = and i32 %a, %1
116*9880d681SAndroid Build Coastguard Worker  ret i32 %2
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine i64 @and_mul_i64(i64 %a, i64 %b) {
120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and_mul_i64
121*9880d681SAndroid Build Coastguard Worker; CHECK:       and x0, x0, x1, lsl #2
122*9880d681SAndroid Build Coastguard Worker  %1 = mul i64 %b, 4
123*9880d681SAndroid Build Coastguard Worker  %2 = and i64 %a, %1
124*9880d681SAndroid Build Coastguard Worker  ret i64 %2
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker; OR
128*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @or_rr_i1(i1 signext %a, i1 signext %b) {
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_rr_i1
130*9880d681SAndroid Build Coastguard Worker; CHECK:       orr [[REG:w[0-9]+]], w0, w1
131*9880d681SAndroid Build Coastguard Worker  %1 = or i1 %a, %b
132*9880d681SAndroid Build Coastguard Worker  ret i1 %1
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @or_rr_i8(i8 signext %a, i8 signext %b) {
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_rr_i8
137*9880d681SAndroid Build Coastguard Worker; CHECK:       orr [[REG:w[0-9]+]], w0, w1
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xff
139*9880d681SAndroid Build Coastguard Worker  %1 = or i8 %a, %b
140*9880d681SAndroid Build Coastguard Worker  ret i8 %1
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @or_rr_i16(i16 signext %a, i16 signext %b) {
144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_rr_i16
145*9880d681SAndroid Build Coastguard Worker; CHECK:       orr [[REG:w[0-9]+]], w0, w1
146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xffff
147*9880d681SAndroid Build Coastguard Worker  %1 = or i16 %a, %b
148*9880d681SAndroid Build Coastguard Worker  ret i16 %1
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerdefine i32 @or_rr_i32(i32 %a, i32 %b) {
152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_rr_i32
153*9880d681SAndroid Build Coastguard Worker; CHECK:       orr w0, w0, w1
154*9880d681SAndroid Build Coastguard Worker  %1 = or i32 %a, %b
155*9880d681SAndroid Build Coastguard Worker  ret i32 %1
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdefine i64 @or_rr_i64(i64 %a, i64 %b) {
159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_rr_i64
160*9880d681SAndroid Build Coastguard Worker; CHECK:       orr x0, x0, x1
161*9880d681SAndroid Build Coastguard Worker  %1 = or i64 %a, %b
162*9880d681SAndroid Build Coastguard Worker  ret i64 %1
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @or_ri_i8(i8 %a) {
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_ri_i8
167*9880d681SAndroid Build Coastguard Worker; CHECK:       orr [[REG:w[0-9]+]], w0, #0xf
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xff
169*9880d681SAndroid Build Coastguard Worker  %1 = or i8 %a, 15
170*9880d681SAndroid Build Coastguard Worker  ret i8 %1
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @or_ri_i16(i16 %a) {
174*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_ri_i16
175*9880d681SAndroid Build Coastguard Worker; CHECK:       orr [[REG:w[0-9]+]], w0, #0xff
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xffff
177*9880d681SAndroid Build Coastguard Worker  %1 = or i16 %a, 255
178*9880d681SAndroid Build Coastguard Worker  ret i16 %1
179*9880d681SAndroid Build Coastguard Worker}
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Workerdefine i32 @or_ri_i32(i32 %a) {
182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_ri_i32
183*9880d681SAndroid Build Coastguard Worker; CHECK:       orr w0, w0, #0xff
184*9880d681SAndroid Build Coastguard Worker  %1 = or i32 %a, 255
185*9880d681SAndroid Build Coastguard Worker  ret i32 %1
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerdefine i64 @or_ri_i64(i64 %a) {
189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_ri_i64
190*9880d681SAndroid Build Coastguard Worker; CHECK:       orr x0, x0, #0xff
191*9880d681SAndroid Build Coastguard Worker  %1 = or i64 %a, 255
192*9880d681SAndroid Build Coastguard Worker  ret i64 %1
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @or_rs_i8(i8 signext %a, i8 signext %b) {
196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_rs_i8
197*9880d681SAndroid Build Coastguard Worker; CHECK:       orr [[REG:w[0-9]+]], w0, w1, lsl #4
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], {{#0xff|#0xf0}}
199*9880d681SAndroid Build Coastguard Worker  %1 = shl i8 %b, 4
200*9880d681SAndroid Build Coastguard Worker  %2 = or i8 %a, %1
201*9880d681SAndroid Build Coastguard Worker  ret i8 %2
202*9880d681SAndroid Build Coastguard Worker}
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @or_rs_i16(i16 signext %a, i16 signext %b) {
205*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_rs_i16
206*9880d681SAndroid Build Coastguard Worker; CHECK:       orr [[REG:w[0-9]+]], w0, w1, lsl #8
207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], {{#0xffff|#0xff00}}
208*9880d681SAndroid Build Coastguard Worker  %1 = shl i16 %b, 8
209*9880d681SAndroid Build Coastguard Worker  %2 = or i16 %a, %1
210*9880d681SAndroid Build Coastguard Worker  ret i16 %2
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdefine i32 @or_rs_i32(i32 %a, i32 %b) {
214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_rs_i32
215*9880d681SAndroid Build Coastguard Worker; CHECK:       orr w0, w0, w1, lsl #8
216*9880d681SAndroid Build Coastguard Worker  %1 = shl i32 %b, 8
217*9880d681SAndroid Build Coastguard Worker  %2 = or i32 %a, %1
218*9880d681SAndroid Build Coastguard Worker  ret i32 %2
219*9880d681SAndroid Build Coastguard Worker}
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerdefine i64 @or_rs_i64(i64 %a, i64 %b) {
222*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_rs_i64
223*9880d681SAndroid Build Coastguard Worker; CHECK:       orr x0, x0, x1, lsl #8
224*9880d681SAndroid Build Coastguard Worker  %1 = shl i64 %b, 8
225*9880d681SAndroid Build Coastguard Worker  %2 = or i64 %a, %1
226*9880d681SAndroid Build Coastguard Worker  ret i64 %2
227*9880d681SAndroid Build Coastguard Worker}
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Workerdefine i32 @or_mul_i32(i32 %a, i32 %b) {
230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_mul_i32
231*9880d681SAndroid Build Coastguard Worker; CHECK:       orr w0, w0, w1, lsl #2
232*9880d681SAndroid Build Coastguard Worker  %1 = mul i32 %b, 4
233*9880d681SAndroid Build Coastguard Worker  %2 = or i32 %a, %1
234*9880d681SAndroid Build Coastguard Worker  ret i32 %2
235*9880d681SAndroid Build Coastguard Worker}
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Workerdefine i64 @or_mul_i64(i64 %a, i64 %b) {
238*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or_mul_i64
239*9880d681SAndroid Build Coastguard Worker; CHECK:       orr x0, x0, x1, lsl #2
240*9880d681SAndroid Build Coastguard Worker  %1 = mul i64 %b, 4
241*9880d681SAndroid Build Coastguard Worker  %2 = or i64 %a, %1
242*9880d681SAndroid Build Coastguard Worker  ret i64 %2
243*9880d681SAndroid Build Coastguard Worker}
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker; XOR
246*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @xor_rr_i1(i1 signext %a, i1 signext %b) {
247*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_rr_i1
248*9880d681SAndroid Build Coastguard Worker; CHECK:       eor [[REG:w[0-9]+]], w0, w1
249*9880d681SAndroid Build Coastguard Worker  %1 = xor i1 %a, %b
250*9880d681SAndroid Build Coastguard Worker  ret i1 %1
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @xor_rr_i8(i8 signext %a, i8 signext %b) {
254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_rr_i8
255*9880d681SAndroid Build Coastguard Worker; CHECK:       eor [[REG:w[0-9]+]], w0, w1
256*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xff
257*9880d681SAndroid Build Coastguard Worker  %1 = xor i8 %a, %b
258*9880d681SAndroid Build Coastguard Worker  ret i8 %1
259*9880d681SAndroid Build Coastguard Worker}
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @xor_rr_i16(i16 signext %a, i16 signext %b) {
262*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_rr_i16
263*9880d681SAndroid Build Coastguard Worker; CHECK:       eor [[REG:w[0-9]+]], w0, w1
264*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xffff
265*9880d681SAndroid Build Coastguard Worker  %1 = xor i16 %a, %b
266*9880d681SAndroid Build Coastguard Worker  ret i16 %1
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Workerdefine i32 @xor_rr_i32(i32 %a, i32 %b) {
270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_rr_i32
271*9880d681SAndroid Build Coastguard Worker; CHECK:       eor w0, w0, w1
272*9880d681SAndroid Build Coastguard Worker  %1 = xor i32 %a, %b
273*9880d681SAndroid Build Coastguard Worker  ret i32 %1
274*9880d681SAndroid Build Coastguard Worker}
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Workerdefine i64 @xor_rr_i64(i64 %a, i64 %b) {
277*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_rr_i64
278*9880d681SAndroid Build Coastguard Worker; CHECK:       eor x0, x0, x1
279*9880d681SAndroid Build Coastguard Worker  %1 = xor i64 %a, %b
280*9880d681SAndroid Build Coastguard Worker  ret i64 %1
281*9880d681SAndroid Build Coastguard Worker}
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @xor_ri_i8(i8 signext %a) {
284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_ri_i8
285*9880d681SAndroid Build Coastguard Worker; CHECK:       eor [[REG:w[0-9]+]], w0, #0xf
286*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xff
287*9880d681SAndroid Build Coastguard Worker  %1 = xor i8 %a, 15
288*9880d681SAndroid Build Coastguard Worker  ret i8 %1
289*9880d681SAndroid Build Coastguard Worker}
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @xor_ri_i16(i16 signext %a) {
292*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_ri_i16
293*9880d681SAndroid Build Coastguard Worker; CHECK:       eor [[REG:w[0-9]+]], w0, #0xff
294*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], #0xffff
295*9880d681SAndroid Build Coastguard Worker  %1 = xor i16 %a, 255
296*9880d681SAndroid Build Coastguard Worker  ret i16 %1
297*9880d681SAndroid Build Coastguard Worker}
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Workerdefine i32 @xor_ri_i32(i32 %a) {
300*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_ri_i32
301*9880d681SAndroid Build Coastguard Worker; CHECK:       eor w0, w0, #0xff
302*9880d681SAndroid Build Coastguard Worker  %1 = xor i32 %a, 255
303*9880d681SAndroid Build Coastguard Worker  ret i32 %1
304*9880d681SAndroid Build Coastguard Worker}
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Workerdefine i64 @xor_ri_i64(i64 %a) {
307*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_ri_i64
308*9880d681SAndroid Build Coastguard Worker; CHECK:       eor x0, x0, #0xff
309*9880d681SAndroid Build Coastguard Worker  %1 = xor i64 %a, 255
310*9880d681SAndroid Build Coastguard Worker  ret i64 %1
311*9880d681SAndroid Build Coastguard Worker}
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @xor_rs_i8(i8 %a, i8 %b) {
314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_rs_i8
315*9880d681SAndroid Build Coastguard Worker; CHECK:       eor [[REG:w[0-9]+]], w0, w1, lsl #4
316*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], {{#0xff|#0xf0}}
317*9880d681SAndroid Build Coastguard Worker  %1 = shl i8 %b, 4
318*9880d681SAndroid Build Coastguard Worker  %2 = xor i8 %a, %1
319*9880d681SAndroid Build Coastguard Worker  ret i8 %2
320*9880d681SAndroid Build Coastguard Worker}
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @xor_rs_i16(i16 %a, i16 %b) {
323*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_rs_i16
324*9880d681SAndroid Build Coastguard Worker; CHECK:       eor [[REG:w[0-9]+]], w0, w1, lsl #8
325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and {{w[0-9]+}}, [[REG]], {{#0xffff|#0xff00}}
326*9880d681SAndroid Build Coastguard Worker  %1 = shl i16 %b, 8
327*9880d681SAndroid Build Coastguard Worker  %2 = xor i16 %a, %1
328*9880d681SAndroid Build Coastguard Worker  ret i16 %2
329*9880d681SAndroid Build Coastguard Worker}
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Workerdefine i32 @xor_rs_i32(i32 %a, i32 %b) {
332*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_rs_i32
333*9880d681SAndroid Build Coastguard Worker; CHECK:       eor w0, w0, w1, lsl #8
334*9880d681SAndroid Build Coastguard Worker  %1 = shl i32 %b, 8
335*9880d681SAndroid Build Coastguard Worker  %2 = xor i32 %a, %1
336*9880d681SAndroid Build Coastguard Worker  ret i32 %2
337*9880d681SAndroid Build Coastguard Worker}
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Workerdefine i64 @xor_rs_i64(i64 %a, i64 %b) {
340*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_rs_i64
341*9880d681SAndroid Build Coastguard Worker; CHECK:       eor x0, x0, x1, lsl #8
342*9880d681SAndroid Build Coastguard Worker  %1 = shl i64 %b, 8
343*9880d681SAndroid Build Coastguard Worker  %2 = xor i64 %a, %1
344*9880d681SAndroid Build Coastguard Worker  ret i64 %2
345*9880d681SAndroid Build Coastguard Worker}
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Workerdefine i32 @xor_mul_i32(i32 %a, i32 %b) {
348*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_mul_i32
349*9880d681SAndroid Build Coastguard Worker; CHECK:       eor w0, w0, w1, lsl #2
350*9880d681SAndroid Build Coastguard Worker  %1 = mul i32 %b, 4
351*9880d681SAndroid Build Coastguard Worker  %2 = xor i32 %a, %1
352*9880d681SAndroid Build Coastguard Worker  ret i32 %2
353*9880d681SAndroid Build Coastguard Worker}
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Workerdefine i64 @xor_mul_i64(i64 %a, i64 %b) {
356*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor_mul_i64
357*9880d681SAndroid Build Coastguard Worker; CHECK:       eor x0, x0, x1, lsl #2
358*9880d681SAndroid Build Coastguard Worker  %1 = mul i64 %b, 4
359*9880d681SAndroid Build Coastguard Worker  %2 = xor i64 %a, %1
360*9880d681SAndroid Build Coastguard Worker  ret i64 %2
361*9880d681SAndroid Build Coastguard Worker}
362*9880d681SAndroid Build Coastguard Worker
363