Teach the DAGCombiner how to fold 'vselect' dag nodes according
[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 define <8 x i8> @and8xi8(<8 x i8> %a, <8 x i8> %b) {
4 ;CHECK: and {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
5         %tmp1 = and <8 x i8> %a, %b;
6         ret <8 x i8> %tmp1
7 }
8
9 define <16 x i8> @and16xi8(<16 x i8> %a, <16 x i8> %b) {
10 ;CHECK: and {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
11         %tmp1 = and <16 x i8> %a, %b;
12         ret <16 x i8> %tmp1
13 }
14
15
16 define <8 x i8> @orr8xi8(<8 x i8> %a, <8 x i8> %b) {
17 ;CHECK: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
18         %tmp1 = or <8 x i8> %a, %b;
19         ret <8 x i8> %tmp1
20 }
21
22 define <16 x i8> @orr16xi8(<16 x i8> %a, <16 x i8> %b) {
23 ;CHECK: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
24         %tmp1 = or <16 x i8> %a, %b;
25         ret <16 x i8> %tmp1
26 }
27
28
29 define <8 x i8> @xor8xi8(<8 x i8> %a, <8 x i8> %b) {
30 ;CHECK: eor {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
31         %tmp1 = xor <8 x i8> %a, %b;
32         ret <8 x i8> %tmp1
33 }
34
35 define <16 x i8> @xor16xi8(<16 x i8> %a, <16 x i8> %b) {
36 ;CHECK: eor {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
37         %tmp1 = xor <16 x i8> %a, %b;
38         ret <16 x i8> %tmp1
39 }
40
41 define <8 x i8> @bsl8xi8_const(<8 x i8> %a, <8 x i8> %b)  {
42 ;CHECK:  bsl {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
43         %tmp1 = and <8 x i8> %a, < i8 -1, i8 -1, i8 0, i8 0, i8 -1, i8 -1, i8 0, i8 0 >
44         %tmp2 = and <8 x i8> %b, < i8 0, i8 0, i8 -1, i8 -1, i8 0, i8 0, i8 -1, i8 -1 >
45         %tmp3 = or <8 x i8> %tmp1, %tmp2
46         ret <8 x i8> %tmp3
47 }
48
49 define <16 x i8> @bsl16xi8_const(<16 x i8> %a, <16 x i8> %b) {
50 ;CHECK: bsl {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
51         %tmp1 = and <16 x i8> %a, < i8 -1, i8 -1, i8 -1, i8 -1, i8 0, i8 0, i8 0, i8 0, i8 -1, i8 -1, i8 -1, i8 -1, i8 0, i8 0, i8 0, i8 0 >
52         %tmp2 = and <16 x i8> %b, < i8 0, i8 0, i8 0, i8 0, i8 -1, i8 -1, i8 -1, i8 -1, i8 0, i8 0, i8 0, i8 0, i8 -1, i8 -1, i8 -1, i8 -1 >
53         %tmp3 = or <16 x i8> %tmp1, %tmp2
54         ret <16 x i8> %tmp3
55 }
56
57 define <8 x i8> @orn8xi8(<8 x i8> %a, <8 x i8> %b)  {
58 ;CHECK:  orn {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
59   %tmp1 = xor <8 x i8> %b, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
60   %tmp2 = or <8 x i8> %a, %tmp1
61   ret <8 x i8> %tmp2
62 }
63
64 define <16 x i8> @orn16xi8(<16 x i8> %a, <16 x i8> %b) {
65 ;CHECK:  orn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
66   %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 >
67   %tmp2 = or <16 x i8> %a, %tmp1
68   ret <16 x i8> %tmp2
69 }
70
71 define <8 x i8> @bic8xi8(<8 x i8> %a, <8 x i8> %b)  {
72 ;CHECK:  bic {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
73   %tmp1 = xor <8 x i8> %b, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
74   %tmp2 = and <8 x i8> %a, %tmp1
75   ret <8 x i8> %tmp2
76 }
77
78 define <16 x i8> @bic16xi8(<16 x i8> %a, <16 x i8> %b) {
79 ;CHECK:  bic {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
80   %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 >
81   %tmp2 = and <16 x i8> %a, %tmp1
82   ret <16 x i8> %tmp2
83 }
84
85 define <2 x i32> @orrimm2s_lsl0(<2 x i32> %a) {
86 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff
87         %tmp1 = or <2 x i32> %a, < i32 255, i32 255>
88         ret <2 x i32> %tmp1
89 }
90
91 define <2 x i32> @orrimm2s_lsl8(<2 x i32> %a) {
92 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #8
93         %tmp1 = or <2 x i32> %a, < i32 65280, i32 65280>
94         ret <2 x i32> %tmp1
95 }
96
97 define <2 x i32> @orrimm2s_lsl16(<2 x i32> %a) {
98 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #16
99         %tmp1 = or <2 x i32> %a, < i32 16711680, i32 16711680>
100         ret <2 x i32> %tmp1
101 }
102
103 define <2 x i32> @orrimm2s_lsl24(<2 x i32> %a) {
104 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #24
105         %tmp1 = or <2 x i32> %a, < i32 4278190080, i32 4278190080>
106         ret <2 x i32> %tmp1
107 }
108
109 define <4 x i32> @orrimm4s_lsl0(<4 x i32> %a) {
110 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff
111         %tmp1 = or <4 x i32> %a, < i32 255, i32 255, i32 255, i32 255>
112         ret <4 x i32> %tmp1
113 }
114
115 define <4 x i32> @orrimm4s_lsl8(<4 x i32> %a) {
116 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #8
117         %tmp1 = or <4 x i32> %a, < i32 65280, i32 65280, i32 65280, i32 65280>
118         ret <4 x i32> %tmp1
119 }
120
121 define <4 x i32> @orrimm4s_lsl16(<4 x i32> %a) {
122 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #16
123         %tmp1 = or <4 x i32> %a, < i32 16711680, i32 16711680, i32 16711680, i32 16711680>
124         ret <4 x i32> %tmp1
125 }
126
127 define <4 x i32> @orrimm4s_lsl24(<4 x i32> %a) {
128 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #24
129         %tmp1 = or <4 x i32> %a, < i32 4278190080, i32 4278190080, i32 4278190080, i32 4278190080>
130         ret <4 x i32> %tmp1
131 }
132
133 define <4 x i16> @orrimm4h_lsl0(<4 x i16> %a) {
134 ;CHECK:  orr {{v[0-9]+}}.4h, #0xff
135         %tmp1 = or <4 x i16> %a, < i16 255, i16 255, i16 255, i16 255 >
136         ret <4 x i16> %tmp1
137 }
138
139 define <4 x i16> @orrimm4h_lsl8(<4 x i16> %a) {
140 ;CHECK:  orr {{v[0-9]+}}.4h, #0xff, lsl #8
141         %tmp1 = or <4 x i16> %a, < i16 65280, i16 65280, i16 65280, i16 65280 >
142         ret <4 x i16> %tmp1
143 }
144
145 define <8 x i16> @orrimm8h_lsl0(<8 x i16> %a) {
146 ;CHECK:  orr {{v[0-9]+}}.8h, #0xff
147         %tmp1 = or <8 x i16> %a, < i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255 >
148         ret <8 x i16> %tmp1
149 }
150
151 define <8 x i16> @orrimm8h_lsl8(<8 x i16> %a) {
152 ;CHECK:  orr {{v[0-9]+}}.8h, #0xff, lsl #8
153         %tmp1 = or <8 x i16> %a, < i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280, i16 65280 >
154         ret <8 x i16> %tmp1
155 }
156
157 define <2 x i32> @bicimm2s_lsl0(<2 x i32> %a) {
158 ;CHECK:  bic {{v[0-9]+}}.2s, #0x10
159         %tmp1 = and <2 x i32> %a, < i32 4294967279, i32 4294967279 >
160         ret <2 x i32> %tmp1
161 }
162
163 define <2 x i32> @bicimm2s_lsl8(<2 x i32> %a) {
164 ;CHECK:  bic {{v[0-9]+}}.2s, #0x10, lsl #8
165         %tmp1 = and <2 x i32> %a, < i32 4294963199, i32  4294963199 >
166         ret <2 x i32> %tmp1
167 }
168
169 define <2 x i32> @bicimm2s_lsl16(<2 x i32> %a) {
170 ;CHECK:  bic {{v[0-9]+}}.2s, #0x10, lsl #16
171         %tmp1 = and <2 x i32> %a, < i32 4293918719, i32 4293918719 >
172         ret <2 x i32> %tmp1
173 }
174
175 define <2 x i32> @bicimm2s_lsl124(<2 x i32> %a) {
176 ;CHECK:  bic {{v[0-9]+}}.2s, #0x10, lsl #24
177         %tmp1 = and <2 x i32> %a, < i32 4026531839, i32  4026531839>
178         ret <2 x i32> %tmp1
179 }
180
181 define <4 x i32> @bicimm4s_lsl0(<4 x i32> %a) {
182 ;CHECK:  bic {{v[0-9]+}}.4s, #0x10
183         %tmp1 = and <4 x i32> %a, < i32 4294967279, i32 4294967279, i32 4294967279, i32 4294967279 >
184         ret <4 x i32> %tmp1
185 }
186
187 define <4 x i32> @bicimm4s_lsl8(<4 x i32> %a) {
188 ;CHECK:  bic {{v[0-9]+}}.4s, #0x10, lsl #8
189         %tmp1 = and <4 x i32> %a, < i32 4294963199, i32  4294963199, i32  4294963199, i32  4294963199 >
190         ret <4 x i32> %tmp1
191 }
192
193 define <4 x i32> @bicimm4s_lsl16(<4 x i32> %a) {
194 ;CHECK:  bic {{v[0-9]+}}.4s, #0x10, lsl #16
195         %tmp1 = and <4 x i32> %a, < i32 4293918719, i32 4293918719, i32 4293918719, i32 4293918719 >
196         ret <4 x i32> %tmp1
197 }
198
199 define <4 x i32> @bicimm4s_lsl124(<4 x i32> %a) {
200 ;CHECK:  bic {{v[0-9]+}}.4s, #0x10, lsl #24
201         %tmp1 = and <4 x i32> %a, < i32 4026531839, i32  4026531839, i32  4026531839, i32  4026531839>
202         ret <4 x i32> %tmp1
203 }
204
205 define <4 x i16> @bicimm4h_lsl0_a(<4 x i16> %a) {
206 ;CHECK:  bic {{v[0-9]+}}.4h, #0x10
207         %tmp1 = and <4 x i16> %a, < i16 4294967279, i16  4294967279, i16  4294967279, i16  4294967279 >
208         ret <4 x i16> %tmp1
209 }
210
211 define <4 x i16> @bicimm4h_lsl0_b(<4 x i16> %a) {
212 ;CHECK:  bic {{v[0-9]+}}.4h, #0xff
213         %tmp1 = and <4 x i16> %a, < i16 65280, i16  65280, i16  65280, i16 65280 >
214         ret <4 x i16> %tmp1
215 }
216
217 define <4 x i16> @bicimm4h_lsl8_a(<4 x i16> %a) {
218 ;CHECK:  bic {{v[0-9]+}}.4h, #0x10, lsl #8
219         %tmp1 = and <4 x i16> %a, < i16 4294963199, i16  4294963199, i16  4294963199, i16  4294963199>
220         ret <4 x i16> %tmp1
221 }
222
223 define <4 x i16> @bicimm4h_lsl8_b(<4 x i16> %a) {
224 ;CHECK:  bic {{v[0-9]+}}.4h, #0xff, lsl #8
225         %tmp1 = and <4 x i16> %a, < i16 255, i16 255, i16 255, i16 255>
226         ret <4 x i16> %tmp1
227 }
228
229 define <8 x i16> @bicimm8h_lsl0_a(<8 x i16> %a) {
230 ;CHECK:  bic {{v[0-9]+}}.8h, #0x10
231         %tmp1 = and <8 x i16> %a, < i16 4294967279, i16  4294967279, i16  4294967279, i16  4294967279,
232    i16  4294967279, i16  4294967279, i16  4294967279, i16  4294967279 >
233         ret <8 x i16> %tmp1
234 }
235
236 define <8 x i16> @bicimm8h_lsl0_b(<8 x i16> %a) {
237 ;CHECK:  bic {{v[0-9]+}}.8h, #0xff
238         %tmp1 = and <8 x i16> %a, < i16 65280, i16  65280, i16  65280, i16 65280, i16 65280, i16  65280, i16  65280, i16 65280 >
239         ret <8 x i16> %tmp1
240 }
241
242 define <8 x i16> @bicimm8h_lsl8_a(<8 x i16> %a) {
243 ;CHECK:  bic {{v[0-9]+}}.8h, #0x10, lsl #8
244         %tmp1 = and <8 x i16> %a, < i16 4294963199, i16  4294963199, i16  4294963199, i16  4294963199,
245    i16  4294963199, i16  4294963199, i16  4294963199, i16  4294963199>
246         ret <8 x i16> %tmp1
247 }
248
249 define <8 x i16> @bicimm8h_lsl8_b(<8 x i16> %a) {
250 ;CHECK:  bic {{v[0-9]+}}.8h, #0xff, lsl #8
251         %tmp1 = and <8 x i16> %a, < i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
252         ret <8 x i16> %tmp1
253 }
254
255 define <2 x i32> @and2xi32(<2 x i32> %a, <2 x i32> %b) {
256 ;CHECK: and {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
257         %tmp1 = and <2 x i32> %a, %b;
258         ret <2 x i32> %tmp1
259 }
260
261 define <4 x i16> @and4xi16(<4 x i16> %a, <4 x i16> %b) {
262 ;CHECK: and {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
263         %tmp1 = and <4 x i16> %a, %b;
264         ret <4 x i16> %tmp1
265 }
266
267 define <1 x i64> @and1xi64(<1 x i64> %a, <1 x i64> %b) {
268 ;CHECK: and {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
269         %tmp1 = and <1 x i64> %a, %b;
270         ret <1 x i64> %tmp1
271 }
272
273 define <4 x i32> @and4xi32(<4 x i32> %a, <4 x i32> %b) {
274 ;CHECK: and {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
275         %tmp1 = and <4 x i32> %a, %b;
276         ret <4 x i32> %tmp1
277 }
278
279 define <8 x i16> @and8xi16(<8 x i16> %a, <8 x i16> %b) {
280 ;CHECK: and {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
281         %tmp1 = and <8 x i16> %a, %b;
282         ret <8 x i16> %tmp1
283 }
284
285 define <2 x i64> @and2xi64(<2 x i64> %a, <2 x i64> %b) {
286 ;CHECK: and {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
287         %tmp1 = and <2 x i64> %a, %b;
288         ret <2 x i64> %tmp1
289 }
290
291 define <2 x i32> @orr2xi32(<2 x i32> %a, <2 x i32> %b) {
292 ;CHECK: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
293         %tmp1 = or <2 x i32> %a, %b;
294         ret <2 x i32> %tmp1
295 }
296
297 define <4 x i16> @orr4xi16(<4 x i16> %a, <4 x i16> %b) {
298 ;CHECK: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
299         %tmp1 = or <4 x i16> %a, %b;
300         ret <4 x i16> %tmp1
301 }
302
303 define <1 x i64> @orr1xi64(<1 x i64> %a, <1 x i64> %b) {
304 ;CHECK: orr {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
305         %tmp1 = or <1 x i64> %a, %b;
306         ret <1 x i64> %tmp1
307 }
308
309 define <4 x i32> @orr4xi32(<4 x i32> %a, <4 x i32> %b) {
310 ;CHECK: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
311         %tmp1 = or <4 x i32> %a, %b;
312         ret <4 x i32> %tmp1
313 }
314
315 define <8 x i16> @orr8xi16(<8 x i16> %a, <8 x i16> %b) {
316 ;CHECK: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
317         %tmp1 = or <8 x i16> %a, %b;
318         ret <8 x i16> %tmp1
319 }
320
321 define <2 x i64> @orr2xi64(<2 x i64> %a, <2 x i64> %b) {
322 ;CHECK: orr {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
323         %tmp1 = or <2 x i64> %a, %b;
324         ret <2 x i64> %tmp1
325 }
326
327 define <2 x i32> @eor2xi32(<2 x i32> %a, <2 x i32> %b) {
328 ;CHECK: eor {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
329         %tmp1 = xor <2 x i32> %a, %b;
330         ret <2 x i32> %tmp1
331 }
332
333 define <4 x i16> @eor4xi16(<4 x i16> %a, <4 x i16> %b) {
334 ;CHECK: eor {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
335         %tmp1 = xor <4 x i16> %a, %b;
336         ret <4 x i16> %tmp1
337 }
338
339 define <1 x i64> @eor1xi64(<1 x i64> %a, <1 x i64> %b) {
340 ;CHECK: eor {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
341         %tmp1 = xor <1 x i64> %a, %b;
342         ret <1 x i64> %tmp1
343 }
344
345 define <4 x i32> @eor4xi32(<4 x i32> %a, <4 x i32> %b) {
346 ;CHECK: eor {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
347         %tmp1 = xor <4 x i32> %a, %b;
348         ret <4 x i32> %tmp1
349 }
350
351 define <8 x i16> @eor8xi16(<8 x i16> %a, <8 x i16> %b) {
352 ;CHECK: eor {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
353         %tmp1 = xor <8 x i16> %a, %b;
354         ret <8 x i16> %tmp1
355 }
356
357 define <2 x i64> @eor2xi64(<2 x i64> %a, <2 x i64> %b) {
358 ;CHECK: eor {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
359         %tmp1 = xor <2 x i64> %a, %b;
360         ret <2 x i64> %tmp1
361 }
362
363
364 define <2 x i32> @bic2xi32(<2 x i32> %a, <2 x i32> %b)  {
365 ;CHECK:  bic {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
366   %tmp1 = xor <2 x i32> %b, < i32 -1, i32 -1 >
367   %tmp2 = and <2 x i32> %a, %tmp1
368   ret <2 x i32> %tmp2
369 }
370
371 define <4 x i16> @bic4xi16(<4 x i16> %a, <4 x i16> %b)  {
372 ;CHECK:  bic {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
373   %tmp1 = xor <4 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1 >
374   %tmp2 = and <4 x i16> %a, %tmp1
375   ret <4 x i16> %tmp2
376 }
377
378 define <1 x i64> @bic1xi64(<1 x i64> %a, <1 x i64> %b)  {
379 ;CHECK:  bic {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
380   %tmp1 = xor <1 x i64> %b, < i64 -1>
381   %tmp2 = and <1 x i64> %a, %tmp1
382   ret <1 x i64> %tmp2
383 }
384
385 define <4 x i32> @bic4xi32(<4 x i32> %a, <4 x i32> %b)  {
386 ;CHECK:  bic {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
387   %tmp1 = xor <4 x i32> %b, < i32 -1, i32 -1, i32 -1, i32 -1>
388   %tmp2 = and <4 x i32> %a, %tmp1
389   ret <4 x i32> %tmp2
390 }
391
392 define <8 x i16> @bic8xi16(<8 x i16> %a, <8 x i16> %b)  {
393 ;CHECK:  bic {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
394   %tmp1 = xor <8 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1, i16 -1, i16 -1, i16 -1, i16 -1 >
395   %tmp2 = and <8 x i16> %a, %tmp1
396   ret <8 x i16> %tmp2
397 }
398
399 define <2 x i64> @bic2xi64(<2 x i64> %a, <2 x i64> %b)  {
400 ;CHECK:  bic {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
401   %tmp1 = xor <2 x i64> %b, < i64 -1, i64 -1>
402   %tmp2 = and <2 x i64> %a, %tmp1
403   ret <2 x i64> %tmp2
404 }
405
406 define <2 x i32> @orn2xi32(<2 x i32> %a, <2 x i32> %b)  {
407 ;CHECK:  orn {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
408   %tmp1 = xor <2 x i32> %b, < i32 -1, i32 -1 >
409   %tmp2 = or <2 x i32> %a, %tmp1
410   ret <2 x i32> %tmp2
411 }
412
413 define <4 x i16> @orn4xi16(<4 x i16> %a, <4 x i16> %b)  {
414 ;CHECK:  orn {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
415   %tmp1 = xor <4 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1 >
416   %tmp2 = or <4 x i16> %a, %tmp1
417   ret <4 x i16> %tmp2
418 }
419
420 define <1 x i64> @orn1xi64(<1 x i64> %a, <1 x i64> %b)  {
421 ;CHECK:  orn {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
422   %tmp1 = xor <1 x i64> %b, < i64 -1>
423   %tmp2 = or <1 x i64> %a, %tmp1
424   ret <1 x i64> %tmp2
425 }
426
427 define <4 x i32> @orn4xi32(<4 x i32> %a, <4 x i32> %b)  {
428 ;CHECK:  orn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
429   %tmp1 = xor <4 x i32> %b, < i32 -1, i32 -1, i32 -1, i32 -1>
430   %tmp2 = or <4 x i32> %a, %tmp1
431   ret <4 x i32> %tmp2
432 }
433
434 define <8 x i16> @orn8xi16(<8 x i16> %a, <8 x i16> %b)  {
435 ;CHECK:  orn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
436   %tmp1 = xor <8 x i16> %b, < i16 -1, i16 -1, i16 -1, i16-1, i16 -1, i16 -1, i16 -1, i16 -1 >
437   %tmp2 = or <8 x i16> %a, %tmp1
438   ret <8 x i16> %tmp2
439 }
440
441 define <2 x i64> @orn2xi64(<2 x i64> %a, <2 x i64> %b)  {
442 ;CHECK:  orn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
443   %tmp1 = xor <2 x i64> %b, < i64 -1, i64 -1>
444   %tmp2 = or <2 x i64> %a, %tmp1
445   ret <2 x i64> %tmp2
446 }
447
448 define <2 x i32> @bsl2xi32_const(<2 x i32> %a, <2 x i32> %b)  {
449 ;CHECK:  bsl {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
450         %tmp1 = and <2 x i32> %a, < i32 -1, i32 0 >
451         %tmp2 = and <2 x i32> %b, < i32 0, i32 -1 >
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-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
459         %tmp1 = and <4 x i16> %a, < i16 -1, i16 0, i16 -1,i16 0 >
460         %tmp2 = and <4 x i16> %b, < i16 0, i16 -1,i16 0, i16 -1 >
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-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
467         %tmp1 = and <1 x i64> %a, < i64 -16 >
468         %tmp2 = and <1 x i64> %b, < i64 15 >
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-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
475         %tmp1 = and <4 x i32> %a, < i32 -1, i32 0, i32 -1, i32 0 >
476         %tmp2 = and <4 x i32> %b, < i32 0, i32 -1, i32 0, i32 -1 >
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-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
483         %tmp1 = and <8 x i16> %a, < i16 -1, i16 -1, i16 0,i16 0, i16 -1, i16 -1, i16 0,i16 0 >
484         %tmp2 = and <8 x i16> %b, < i16 0, i16 0, i16 -1, i16 -1, i16 0, i16 0, i16 -1, i16 -1 >
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-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
491         %tmp1 = and <2 x i64> %a, < i64 -1, i64 0 >
492         %tmp2 = and <2 x i64> %b, < i64 0, i64 -1 >
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-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.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-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.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-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.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-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.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-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.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-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.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-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.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 <8 x i8> @vselect_v8i8(<8 x i8> %a) {
562 ;CHECK:  movi    {{d[0-9]+}}, #0xffff
563 ;CHECK-NEXT:  bsl {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
564   %b = select <8 x i1> <i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false>, <8 x i8> %a, <8 x i8> <i8 undef, i8 undef, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>
565   ret <8 x i8> %b
566 }
567
568 define <4 x i16> @vselect_v4i16(<4 x i16> %a) {
569 ;CHECK:  movi    {{d[0-9]+}}, #0xffff
570 ;CHECK-NEXT:  bsl {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
571   %b = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x i16> %a, <4 x i16> <i16 undef, i16 0, i16 0, i16 0>
572   ret <4 x i16> %b
573 }
574
575 define <8 x i8> @vselect_cmp_ne(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) {
576 ;CHECK:  cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
577 ;CHECK-NEXT:  not {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
578 ;CHECK-NEXT:  bsl {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
579   %cmp = icmp ne <8 x i8> %a, %b
580   %d = select <8 x i1> %cmp, <8 x i8> %b, <8 x i8> %c
581   ret <8 x i8> %d
582 }
583
584 define <8 x i8> @vselect_cmp_eq(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) {
585 ;CHECK:  cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
586 ;CHECK-NEXT:  bsl {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
587   %cmp = icmp eq <8 x i8> %a, %b
588   %d = select <8 x i1> %cmp, <8 x i8> %b, <8 x i8> %c
589   ret <8 x i8> %d
590 }
591
592 define <8 x i8> @vselect_cmpz_ne(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) {
593 ;CHECK:  cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #0
594 ;CHECK-NEXT:  not {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
595 ;CHECK-NEXT:  bsl {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
596   %cmp = icmp ne <8 x i8> %a, zeroinitializer
597   %d = select <8 x i1> %cmp, <8 x i8> %b, <8 x i8> %c
598   ret <8 x i8> %d
599 }
600
601 define <8 x i8> @vselect_cmpz_eq(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) {
602 ;CHECK:  cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #0
603 ;CHECK-NEXT:  bsl {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
604   %cmp = icmp eq <8 x i8> %a, zeroinitializer
605   %d = select <8 x i1> %cmp, <8 x i8> %b, <8 x i8> %c
606   ret <8 x i8> %d
607 }
608
609 define <8 x i8> @vselect_tst(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) {
610 ;CHECK:  cmtst {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
611 ;CHECK-NEXT:  bsl {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b
612         %tmp3 = and <8 x i8> %a, %b
613         %tmp4 = icmp ne <8 x i8> %tmp3, zeroinitializer
614   %d = select <8 x i1> %tmp4, <8 x i8> %b, <8 x i8> %c
615   ret <8 x i8> %d
616 }
617
618 define <2 x i64> @bsl2xi64(<2 x i64> %v1, <2 x i64> %v2, <2 x i64> %v3) {
619 ;CHECK:  bsl {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b
620   %1 = and <2 x i64> %v1, %v2
621   %2 = xor <2 x i64> %v1, <i64 -1, i64 -1>
622   %3 = and <2 x i64> %2, %v3
623   %4 = or <2 x i64> %1, %3
624   ret <2 x i64> %4
625 }
626
627 define <8 x i8> @orrimm8b_as_orrimm4h_lsl0(<8 x i8> %a) {
628 ;CHECK:  orr {{v[0-9]+}}.4h, #0xff
629   %val = or <8 x i8> %a, <i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0>
630   ret <8 x i8> %val
631 }
632
633 define <8 x i8> @orrimm8b_as_orimm4h_lsl8(<8 x i8> %a) {
634 ;CHECK:  orr {{v[0-9]+}}.4h, #0xff, lsl #8
635   %val = or <8 x i8> %a, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255>
636   ret <8 x i8> %val
637 }
638
639 define <16 x i8> @orimm16b_as_orrimm8h_lsl0(<16 x i8> %a) {
640 ;CHECK:  orr {{v[0-9]+}}.8h, #0xff
641   %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>
642   ret <16 x i8> %val
643 }
644
645 define <16 x i8> @orimm16b_as_orrimm8h_lsl8(<16 x i8> %a) {
646 ;CHECK:  orr {{v[0-9]+}}.8h, #0xff, lsl #8
647   %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>
648   ret <16 x i8> %val
649 }
650
651 define <8 x i8> @and8imm2s_lsl0(<8 x i8> %a) {
652 ;CHECK:  bic {{v[0-9]+}}.2s, #0xff
653         %tmp1 = and <8 x i8> %a, < i8 0, i8 255, i8 255, i8 255, i8 0, i8 255, i8 255, i8 255>
654         ret <8 x i8> %tmp1
655 }
656
657 define <8 x i8> @and8imm2s_lsl8(<8 x i8> %a) {
658 ;CHECK:  bic {{v[0-9]+}}.2s, #0xff, lsl #8
659         %tmp1 = and <8 x i8> %a, < i8 255, i8 0, i8 255, i8 255, i8 255, i8 0, i8 255, i8 255>
660         ret <8 x i8> %tmp1
661 }
662
663 define <8 x i8> @and8imm2s_lsl16(<8 x i8> %a) {
664 ;CHECK:  bic {{v[0-9]+}}.2s, #0xff, lsl #16
665         %tmp1 = and <8 x i8> %a, < i8 255, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0, i8 255>
666         ret <8 x i8> %tmp1
667 }
668
669 define <8 x i8> @and8imm2s_lsl24(<8 x i8> %a) {
670 ;CHECK:  bic {{v[0-9]+}}.2s, #0xfe, lsl #24
671         %tmp1 = and <8 x i8> %a, < i8 255, i8 255, i8 255, i8 1, i8 255, i8 255, i8 255, i8 1>
672         ret <8 x i8> %tmp1
673 }
674
675 define <4 x i16> @and16imm2s_lsl0(<4 x i16> %a) {
676 ;CHECK:  bic {{v[0-9]+}}.2s, #0xff
677         %tmp1 = and <4 x i16> %a, < i16 65280, i16 65535, i16 65280, i16 65535>
678         ret <4 x i16> %tmp1
679 }
680
681 define <4 x i16> @and16imm2s_lsl8(<4 x i16> %a) {
682 ;CHECK:  bic {{v[0-9]+}}.2s, #0xff, lsl #8
683         %tmp1 = and <4 x i16> %a, < i16 255, i16 65535, i16 255, i16 65535>
684         ret <4 x i16> %tmp1
685 }
686
687 define <4 x i16> @and16imm2s_lsl16(<4 x i16> %a) {
688 ;CHECK:  bic {{v[0-9]+}}.2s, #0xff, lsl #16
689         %tmp1 = and <4 x i16> %a, < i16 65535, i16 65280, i16 65535, i16 65280>
690         ret <4 x i16> %tmp1
691 }
692
693 define <4 x i16> @and16imm2s_lsl24(<4 x i16> %a) {
694 ;CHECK:  bic {{v[0-9]+}}.2s, #0xfe, lsl #24
695         %tmp1 = and <4 x i16> %a, < i16 65535, i16 511, i16 65535, i16 511>
696         ret <4 x i16> %tmp1
697 }
698
699
700 define <1 x i64> @and64imm2s_lsl0(<1 x i64> %a) {
701 ;CHECK:  bic {{v[0-9]+}}.2s, #0xff
702         %tmp1 = and <1 x i64> %a, < i64 -1095216660736>
703         ret <1 x i64> %tmp1
704 }
705
706 define <1 x i64> @and64imm2s_lsl8(<1 x i64> %a) {
707 ;CHECK:  bic {{v[0-9]+}}.2s, #0xff, lsl #8
708         %tmp1 = and <1 x i64> %a, < i64 -280375465148161>
709         ret <1 x i64> %tmp1
710 }
711
712 define <1 x i64> @and64imm2s_lsl16(<1 x i64> %a) {
713 ;CHECK:  bic {{v[0-9]+}}.2s, #0xff, lsl #16
714         %tmp1 = and <1 x i64> %a, < i64 -71776119077928961>
715         ret <1 x i64> %tmp1
716 }
717
718 define <1 x i64> @and64imm2s_lsl24(<1 x i64> %a) {
719 ;CHECK:  bic {{v[0-9]+}}.2s, #0xfe, lsl #24
720         %tmp1 = and <1 x i64> %a, < i64 144115183814443007>
721         ret <1 x i64> %tmp1
722 }
723
724 define <16 x i8> @and8imm4s_lsl0(<16 x i8> %a) {
725 ;CHECK:  bic {{v[0-9]+}}.4s, #0xff
726         %tmp1 = and <16 x i8> %a, < i8 0, i8 255, i8 255, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0, i8 255, i8 255, i8 255>
727         ret <16 x i8> %tmp1
728 }
729
730 define <16 x i8> @and8imm4s_lsl8(<16 x i8> %a) {
731 ;CHECK:  bic {{v[0-9]+}}.4s, #0xff, lsl #8
732         %tmp1 = and <16 x i8> %a, < i8 255, i8 0, i8 255, i8 255, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0, i8 255, i8 255>
733         ret <16 x i8> %tmp1
734 }
735
736 define <16 x i8> @and8imm4s_lsl16(<16 x i8> %a) {
737 ;CHECK:  bic {{v[0-9]+}}.4s, #0xff, lsl #16
738         %tmp1 = and <16 x i8> %a, < i8 255, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0, i8 255, i8 255, i8 255, i8 0, i8 255>
739         ret <16 x i8> %tmp1
740 }
741
742 define <16 x i8> @and8imm4s_lsl24(<16 x i8> %a) {
743 ;CHECK:  bic {{v[0-9]+}}.4s, #0xfe, lsl #24
744         %tmp1 = and <16 x i8> %a, < i8 255, i8 255, i8 255, i8 1, i8 255, i8 255, i8 255, i8 1, i8 255, i8 255, i8 255, i8 1, i8 255, i8 255, i8 255, i8 1>
745         ret <16 x i8> %tmp1
746 }
747
748 define <8 x i16> @and16imm4s_lsl0(<8 x i16> %a) {
749 ;CHECK:  bic {{v[0-9]+}}.4s, #0xff
750         %tmp1 = and <8 x i16> %a, < i16 65280, i16 65535, i16 65280, i16 65535, i16 65280, i16 65535, i16 65280, i16 65535>
751         ret <8 x i16> %tmp1
752 }
753
754 define <8 x i16> @and16imm4s_lsl8(<8 x i16> %a) {
755 ;CHECK:  bic {{v[0-9]+}}.4s, #0xff, lsl #8
756         %tmp1 = and <8 x i16> %a, < i16 255, i16 65535, i16 255, i16 65535, i16 255, i16 65535, i16 255, i16 65535>
757         ret <8 x i16> %tmp1
758 }
759
760 define <8 x i16> @and16imm4s_lsl16(<8 x i16> %a) {
761 ;CHECK:  bic {{v[0-9]+}}.4s, #0xff, lsl #16
762         %tmp1 = and <8 x i16> %a, < i16 65535, i16 65280, i16 65535, i16 65280, i16 65535, i16 65280, i16 65535, i16 65280>
763         ret <8 x i16> %tmp1
764 }
765
766 define <8 x i16> @and16imm4s_lsl24(<8 x i16> %a) {
767 ;CHECK:  bic {{v[0-9]+}}.4s, #0xfe, lsl #24
768         %tmp1 = and <8 x i16> %a, < i16 65535, i16 511, i16 65535, i16 511, i16 65535, i16 511, i16 65535, i16 511>
769         ret <8 x i16> %tmp1
770 }
771
772 define <2 x i64> @and64imm4s_lsl0(<2 x i64> %a) {
773 ;CHECK:  bic {{v[0-9]+}}.4s, #0xff
774         %tmp1 = and <2 x i64> %a, < i64 -1095216660736, i64 -1095216660736>
775         ret <2 x i64> %tmp1
776 }
777
778 define <2 x i64> @and64imm4s_lsl8(<2 x i64> %a) {
779 ;CHECK:  bic {{v[0-9]+}}.4s, #0xff, lsl #8
780         %tmp1 = and <2 x i64> %a, < i64 -280375465148161, i64 -280375465148161>
781         ret <2 x i64> %tmp1
782 }
783
784 define <2 x i64> @and64imm4s_lsl16(<2 x i64> %a) {
785 ;CHECK:  bic {{v[0-9]+}}.4s, #0xff, lsl #16
786         %tmp1 = and <2 x i64> %a, < i64 -71776119077928961, i64 -71776119077928961>
787         ret <2 x i64> %tmp1
788 }
789
790 define <2 x i64> @and64imm4s_lsl24(<2 x i64> %a) {
791 ;CHECK:  bic {{v[0-9]+}}.4s, #0xfe, lsl #24
792         %tmp1 = and <2 x i64> %a, < i64 144115183814443007, i64 144115183814443007>
793         ret <2 x i64> %tmp1
794 }
795
796 define <8 x i8> @and8imm4h_lsl0(<8 x i8> %a) {
797 ;CHECK:  bic {{v[0-9]+}}.4h, #0xff
798         %tmp1 = and <8 x i8> %a, < i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255>
799         ret <8 x i8> %tmp1
800 }
801
802 define <8 x i8> @and8imm4h_lsl8(<8 x i8> %a) {
803 ;CHECK:  bic {{v[0-9]+}}.4h, #0xff, lsl #8
804         %tmp1 = and <8 x i8> %a, < i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0>
805         ret <8 x i8> %tmp1
806 }
807
808 define <2 x i32> @and16imm4h_lsl0(<2 x i32> %a) {
809 ;CHECK:  bic {{v[0-9]+}}.4h, #0xff
810         %tmp1 = and <2 x i32> %a, < i32 4278255360, i32 4278255360>
811         ret <2 x i32> %tmp1
812 }
813
814 define <2 x i32> @and16imm4h_lsl8(<2 x i32> %a) {
815 ;CHECK:  bic {{v[0-9]+}}.4h, #0xff, lsl #8
816         %tmp1 = and <2 x i32> %a, < i32 16711935, i32 16711935>
817         ret <2 x i32> %tmp1
818 }
819
820 define <1 x i64> @and64imm4h_lsl0(<1 x i64> %a) {
821 ;CHECK:  bic {{v[0-9]+}}.4h, #0xff
822         %tmp1 = and <1 x i64> %a, < i64 -71777214294589696>
823         ret <1 x i64> %tmp1
824 }
825
826 define <1 x i64> @and64imm4h_lsl8(<1 x i64> %a) {
827 ;CHECK:  bic {{v[0-9]+}}.4h, #0xff, lsl #8
828         %tmp1 = and <1 x i64> %a, < i64 71777214294589695>
829         ret <1 x i64> %tmp1
830 }
831
832 define <16 x i8> @and8imm8h_lsl0(<16 x i8> %a) {
833 ;CHECK:  bic {{v[0-9]+}}.8h, #0xff
834         %tmp1 = and <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 >
835         ret <16 x i8> %tmp1
836 }
837
838 define <16 x i8> @and8imm8h_lsl8(<16 x i8> %a) {
839 ;CHECK:  bic {{v[0-9]+}}.8h, #0xff, lsl #8
840         %tmp1 = and <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 >
841         ret <16 x i8> %tmp1
842 }
843
844 define <4 x i32> @and16imm8h_lsl0(<4 x i32> %a) {
845 ;CHECK:  bic {{v[0-9]+}}.8h, #0xff
846         %tmp1 = and <4 x i32> %a, < i32 4278255360, i32 4278255360, i32 4278255360, i32 4278255360>
847         ret <4 x i32> %tmp1
848 }
849
850 define <4 x i32> @and16imm8h_lsl8(<4 x i32> %a) {
851 ;CHECK:  bic {{v[0-9]+}}.8h, #0xff, lsl #8
852         %tmp1 = and <4 x i32> %a, < i32 16711935, i32 16711935, i32 16711935, i32 16711935>
853         ret <4 x i32> %tmp1
854 }
855
856 define <2 x i64> @and64imm8h_lsl0(<2 x i64> %a) {
857 ;CHECK:  bic {{v[0-9]+}}.8h, #0xff
858         %tmp1 = and <2 x i64> %a, < i64 -71777214294589696, i64 -71777214294589696>
859         ret <2 x i64> %tmp1
860 }
861
862 define <2 x i64> @and64imm8h_lsl8(<2 x i64> %a) {
863 ;CHECK:  bic {{v[0-9]+}}.8h, #0xff, lsl #8
864         %tmp1 = and <2 x i64> %a, < i64 71777214294589695, i64 71777214294589695>
865         ret <2 x i64> %tmp1
866 }
867
868 define <8 x i8> @orr8imm2s_lsl0(<8 x i8> %a) {
869 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff
870         %tmp1 = or <8 x i8> %a, < i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0>
871         ret <8 x i8> %tmp1
872 }
873
874 define <8 x i8> @orr8imm2s_lsl8(<8 x i8> %a) {
875 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #8
876         %tmp1 = or <8 x i8> %a, < i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0>
877         ret <8 x i8> %tmp1
878 }
879
880 define <8 x i8> @orr8imm2s_lsl16(<8 x i8> %a) {
881 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #16
882         %tmp1 = or <8 x i8> %a, < i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0>
883         ret <8 x i8> %tmp1
884 }
885
886 define <8 x i8> @orr8imm2s_lsl24(<8 x i8> %a) {
887 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #24
888         %tmp1 = or <8 x i8> %a, < i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255>
889         ret <8 x i8> %tmp1
890 }
891
892 define <4 x i16> @orr16imm2s_lsl0(<4 x i16> %a) {
893 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff
894         %tmp1 = or <4 x i16> %a, < i16 255, i16 0, i16 255, i16 0>
895         ret <4 x i16> %tmp1
896 }
897
898 define <4 x i16> @orr16imm2s_lsl8(<4 x i16> %a) {
899 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #8
900         %tmp1 = or <4 x i16> %a, < i16 65280, i16 0, i16 65280, i16 0>
901         ret <4 x i16> %tmp1
902 }
903
904 define <4 x i16> @orr16imm2s_lsl16(<4 x i16> %a) {
905 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #16
906         %tmp1 = or <4 x i16> %a, < i16 0, i16 255, i16 0, i16 255>
907         ret <4 x i16> %tmp1
908 }
909
910 define <4 x i16> @orr16imm2s_lsl24(<4 x i16> %a) {
911 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #24
912         %tmp1 = or <4 x i16> %a, < i16 0, i16 65280, i16 0, i16 65280>
913         ret <4 x i16> %tmp1
914 }
915
916 define <1 x i64> @orr64imm2s_lsl0(<1 x i64> %a) {
917 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff
918         %tmp1 = or <1 x i64> %a, < i64 1095216660735>
919         ret <1 x i64> %tmp1
920 }
921
922 define <1 x i64> @orr64imm2s_lsl8(<1 x i64> %a) {
923 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #8
924         %tmp1 = or <1 x i64> %a, < i64 280375465148160>
925         ret <1 x i64> %tmp1
926 }
927
928 define <1 x i64> @orr64imm2s_lsl16(<1 x i64> %a) {
929 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #16
930         %tmp1 = or <1 x i64> %a, < i64 71776119077928960>
931         ret <1 x i64> %tmp1
932 }
933
934 define <1 x i64> @orr64imm2s_lsl24(<1 x i64> %a) {
935 ;CHECK:  orr {{v[0-9]+}}.2s, #0xff, lsl #24
936         %tmp1 = or <1 x i64> %a, < i64 -72057589759737856>
937         ret <1 x i64> %tmp1
938 }
939
940 define <16 x i8> @orr8imm4s_lsl0(<16 x i8> %a) {
941 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff
942         %tmp1 = or <16 x i8> %a, < i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0>
943         ret <16 x i8> %tmp1
944 }
945
946 define <16 x i8> @orr8imm4s_lsl8(<16 x i8> %a) {
947 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #8
948         %tmp1 = or <16 x i8> %a, < i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0>
949         ret <16 x i8> %tmp1
950 }
951
952 define <16 x i8> @orr8imm4s_lsl16(<16 x i8> %a) {
953 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #16
954         %tmp1 = or <16 x i8> %a, < i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0>
955         ret <16 x i8> %tmp1
956 }
957
958 define <16 x i8> @orr8imm4s_lsl24(<16 x i8> %a) {
959 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #24
960         %tmp1 = or <16 x i8> %a, < i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255, i8 0, i8 0, i8 0, i8 255>
961         ret <16 x i8> %tmp1
962 }
963
964 define <8 x i16> @orr16imm4s_lsl0(<8 x i16> %a) {
965 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff
966         %tmp1 = or <8 x i16> %a, < i16 255, i16 0, i16 255, i16 0, i16 255, i16 0, i16 255, i16 0>
967         ret <8 x i16> %tmp1
968 }
969
970 define <8 x i16> @orr16imm4s_lsl8(<8 x i16> %a) {
971 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #8
972         %tmp1 = or <8 x i16> %a, < i16 65280, i16 0, i16 65280, i16 0, i16 65280, i16 0, i16 65280, i16 0>
973         ret <8 x i16> %tmp1
974 }
975
976 define <8 x i16> @orr16imm4s_lsl16(<8 x i16> %a) {
977 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #16
978         %tmp1 = or <8 x i16> %a, < i16 0, i16 255, i16 0, i16 255, i16 0, i16 255, i16 0, i16 255>
979         ret <8 x i16> %tmp1
980 }
981
982 define <8 x i16> @orr16imm4s_lsl24(<8 x i16> %a) {
983 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #24
984         %tmp1 = or <8 x i16> %a, < i16 0, i16 65280, i16 0, i16 65280, i16 0, i16 65280, i16 0, i16 65280>
985         ret <8 x i16> %tmp1
986 }
987
988 define <2 x i64> @orr64imm4s_lsl0(<2 x i64> %a) {
989 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff
990         %tmp1 = or <2 x i64> %a, < i64 1095216660735, i64 1095216660735>
991         ret <2 x i64> %tmp1
992 }
993
994 define <2 x i64> @orr64imm4s_lsl8(<2 x i64> %a) {
995 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #8
996         %tmp1 = or <2 x i64> %a, < i64 280375465148160, i64 280375465148160>
997         ret <2 x i64> %tmp1
998 }
999
1000 define <2 x i64> @orr64imm4s_lsl16(<2 x i64> %a) {
1001 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #16
1002         %tmp1 = or <2 x i64> %a, < i64 71776119077928960, i64 71776119077928960>
1003         ret <2 x i64> %tmp1
1004 }
1005
1006 define <2 x i64> @orr64imm4s_lsl24(<2 x i64> %a) {
1007 ;CHECK:  orr {{v[0-9]+}}.4s, #0xff, lsl #24
1008         %tmp1 = or <2 x i64> %a, < i64 -72057589759737856, i64 -72057589759737856>
1009         ret <2 x i64> %tmp1
1010 }
1011
1012 define <8 x i8> @orr8imm4h_lsl0(<8 x i8> %a) {
1013 ;CHECK:  orr {{v[0-9]+}}.4h, #0xff
1014         %tmp1 = or <8 x i8> %a, < i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0>
1015         ret <8 x i8> %tmp1
1016 }
1017
1018 define <8 x i8> @orr8imm4h_lsl8(<8 x i8> %a) {
1019 ;CHECK:  orr {{v[0-9]+}}.4h, #0xff, lsl #8
1020         %tmp1 = or <8 x i8> %a, < i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255>
1021         ret <8 x i8> %tmp1
1022 }
1023
1024 define <2 x i32> @orr16imm4h_lsl0(<2 x i32> %a) {
1025 ;CHECK:  orr {{v[0-9]+}}.4h, #0xff
1026         %tmp1 = or <2 x i32> %a, < i32 16711935, i32 16711935>
1027         ret <2 x i32> %tmp1
1028 }
1029
1030 define <2 x i32> @orr16imm4h_lsl8(<2 x i32> %a) {
1031 ;CHECK:  orr {{v[0-9]+}}.4h, #0xff, lsl #8
1032         %tmp1 = or <2 x i32> %a, < i32 4278255360, i32 4278255360>
1033         ret <2 x i32> %tmp1
1034 }
1035
1036 define <1 x i64> @orr64imm4h_lsl0(<1 x i64> %a) {
1037 ;CHECK:  orr {{v[0-9]+}}.4h, #0xff
1038         %tmp1 = or <1 x i64> %a, < i64 71777214294589695>
1039         ret <1 x i64> %tmp1
1040 }
1041
1042 define <1 x i64> @orr64imm4h_lsl8(<1 x i64> %a) {
1043 ;CHECK:  orr {{v[0-9]+}}.4h, #0xff, lsl #8
1044         %tmp1 = or <1 x i64> %a, < i64 -71777214294589696>
1045         ret <1 x i64> %tmp1
1046 }
1047
1048 define <16 x i8> @orr8imm8h_lsl0(<16 x i8> %a) {
1049 ;CHECK:  orr {{v[0-9]+}}.8h, #0xff
1050         %tmp1 = 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>
1051         ret <16 x i8> %tmp1
1052 }
1053
1054 define <16 x i8> @orr8imm8h_lsl8(<16 x i8> %a) {
1055 ;CHECK:  orr {{v[0-9]+}}.8h, #0xff, lsl #8
1056         %tmp1 = 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>
1057         ret <16 x i8> %tmp1
1058 }
1059
1060 define <4 x i32> @orr16imm8h_lsl0(<4 x i32> %a) {
1061 ;CHECK:  orr {{v[0-9]+}}.8h, #0xff
1062         %tmp1 = or <4 x i32> %a, < i32 16711935, i32 16711935, i32 16711935, i32 16711935>
1063         ret <4 x i32> %tmp1
1064 }
1065
1066 define <4 x i32> @orr16imm8h_lsl8(<4 x i32> %a) {
1067 ;CHECK:  orr {{v[0-9]+}}.8h, #0xff, lsl #8
1068         %tmp1 = or <4 x i32> %a, < i32 4278255360, i32 4278255360, i32 4278255360, i32 4278255360>
1069         ret <4 x i32> %tmp1
1070 }
1071
1072 define <2 x i64> @orr64imm8h_lsl0(<2 x i64> %a) {
1073 ;CHECK:  orr {{v[0-9]+}}.8h, #0xff
1074         %tmp1 = or <2 x i64> %a, < i64 71777214294589695, i64 71777214294589695>
1075         ret <2 x i64> %tmp1
1076 }
1077
1078 define <2 x i64> @orr64imm8h_lsl8(<2 x i64> %a) {
1079 ;CHECK:  orr {{v[0-9]+}}.8h, #0xff, lsl #8
1080         %tmp1 = or <2 x i64> %a, < i64 -71777214294589696, i64 -71777214294589696>
1081         ret <2 x i64> %tmp1
1082 }
1083