AArch64: add initial NEON support
[oota-llvm.git] / test / CodeGen / AArch64 / neon-bitwise-instructions.ll
1 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s
2
3
4 define <8 x i8> @and8xi8(<8 x i8> %a, <8 x i8> %b) {
5 ;CHECK: and {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
6         %tmp1 = and <8 x i8> %a, %b;
7         ret <8 x i8> %tmp1
8 }
9
10 define <16 x i8> @and16xi8(<16 x i8> %a, <16 x i8> %b) {
11 ;CHECK: and {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
12         %tmp1 = and <16 x i8> %a, %b;
13         ret <16 x i8> %tmp1
14 }
15
16
17 define <8 x i8> @orr8xi8(<8 x i8> %a, <8 x i8> %b) {
18 ;CHECK: orr {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
19         %tmp1 = or <8 x i8> %a, %b;
20         ret <8 x i8> %tmp1
21 }
22
23 define <16 x i8> @orr16xi8(<16 x i8> %a, <16 x i8> %b) {
24 ;CHECK: orr {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
25         %tmp1 = or <16 x i8> %a, %b;
26         ret <16 x i8> %tmp1
27 }
28
29
30 define <8 x i8> @xor8xi8(<8 x i8> %a, <8 x i8> %b) {
31 ;CHECK: eor {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
32         %tmp1 = xor <8 x i8> %a, %b;
33         ret <8 x i8> %tmp1
34 }
35
36 define <16 x i8> @xor16xi8(<16 x i8> %a, <16 x i8> %b) {
37 ;CHECK: eor {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
38         %tmp1 = xor <16 x i8> %a, %b;
39         ret <16 x i8> %tmp1
40 }
41
42 define <8 x i8> @bsl8xi8_const(<8 x i8> %a, <8 x i8> %b)  {
43 ;CHECK:  bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
44         %tmp1 = and <8 x i8> %a, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
45         %tmp2 = and <8 x i8> %b, < i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0 >
46         %tmp3 = or <8 x i8> %tmp1, %tmp2
47         ret <8 x i8> %tmp3
48 }
49
50 define <16 x i8> @bsl16xi8_const(<16 x i8> %a, <16 x i8> %b) {
51 ;CHECK:  bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
52         %tmp1 = and <16 x i8> %a, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
53         %tmp2 = and <16 x i8> %b, < i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0 >
54         %tmp3 = or <16 x i8> %tmp1, %tmp2
55         ret <16 x i8> %tmp3
56 }
57
58 define <8 x i8> @orn8xi8(<8 x i8> %a, <8 x i8> %b)  {
59 ;CHECK:  orn {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
60   %tmp1 = xor <8 x i8> %b, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
61   %tmp2 = or <8 x i8> %a, %tmp1
62   ret <8 x i8> %tmp2
63 }
64
65 define <16 x i8> @orn16xi8(<16 x i8> %a, <16 x i8> %b) {
66 ;CHECK:  orn {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
67   %tmp1 = xor <16 x i8> %b, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
68   %tmp2 = or <16 x i8> %a, %tmp1
69   ret <16 x i8> %tmp2
70 }
71
72 define <8 x i8> @bic8xi8(<8 x i8> %a, <8 x i8> %b)  {
73 ;CHECK:  bic {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
74   %tmp1 = xor <8 x i8> %b, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
75   %tmp2 = and <8 x i8> %a, %tmp1
76   ret <8 x i8> %tmp2
77 }
78
79 define <16 x i8> @bic16xi8(<16 x i8> %a, <16 x i8> %b) {
80 ;CHECK:  bic {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
81   %tmp1 = xor <16 x i8> %b, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
82   %tmp2 = and <16 x i8> %a, %tmp1
83   ret <16 x i8> %tmp2
84 }
85
86 define <2 x i32> @orrimm2s_lsl0(<2 x i32> %a) {
87 ;CHECK:  orr {{v[0-31]+}}.2s, #0xff
88         %tmp1 = or <2 x i32> %a, < i32 255, i32 255>
89         ret <2 x i32> %tmp1
90 }
91
92 define <2 x i32> @orrimm2s_lsl8(<2 x i32> %a) {
93 ;CHECK:  orr {{v[0-31]+}}.2s, #0xff, lsl #8
94         %tmp1 = or <2 x i32> %a, < i32 65280, i32 65280>
95         ret <2 x i32> %tmp1
96 }
97
98 define <2 x i32> @orrimm2s_lsl16(<2 x i32> %a) {
99 ;CHECK:  orr {{v[0-31]+}}.2s, #0xff, lsl #16
100         %tmp1 = or <2 x i32> %a, < i32 16711680, i32 16711680>
101         ret <2 x i32> %tmp1
102 }
103
104 define <2 x i32> @orrimm2s_lsl24(<2 x i32> %a) {
105 ;CHECK:  orr {{v[0-31]+}}.2s, #0xff, lsl #24
106         %tmp1 = or <2 x i32> %a, < i32 4278190080, i32 4278190080>
107         ret <2 x i32> %tmp1
108 }
109
110 define <4 x i32> @orrimm4s_lsl0(<4 x i32> %a) {
111 ;CHECK:  orr {{v[0-31]+}}.4s, #0xff
112         %tmp1 = or <4 x i32> %a, < i32 255, i32 255, i32 255, i32 255>
113         ret <4 x i32> %tmp1
114 }
115
116 define <4 x i32> @orrimm4s_lsl8(<4 x i32> %a) {
117 ;CHECK:  orr {{v[0-31]+}}.4s, #0xff, lsl #8
118         %tmp1 = or <4 x i32> %a, < i32 65280, i32 65280, i32 65280, i32 65280>
119         ret <4 x i32> %tmp1
120 }
121
122 define <4 x i32> @orrimm4s_lsl16(<4 x i32> %a) {
123 ;CHECK:  orr {{v[0-31]+}}.4s, #0xff, lsl #16
124         %tmp1 = or <4 x i32> %a, < i32 16711680, i32 16711680, i32 16711680, i32 16711680>
125         ret <4 x i32> %tmp1
126 }
127
128 define <4 x i32> @orrimm4s_lsl24(<4 x i32> %a) {
129 ;CHECK:  orr {{v[0-31]+}}.4s, #0xff, lsl #24
130         %tmp1 = or <4 x i32> %a, < i32 4278190080, i32 4278190080, i32 4278190080, i32 4278190080>
131         ret <4 x i32> %tmp1
132 }
133
134 define <4 x i16> @orrimm4h_lsl0(<4 x i16> %a) {
135 ;CHECK:  orr {{v[0-31]+}}.4h, #0xff
136         %tmp1 = or <4 x i16> %a, < i16 255, i16 255, i16 255, i16 255 >
137         ret <4 x i16> %tmp1
138 }
139
140 define <4 x i16> @orrimm4h_lsl8(<4 x i16> %a) {
141 ;CHECK:  orr {{v[0-31]+}}.4h, #0xff, lsl #8
142         %tmp1 = or <4 x i16> %a, < i16 65280, i16 65280, i16 65280, i16 65280 >
143         ret <4 x i16> %tmp1
144 }
145
146 define <8 x i16> @orrimm8h_lsl0(<8 x i16> %a) {
147 ;CHECK:  orr {{v[0-31]+}}.8h, #0xff
148         %tmp1 = or <8 x i16> %a, < i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255 >
149         ret <8 x i16> %tmp1
150 }
151
152 define <8 x i16> @orrimm8h_lsl8(<8 x i16> %a) {
153 ;CHECK:  orr {{v[0-31]+}}.8h, #0xff, lsl #8
154         %tmp1 = or <8 x i16> %a, < i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280 >
155         ret <8 x i16> %tmp1
156 }
157
158 define <2 x i32> @bicimm2s_lsl0(<2 x i32> %a) {
159 ;CHECK:  bic {{v[0-31]+}}.2s, #0x10
160         %tmp1 = and <2 x i32> %a, < i32 4294967279, i32 4294967279 >
161         ret <2 x i32> %tmp1
162 }
163
164 define <2 x i32> @bicimm2s_lsl8(<2 x i32> %a) {
165 ;CHECK:  bic {{v[0-31]+}}.2s, #0x10, lsl #8
166         %tmp1 = and <2 x i32> %a, < i32 18446744073709547519, i32  18446744073709547519 >
167         ret <2 x i32> %tmp1
168 }
169
170 define <2 x i32> @bicimm2s_lsl16(<2 x i32> %a) {
171 ;CHECK:  bic {{v[0-31]+}}.2s, #0x10, lsl #16
172         %tmp1 = and <2 x i32> %a, < i32 18446744073708503039, i32 18446744073708503039 >
173         ret <2 x i32> %tmp1
174 }
175
176 define <2 x i32> @bicimm2s_lsl124(<2 x i32> %a) {
177 ;CHECK:  bic {{v[0-31]+}}.2s, #0x10, lsl #24
178         %tmp1 = and <2 x i32> %a, < i32 18446744073441116159, i32  18446744073441116159>
179         ret <2 x i32> %tmp1
180 }
181
182 define <4 x i32> @bicimm4s_lsl0(<4 x i32> %a) {
183 ;CHECK:  bic {{v[0-31]+}}.4s, #0x10
184         %tmp1 = and <4 x i32> %a, < i32 4294967279, i32 4294967279, i32 4294967279, i32 4294967279 >
185         ret <4 x i32> %tmp1
186 }
187
188 define <4 x i32> @bicimm4s_lsl8(<4 x i32> %a) {
189 ;CHECK:  bic {{v[0-31]+}}.4s, #0x10, lsl #8
190         %tmp1 = and <4 x i32> %a, < i32 18446744073709547519, i32  18446744073709547519, i32  18446744073709547519, i32  18446744073709547519 >
191         ret <4 x i32> %tmp1
192 }
193
194 define <4 x i32> @bicimm4s_lsl16(<4 x i32> %a) {
195 ;CHECK:  bic {{v[0-31]+}}.4s, #0x10, lsl #16
196         %tmp1 = and <4 x i32> %a, < i32 18446744073708503039, i32 18446744073708503039, i32 18446744073708503039, i32 18446744073708503039 >
197         ret <4 x i32> %tmp1
198 }
199
200 define <4 x i32> @bicimm4s_lsl124(<4 x i32> %a) {
201 ;CHECK:  bic {{v[0-31]+}}.4s, #0x10, lsl #24
202         %tmp1 = and <4 x i32> %a, < i32 18446744073441116159, i32  18446744073441116159, i32  18446744073441116159, i32  18446744073441116159>
203         ret <4 x i32> %tmp1
204 }
205
206 define <4 x i16> @bicimm4h_lsl0_a(<4 x i16> %a) {
207 ;CHECK:  bic {{v[0-31]+}}.4h, #0x10
208         %tmp1 = and <4 x i16> %a, < i16 18446744073709551599, i16  18446744073709551599, i16  18446744073709551599, i16  18446744073709551599 >
209         ret <4 x i16> %tmp1
210 }
211
212 define <4 x i16> @bicimm4h_lsl0_b(<4 x i16> %a) {
213 ;CHECK:  bic {{v[0-31]+}}.4h, #0x0
214         %tmp1 = and <4 x i16> %a, < i16 65280, i16  65280, i16  65280, i16 65280 >
215         ret <4 x i16> %tmp1
216 }
217
218 define <4 x i16> @bicimm4h_lsl8_a(<4 x i16> %a) {
219 ;CHECK:  bic {{v[0-31]+}}.4h, #0x10, lsl #8
220         %tmp1 = and <4 x i16> %a, < i16 18446744073709547519, i16  18446744073709547519, i16  18446744073709547519, i16  18446744073709547519>
221         ret <4 x i16> %tmp1
222 }
223
224 define <4 x i16> @bicimm4h_lsl8_b(<4 x i16> %a) {
225 ;CHECK:  bic {{v[0-31]+}}.4h, #0x0, lsl #8
226         %tmp1 = and <4 x i16> %a, < i16 255, i16 255, i16 255, i16 255>
227         ret <4 x i16> %tmp1
228 }
229
230 define <8 x i16> @bicimm8h_lsl0_a(<8 x i16> %a) {
231 ;CHECK:  bic {{v[0-31]+}}.8h, #0x10
232         %tmp1 = and <8 x i16> %a, < i16 18446744073709551599, i16  18446744073709551599, i16  18446744073709551599, i16  18446744073709551599,
233    i16  18446744073709551599, i16  18446744073709551599, i16  18446744073709551599, i16  18446744073709551599 >
234         ret <8 x i16> %tmp1
235 }
236
237 define <8 x i16> @bicimm8h_lsl0_b(<8 x i16> %a) {
238 ;CHECK:  bic {{v[0-31]+}}.8h, #0x0
239         %tmp1 = and <8 x i16> %a, < i16 65280, i16  65280, i16  65280, i16 65280, i16 65280, i16  65280, i16  65280, i16 65280 >
240         ret <8 x i16> %tmp1
241 }
242
243 define <8 x i16> @bicimm8h_lsl8_a(<8 x i16> %a) {
244 ;CHECK:  bic {{v[0-31]+}}.8h, #0x10, lsl #8
245         %tmp1 = and <8 x i16> %a, < i16 18446744073709547519, i16  18446744073709547519, i16  18446744073709547519, i16  18446744073709547519,
246    i16  18446744073709547519, i16  18446744073709547519, i16  18446744073709547519, i16  18446744073709547519>
247         ret <8 x i16> %tmp1
248 }
249
250 define <8 x i16> @bicimm8h_lsl8_b(<8 x i16> %a) {
251 ;CHECK:  bic {{v[0-31]+}}.8h, #0x0, lsl #8
252         %tmp1 = and <8 x i16> %a, < i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
253         ret <8 x i16> %tmp1
254 }
255
256 define <2 x i32> @and2xi32(<2 x i32> %a, <2 x i32> %b) {
257 ;CHECK: and {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
258         %tmp1 = and <2 x i32> %a, %b;
259         ret <2 x i32> %tmp1
260 }
261
262 define <4 x i16> @and4xi16(<4 x i16> %a, <4 x i16> %b) {
263 ;CHECK: and {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
264         %tmp1 = and <4 x i16> %a, %b;
265         ret <4 x i16> %tmp1
266 }
267
268 define <1 x i64> @and1xi64(<1 x i64> %a, <1 x i64> %b) {
269 ;CHECK: and {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
270         %tmp1 = and <1 x i64> %a, %b;
271         ret <1 x i64> %tmp1
272 }
273
274 define <4 x i32> @and4xi32(<4 x i32> %a, <4 x i32> %b) {
275 ;CHECK: and {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
276         %tmp1 = and <4 x i32> %a, %b;
277         ret <4 x i32> %tmp1
278 }
279
280 define <8 x i16> @and8xi16(<8 x i16> %a, <8 x i16> %b) {
281 ;CHECK: and {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
282         %tmp1 = and <8 x i16> %a, %b;
283         ret <8 x i16> %tmp1
284 }
285
286 define <2 x i64> @and2xi64(<2 x i64> %a, <2 x i64> %b) {
287 ;CHECK: and {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
288         %tmp1 = and <2 x i64> %a, %b;
289         ret <2 x i64> %tmp1
290 }
291
292 define <2 x i32> @orr2xi32(<2 x i32> %a, <2 x i32> %b) {
293 ;CHECK: orr {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
294         %tmp1 = or <2 x i32> %a, %b;
295         ret <2 x i32> %tmp1
296 }
297
298 define <4 x i16> @orr4xi16(<4 x i16> %a, <4 x i16> %b) {
299 ;CHECK: orr {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
300         %tmp1 = or <4 x i16> %a, %b;
301         ret <4 x i16> %tmp1
302 }
303
304 define <1 x i64> @orr1xi64(<1 x i64> %a, <1 x i64> %b) {
305 ;CHECK: orr {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
306         %tmp1 = or <1 x i64> %a, %b;
307         ret <1 x i64> %tmp1
308 }
309
310 define <4 x i32> @orr4xi32(<4 x i32> %a, <4 x i32> %b) {
311 ;CHECK: orr {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
312         %tmp1 = or <4 x i32> %a, %b;
313         ret <4 x i32> %tmp1
314 }
315
316 define <8 x i16> @orr8xi16(<8 x i16> %a, <8 x i16> %b) {
317 ;CHECK: orr {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
318         %tmp1 = or <8 x i16> %a, %b;
319         ret <8 x i16> %tmp1
320 }
321
322 define <2 x i64> @orr2xi64(<2 x i64> %a, <2 x i64> %b) {
323 ;CHECK: orr {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
324         %tmp1 = or <2 x i64> %a, %b;
325         ret <2 x i64> %tmp1
326 }
327
328 define <2 x i32> @eor2xi32(<2 x i32> %a, <2 x i32> %b) {
329 ;CHECK: eor {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
330         %tmp1 = xor <2 x i32> %a, %b;
331         ret <2 x i32> %tmp1
332 }
333
334 define <4 x i16> @eor4xi16(<4 x i16> %a, <4 x i16> %b) {
335 ;CHECK: eor {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
336         %tmp1 = xor <4 x i16> %a, %b;
337         ret <4 x i16> %tmp1
338 }
339
340 define <1 x i64> @eor1xi64(<1 x i64> %a, <1 x i64> %b) {
341 ;CHECK: eor {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
342         %tmp1 = xor <1 x i64> %a, %b;
343         ret <1 x i64> %tmp1
344 }
345
346 define <4 x i32> @eor4xi32(<4 x i32> %a, <4 x i32> %b) {
347 ;CHECK: eor {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
348         %tmp1 = xor <4 x i32> %a, %b;
349         ret <4 x i32> %tmp1
350 }
351
352 define <8 x i16> @eor8xi16(<8 x i16> %a, <8 x i16> %b) {
353 ;CHECK: eor {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
354         %tmp1 = xor <8 x i16> %a, %b;
355         ret <8 x i16> %tmp1
356 }
357
358 define <2 x i64> @eor2xi64(<2 x i64> %a, <2 x i64> %b) {
359 ;CHECK: eor {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
360         %tmp1 = xor <2 x i64> %a, %b;
361         ret <2 x i64> %tmp1
362 }
363
364
365 define <2 x i32> @bic2xi32(<2 x i32> %a, <2 x i32> %b)  {
366 ;CHECK:  bic {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
367   %tmp1 = xor <2 x i32> %b, < i32 -1, i32 -1 >
368   %tmp2 = and <2 x i32> %a, %tmp1
369   ret <2 x i32> %tmp2
370 }
371
372 define <4 x i16> @bic4xi16(<4 x i16> %a, <4 x i16> %b)  {
373 ;CHECK:  bic {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
374   %tmp1 = xor <4 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1 >
375   %tmp2 = and <4 x i16> %a, %tmp1
376   ret <4 x i16> %tmp2
377 }
378
379 define <1 x i64> @bic1xi64(<1 x i64> %a, <1 x i64> %b)  {
380 ;CHECK:  bic {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
381   %tmp1 = xor <1 x i64> %b, < i64 -1>
382   %tmp2 = and <1 x i64> %a, %tmp1
383   ret <1 x i64> %tmp2
384 }
385
386 define <4 x i32> @bic4xi32(<4 x i32> %a, <4 x i32> %b)  {
387 ;CHECK:  bic {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
388   %tmp1 = xor <4 x i32> %b, < i32 -1, i32 -1, i32 -1, i32 -1>
389   %tmp2 = and <4 x i32> %a, %tmp1
390   ret <4 x i32> %tmp2
391 }
392
393 define <8 x i16> @bic8xi16(<8 x i16> %a, <8 x i16> %b)  {
394 ;CHECK:  bic {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
395   %tmp1 = xor <8 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1, i16 -1, i16 -1, i16 -1, i16 -1 >
396   %tmp2 = and <8 x i16> %a, %tmp1
397   ret <8 x i16> %tmp2
398 }
399
400 define <2 x i64> @bic2xi64(<2 x i64> %a, <2 x i64> %b)  {
401 ;CHECK:  bic {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
402   %tmp1 = xor <2 x i64> %b, < i64 -1, i64 -1>
403   %tmp2 = and <2 x i64> %a, %tmp1
404   ret <2 x i64> %tmp2
405 }
406
407 define <2 x i32> @orn2xi32(<2 x i32> %a, <2 x i32> %b)  {
408 ;CHECK:  orn {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
409   %tmp1 = xor <2 x i32> %b, < i32 -1, i32 -1 >
410   %tmp2 = or <2 x i32> %a, %tmp1
411   ret <2 x i32> %tmp2
412 }
413
414 define <4 x i16> @orn4xi16(<4 x i16> %a, <4 x i16> %b)  {
415 ;CHECK:  orn {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
416   %tmp1 = xor <4 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1 >
417   %tmp2 = or <4 x i16> %a, %tmp1
418   ret <4 x i16> %tmp2
419 }
420
421 define <1 x i64> @orn1xi64(<1 x i64> %a, <1 x i64> %b)  {
422 ;CHECK:  orn {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
423   %tmp1 = xor <1 x i64> %b, < i64 -1>
424   %tmp2 = or <1 x i64> %a, %tmp1
425   ret <1 x i64> %tmp2
426 }
427
428 define <4 x i32> @orn4xi32(<4 x i32> %a, <4 x i32> %b)  {
429 ;CHECK:  orn {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
430   %tmp1 = xor <4 x i32> %b, < i32 -1, i32 -1, i32 -1, i32 -1>
431   %tmp2 = or <4 x i32> %a, %tmp1
432   ret <4 x i32> %tmp2
433 }
434
435 define <8 x i16> @orn8xi16(<8 x i16> %a, <8 x i16> %b)  {
436 ;CHECK:  orn {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
437   %tmp1 = xor <8 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1, i16 -1, i16 -1, i16 -1, i16 -1 >
438   %tmp2 = or <8 x i16> %a, %tmp1
439   ret <8 x i16> %tmp2
440 }
441
442 define <2 x i64> @orn2xi64(<2 x i64> %a, <2 x i64> %b)  {
443 ;CHECK:  orn {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
444   %tmp1 = xor <2 x i64> %b, < i64 -1, i64 -1>
445   %tmp2 = or <2 x i64> %a, %tmp1
446   ret <2 x i64> %tmp2
447 }
448 define <2 x i32> @bsl2xi32_const(<2 x i32> %a, <2 x i32> %b)  {
449 ;CHECK:  bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
450         %tmp1 = and <2 x i32> %a, < i32 -1, i32 -1 >
451         %tmp2 = and <2 x i32> %b, < i32 0, i32 0 >
452         %tmp3 = or <2 x i32> %tmp1, %tmp2
453         ret <2 x i32> %tmp3
454 }
455
456
457 define <4 x i16> @bsl4xi16_const(<4 x i16> %a, <4 x i16> %b)  {
458 ;CHECK:  bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
459         %tmp1 = and <4 x i16> %a, < i16 -1, i16 -1, i16 -1,i16 -1 >
460         %tmp2 = and <4 x i16> %b, < i16 0, i16 0,i16 0, i16 0 >
461         %tmp3 = or <4 x i16> %tmp1, %tmp2
462         ret <4 x i16> %tmp3
463 }
464
465 define <1 x i64> @bsl1xi64_const(<1 x i64> %a, <1 x i64> %b)  {
466 ;CHECK:  bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
467         %tmp1 = and <1 x i64> %a, < i64 -1 >
468         %tmp2 = and <1 x i64> %b, < i64 0 >
469         %tmp3 = or <1 x i64> %tmp1, %tmp2
470         ret <1 x i64> %tmp3
471 }
472
473 define <4 x i32> @bsl4xi32_const(<4 x i32> %a, <4 x i32> %b)  {
474 ;CHECK:  bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
475         %tmp1 = and <4 x i32> %a, < i32 -1, i32 -1, i32 -1, i32 -1 >
476         %tmp2 = and <4 x i32> %b, < i32 0, i32 0, i32 0, i32 0 >
477         %tmp3 = or <4 x i32> %tmp1, %tmp2
478         ret <4 x i32> %tmp3
479 }
480
481 define <8 x i16> @bsl8xi16_const(<8 x i16> %a, <8 x i16> %b)  {
482 ;CHECK:  bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
483         %tmp1 = and <8 x i16> %a, < i16 -1, i16 -1, i16 -1,i16 -1, i16 -1, i16 -1, i16 -1,i16 -1 >
484         %tmp2 = and <8 x i16> %b, < i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0 >
485         %tmp3 = or <8 x i16> %tmp1, %tmp2
486         ret <8 x i16> %tmp3
487 }
488
489 define <2 x i64> @bsl2xi64_const(<2 x i64> %a, <2 x i64> %b)  {
490 ;CHECK:  bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
491         %tmp1 = and <2 x i64> %a, < i64 -1, i64 -1 >
492         %tmp2 = and <2 x i64> %b, < i64 0, i64 0 >
493         %tmp3 = or <2 x i64> %tmp1, %tmp2
494         ret <2 x i64> %tmp3
495 }
496
497
498 define <8 x i8> @bsl8xi8(<8 x i8> %v1, <8 x i8> %v2, <8 x i8> %v3) {
499 ;CHECK:  bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
500   %1 = and <8 x i8> %v1, %v2
501   %2 = xor <8 x i8> %v1, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
502   %3 = and <8 x i8> %2, %v3
503   %4 = or <8 x i8> %1, %3
504   ret <8 x i8> %4
505 }
506
507 define <4 x i16> @bsl4xi16(<4 x i16> %v1, <4 x i16> %v2, <4 x i16> %v3) {
508 ;CHECK:  bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
509   %1 = and <4 x i16> %v1, %v2
510   %2 = xor <4 x i16> %v1, <i16 -1, i16 -1, i16 -1, i16 -1>
511   %3 = and <4 x i16> %2, %v3
512   %4 = or <4 x i16> %1, %3
513   ret <4 x i16> %4
514 }
515
516 define <2 x i32> @bsl2xi32(<2 x i32> %v1, <2 x i32> %v2, <2 x i32> %v3) {
517 ;CHECK:  bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
518   %1 = and <2 x i32> %v1, %v2
519   %2 = xor <2 x i32> %v1, <i32 -1, i32 -1>
520   %3 = and <2 x i32> %2, %v3
521   %4 = or <2 x i32> %1, %3
522   ret <2 x i32> %4
523 }
524
525 define <1 x i64> @bsl1xi64(<1 x i64> %v1, <1 x i64> %v2, <1 x i64> %v3) {
526 ;CHECK:  bsl {{v[0-31]+}}.8b, {{v[0-31]+}}.8b, {{v[0-31]+}}.8b
527   %1 = and <1 x i64> %v1, %v2
528   %2 = xor <1 x i64> %v1, <i64 -1>
529   %3 = and <1 x i64> %2, %v3
530   %4 = or <1 x i64> %1, %3
531   ret <1 x i64> %4
532 }
533
534 define <16 x i8> @bsl16xi8(<16 x i8> %v1, <16 x i8> %v2, <16 x i8> %v3) {
535 ;CHECK:  bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
536   %1 = and <16 x i8> %v1, %v2
537   %2 = xor <16 x i8> %v1, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
538   %3 = and <16 x i8> %2, %v3
539   %4 = or <16 x i8> %1, %3
540   ret <16 x i8> %4
541 }
542
543 define <8 x i16> @bsl8xi16(<8 x i16> %v1, <8 x i16> %v2, <8 x i16> %v3) {
544 ;CHECK:  bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
545   %1 = and <8 x i16> %v1, %v2
546   %2 = xor <8 x i16> %v1, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
547   %3 = and <8 x i16> %2, %v3
548   %4 = or <8 x i16> %1, %3
549   ret <8 x i16> %4
550 }
551
552 define <4 x i32> @bsl4xi32(<4 x i32> %v1, <4 x i32> %v2, <4 x i32> %v3) {
553 ;CHECK:  bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
554   %1 = and <4 x i32> %v1, %v2
555   %2 = xor <4 x i32> %v1, <i32 -1, i32 -1, i32 -1, i32 -1>
556   %3 = and <4 x i32> %2, %v3
557   %4 = or <4 x i32> %1, %3
558   ret <4 x i32> %4
559 }
560
561 define <2 x i64> @bsl2xi64(<2 x i64> %v1, <2 x i64> %v2, <2 x i64> %v3) {
562 ;CHECK:  bsl {{v[0-31]+}}.16b, {{v[0-31]+}}.16b, {{v[0-31]+}}.16b
563   %1 = and <2 x i64> %v1, %v2
564   %2 = xor <2 x i64> %v1, <i64 -1, i64 -1>
565   %3 = and <2 x i64> %2, %v3
566   %4 = or <2 x i64> %1, %3
567   ret <2 x i64> %4
568 }
569
570 define <8 x i8> @orrimm8b_as_orrimm4h_lsl0(<8 x i8> %a) {
571 ;CHECK:  orr {{v[0-31]+}}.4h, #0xff
572   %val = or <8 x i8> %a, <i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0>
573   ret <8 x i8> %val
574 }
575
576 define <8 x i8> @orrimm8b_as_orimm4h_lsl8(<8 x i8> %a) {
577 ;CHECK:  orr {{v[0-31]+}}.4h, #0xff, lsl #8
578   %val = or <8 x i8> %a, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255>
579   ret <8 x i8> %val
580 }
581
582 define <16 x i8> @orimm16b_as_orrimm8h_lsl0(<16 x i8> %a) {
583 ;CHECK:  orr {{v[0-31]+}}.8h, #0xff
584   %val = or <16 x i8> %a, <i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0>
585   ret <16 x i8> %val
586 }
587
588 define <16 x i8> @orimm16b_as_orrimm8h_lsl8(<16 x i8> %a) {
589 ;CHECK:  orr {{v[0-31]+}}.8h, #0xff, lsl #8
590   %val = or <16 x i8> %a, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255>
591   ret <16 x i8> %val
592 }
593
594