[FastISel][AArch64] Add support for non-native types for logical ops.
[oota-llvm.git] / test / CodeGen / AArch64 / fast-isel-logic-op.ll
1 ; 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
5 define 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
12 define 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
20 define 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
28 define 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
35 define 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
42 define 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
49 define 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
56 define 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
63 define 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
70 define 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
77 define 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
86 define 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
95 define 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
103 define 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
112 define 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
119 define 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
127 define 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
135 define 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
142 define 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
149 define 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
157 define 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
165 define 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
172 define 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
179 define 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
188 define 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
197 define 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
205 define 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
214 define 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
221 define 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
229 define 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
237 define 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
244 define 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
251 define 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
259 define 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
267 define 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
274 define 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
281 define 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
290 define 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
299 define 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
307 define 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