blob: 152fff808ad0ccaf7525a415b1ea2e423c32514f [file] [log] [blame]
Juergen Ributzka1dbc15f2014-09-04 01:29:18 +00001; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel=0 -verify-machineinstrs < %s | FileCheck %s
2; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel=1 -fast-isel-abort -verify-machineinstrs < %s | FileCheck %s
3
4; AND
Juergen Ributzka85c1f842014-09-13 23:46:28 +00005define zeroext i1 @and_rr_i1(i1 signext %a, i1 signext %b) {
6; CHECK-LABEL: and_rr_i1
7; CHECK: and [[REG:w[0-9]+]], w0, w1
8 %1 = and i1 %a, %b
9 ret i1 %1
10}
11
12define zeroext i8 @and_rr_i8(i8 signext %a, i8 signext %b) {
13; CHECK-LABEL: and_rr_i8
14; CHECK: and [[REG:w[0-9]+]], w0, w1
15; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], #0xff
16 %1 = and i8 %a, %b
17 ret i8 %1
18}
19
20define zeroext i16 @and_rr_i16(i16 signext %a, i16 signext %b) {
21; CHECK-LABEL: and_rr_i16
22; CHECK: and [[REG:w[0-9]+]], w0, w1
23; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], #0xffff
24 %1 = and i16 %a, %b
25 ret i16 %1
26}
27
Juergen Ributzka1dbc15f2014-09-04 01:29:18 +000028define i32 @and_rr_i32(i32 %a, i32 %b) {
29; CHECK-LABEL: and_rr_i32
30; CHECK: and w0, w0, w1
31 %1 = and i32 %a, %b
32 ret i32 %1
33}
34
35define i64 @and_rr_i64(i64 %a, i64 %b) {
36; CHECK-LABEL: and_rr_i64
37; CHECK: and x0, x0, x1
38 %1 = and i64 %a, %b
39 ret i64 %1
40}
41
Juergen Ributzka85c1f842014-09-13 23:46:28 +000042define zeroext i1 @and_ri_i1(i1 signext %a) {
43; CHECK-LABEL: and_ri_i1
44; CHECK: and {{w[0-9]+}}, w0, #0x1
45 %1 = and i1 %a, 1
46 ret i1 %1
47}
48
49define zeroext i8 @and_ri_i8(i8 signext %a) {
50; CHECK-LABEL: and_ri_i8
51; CHECK: and {{w[0-9]+}}, w0, #0xf
52 %1 = and i8 %a, 15
53 ret i8 %1
54}
55
56define zeroext i16 @and_ri_i16(i16 signext %a) {
57; CHECK-LABEL: and_ri_i16
58; CHECK: and {{w[0-9]+}}, w0, #0xff
59 %1 = and i16 %a, 255
60 ret i16 %1
61}
62
Juergen Ributzka1dbc15f2014-09-04 01:29:18 +000063define i32 @and_ri_i32(i32 %a) {
64; CHECK-LABEL: and_ri_i32
65; CHECK: and w0, w0, #0xff
66 %1 = and i32 %a, 255
67 ret i32 %1
68}
69
70define i64 @and_ri_i64(i64 %a) {
71; CHECK-LABEL: and_ri_i64
72; CHECK: and x0, x0, #0xff
73 %1 = and i64 %a, 255
74 ret i64 %1
75}
76
Juergen Ributzka85c1f842014-09-13 23:46:28 +000077define zeroext i8 @and_rs_i8(i8 signext %a, i8 signext %b) {
78; CHECK-LABEL: and_rs_i8
79; CHECK: and [[REG:w[0-9]+]], w0, w1, lsl #4
80; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], {{#0xff|#0xf0}}
81 %1 = shl i8 %b, 4
82 %2 = and i8 %a, %1
83 ret i8 %2
84}
85
86define zeroext i16 @and_rs_i16(i16 signext %a, i16 signext %b) {
87; CHECK-LABEL: and_rs_i16
88; CHECK: and [[REG:w[0-9]+]], w0, w1, lsl #8
89; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], {{#0xffff|#0xff00}}
90 %1 = shl i16 %b, 8
91 %2 = and i16 %a, %1
92 ret i16 %2
93}
94
Juergen Ributzka1dbc15f2014-09-04 01:29:18 +000095define i32 @and_rs_i32(i32 %a, i32 %b) {
96; CHECK-LABEL: and_rs_i32
97; CHECK: and w0, w0, w1, lsl #8
98 %1 = shl i32 %b, 8
99 %2 = and i32 %a, %1
100 ret i32 %2
101}
102
103define i64 @and_rs_i64(i64 %a, i64 %b) {
104; CHECK-LABEL: and_rs_i64
105; CHECK: and x0, x0, x1, lsl #8
106 %1 = shl i64 %b, 8
107 %2 = and i64 %a, %1
108 ret i64 %2
109}
110
111; OR
Juergen Ributzka85c1f842014-09-13 23:46:28 +0000112define zeroext i1 @or_rr_i1(i1 signext %a, i1 signext %b) {
113; CHECK-LABEL: or_rr_i1
114; CHECK: orr [[REG:w[0-9]+]], w0, w1
115 %1 = or i1 %a, %b
116 ret i1 %1
117}
118
119define zeroext i8 @or_rr_i8(i8 signext %a, i8 signext %b) {
120; CHECK-LABEL: or_rr_i8
121; CHECK: orr [[REG:w[0-9]+]], w0, w1
122; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], #0xff
123 %1 = or i8 %a, %b
124 ret i8 %1
125}
126
127define zeroext i16 @or_rr_i16(i16 signext %a, i16 signext %b) {
128; CHECK-LABEL: or_rr_i16
129; CHECK: orr [[REG:w[0-9]+]], w0, w1
130; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], #0xffff
131 %1 = or i16 %a, %b
132 ret i16 %1
133}
134
Juergen Ributzka1dbc15f2014-09-04 01:29:18 +0000135define i32 @or_rr_i32(i32 %a, i32 %b) {
136; CHECK-LABEL: or_rr_i32
137; CHECK: orr w0, w0, w1
138 %1 = or i32 %a, %b
139 ret i32 %1
140}
141
142define i64 @or_rr_i64(i64 %a, i64 %b) {
143; CHECK-LABEL: or_rr_i64
144; CHECK: orr x0, x0, x1
145 %1 = or i64 %a, %b
146 ret i64 %1
147}
148
Juergen Ributzka85c1f842014-09-13 23:46:28 +0000149define zeroext i8 @or_ri_i8(i8 %a) {
150; CHECK-LABEL: or_ri_i8
151; CHECK: orr [[REG:w[0-9]+]], w0, #0xf
152; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], #0xff
153 %1 = or i8 %a, 15
154 ret i8 %1
155}
156
157define zeroext i16 @or_ri_i16(i16 %a) {
158; CHECK-LABEL: or_ri_i16
159; CHECK: orr [[REG:w[0-9]+]], w0, #0xff
160; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], #0xffff
161 %1 = or i16 %a, 255
162 ret i16 %1
163}
164
Juergen Ributzka1dbc15f2014-09-04 01:29:18 +0000165define i32 @or_ri_i32(i32 %a) {
166; CHECK-LABEL: or_ri_i32
167; CHECK: orr w0, w0, #0xff
168 %1 = or i32 %a, 255
169 ret i32 %1
170}
171
172define i64 @or_ri_i64(i64 %a) {
173; CHECK-LABEL: or_ri_i64
174; CHECK: orr x0, x0, #0xff
175 %1 = or i64 %a, 255
176 ret i64 %1
177}
178
Juergen Ributzka85c1f842014-09-13 23:46:28 +0000179define zeroext i8 @or_rs_i8(i8 signext %a, i8 signext %b) {
180; CHECK-LABEL: or_rs_i8
181; CHECK: orr [[REG:w[0-9]+]], w0, w1, lsl #4
182; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], {{#0xff|#0xf0}}
183 %1 = shl i8 %b, 4
184 %2 = or i8 %a, %1
185 ret i8 %2
186}
187
188define zeroext i16 @or_rs_i16(i16 signext %a, i16 signext %b) {
189; CHECK-LABEL: or_rs_i16
190; CHECK: orr [[REG:w[0-9]+]], w0, w1, lsl #8
191; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], {{#0xffff|#0xff00}}
192 %1 = shl i16 %b, 8
193 %2 = or i16 %a, %1
194 ret i16 %2
195}
196
Juergen Ributzka1dbc15f2014-09-04 01:29:18 +0000197define i32 @or_rs_i32(i32 %a, i32 %b) {
198; CHECK-LABEL: or_rs_i32
199; CHECK: orr w0, w0, w1, lsl #8
200 %1 = shl i32 %b, 8
201 %2 = or i32 %a, %1
202 ret i32 %2
203}
204
205define i64 @or_rs_i64(i64 %a, i64 %b) {
206; CHECK-LABEL: or_rs_i64
207; CHECK: orr x0, x0, x1, lsl #8
208 %1 = shl i64 %b, 8
209 %2 = or i64 %a, %1
210 ret i64 %2
211}
212
213; XOR
Juergen Ributzka85c1f842014-09-13 23:46:28 +0000214define zeroext i1 @xor_rr_i1(i1 signext %a, i1 signext %b) {
215; CHECK-LABEL: xor_rr_i1
216; CHECK: eor [[REG:w[0-9]+]], w0, w1
217 %1 = xor i1 %a, %b
218 ret i1 %1
219}
220
221define zeroext i8 @xor_rr_i8(i8 signext %a, i8 signext %b) {
222; CHECK-LABEL: xor_rr_i8
223; CHECK: eor [[REG:w[0-9]+]], w0, w1
224; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], #0xff
225 %1 = xor i8 %a, %b
226 ret i8 %1
227}
228
229define zeroext i16 @xor_rr_i16(i16 signext %a, i16 signext %b) {
230; CHECK-LABEL: xor_rr_i16
231; CHECK: eor [[REG:w[0-9]+]], w0, w1
232; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], #0xffff
233 %1 = xor i16 %a, %b
234 ret i16 %1
235}
236
Juergen Ributzka1dbc15f2014-09-04 01:29:18 +0000237define i32 @xor_rr_i32(i32 %a, i32 %b) {
238; CHECK-LABEL: xor_rr_i32
239; CHECK: eor w0, w0, w1
240 %1 = xor i32 %a, %b
241 ret i32 %1
242}
243
244define i64 @xor_rr_i64(i64 %a, i64 %b) {
245; CHECK-LABEL: xor_rr_i64
246; CHECK: eor x0, x0, x1
247 %1 = xor i64 %a, %b
248 ret i64 %1
249}
250
Juergen Ributzka85c1f842014-09-13 23:46:28 +0000251define zeroext i8 @xor_ri_i8(i8 signext %a) {
252; CHECK-LABEL: xor_ri_i8
253; CHECK: eor [[REG:w[0-9]+]], w0, #0xf
254; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], #0xff
255 %1 = xor i8 %a, 15
256 ret i8 %1
257}
258
259define zeroext i16 @xor_ri_i16(i16 signext %a) {
260; CHECK-LABEL: xor_ri_i16
261; CHECK: eor [[REG:w[0-9]+]], w0, #0xff
262; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], #0xffff
263 %1 = xor i16 %a, 255
264 ret i16 %1
265}
266
Juergen Ributzka1dbc15f2014-09-04 01:29:18 +0000267define i32 @xor_ri_i32(i32 %a) {
268; CHECK-LABEL: xor_ri_i32
269; CHECK: eor w0, w0, #0xff
270 %1 = xor i32 %a, 255
271 ret i32 %1
272}
273
274define i64 @xor_ri_i64(i64 %a) {
275; CHECK-LABEL: xor_ri_i64
276; CHECK: eor x0, x0, #0xff
277 %1 = xor i64 %a, 255
278 ret i64 %1
279}
280
Juergen Ributzka85c1f842014-09-13 23:46:28 +0000281define zeroext i8 @xor_rs_i8(i8 %a, i8 %b) {
282; CHECK-LABEL: xor_rs_i8
283; CHECK: eor [[REG:w[0-9]+]], w0, w1, lsl #4
284; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], {{#0xff|#0xf0}}
285 %1 = shl i8 %b, 4
286 %2 = xor i8 %a, %1
287 ret i8 %2
288}
289
290define zeroext i16 @xor_rs_i16(i16 %a, i16 %b) {
291; CHECK-LABEL: xor_rs_i16
292; CHECK: eor [[REG:w[0-9]+]], w0, w1, lsl #8
293; CHECK-NEXT: and {{w[0-9]+}}, [[REG]], {{#0xffff|#0xff00}}
294 %1 = shl i16 %b, 8
295 %2 = xor i16 %a, %1
296 ret i16 %2
297}
298
Juergen Ributzka1dbc15f2014-09-04 01:29:18 +0000299define i32 @xor_rs_i32(i32 %a, i32 %b) {
300; CHECK-LABEL: xor_rs_i32
301; CHECK: eor w0, w0, w1, lsl #8
302 %1 = shl i32 %b, 8
303 %2 = xor i32 %a, %1
304 ret i32 %2
305}
306
307define i64 @xor_rs_i64(i64 %a, i64 %b) {
308; CHECK-LABEL: xor_rs_i64
309; CHECK: eor x0, x0, x1, lsl #8
310 %1 = shl i64 %b, 8
311 %2 = xor i64 %a, %1
312 ret i64 %2
313}
314