1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s
4 define void @testLeftGood8x8(<8 x i8> %src1, <8 x i8> %src2, <8 x i8>* %dest) nounwind {
5 ; CHECK-LABEL: testLeftGood8x8:
7 ; CHECK-NEXT: sli.8b v0, v1, #3
8 ; CHECK-NEXT: str d0, [x0]
10 %and.i = and <8 x i8> %src1, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
11 %vshl_n = shl <8 x i8> %src2, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
12 %result = or <8 x i8> %and.i, %vshl_n
13 store <8 x i8> %result, <8 x i8>* %dest, align 8
17 define void @testLeftBad8x8(<8 x i8> %src1, <8 x i8> %src2, <8 x i8>* %dest) nounwind {
18 ; CHECK-LABEL: testLeftBad8x8:
20 ; CHECK-NEXT: movi.8b v2, #165
21 ; CHECK-NEXT: and.8b v0, v0, v2
22 ; CHECK-NEXT: shl.8b v1, v1, #1
23 ; CHECK-NEXT: orr.8b v0, v0, v1
24 ; CHECK-NEXT: str d0, [x0]
26 %and.i = and <8 x i8> %src1, <i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165>
27 %vshl_n = shl <8 x i8> %src2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
28 %result = or <8 x i8> %and.i, %vshl_n
29 store <8 x i8> %result, <8 x i8>* %dest, align 8
33 define void @testRightGood8x8(<8 x i8> %src1, <8 x i8> %src2, <8 x i8>* %dest) nounwind {
34 ; CHECK-LABEL: testRightGood8x8:
36 ; CHECK-NEXT: sri.8b v0, v1, #3
37 ; CHECK-NEXT: str d0, [x0]
39 %and.i = and <8 x i8> %src1, <i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224>
40 %vshl_n = lshr <8 x i8> %src2, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
41 %result = or <8 x i8> %and.i, %vshl_n
42 store <8 x i8> %result, <8 x i8>* %dest, align 8
46 define void @testRightBad8x8(<8 x i8> %src1, <8 x i8> %src2, <8 x i8>* %dest) nounwind {
47 ; CHECK-LABEL: testRightBad8x8:
49 ; CHECK-NEXT: movi.8b v2, #165
50 ; CHECK-NEXT: and.8b v0, v0, v2
51 ; CHECK-NEXT: ushr.8b v1, v1, #1
52 ; CHECK-NEXT: orr.8b v0, v0, v1
53 ; CHECK-NEXT: str d0, [x0]
55 %and.i = and <8 x i8> %src1, <i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165>
56 %vshl_n = lshr <8 x i8> %src2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
57 %result = or <8 x i8> %and.i, %vshl_n
58 store <8 x i8> %result, <8 x i8>* %dest, align 8
62 define void @testLeftGood16x8(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind {
63 ; CHECK-LABEL: testLeftGood16x8:
65 ; CHECK-NEXT: sli.16b v0, v1, #3
66 ; CHECK-NEXT: str q0, [x0]
68 %and.i = and <16 x i8> %src1, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
69 %vshl_n = shl <16 x i8> %src2, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
70 %result = or <16 x i8> %and.i, %vshl_n
71 store <16 x i8> %result, <16 x i8>* %dest, align 16
75 define void @testLeftBad16x8(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind {
76 ; CHECK-LABEL: testLeftBad16x8:
78 ; CHECK-NEXT: movi.16b v2, #165
79 ; CHECK-NEXT: and.16b v0, v0, v2
80 ; CHECK-NEXT: shl.16b v1, v1, #1
81 ; CHECK-NEXT: orr.16b v0, v0, v1
82 ; CHECK-NEXT: str q0, [x0]
84 %and.i = and <16 x i8> %src1, <i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165>
85 %vshl_n = shl <16 x i8> %src2, <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>
86 %result = or <16 x i8> %and.i, %vshl_n
87 store <16 x i8> %result, <16 x i8>* %dest, align 16
91 define void @testRightGood16x8(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind {
92 ; CHECK-LABEL: testRightGood16x8:
94 ; CHECK-NEXT: sri.16b v0, v1, #3
95 ; CHECK-NEXT: str q0, [x0]
97 %and.i = and <16 x i8> %src1, <i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224>
98 %vshl_n = lshr <16 x i8> %src2, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
99 %result = or <16 x i8> %and.i, %vshl_n
100 store <16 x i8> %result, <16 x i8>* %dest, align 16
104 define void @testRightBad16x8(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind {
105 ; CHECK-LABEL: testRightBad16x8:
107 ; CHECK-NEXT: movi.16b v2, #165
108 ; CHECK-NEXT: and.16b v0, v0, v2
109 ; CHECK-NEXT: ushr.16b v1, v1, #1
110 ; CHECK-NEXT: orr.16b v0, v0, v1
111 ; CHECK-NEXT: str q0, [x0]
113 %and.i = and <16 x i8> %src1, <i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165>
114 %vshl_n = lshr <16 x i8> %src2, <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>
115 %result = or <16 x i8> %and.i, %vshl_n
116 store <16 x i8> %result, <16 x i8>* %dest, align 16
120 define void @testLeftGood4x16(<4 x i16> %src1, <4 x i16> %src2, <4 x i16>* %dest) nounwind {
121 ; CHECK-LABEL: testLeftGood4x16:
123 ; CHECK-NEXT: sli.4h v0, v1, #14
124 ; CHECK-NEXT: str d0, [x0]
126 %and.i = and <4 x i16> %src1, <i16 16383, i16 16383, i16 16383, i16 16383>
127 %vshl_n = shl <4 x i16> %src2, <i16 14, i16 14, i16 14, i16 14>
128 %result = or <4 x i16> %and.i, %vshl_n
129 store <4 x i16> %result, <4 x i16>* %dest, align 8
133 define void @testLeftBad4x16(<4 x i16> %src1, <4 x i16> %src2, <4 x i16>* %dest) nounwind {
134 ; CHECK-LABEL: testLeftBad4x16:
136 ; CHECK-NEXT: mov w8, #16500
137 ; CHECK-NEXT: dup.4h v2, w8
138 ; CHECK-NEXT: and.8b v0, v0, v2
139 ; CHECK-NEXT: shl.4h v1, v1, #14
140 ; CHECK-NEXT: orr.8b v0, v0, v1
141 ; CHECK-NEXT: str d0, [x0]
143 %and.i = and <4 x i16> %src1, <i16 16500, i16 16500, i16 16500, i16 16500>
144 %vshl_n = shl <4 x i16> %src2, <i16 14, i16 14, i16 14, i16 14>
145 %result = or <4 x i16> %and.i, %vshl_n
146 store <4 x i16> %result, <4 x i16>* %dest, align 8
150 define void @testRightGood4x16(<4 x i16> %src1, <4 x i16> %src2, <4 x i16>* %dest) nounwind {
151 ; CHECK-LABEL: testRightGood4x16:
153 ; CHECK-NEXT: sri.4h v0, v1, #14
154 ; CHECK-NEXT: str d0, [x0]
156 %and.i = and <4 x i16> %src1, <i16 65532, i16 65532, i16 65532, i16 65532>
157 %vshl_n = lshr <4 x i16> %src2, <i16 14, i16 14, i16 14, i16 14>
158 %result = or <4 x i16> %and.i, %vshl_n
159 store <4 x i16> %result, <4 x i16>* %dest, align 8
163 define void @testRightBad4x16(<4 x i16> %src1, <4 x i16> %src2, <4 x i16>* %dest) nounwind {
164 ; CHECK-LABEL: testRightBad4x16:
166 ; CHECK-NEXT: mov w8, #16500
167 ; CHECK-NEXT: dup.4h v2, w8
168 ; CHECK-NEXT: and.8b v0, v0, v2
169 ; CHECK-NEXT: ushr.4h v1, v1, #14
170 ; CHECK-NEXT: orr.8b v0, v0, v1
171 ; CHECK-NEXT: str d0, [x0]
173 %and.i = and <4 x i16> %src1, <i16 16500, i16 16500, i16 16500, i16 16500>
174 %vshl_n = lshr <4 x i16> %src2, <i16 14, i16 14, i16 14, i16 14>
175 %result = or <4 x i16> %and.i, %vshl_n
176 store <4 x i16> %result, <4 x i16>* %dest, align 8
180 define void @testLeftGood8x16(<8 x i16> %src1, <8 x i16> %src2, <8 x i16>* %dest) nounwind {
181 ; CHECK-LABEL: testLeftGood8x16:
183 ; CHECK-NEXT: sli.8h v0, v1, #14
184 ; CHECK-NEXT: str q0, [x0]
186 %and.i = and <8 x i16> %src1, <i16 16383, i16 16383, i16 16383, i16 16383, i16 16383, i16 16383, i16 16383, i16 16383>
187 %vshl_n = shl <8 x i16> %src2, <i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14>
188 %result = or <8 x i16> %and.i, %vshl_n
189 store <8 x i16> %result, <8 x i16>* %dest, align 16
193 define void @testLeftBad8x16(<8 x i16> %src1, <8 x i16> %src2, <8 x i16>* %dest) nounwind {
194 ; CHECK-LABEL: testLeftBad8x16:
196 ; CHECK-NEXT: mov w8, #16500
197 ; CHECK-NEXT: dup.8h v2, w8
198 ; CHECK-NEXT: and.16b v0, v0, v2
199 ; CHECK-NEXT: shl.8h v1, v1, #14
200 ; CHECK-NEXT: orr.16b v0, v0, v1
201 ; CHECK-NEXT: str q0, [x0]
203 %and.i = and <8 x i16> %src1, <i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500>
204 %vshl_n = shl <8 x i16> %src2, <i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14>
205 %result = or <8 x i16> %and.i, %vshl_n
206 store <8 x i16> %result, <8 x i16>* %dest, align 16
210 define void @testRightGood8x16(<8 x i16> %src1, <8 x i16> %src2, <8 x i16>* %dest) nounwind {
211 ; CHECK-LABEL: testRightGood8x16:
213 ; CHECK-NEXT: sri.8h v0, v1, #14
214 ; CHECK-NEXT: str q0, [x0]
216 %and.i = and <8 x i16> %src1, <i16 65532, i16 65532, i16 65532, i16 65532, i16 65532, i16 65532, i16 65532, i16 65532>
217 %vshl_n = lshr <8 x i16> %src2, <i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14>
218 %result = or <8 x i16> %and.i, %vshl_n
219 store <8 x i16> %result, <8 x i16>* %dest, align 16
223 define void @testRightBad8x16(<8 x i16> %src1, <8 x i16> %src2, <8 x i16>* %dest) nounwind {
224 ; CHECK-LABEL: testRightBad8x16:
226 ; CHECK-NEXT: mov w8, #16500
227 ; CHECK-NEXT: dup.8h v2, w8
228 ; CHECK-NEXT: and.16b v0, v0, v2
229 ; CHECK-NEXT: ushr.8h v1, v1, #14
230 ; CHECK-NEXT: orr.16b v0, v0, v1
231 ; CHECK-NEXT: str q0, [x0]
233 %and.i = and <8 x i16> %src1, <i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500>
234 %vshl_n = lshr <8 x i16> %src2, <i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14>
235 %result = or <8 x i16> %and.i, %vshl_n
236 store <8 x i16> %result, <8 x i16>* %dest, align 16
240 define void @testLeftGood2x32(<2 x i32> %src1, <2 x i32> %src2, <2 x i32>* %dest) nounwind {
241 ; CHECK-LABEL: testLeftGood2x32:
243 ; CHECK-NEXT: sli.2s v0, v1, #22
244 ; CHECK-NEXT: str d0, [x0]
246 %and.i = and <2 x i32> %src1, <i32 4194303, i32 4194303>
247 %vshl_n = shl <2 x i32> %src2, <i32 22, i32 22>
248 %result = or <2 x i32> %and.i, %vshl_n
249 store <2 x i32> %result, <2 x i32>* %dest, align 8
253 define void @testLeftBad2x32(<2 x i32> %src1, <2 x i32> %src2, <2 x i32>* %dest) nounwind {
254 ; CHECK-LABEL: testLeftBad2x32:
256 ; CHECK-NEXT: mov w8, #4194300
257 ; CHECK-NEXT: dup.2s v2, w8
258 ; CHECK-NEXT: and.8b v0, v0, v2
259 ; CHECK-NEXT: shl.2s v1, v1, #22
260 ; CHECK-NEXT: orr.8b v0, v0, v1
261 ; CHECK-NEXT: str d0, [x0]
263 %and.i = and <2 x i32> %src1, <i32 4194300, i32 4194300>
264 %vshl_n = shl <2 x i32> %src2, <i32 22, i32 22>
265 %result = or <2 x i32> %and.i, %vshl_n
266 store <2 x i32> %result, <2 x i32>* %dest, align 8
270 define void @testRightGood2x32(<2 x i32> %src1, <2 x i32> %src2, <2 x i32>* %dest) nounwind {
271 ; CHECK-LABEL: testRightGood2x32:
273 ; CHECK-NEXT: sri.2s v0, v1, #22
274 ; CHECK-NEXT: str d0, [x0]
276 %and.i = and <2 x i32> %src1, <i32 4294966272, i32 4294966272>
277 %vshl_n = lshr <2 x i32> %src2, <i32 22, i32 22>
278 %result = or <2 x i32> %and.i, %vshl_n
279 store <2 x i32> %result, <2 x i32>* %dest, align 8
283 define void @testRightBad2x32(<2 x i32> %src1, <2 x i32> %src2, <2 x i32>* %dest) nounwind {
284 ; CHECK-LABEL: testRightBad2x32:
286 ; CHECK-NEXT: mov w8, #4194300
287 ; CHECK-NEXT: dup.2s v2, w8
288 ; CHECK-NEXT: and.8b v0, v0, v2
289 ; CHECK-NEXT: ushr.2s v1, v1, #22
290 ; CHECK-NEXT: orr.8b v0, v0, v1
291 ; CHECK-NEXT: str d0, [x0]
293 %and.i = and <2 x i32> %src1, <i32 4194300, i32 4194300>
294 %vshl_n = lshr <2 x i32> %src2, <i32 22, i32 22>
295 %result = or <2 x i32> %and.i, %vshl_n
296 store <2 x i32> %result, <2 x i32>* %dest, align 8
300 define void @testLeftGood4x32(<4 x i32> %src1, <4 x i32> %src2, <4 x i32>* %dest) nounwind {
301 ; CHECK-LABEL: testLeftGood4x32:
303 ; CHECK-NEXT: sli.4s v0, v1, #22
304 ; CHECK-NEXT: str q0, [x0]
306 %and.i = and <4 x i32> %src1, <i32 4194303, i32 4194303, i32 4194303, i32 4194303>
307 %vshl_n = shl <4 x i32> %src2, <i32 22, i32 22, i32 22, i32 22>
308 %result = or <4 x i32> %and.i, %vshl_n
309 store <4 x i32> %result, <4 x i32>* %dest, align 16
313 define void @testLeftBad4x32(<4 x i32> %src1, <4 x i32> %src2, <4 x i32>* %dest) nounwind {
314 ; CHECK-LABEL: testLeftBad4x32:
316 ; CHECK-NEXT: mov w8, #4194300
317 ; CHECK-NEXT: dup.4s v2, w8
318 ; CHECK-NEXT: and.16b v0, v0, v2
319 ; CHECK-NEXT: shl.4s v1, v1, #22
320 ; CHECK-NEXT: orr.16b v0, v0, v1
321 ; CHECK-NEXT: str q0, [x0]
323 %and.i = and <4 x i32> %src1, <i32 4194300, i32 4194300, i32 4194300, i32 4194300>
324 %vshl_n = shl <4 x i32> %src2, <i32 22, i32 22, i32 22, i32 22>
325 %result = or <4 x i32> %and.i, %vshl_n
326 store <4 x i32> %result, <4 x i32>* %dest, align 16
330 define void @testRightGood4x32(<4 x i32> %src1, <4 x i32> %src2, <4 x i32>* %dest) nounwind {
331 ; CHECK-LABEL: testRightGood4x32:
333 ; CHECK-NEXT: sri.4s v0, v1, #22
334 ; CHECK-NEXT: str q0, [x0]
336 %and.i = and <4 x i32> %src1, <i32 4294966272, i32 4294966272, i32 4294966272, i32 4294966272>
337 %vshl_n = lshr <4 x i32> %src2, <i32 22, i32 22, i32 22, i32 22>
338 %result = or <4 x i32> %and.i, %vshl_n
339 store <4 x i32> %result, <4 x i32>* %dest, align 16
343 define void @testRightBad4x32(<4 x i32> %src1, <4 x i32> %src2, <4 x i32>* %dest) nounwind {
344 ; CHECK-LABEL: testRightBad4x32:
346 ; CHECK-NEXT: mov w8, #4194300
347 ; CHECK-NEXT: dup.4s v2, w8
348 ; CHECK-NEXT: and.16b v0, v0, v2
349 ; CHECK-NEXT: ushr.4s v1, v1, #22
350 ; CHECK-NEXT: orr.16b v0, v0, v1
351 ; CHECK-NEXT: str q0, [x0]
353 %and.i = and <4 x i32> %src1, <i32 4194300, i32 4194300, i32 4194300, i32 4194300>
354 %vshl_n = lshr <4 x i32> %src2, <i32 22, i32 22, i32 22, i32 22>
355 %result = or <4 x i32> %and.i, %vshl_n
356 store <4 x i32> %result, <4 x i32>* %dest, align 16
360 define void @testLeftGood2x64(<2 x i64> %src1, <2 x i64> %src2, <2 x i64>* %dest) nounwind {
361 ; CHECK-LABEL: testLeftGood2x64:
363 ; CHECK-NEXT: sli.2d v0, v1, #48
364 ; CHECK-NEXT: str q0, [x0]
366 %and.i = and <2 x i64> %src1, <i64 281474976710655, i64 281474976710655>
367 %vshl_n = shl <2 x i64> %src2, <i64 48, i64 48>
368 %result = or <2 x i64> %and.i, %vshl_n
369 store <2 x i64> %result, <2 x i64>* %dest, align 16
373 define void @testLeftBad2x64(<2 x i64> %src1, <2 x i64> %src2, <2 x i64>* %dest) nounwind {
374 ; CHECK-LABEL: testLeftBad2x64:
376 ; CHECK-NEXT: mov x8, #10
377 ; CHECK-NEXT: movk x8, #1, lsl #48
378 ; CHECK-NEXT: dup.2d v2, x8
379 ; CHECK-NEXT: and.16b v0, v0, v2
380 ; CHECK-NEXT: shl.2d v1, v1, #48
381 ; CHECK-NEXT: orr.16b v0, v0, v1
382 ; CHECK-NEXT: str q0, [x0]
384 %and.i = and <2 x i64> %src1, <i64 281474976710666, i64 281474976710666>
385 %vshl_n = shl <2 x i64> %src2, <i64 48, i64 48>
386 %result = or <2 x i64> %and.i, %vshl_n
387 store <2 x i64> %result, <2 x i64>* %dest, align 16
391 define void @testRightGood2x64(<2 x i64> %src1, <2 x i64> %src2, <2 x i64>* %dest) nounwind {
392 ; CHECK-LABEL: testRightGood2x64:
394 ; CHECK-NEXT: sri.2d v0, v1, #48
395 ; CHECK-NEXT: str q0, [x0]
397 %and.i = and <2 x i64> %src1, <i64 18446744073709486080, i64 18446744073709486080>
398 %vshl_n = lshr <2 x i64> %src2, <i64 48, i64 48>
399 %result = or <2 x i64> %and.i, %vshl_n
400 store <2 x i64> %result, <2 x i64>* %dest, align 16
404 define void @testRightBad2x64(<2 x i64> %src1, <2 x i64> %src2, <2 x i64>* %dest) nounwind {
405 ; CHECK-LABEL: testRightBad2x64:
407 ; CHECK-NEXT: mov x8, #10
408 ; CHECK-NEXT: movk x8, #1, lsl #48
409 ; CHECK-NEXT: dup.2d v2, x8
410 ; CHECK-NEXT: and.16b v0, v0, v2
411 ; CHECK-NEXT: ushr.2d v1, v1, #48
412 ; CHECK-NEXT: orr.16b v0, v0, v1
413 ; CHECK-NEXT: str q0, [x0]
415 %and.i = and <2 x i64> %src1, <i64 281474976710666, i64 281474976710666>
416 %vshl_n = lshr <2 x i64> %src2, <i64 48, i64 48>
417 %result = or <2 x i64> %and.i, %vshl_n
418 store <2 x i64> %result, <2 x i64>* %dest, align 16
422 define void @testLeftShouldNotCreateSLI1x128(<1 x i128> %src1, <1 x i128> %src2, <1 x i128>* %dest) nounwind {
423 ; CHECK-LABEL: testLeftShouldNotCreateSLI1x128:
425 ; CHECK-NEXT: bfi x1, x2, #6, #58
426 ; CHECK-NEXT: stp x0, x1, [x4]
428 %and.i = and <1 x i128> %src1, <i128 1180591620717411303423>
429 %vshl_n = shl <1 x i128> %src2, <i128 70>
430 %result = or <1 x i128> %and.i, %vshl_n
431 store <1 x i128> %result, <1 x i128>* %dest, align 16
435 define void @testLeftNotAllConstantBuildVec8x8(<8 x i8> %src1, <8 x i8> %src2, <8 x i8>* %dest) nounwind {
436 ; CHECK-LABEL: testLeftNotAllConstantBuildVec8x8:
438 ; CHECK-NEXT: adrp x8, .LCPI29_0
439 ; CHECK-NEXT: ldr d2, [x8, :lo12:.LCPI29_0]
440 ; CHECK-NEXT: shl.8b v1, v1, #3
441 ; CHECK-NEXT: and.8b v0, v0, v2
442 ; CHECK-NEXT: orr.8b v0, v0, v1
443 ; CHECK-NEXT: str d0, [x0]
445 %and.i = and <8 x i8> %src1, <i8 7, i8 7, i8 255, i8 7, i8 7, i8 7, i8 255, i8 7>
446 %vshl_n = shl <8 x i8> %src2, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
447 %result = or <8 x i8> %and.i, %vshl_n
448 store <8 x i8> %result, <8 x i8>* %dest, align 8