[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / extbinopload.ll
bloba93762918cd87c47ae82a2dbd69d568d58e2e0ac
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -mtriple=aarch64-none-eabi -verify-machineinstrs %s -o - | FileCheck %s
4 define <4 x i16> @normal_load_v4i8(ptr %p) {
5 ; CHECK-LABEL: normal_load_v4i8:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    ldp s0, s1, [x0]
8 ; CHECK-NEXT:    uaddl v0.8h, v0.8b, v1.8b
9 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
10 ; CHECK-NEXT:    ret
11   %l1 = load <4 x i8>, ptr %p
12   %q = getelementptr i8, ptr %p, i32 4
13   %l2 = load <4 x i8>, ptr %q
14   %e1 = zext <4 x i8> %l1 to <4 x i16>
15   %e2 = zext <4 x i8> %l2 to <4 x i16>
16   %a = add <4 x i16> %e1, %e2
17   ret <4 x i16> %a
20 define <4 x i32> @normal_load_v4i16_v4i32(ptr %p) {
21 ; CHECK-LABEL: normal_load_v4i16_v4i32:
22 ; CHECK:       // %bb.0:
23 ; CHECK-NEXT:    ldp d0, d1, [x0]
24 ; CHECK-NEXT:    uaddl v0.4s, v0.4h, v1.4h
25 ; CHECK-NEXT:    ret
26   %l1 = load <4 x i16>, ptr %p
27   %q = getelementptr i8, ptr %p, i32 8
28   %l2 = load <4 x i16>, ptr %q
29   %e1 = zext <4 x i16> %l1 to <4 x i32>
30   %e2 = zext <4 x i16> %l2 to <4 x i32>
31   %a = add <4 x i32> %e1, %e2
32   ret <4 x i32> %a
35 define <4 x i16> @load_v4i8(ptr %p) {
36 ; CHECK-LABEL: load_v4i8:
37 ; CHECK:       // %bb.0:
38 ; CHECK-NEXT:    ldp s1, s0, [x0]
39 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
40 ; CHECK-NEXT:    shl v0.4h, v0.4h, #3
41 ; CHECK-NEXT:    uaddw v0.8h, v0.8h, v1.8b
42 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
43 ; CHECK-NEXT:    ret
44   %l1 = load <4 x i8>, ptr %p
45   %q = getelementptr i8, ptr %p, i32 4
46   %l2 = load <4 x i8>, ptr %q
47   %e1 = zext <4 x i8> %l1 to <4 x i16>
48   %e2 = zext <4 x i8> %l2 to <4 x i16>
49   %e3 = shl <4 x i16> %e2, <i16 3, i16 3, i16 3, i16 3>
50   %a = add <4 x i16> %e1, %e3
51   ret <4 x i16> %a
54 define <4 x i32> @load_v4i16_v4i32(ptr %p) {
55 ; CHECK-LABEL: load_v4i16_v4i32:
56 ; CHECK:       // %bb.0:
57 ; CHECK-NEXT:    ldr q0, [x0]
58 ; CHECK-NEXT:    ushll2 v1.4s, v0.8h, #3
59 ; CHECK-NEXT:    uaddw v0.4s, v1.4s, v0.4h
60 ; CHECK-NEXT:    ret
61   %l1 = load <4 x i16>, ptr %p
62   %q = getelementptr i8, ptr %p, i32 8
63   %l2 = load <4 x i16>, ptr %q
64   %e1 = zext <4 x i16> %l1 to <4 x i32>
65   %e2 = zext <4 x i16> %l2 to <4 x i32>
66   %e3 = shl <4 x i32> %e2, <i32 3, i32 3, i32 3, i32 3>
67   %a = add <4 x i32> %e1, %e3
68   ret <4 x i32> %a
71 define <4 x i64> @load_v4i32_v4i64(ptr %p) {
72 ; CHECK-LABEL: load_v4i32_v4i64:
73 ; CHECK:       // %bb.0:
74 ; CHECK-NEXT:    ldp q2, q0, [x0]
75 ; CHECK-NEXT:    ushll2 v1.2d, v0.4s, #3
76 ; CHECK-NEXT:    ushll v0.2d, v0.2s, #3
77 ; CHECK-NEXT:    uaddw2 v1.2d, v1.2d, v2.4s
78 ; CHECK-NEXT:    uaddw v0.2d, v0.2d, v2.2s
79 ; CHECK-NEXT:    ret
80   %l1 = load <4 x i32>, ptr %p
81   %q = getelementptr i8, ptr %p, i32 16
82   %l2 = load <4 x i32>, ptr %q
83   %e1 = zext <4 x i32> %l1 to <4 x i64>
84   %e2 = zext <4 x i32> %l2 to <4 x i64>
85   %e3 = shl <4 x i64> %e2, <i64 3, i64 3, i64 3, i64 3>
86   %a = add <4 x i64> %e1, %e3
87   ret <4 x i64> %a
90 define <4 x i32> @load_v4i8_v4i32(ptr %p) {
91 ; CHECK-LABEL: load_v4i8_v4i32:
92 ; CHECK:       // %bb.0:
93 ; CHECK-NEXT:    ldr d0, [x0]
94 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
95 ; CHECK-NEXT:    ushll2 v1.4s, v0.8h, #3
96 ; CHECK-NEXT:    uaddw v0.4s, v1.4s, v0.4h
97 ; CHECK-NEXT:    ret
98   %l1 = load <4 x i8>, ptr %p
99   %q = getelementptr i8, ptr %p, i32 4
100   %l2 = load <4 x i8>, ptr %q
101   %e1 = zext <4 x i8> %l1 to <4 x i32>
102   %e2 = zext <4 x i8> %l2 to <4 x i32>
103   %e3 = shl <4 x i32> %e2, <i32 3, i32 3, i32 3, i32 3>
104   %a = add <4 x i32> %e1, %e3
105   ret <4 x i32> %a
108 define <4 x i32> @load_v4i12_v4i32(ptr %p) {
109 ; CHECK-LABEL: load_v4i12_v4i32:
110 ; CHECK:       // %bb.0:
111 ; CHECK-NEXT:    ldr x8, [x0]
112 ; CHECK-NEXT:    ldr w9, [x0, #8]
113 ; CHECK-NEXT:    lsr x10, x8, #60
114 ; CHECK-NEXT:    ubfx x11, x8, #48, #12
115 ; CHECK-NEXT:    ubfx w12, w9, #8, #12
116 ; CHECK-NEXT:    orr w10, w10, w9, lsl #4
117 ; CHECK-NEXT:    fmov s0, w11
118 ; CHECK-NEXT:    and w11, w8, #0xfff
119 ; CHECK-NEXT:    fmov s1, w11
120 ; CHECK-NEXT:    lsr x9, x9, #20
121 ; CHECK-NEXT:    and w10, w10, #0xfff
122 ; CHECK-NEXT:    mov v0.h[1], w10
123 ; CHECK-NEXT:    ubfx w10, w8, #12, #12
124 ; CHECK-NEXT:    mov v1.h[1], w10
125 ; CHECK-NEXT:    ubfx x10, x8, #24, #12
126 ; CHECK-NEXT:    ubfx x8, x8, #36, #12
127 ; CHECK-NEXT:    mov v0.h[2], w12
128 ; CHECK-NEXT:    mov v1.h[2], w10
129 ; CHECK-NEXT:    mov v0.h[3], w9
130 ; CHECK-NEXT:    mov v1.h[3], w8
131 ; CHECK-NEXT:    ushll v0.4s, v0.4h, #3
132 ; CHECK-NEXT:    uaddw v0.4s, v0.4s, v1.4h
133 ; CHECK-NEXT:    ret
134   %l1 = load <4 x i12>, ptr %p
135   %q = getelementptr i8, ptr %p, i32 6
136   %l2 = load <4 x i12>, ptr %q
137   %e1 = zext <4 x i12> %l1 to <4 x i32>
138   %e2 = zext <4 x i12> %l2 to <4 x i32>
139   %e3 = shl <4 x i32> %e2, <i32 3, i32 3, i32 3, i32 3>
140   %a = add <4 x i32> %e1, %e3
141   ret <4 x i32> %a
144 define <8 x i16> @load_v8i8(ptr %p) {
145 ; CHECK-LABEL: load_v8i8:
146 ; CHECK:       // %bb.0:
147 ; CHECK-NEXT:    ldr q0, [x0]
148 ; CHECK-NEXT:    ushll2 v1.8h, v0.16b, #3
149 ; CHECK-NEXT:    uaddw v0.8h, v1.8h, v0.8b
150 ; CHECK-NEXT:    ret
151   %l1 = load <8 x i8>, ptr %p
152   %q = getelementptr i8, ptr %p, i32 8
153   %l2 = load <8 x i8>, ptr %q
154   %e1 = zext <8 x i8> %l1 to <8 x i16>
155   %e2 = zext <8 x i8> %l2 to <8 x i16>
156   %e3 = shl <8 x i16> %e2, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
157   %a = add <8 x i16> %e1, %e3
158   ret <8 x i16> %a
161 define <8 x i16> @loadadd_v8i8(ptr %p1, ptr %p2) {
162 ; CHECK-LABEL: loadadd_v8i8:
163 ; CHECK:       // %bb.0:
164 ; CHECK-NEXT:    ldr q0, [x0]
165 ; CHECK-NEXT:    ldr q1, [x1]
166 ; CHECK-NEXT:    add v0.16b, v0.16b, v1.16b
167 ; CHECK-NEXT:    ushll2 v1.8h, v0.16b, #3
168 ; CHECK-NEXT:    uaddw v0.8h, v1.8h, v0.8b
169 ; CHECK-NEXT:    ret
170   %l11 = load <8 x i8>, ptr %p1
171   %q1 = getelementptr i8, ptr %p1, i32 8
172   %l12 = load <8 x i8>, ptr %q1
173   %l21 = load <8 x i8>, ptr %p2
174   %q2 = getelementptr i8, ptr %p2, i32 8
175   %l22 = load <8 x i8>, ptr %q2
176   %l1 = add <8 x i8> %l11, %l21
177   %l2 = add <8 x i8> %l12, %l22
178   %e1 = zext <8 x i8> %l1 to <8 x i16>
179   %e2 = zext <8 x i8> %l2 to <8 x i16>
180   %e3 = shl <8 x i16> %e2, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
181   %a = add <8 x i16> %e1, %e3
182   ret <8 x i16> %a
185 define <8 x i32> @loadaddext_v8i8(ptr %p1, ptr %p2) {
186 ; CHECK-LABEL: loadaddext_v8i8:
187 ; CHECK:       // %bb.0:
188 ; CHECK-NEXT:    ldr q0, [x0]
189 ; CHECK-NEXT:    ldr q1, [x1]
190 ; CHECK-NEXT:    uaddl2 v2.8h, v0.16b, v1.16b
191 ; CHECK-NEXT:    uaddl v0.8h, v0.8b, v1.8b
192 ; CHECK-NEXT:    ushll2 v1.4s, v2.8h, #3
193 ; CHECK-NEXT:    ushll v2.4s, v2.4h, #3
194 ; CHECK-NEXT:    uaddw2 v1.4s, v1.4s, v0.8h
195 ; CHECK-NEXT:    uaddw v0.4s, v2.4s, v0.4h
196 ; CHECK-NEXT:    ret
197   %l11 = load <8 x i8>, ptr %p1
198   %q1 = getelementptr i8, ptr %p1, i32 8
199   %l12 = load <8 x i8>, ptr %q1
200   %l21 = load <8 x i8>, ptr %p2
201   %q2 = getelementptr i8, ptr %p2, i32 8
202   %l22 = load <8 x i8>, ptr %q2
203   %le11 = zext <8 x i8> %l11 to <8 x i16>
204   %le12 = zext <8 x i8> %l12 to <8 x i16>
205   %le21 = zext <8 x i8> %l21 to <8 x i16>
206   %le22 = zext <8 x i8> %l22 to <8 x i16>
207   %l1 = add <8 x i16> %le11, %le21
208   %l2 = add <8 x i16> %le12, %le22
209   %e1 = zext <8 x i16> %l1 to <8 x i32>
210   %e2 = zext <8 x i16> %l2 to <8 x i32>
211   %e3 = shl <8 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
212   %a = add <8 x i32> %e1, %e3
213   ret <8 x i32> %a
216 define <4 x i32> @loadaddext_v4i8(ptr %p1, ptr %p2) {
217 ; CHECK-LABEL: loadaddext_v4i8:
218 ; CHECK:       // %bb.0:
219 ; CHECK-NEXT:    ldr d0, [x0]
220 ; CHECK-NEXT:    ldr d1, [x1]
221 ; CHECK-NEXT:    uaddl v0.8h, v0.8b, v1.8b
222 ; CHECK-NEXT:    ushll2 v1.4s, v0.8h, #3
223 ; CHECK-NEXT:    uaddw v0.4s, v1.4s, v0.4h
224 ; CHECK-NEXT:    ret
225   %l11 = load <4 x i8>, ptr %p1
226   %q1 = getelementptr i8, ptr %p1, i32 4
227   %l12 = load <4 x i8>, ptr %q1
228   %l21 = load <4 x i8>, ptr %p2
229   %q2 = getelementptr i8, ptr %p2, i32 4
230   %l22 = load <4 x i8>, ptr %q2
231   %le11 = zext <4 x i8> %l11 to <4 x i16>
232   %le12 = zext <4 x i8> %l12 to <4 x i16>
233   %le21 = zext <4 x i8> %l21 to <4 x i16>
234   %le22 = zext <4 x i8> %l22 to <4 x i16>
235   %l1 = add <4 x i16> %le11, %le21
236   %l2 = add <4 x i16> %le12, %le22
237   %e1 = zext <4 x i16> %l1 to <4 x i32>
238   %e2 = zext <4 x i16> %l2 to <4 x i32>
239   %e3 = shl <4 x i32> %e2, <i32 3, i32 3, i32 3, i32 3>
240   %a = add <4 x i32> %e1, %e3
241   ret <4 x i32> %a
244 define <16 x i16> @load_v16i8(ptr %p) {
245 ; CHECK-LABEL: load_v16i8:
246 ; CHECK:       // %bb.0:
247 ; CHECK-NEXT:    ldp q2, q0, [x0]
248 ; CHECK-NEXT:    ushll2 v1.8h, v0.16b, #3
249 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #3
250 ; CHECK-NEXT:    uaddw2 v1.8h, v1.8h, v2.16b
251 ; CHECK-NEXT:    uaddw v0.8h, v0.8h, v2.8b
252 ; CHECK-NEXT:    ret
253   %l1 = load <16 x i8>, ptr %p
254   %q = getelementptr i8, ptr %p, i32 16
255   %l2 = load <16 x i8>, ptr %q
256   %e1 = zext <16 x i8> %l1 to <16 x i16>
257   %e2 = zext <16 x i8> %l2 to <16 x i16>
258   %e3 = shl <16 x i16> %e2, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
259   %a = add <16 x i16> %e1, %e3
260   ret <16 x i16> %a
263 define <2 x i16> @std_v2i8_v2i16(ptr %p) {
264 ; CHECK-LABEL: std_v2i8_v2i16:
265 ; CHECK:       // %bb.0:
266 ; CHECK-NEXT:    ldrb w8, [x0, #2]
267 ; CHECK-NEXT:    ldrb w9, [x0, #3]
268 ; CHECK-NEXT:    fmov s0, w8
269 ; CHECK-NEXT:    ldrb w8, [x0]
270 ; CHECK-NEXT:    fmov s1, w8
271 ; CHECK-NEXT:    mov v0.s[1], w9
272 ; CHECK-NEXT:    ldrb w9, [x0, #1]
273 ; CHECK-NEXT:    mov v1.s[1], w9
274 ; CHECK-NEXT:    shl v0.2s, v0.2s, #3
275 ; CHECK-NEXT:    add v0.2s, v1.2s, v0.2s
276 ; CHECK-NEXT:    ret
277   %l1 = load <2 x i8>, ptr %p
278   %q = getelementptr i8, ptr %p, i32 2
279   %l2 = load <2 x i8>, ptr %q
280   %e1 = zext <2 x i8> %l1 to <2 x i16>
281   %e2 = zext <2 x i8> %l2 to <2 x i16>
282   %se2 = shl <2 x i16> %e2, <i16 3, i16 3>
283   %a = add <2 x i16> %e1, %se2
284   ret <2 x i16> %a
287 define <8 x i16> @load_bv_v4i8(ptr %p, ptr %q) {
288 ; CHECK-LABEL: load_bv_v4i8:
289 ; CHECK:       // %bb.0:
290 ; CHECK-NEXT:    ldp s0, s1, [x0]
291 ; CHECK-NEXT:    ld1 { v0.s }[1], [x1], #4
292 ; CHECK-NEXT:    ld1 { v1.s }[1], [x1]
293 ; CHECK-NEXT:    ushll v1.8h, v1.8b, #3
294 ; CHECK-NEXT:    uaddw v0.8h, v1.8h, v0.8b
295 ; CHECK-NEXT:    ret
296   %j1 = load <4 x i8>, ptr %p
297   %p1 = getelementptr i8, ptr %p, i32 4
298   %j2 = load <4 x i8>, ptr %p1
299   %k1 = load <4 x i8>, ptr %q
300   %q1 = getelementptr i8, ptr %q, i32 4
301   %k2 = load <4 x i8>, ptr %q1
302   %l1 = shufflevector <4 x i8> %j1, <4 x i8> %k1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
303   %l2 = shufflevector <4 x i8> %j2, <4 x i8> %k2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
304   %e1 = zext <8 x i8> %l1 to <8 x i16>
305   %e2 = zext <8 x i8> %l2 to <8 x i16>
306   %e3 = shl <8 x i16> %e2, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
307   %a = add <8 x i16> %e1, %e3
308   ret <8 x i16> %a
311 define <8 x i32> @load_bv_v4i8_i32(ptr %p, ptr %q) {
312 ; CHECK-LABEL: load_bv_v4i8_i32:
313 ; CHECK:       // %bb.0:
314 ; CHECK-NEXT:    ldr d0, [x0]
315 ; CHECK-NEXT:    ldr d1, [x1]
316 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
317 ; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
318 ; CHECK-NEXT:    ushll2 v2.4s, v0.8h, #3
319 ; CHECK-NEXT:    ushll2 v3.4s, v1.8h, #3
320 ; CHECK-NEXT:    uaddw v0.4s, v2.4s, v0.4h
321 ; CHECK-NEXT:    uaddw v1.4s, v3.4s, v1.4h
322 ; CHECK-NEXT:    ret
323   %j1 = load <4 x i8>, ptr %p
324   %p1 = getelementptr i8, ptr %p, i32 4
325   %j2 = load <4 x i8>, ptr %p1
326   %k1 = load <4 x i8>, ptr %q
327   %q1 = getelementptr i8, ptr %q, i32 4
328   %k2 = load <4 x i8>, ptr %q1
329   %l1 = shufflevector <4 x i8> %j1, <4 x i8> %k1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
330   %l2 = shufflevector <4 x i8> %j2, <4 x i8> %k2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
331   %e1 = zext <8 x i8> %l1 to <8 x i32>
332   %e2 = zext <8 x i8> %l2 to <8 x i32>
333   %e3 = shl <8 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
334   %a = add <8 x i32> %e1, %e3
335   ret <8 x i32> %a
338 define <8 x i32> @load_bv_v4i16_i32(ptr %p, ptr %q) {
339 ; CHECK-LABEL: load_bv_v4i16_i32:
340 ; CHECK:       // %bb.0:
341 ; CHECK-NEXT:    ldr q0, [x0]
342 ; CHECK-NEXT:    ldr q1, [x1]
343 ; CHECK-NEXT:    ushll2 v2.4s, v0.8h, #3
344 ; CHECK-NEXT:    ushll2 v3.4s, v1.8h, #3
345 ; CHECK-NEXT:    uaddw v0.4s, v2.4s, v0.4h
346 ; CHECK-NEXT:    uaddw v1.4s, v3.4s, v1.4h
347 ; CHECK-NEXT:    ret
348   %j1 = load <4 x i16>, ptr %p
349   %p1 = getelementptr i8, ptr %p, i32 8
350   %j2 = load <4 x i16>, ptr %p1
351   %k1 = load <4 x i16>, ptr %q
352   %q1 = getelementptr i8, ptr %q, i32 8
353   %k2 = load <4 x i16>, ptr %q1
354   %l1 = shufflevector <4 x i16> %j1, <4 x i16> %k1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
355   %l2 = shufflevector <4 x i16> %j2, <4 x i16> %k2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
356   %e1 = zext <8 x i16> %l1 to <8 x i32>
357   %e2 = zext <8 x i16> %l2 to <8 x i32>
358   %e3 = shl <8 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
359   %a = add <8 x i32> %e1, %e3
360   ret <8 x i32> %a
363 define <12 x i32> @load_bv_3xv4i8_i32(ptr %p, ptr %q, ptr %r) {
364 ; CHECK-LABEL: load_bv_3xv4i8_i32:
365 ; CHECK:       // %bb.0:
366 ; CHECK-NEXT:    ldp s0, s1, [x0]
367 ; CHECK-NEXT:    ld1 { v0.s }[1], [x1], #4
368 ; CHECK-NEXT:    ldp s3, s2, [x2]
369 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
370 ; CHECK-NEXT:    ld1 { v1.s }[1], [x1]
371 ; CHECK-NEXT:    ushll v2.8h, v2.8b, #0
372 ; CHECK-NEXT:    ushll v3.8h, v3.8b, #0
373 ; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
374 ; CHECK-NEXT:    ushll v2.4s, v2.4h, #3
375 ; CHECK-NEXT:    ushll2 v4.4s, v1.8h, #3
376 ; CHECK-NEXT:    ushll v1.4s, v1.4h, #3
377 ; CHECK-NEXT:    uaddw v2.4s, v2.4s, v3.4h
378 ; CHECK-NEXT:    uaddw2 v3.4s, v4.4s, v0.8h
379 ; CHECK-NEXT:    uaddw v0.4s, v1.4s, v0.4h
380 ; CHECK-NEXT:    stp q3, q2, [x8, #16]
381 ; CHECK-NEXT:    str q0, [x8]
382 ; CHECK-NEXT:    ret
383   %j1 = load <4 x i8>, ptr %p
384   %p1 = getelementptr i8, ptr %p, i32 4
385   %j2 = load <4 x i8>, ptr %p1
386   %k1 = load <4 x i8>, ptr %q
387   %q1 = getelementptr i8, ptr %q, i32 4
388   %k2 = load <4 x i8>, ptr %q1
389   %m1 = load <4 x i8>, ptr %r
390   %r1 = getelementptr i8, ptr %r, i32 4
391   %m2 = load <4 x i8>, ptr %r1
392   %jk1 = shufflevector <4 x i8> %j1, <4 x i8> %k1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
393   %jk2 = shufflevector <4 x i8> %j2, <4 x i8> %k2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
394   %mn1 = shufflevector <4 x i8> %m1, <4 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
395   %mn2 = shufflevector <4 x i8> %m2, <4 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
396   %l1 = shufflevector <8 x i8> %jk1, <8 x i8> %mn1, <12 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>
397   %l2 = shufflevector <8 x i8> %jk2, <8 x i8> %mn2, <12 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>
398   %e1 = zext <12 x i8> %l1 to <12 x i32>
399   %e2 = zext <12 x i8> %l2 to <12 x i32>
400   %e3 = shl <12 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
401   %a = add <12 x i32> %e1, %e3
402   ret <12 x i32> %a
405 define <16 x i16> @load_bv_4xv4i8_i32(ptr %p, ptr %q, ptr %r, ptr %s) {
406 ; CHECK-LABEL: load_bv_4xv4i8_i32:
407 ; CHECK:       // %bb.0:
408 ; CHECK-NEXT:    ldp s0, s1, [x0]
409 ; CHECK-NEXT:    ld1 { v0.s }[1], [x1], #4
410 ; CHECK-NEXT:    ldp s2, s3, [x2]
411 ; CHECK-NEXT:    ld1 { v1.s }[1], [x1]
412 ; CHECK-NEXT:    ld1 { v2.s }[1], [x3], #4
413 ; CHECK-NEXT:    uaddl v0.8h, v0.8b, v1.8b
414 ; CHECK-NEXT:    ld1 { v3.s }[1], [x3]
415 ; CHECK-NEXT:    uaddl v1.8h, v2.8b, v3.8b
416 ; CHECK-NEXT:    ret
417   %j1 = load <4 x i8>, ptr %p
418   %p1 = getelementptr i8, ptr %p, i32 4
419   %j2 = load <4 x i8>, ptr %p1
420   %k1 = load <4 x i8>, ptr %q
421   %q1 = getelementptr i8, ptr %q, i32 4
422   %k2 = load <4 x i8>, ptr %q1
423   %m1 = load <4 x i8>, ptr %r
424   %r1 = getelementptr i8, ptr %r, i32 4
425   %m2 = load <4 x i8>, ptr %r1
426   %n1 = load <4 x i8>, ptr %s
427   %s1 = getelementptr i8, ptr %s, i32 4
428   %n2 = load <4 x i8>, ptr %s1
429   %jk1 = shufflevector <4 x i8> %j1, <4 x i8> %k1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
430   %jk2 = shufflevector <4 x i8> %j2, <4 x i8> %k2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
431   %mn1 = shufflevector <4 x i8> %m1, <4 x i8> %n1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
432   %mn2 = shufflevector <4 x i8> %m2, <4 x i8> %n2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
433   %l1 = shufflevector <8 x i8> %jk1, <8 x i8> %mn1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
434   %l2 = shufflevector <8 x i8> %jk2, <8 x i8> %mn2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
435   %e1 = zext <16 x i8> %l1 to <16 x i16>
436   %e2 = zext <16 x i8> %l2 to <16 x i16>
437   %e3 = shl <16 x i16> %e2, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
438   %a = add <16 x i16> %e1, %e2
439   ret <16 x i16> %a
442 define <8 x i32> @double_bv_2xv4i8_i32(ptr %p, ptr %q, ptr %r, ptr %s) {
443 ; CHECK-LABEL: double_bv_2xv4i8_i32:
444 ; CHECK:       // %bb.0:
445 ; CHECK-NEXT:    ldp s0, s1, [x0]
446 ; CHECK-NEXT:    ld1 { v0.s }[1], [x1], #4
447 ; CHECK-NEXT:    ldp s2, s3, [x2]
448 ; CHECK-NEXT:    ld1 { v1.s }[1], [x1]
449 ; CHECK-NEXT:    ld1 { v2.s }[1], [x3], #4
450 ; CHECK-NEXT:    usubl v0.8h, v0.8b, v1.8b
451 ; CHECK-NEXT:    ld1 { v3.s }[1], [x3]
452 ; CHECK-NEXT:    usubl v2.8h, v2.8b, v3.8b
453 ; CHECK-NEXT:    shll v3.4s, v2.4h, #16
454 ; CHECK-NEXT:    shll2 v1.4s, v2.8h, #16
455 ; CHECK-NEXT:    saddw2 v1.4s, v1.4s, v0.8h
456 ; CHECK-NEXT:    saddw v0.4s, v3.4s, v0.4h
457 ; CHECK-NEXT:    ret
458   %j1 = load <4 x i8>, ptr %p
459   %p1 = getelementptr i8, ptr %p, i32 4
460   %j2 = load <4 x i8>, ptr %p1
461   %k1 = load <4 x i8>, ptr %q
462   %q1 = getelementptr i8, ptr %q, i32 4
463   %k2 = load <4 x i8>, ptr %q1
464   %m1 = load <4 x i8>, ptr %r
465   %r1 = getelementptr i8, ptr %r, i32 4
466   %m2 = load <4 x i8>, ptr %r1
467   %n1 = load <4 x i8>, ptr %s
468   %s1 = getelementptr i8, ptr %s, i32 4
469   %n2 = load <4 x i8>, ptr %s1
470   %jk1 = shufflevector <4 x i8> %j1, <4 x i8> %k1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
471   %jk2 = shufflevector <4 x i8> %j2, <4 x i8> %k2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
472   %mn1 = shufflevector <4 x i8> %m1, <4 x i8> %n1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
473   %mn2 = shufflevector <4 x i8> %m2, <4 x i8> %n2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
474   %ejk1 = zext <8 x i8> %jk1 to <8 x i16>
475   %ejk2 = zext <8 x i8> %jk2 to <8 x i16>
476   %ajk = sub <8 x i16> %ejk1, %ejk2
477   %enm1 = zext <8 x i8> %mn1 to <8 x i16>
478   %enm2 = zext <8 x i8> %mn2 to <8 x i16>
479   %anm = sub <8 x i16> %enm1, %enm2
480   %x = sext <8 x i16> %ajk to <8 x i32>
481   %y = zext <8 x i16> %anm to <8 x i32>
482   %ys = shl <8 x i32> %y, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
483   %a = add <8 x i32> %x, %ys
484   ret <8 x i32> %a
487 define <16 x i32> @double_bv_4xv4i8_i32(ptr %p, ptr %q, ptr %r, ptr %s, ptr %t, ptr %u, ptr %v, ptr %w) {
488 ; CHECK-LABEL: double_bv_4xv4i8_i32:
489 ; CHECK:       // %bb.0:
490 ; CHECK-NEXT:    ldp s0, s1, [x0]
491 ; CHECK-NEXT:    ld1 { v0.s }[1], [x1], #4
492 ; CHECK-NEXT:    ldp s2, s3, [x2]
493 ; CHECK-NEXT:    ld1 { v1.s }[1], [x1]
494 ; CHECK-NEXT:    ld1 { v2.s }[1], [x3], #4
495 ; CHECK-NEXT:    ldp s4, s5, [x4]
496 ; CHECK-NEXT:    usubl v1.8h, v0.8b, v1.8b
497 ; CHECK-NEXT:    ld1 { v3.s }[1], [x3]
498 ; CHECK-NEXT:    ld1 { v4.s }[1], [x5], #4
499 ; CHECK-NEXT:    ldp s6, s7, [x6]
500 ; CHECK-NEXT:    usubl v2.8h, v2.8b, v3.8b
501 ; CHECK-NEXT:    ld1 { v5.s }[1], [x5]
502 ; CHECK-NEXT:    ld1 { v6.s }[1], [x7], #4
503 ; CHECK-NEXT:    usubl v4.8h, v4.8b, v5.8b
504 ; CHECK-NEXT:    ld1 { v7.s }[1], [x7]
505 ; CHECK-NEXT:    usubl v5.8h, v6.8b, v7.8b
506 ; CHECK-NEXT:    shll v0.4s, v4.4h, #16
507 ; CHECK-NEXT:    shll2 v4.4s, v4.8h, #16
508 ; CHECK-NEXT:    saddw v0.4s, v0.4s, v1.4h
509 ; CHECK-NEXT:    saddw2 v1.4s, v4.4s, v1.8h
510 ; CHECK-NEXT:    shll v6.4s, v5.4h, #16
511 ; CHECK-NEXT:    shll2 v3.4s, v5.8h, #16
512 ; CHECK-NEXT:    saddw2 v3.4s, v3.4s, v2.8h
513 ; CHECK-NEXT:    saddw v2.4s, v6.4s, v2.4h
514 ; CHECK-NEXT:    ret
515   %j1 = load <4 x i8>, ptr %p
516   %p1 = getelementptr i8, ptr %p, i32 4
517   %j2 = load <4 x i8>, ptr %p1
518   %k1 = load <4 x i8>, ptr %q
519   %q1 = getelementptr i8, ptr %q, i32 4
520   %k2 = load <4 x i8>, ptr %q1
521   %m1 = load <4 x i8>, ptr %r
522   %r1 = getelementptr i8, ptr %r, i32 4
523   %m2 = load <4 x i8>, ptr %r1
524   %n1 = load <4 x i8>, ptr %s
525   %s1 = getelementptr i8, ptr %s, i32 4
526   %n2 = load <4 x i8>, ptr %s1
527   %j3 = load <4 x i8>, ptr %t
528   %t3 = getelementptr i8, ptr %t, i32 4
529   %j4 = load <4 x i8>, ptr %t3
530   %k3 = load <4 x i8>, ptr %u
531   %u3 = getelementptr i8, ptr %u, i32 4
532   %k4 = load <4 x i8>, ptr %u3
533   %m3 = load <4 x i8>, ptr %v
534   %v3 = getelementptr i8, ptr %v, i32 4
535   %m4 = load <4 x i8>, ptr %v3
536   %n3 = load <4 x i8>, ptr %w
537   %w3 = getelementptr i8, ptr %w, i32 4
538   %n4 = load <4 x i8>, ptr %w3
539   %jk1 = shufflevector <4 x i8> %j1, <4 x i8> %k1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
540   %jk2 = shufflevector <4 x i8> %j2, <4 x i8> %k2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
541   %mn1 = shufflevector <4 x i8> %m1, <4 x i8> %n1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
542   %mn2 = shufflevector <4 x i8> %m2, <4 x i8> %n2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
543   %jk3 = shufflevector <4 x i8> %j3, <4 x i8> %k3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
544   %jk4 = shufflevector <4 x i8> %j4, <4 x i8> %k4, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
545   %mn3 = shufflevector <4 x i8> %m3, <4 x i8> %n3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
546   %mn4 = shufflevector <4 x i8> %m4, <4 x i8> %n4, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
547   %l1 = shufflevector <8 x i8> %jk1, <8 x i8> %mn1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
548   %l2 = shufflevector <8 x i8> %jk2, <8 x i8> %mn2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
549   %l3 = shufflevector <8 x i8> %jk3, <8 x i8> %mn3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
550   %l4 = shufflevector <8 x i8> %jk4, <8 x i8> %mn4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
551   %ejk1 = zext <16 x i8> %l1 to <16 x i16>
552   %ejk2 = zext <16 x i8> %l2 to <16 x i16>
553   %ajk = sub <16 x i16> %ejk1, %ejk2
554   %enm1 = zext <16 x i8> %l3 to <16 x i16>
555   %enm2 = zext <16 x i8> %l4 to <16 x i16>
556   %anm = sub <16 x i16> %enm1, %enm2
557   %x = sext <16 x i16> %ajk to <16 x i32>
558   %y = zext <16 x i16> %anm to <16 x i32>
559   %ys = shl <16 x i32> %y, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
560   %a = add <16 x i32> %x, %ys
561   ret <16 x i32> %a
564 define <16 x i32> @double2_bv_4xv4i8_i32(ptr %p, ptr %q, ptr %r, ptr %s, ptr %t, ptr %u, ptr %v, ptr %w) {
565 ; CHECK-LABEL: double2_bv_4xv4i8_i32:
566 ; CHECK:       // %bb.0:
567 ; CHECK-NEXT:    ldr d0, [x2]
568 ; CHECK-NEXT:    ldr d1, [x0]
569 ; CHECK-NEXT:    ldr d2, [x1]
570 ; CHECK-NEXT:    ldr d3, [x3]
571 ; CHECK-NEXT:    ldr d4, [x4]
572 ; CHECK-NEXT:    ldr d5, [x5]
573 ; CHECK-NEXT:    ldr d6, [x6]
574 ; CHECK-NEXT:    ldr d7, [x7]
575 ; CHECK-NEXT:    usubl v1.8h, v1.8b, v4.8b
576 ; CHECK-NEXT:    usubl v2.8h, v2.8b, v5.8b
577 ; CHECK-NEXT:    usubl v3.8h, v3.8b, v7.8b
578 ; CHECK-NEXT:    usubl v4.8h, v0.8b, v6.8b
579 ; CHECK-NEXT:    shll2 v0.4s, v1.8h, #16
580 ; CHECK-NEXT:    shll2 v5.4s, v2.8h, #16
581 ; CHECK-NEXT:    shll2 v6.4s, v4.8h, #16
582 ; CHECK-NEXT:    shll2 v7.4s, v3.8h, #16
583 ; CHECK-NEXT:    saddw v0.4s, v0.4s, v1.4h
584 ; CHECK-NEXT:    saddw v1.4s, v5.4s, v2.4h
585 ; CHECK-NEXT:    saddw v2.4s, v6.4s, v4.4h
586 ; CHECK-NEXT:    saddw v3.4s, v7.4s, v3.4h
587 ; CHECK-NEXT:    ret
588   %j1 = load <4 x i8>, ptr %p
589   %p1 = getelementptr i8, ptr %p, i32 4
590   %j2 = load <4 x i8>, ptr %p1
591   %k1 = load <4 x i8>, ptr %q
592   %q1 = getelementptr i8, ptr %q, i32 4
593   %k2 = load <4 x i8>, ptr %q1
594   %m1 = load <4 x i8>, ptr %r
595   %r1 = getelementptr i8, ptr %r, i32 4
596   %m2 = load <4 x i8>, ptr %r1
597   %n1 = load <4 x i8>, ptr %s
598   %s1 = getelementptr i8, ptr %s, i32 4
599   %n2 = load <4 x i8>, ptr %s1
600   %j3 = load <4 x i8>, ptr %t
601   %t3 = getelementptr i8, ptr %t, i32 4
602   %j4 = load <4 x i8>, ptr %t3
603   %k3 = load <4 x i8>, ptr %u
604   %u3 = getelementptr i8, ptr %u, i32 4
605   %k4 = load <4 x i8>, ptr %u3
606   %m3 = load <4 x i8>, ptr %v
607   %v3 = getelementptr i8, ptr %v, i32 4
608   %m4 = load <4 x i8>, ptr %v3
609   %n3 = load <4 x i8>, ptr %w
610   %w3 = getelementptr i8, ptr %w, i32 4
611   %n4 = load <4 x i8>, ptr %w3
612   %jk1 = shufflevector <4 x i8> %j1, <4 x i8> %k1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
613   %m1l = shufflevector <4 x i8> %m1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
614   %jkm1 = shufflevector <16 x i8> %jk1, <16 x i8> %m1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
615   %n1l = shufflevector <4 x i8> %n1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
616   %l1 = shufflevector <16 x i8> %jkm1, <16 x i8> %n1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
617   %jk2 = shufflevector <4 x i8> %j2, <4 x i8> %k2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
618   %m2l = shufflevector <4 x i8> %m2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
619   %jkm2 = shufflevector <16 x i8> %jk2, <16 x i8> %m2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
620   %n2l = shufflevector <4 x i8> %n2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
621   %l2 = shufflevector <16 x i8> %jkm2, <16 x i8> %n2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
622   %jk3 = shufflevector <4 x i8> %j3, <4 x i8> %k3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
623   %m3l = shufflevector <4 x i8> %m3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
624   %jkm3 = shufflevector <16 x i8> %jk3, <16 x i8> %m3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
625   %n3l = shufflevector <4 x i8> %n3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
626   %l3 = shufflevector <16 x i8> %jkm3, <16 x i8> %n3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
627   %jk4 = shufflevector <4 x i8> %j4, <4 x i8> %k4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
628   %m4l = shufflevector <4 x i8> %m4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
629   %jkm4 = shufflevector <16 x i8> %jk4, <16 x i8> %m4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
630   %n4l = shufflevector <4 x i8> %n4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
631   %l4 = shufflevector <16 x i8> %jkm4, <16 x i8> %n4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
632   %ejk1 = zext <16 x i8> %l1 to <16 x i16>
633   %ejk2 = zext <16 x i8> %l3 to <16 x i16>
634   %ajk = sub <16 x i16> %ejk1, %ejk2
635   %enm1 = zext <16 x i8> %l2 to <16 x i16>
636   %enm2 = zext <16 x i8> %l4 to <16 x i16>
637   %anm = sub <16 x i16> %enm1, %enm2
638   %x = sext <16 x i16> %ajk to <16 x i32>
639   %y = zext <16 x i16> %anm to <16 x i32>
640   %ys = shl <16 x i32> %y, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
641   %a = add <16 x i32> %x, %ys
642   ret <16 x i32> %a
645 define <16 x i32> @extrause_load(ptr %p, ptr %q, ptr %r, ptr %s, ptr %z) {
646 ; CHECK-LABEL: extrause_load:
647 ; CHECK:       // %bb.0:
648 ; CHECK-NEXT:    ldr s0, [x0]
649 ; CHECK-NEXT:    add x8, x3, #8
650 ; CHECK-NEXT:    add x11, x1, #12
651 ; CHECK-NEXT:    str s0, [x4]
652 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
653 ; CHECK-NEXT:    ldp s1, s5, [x2]
654 ; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
655 ; CHECK-NEXT:    umov w9, v1.h[0]
656 ; CHECK-NEXT:    umov w10, v1.h[1]
657 ; CHECK-NEXT:    mov v2.b[8], w9
658 ; CHECK-NEXT:    umov w9, v1.h[2]
659 ; CHECK-NEXT:    mov v2.b[9], w10
660 ; CHECK-NEXT:    umov w10, v1.h[3]
661 ; CHECK-NEXT:    ldr s1, [x1]
662 ; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
663 ; CHECK-NEXT:    mov v2.b[10], w9
664 ; CHECK-NEXT:    add x9, x1, #4
665 ; CHECK-NEXT:    uzp1 v0.8b, v0.8b, v1.8b
666 ; CHECK-NEXT:    mov v2.b[11], w10
667 ; CHECK-NEXT:    add x10, x3, #12
668 ; CHECK-NEXT:    ld1 { v2.s }[3], [x3], #4
669 ; CHECK-NEXT:    ldr s4, [x0, #12]
670 ; CHECK-NEXT:    ldp s3, s16, [x0, #4]
671 ; CHECK-NEXT:    ldp s6, s7, [x2, #8]
672 ; CHECK-NEXT:    ld1 { v4.s }[1], [x11]
673 ; CHECK-NEXT:    ld1 { v5.s }[1], [x3]
674 ; CHECK-NEXT:    ld1 { v3.s }[1], [x9]
675 ; CHECK-NEXT:    ld1 { v6.s }[1], [x8]
676 ; CHECK-NEXT:    ld1 { v7.s }[1], [x10]
677 ; CHECK-NEXT:    add x8, x1, #8
678 ; CHECK-NEXT:    ld1 { v16.s }[1], [x8]
679 ; CHECK-NEXT:    uaddl v1.8h, v3.8b, v4.8b
680 ; CHECK-NEXT:    ushll v3.8h, v6.8b, #0
681 ; CHECK-NEXT:    uaddl v4.8h, v5.8b, v7.8b
682 ; CHECK-NEXT:    uaddl v5.8h, v0.8b, v16.8b
683 ; CHECK-NEXT:    uaddw2 v2.8h, v3.8h, v2.16b
684 ; CHECK-NEXT:    ushll v0.4s, v1.4h, #3
685 ; CHECK-NEXT:    ushll2 v1.4s, v1.8h, #3
686 ; CHECK-NEXT:    ushll v6.4s, v4.4h, #3
687 ; CHECK-NEXT:    ushll2 v3.4s, v4.8h, #3
688 ; CHECK-NEXT:    uaddw v0.4s, v0.4s, v5.4h
689 ; CHECK-NEXT:    uaddw2 v1.4s, v1.4s, v5.8h
690 ; CHECK-NEXT:    uaddw2 v3.4s, v3.4s, v2.8h
691 ; CHECK-NEXT:    uaddw v2.4s, v6.4s, v2.4h
692 ; CHECK-NEXT:    ret
693   %lp1 = load <4 x i8>, ptr %p
694   store <4 x i8> %lp1, ptr %z
695   %p2 = getelementptr i8, ptr %p, i32 4
696   %lp2 = load <4 x i8>, ptr %p2
697   %p3 = getelementptr i8, ptr %p, i32 8
698   %lp3 = load <4 x i8>, ptr %p3
699   %p4 = getelementptr i8, ptr %p, i32 12
700   %lp4 = load <4 x i8>, ptr %p4
701   %lq1 = load <4 x i8>, ptr %q
702   %q2 = getelementptr i8, ptr %q, i32 4
703   %lq2 = load <4 x i8>, ptr %q2
704   %q3 = getelementptr i8, ptr %q, i32 8
705   %lq3 = load <4 x i8>, ptr %q3
706   %q4 = getelementptr i8, ptr %q, i32 12
707   %lq4 = load <4 x i8>, ptr %q4
708   %lr1 = load <4 x i8>, ptr %r
709   %r2 = getelementptr i8, ptr %r, i32 4
710   %lr2 = load <4 x i8>, ptr %r2
711   %r3 = getelementptr i8, ptr %r, i32 8
712   %lr3 = load <4 x i8>, ptr %r3
713   %r4 = getelementptr i8, ptr %r, i32 12
714   %lr4 = load <4 x i8>, ptr %r4
715   %ls1 = load <4 x i8>, ptr %s
716   %s2 = getelementptr i8, ptr %s, i32 4
717   %ls2 = load <4 x i8>, ptr %s2
718   %s3 = getelementptr i8, ptr %s, i32 8
719   %ls3 = load <4 x i8>, ptr %s3
720   %s4 = getelementptr i8, ptr %s, i32 12
721   %ls4 = load <4 x i8>, ptr %s4
723   %jk1 = shufflevector <4 x i8> %lp1, <4 x i8> %lq1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
724   %m1l = shufflevector <4 x i8> %lr1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
725   %jkm1 = shufflevector <16 x i8> %jk1, <16 x i8> %m1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
726   %n1l = shufflevector <4 x i8> %ls1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
727   %l1 = shufflevector <16 x i8> %jkm1, <16 x i8> %n1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
728   %jk2 = shufflevector <4 x i8> %lp2, <4 x i8> %lq2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
729   %m2l = shufflevector <4 x i8> %lr2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
730   %jkm2 = shufflevector <16 x i8> %jk2, <16 x i8> %m2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
731   %n2l = shufflevector <4 x i8> %ls2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
732   %l2 = shufflevector <16 x i8> %jkm2, <16 x i8> %n2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
733   %jk3 = shufflevector <4 x i8> %lp3, <4 x i8> %lq3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
734   %m3l = shufflevector <4 x i8> %lr3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
735   %jkm3 = shufflevector <16 x i8> %jk3, <16 x i8> %m3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
736   %n3l = shufflevector <4 x i8> %ls3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
737   %l3 = shufflevector <16 x i8> %jkm3, <16 x i8> %n3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
738   %jk4 = shufflevector <4 x i8> %lp4, <4 x i8> %lq4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
739   %m4l = shufflevector <4 x i8> %lr4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
740   %jkm4 = shufflevector <16 x i8> %jk4, <16 x i8> %m4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
741   %n4l = shufflevector <4 x i8> %ls4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
742   %l4 = shufflevector <16 x i8> %jkm4, <16 x i8> %n4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
744   %le11 = zext <16 x i8> %l1 to <16 x i16>
745   %le12 = zext <16 x i8> %l3 to <16 x i16>
746   %le21 = zext <16 x i8> %l2 to <16 x i16>
747   %le22 = zext <16 x i8> %l4 to <16 x i16>
748   %la1 = add <16 x i16> %le11, %le12
749   %la2 = add <16 x i16> %le21, %le22
750   %e1 = zext <16 x i16> %la1 to <16 x i32>
751   %e2 = zext <16 x i16> %la2 to <16 x i32>
752   %se2 = shl <16 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
753   %a = add <16 x i32> %e1, %se2
754   ret <16 x i32> %a
757 define <16 x i32> @extrause_shuffle(ptr %p, ptr %q, ptr %r, ptr %s, ptr %z) {
758 ; CHECK-LABEL: extrause_shuffle:
759 ; CHECK:       // %bb.0:
760 ; CHECK-NEXT:    ldp s2, s3, [x0, #8]
761 ; CHECK-NEXT:    add x8, x3, #8
762 ; CHECK-NEXT:    ldr s16, [x1, #12]
763 ; CHECK-NEXT:    ldp s0, s1, [x2]
764 ; CHECK-NEXT:    ldp s6, s7, [x0]
765 ; CHECK-NEXT:    add x9, x1, #8
766 ; CHECK-NEXT:    mov v4.16b, v3.16b
767 ; CHECK-NEXT:    ldp s17, s18, [x2, #8]
768 ; CHECK-NEXT:    ldr s5, [x3, #12]
769 ; CHECK-NEXT:    mov v3.s[1], v16.s[0]
770 ; CHECK-NEXT:    ld1 { v0.s }[1], [x3], #4
771 ; CHECK-NEXT:    mov v4.s[1], v16.s[0]
772 ; CHECK-NEXT:    ld1 { v6.s }[1], [x1], #4
773 ; CHECK-NEXT:    ld1 { v2.s }[1], [x9]
774 ; CHECK-NEXT:    ld1 { v17.s }[1], [x8]
775 ; CHECK-NEXT:    ld1 { v1.s }[1], [x3]
776 ; CHECK-NEXT:    ld1 { v7.s }[1], [x1]
777 ; CHECK-NEXT:    mov v4.s[2], v18.s[0]
778 ; CHECK-NEXT:    mov v18.s[1], v5.s[0]
779 ; CHECK-NEXT:    uaddl v2.8h, v6.8b, v2.8b
780 ; CHECK-NEXT:    uaddl v6.8h, v0.8b, v17.8b
781 ; CHECK-NEXT:    uaddl v3.8h, v7.8b, v3.8b
782 ; CHECK-NEXT:    uaddl v1.8h, v1.8b, v18.8b
783 ; CHECK-NEXT:    mov v4.s[3], v5.s[0]
784 ; CHECK-NEXT:    ushll v0.4s, v3.4h, #3
785 ; CHECK-NEXT:    ushll v7.4s, v1.4h, #3
786 ; CHECK-NEXT:    ushll2 v16.4s, v1.8h, #3
787 ; CHECK-NEXT:    ushll2 v1.4s, v3.8h, #3
788 ; CHECK-NEXT:    uaddw v0.4s, v0.4s, v2.4h
789 ; CHECK-NEXT:    str q4, [x4]
790 ; CHECK-NEXT:    uaddw2 v1.4s, v1.4s, v2.8h
791 ; CHECK-NEXT:    uaddw2 v3.4s, v16.4s, v6.8h
792 ; CHECK-NEXT:    uaddw v2.4s, v7.4s, v6.4h
793 ; CHECK-NEXT:    ret
794   %lp1 = load <4 x i8>, ptr %p
795   %p2 = getelementptr i8, ptr %p, i32 4
796   %lp2 = load <4 x i8>, ptr %p2
797   %p3 = getelementptr i8, ptr %p, i32 8
798   %lp3 = load <4 x i8>, ptr %p3
799   %p4 = getelementptr i8, ptr %p, i32 12
800   %lp4 = load <4 x i8>, ptr %p4
801   %lq1 = load <4 x i8>, ptr %q
802   %q2 = getelementptr i8, ptr %q, i32 4
803   %lq2 = load <4 x i8>, ptr %q2
804   %q3 = getelementptr i8, ptr %q, i32 8
805   %lq3 = load <4 x i8>, ptr %q3
806   %q4 = getelementptr i8, ptr %q, i32 12
807   %lq4 = load <4 x i8>, ptr %q4
808   %lr1 = load <4 x i8>, ptr %r
809   %r2 = getelementptr i8, ptr %r, i32 4
810   %lr2 = load <4 x i8>, ptr %r2
811   %r3 = getelementptr i8, ptr %r, i32 8
812   %lr3 = load <4 x i8>, ptr %r3
813   %r4 = getelementptr i8, ptr %r, i32 12
814   %lr4 = load <4 x i8>, ptr %r4
815   %ls1 = load <4 x i8>, ptr %s
816   %s2 = getelementptr i8, ptr %s, i32 4
817   %ls2 = load <4 x i8>, ptr %s2
818   %s3 = getelementptr i8, ptr %s, i32 8
819   %ls3 = load <4 x i8>, ptr %s3
820   %s4 = getelementptr i8, ptr %s, i32 12
821   %ls4 = load <4 x i8>, ptr %s4
823   %jk1 = shufflevector <4 x i8> %lp1, <4 x i8> %lq1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
824   %m1l = shufflevector <4 x i8> %lr1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
825   %jkm1 = shufflevector <16 x i8> %jk1, <16 x i8> %m1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
826   %n1l = shufflevector <4 x i8> %ls1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
827   %l1 = shufflevector <16 x i8> %jkm1, <16 x i8> %n1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
828   %jk2 = shufflevector <4 x i8> %lp2, <4 x i8> %lq2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
829   %m2l = shufflevector <4 x i8> %lr2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
830   %jkm2 = shufflevector <16 x i8> %jk2, <16 x i8> %m2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
831   %n2l = shufflevector <4 x i8> %ls2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
832   %l2 = shufflevector <16 x i8> %jkm2, <16 x i8> %n2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
833   %jk3 = shufflevector <4 x i8> %lp3, <4 x i8> %lq3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
834   %m3l = shufflevector <4 x i8> %lr3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
835   %jkm3 = shufflevector <16 x i8> %jk3, <16 x i8> %m3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
836   %n3l = shufflevector <4 x i8> %ls3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
837   %l3 = shufflevector <16 x i8> %jkm3, <16 x i8> %n3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
838   %jk4 = shufflevector <4 x i8> %lp4, <4 x i8> %lq4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
839   %m4l = shufflevector <4 x i8> %lr4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
840   %jkm4 = shufflevector <16 x i8> %jk4, <16 x i8> %m4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
841   %n4l = shufflevector <4 x i8> %ls4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
842   %l4 = shufflevector <16 x i8> %jkm4, <16 x i8> %n4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
843   store <16 x i8> %l4, ptr %z
845   %le11 = zext <16 x i8> %l1 to <16 x i16>
846   %le12 = zext <16 x i8> %l3 to <16 x i16>
847   %le21 = zext <16 x i8> %l2 to <16 x i16>
848   %le22 = zext <16 x i8> %l4 to <16 x i16>
849   %la1 = add <16 x i16> %le11, %le12
850   %la2 = add <16 x i16> %le21, %le22
851   %e1 = zext <16 x i16> %la1 to <16 x i32>
852   %e2 = zext <16 x i16> %la2 to <16 x i32>
853   %se2 = shl <16 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
854   %a = add <16 x i32> %e1, %se2
855   ret <16 x i32> %a
858 define <16 x i32> @extrause_ext(ptr %p, ptr %q, ptr %r, ptr %s, ptr %z) {
859 ; CHECK-LABEL: extrause_ext:
860 ; CHECK:       // %bb.0:
861 ; CHECK-NEXT:    ldp s0, s1, [x2]
862 ; CHECK-NEXT:    add x8, x3, #8
863 ; CHECK-NEXT:    ldp s2, s3, [x0]
864 ; CHECK-NEXT:    add x9, x1, #8
865 ; CHECK-NEXT:    add x10, x3, #12
866 ; CHECK-NEXT:    ldp s4, s5, [x2, #8]
867 ; CHECK-NEXT:    ldp s6, s7, [x0, #8]
868 ; CHECK-NEXT:    add x11, x1, #12
869 ; CHECK-NEXT:    ld1 { v0.s }[1], [x3], #4
870 ; CHECK-NEXT:    ld1 { v2.s }[1], [x1], #4
871 ; CHECK-NEXT:    ld1 { v5.s }[1], [x10]
872 ; CHECK-NEXT:    ld1 { v7.s }[1], [x11]
873 ; CHECK-NEXT:    ld1 { v6.s }[1], [x9]
874 ; CHECK-NEXT:    ld1 { v4.s }[1], [x8]
875 ; CHECK-NEXT:    ld1 { v1.s }[1], [x3]
876 ; CHECK-NEXT:    ld1 { v3.s }[1], [x1]
877 ; CHECK-NEXT:    uaddl v2.8h, v2.8b, v6.8b
878 ; CHECK-NEXT:    uaddl v4.8h, v0.8b, v4.8b
879 ; CHECK-NEXT:    uaddl v1.8h, v1.8b, v5.8b
880 ; CHECK-NEXT:    ushll v5.8h, v5.8b, #0
881 ; CHECK-NEXT:    uaddl v3.8h, v3.8b, v7.8b
882 ; CHECK-NEXT:    ushll v6.4s, v1.4h, #3
883 ; CHECK-NEXT:    ushll2 v16.4s, v1.8h, #3
884 ; CHECK-NEXT:    ushll v0.4s, v3.4h, #3
885 ; CHECK-NEXT:    ushll2 v1.4s, v3.8h, #3
886 ; CHECK-NEXT:    uaddw2 v3.4s, v16.4s, v4.8h
887 ; CHECK-NEXT:    uaddw v0.4s, v0.4s, v2.4h
888 ; CHECK-NEXT:    uaddw2 v1.4s, v1.4s, v2.8h
889 ; CHECK-NEXT:    uaddw v2.4s, v6.4s, v4.4h
890 ; CHECK-NEXT:    ushll v4.8h, v7.8b, #0
891 ; CHECK-NEXT:    stp q4, q5, [x4]
892 ; CHECK-NEXT:    ret
893   %lp1 = load <4 x i8>, ptr %p
894   %p2 = getelementptr i8, ptr %p, i32 4
895   %lp2 = load <4 x i8>, ptr %p2
896   %p3 = getelementptr i8, ptr %p, i32 8
897   %lp3 = load <4 x i8>, ptr %p3
898   %p4 = getelementptr i8, ptr %p, i32 12
899   %lp4 = load <4 x i8>, ptr %p4
900   %lq1 = load <4 x i8>, ptr %q
901   %q2 = getelementptr i8, ptr %q, i32 4
902   %lq2 = load <4 x i8>, ptr %q2
903   %q3 = getelementptr i8, ptr %q, i32 8
904   %lq3 = load <4 x i8>, ptr %q3
905   %q4 = getelementptr i8, ptr %q, i32 12
906   %lq4 = load <4 x i8>, ptr %q4
907   %lr1 = load <4 x i8>, ptr %r
908   %r2 = getelementptr i8, ptr %r, i32 4
909   %lr2 = load <4 x i8>, ptr %r2
910   %r3 = getelementptr i8, ptr %r, i32 8
911   %lr3 = load <4 x i8>, ptr %r3
912   %r4 = getelementptr i8, ptr %r, i32 12
913   %lr4 = load <4 x i8>, ptr %r4
914   %ls1 = load <4 x i8>, ptr %s
915   %s2 = getelementptr i8, ptr %s, i32 4
916   %ls2 = load <4 x i8>, ptr %s2
917   %s3 = getelementptr i8, ptr %s, i32 8
918   %ls3 = load <4 x i8>, ptr %s3
919   %s4 = getelementptr i8, ptr %s, i32 12
920   %ls4 = load <4 x i8>, ptr %s4
922   %jk1 = shufflevector <4 x i8> %lp1, <4 x i8> %lq1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
923   %m1l = shufflevector <4 x i8> %lr1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
924   %jkm1 = shufflevector <16 x i8> %jk1, <16 x i8> %m1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
925   %n1l = shufflevector <4 x i8> %ls1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
926   %l1 = shufflevector <16 x i8> %jkm1, <16 x i8> %n1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
927   %jk2 = shufflevector <4 x i8> %lp2, <4 x i8> %lq2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
928   %m2l = shufflevector <4 x i8> %lr2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
929   %jkm2 = shufflevector <16 x i8> %jk2, <16 x i8> %m2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
930   %n2l = shufflevector <4 x i8> %ls2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
931   %l2 = shufflevector <16 x i8> %jkm2, <16 x i8> %n2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
932   %jk3 = shufflevector <4 x i8> %lp3, <4 x i8> %lq3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
933   %m3l = shufflevector <4 x i8> %lr3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
934   %jkm3 = shufflevector <16 x i8> %jk3, <16 x i8> %m3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
935   %n3l = shufflevector <4 x i8> %ls3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
936   %l3 = shufflevector <16 x i8> %jkm3, <16 x i8> %n3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
937   %jk4 = shufflevector <4 x i8> %lp4, <4 x i8> %lq4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
938   %m4l = shufflevector <4 x i8> %lr4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
939   %jkm4 = shufflevector <16 x i8> %jk4, <16 x i8> %m4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
940   %n4l = shufflevector <4 x i8> %ls4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
941   %l4 = shufflevector <16 x i8> %jkm4, <16 x i8> %n4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
943   %le11 = zext <16 x i8> %l1 to <16 x i16>
944   %le12 = zext <16 x i8> %l3 to <16 x i16>
945   %le21 = zext <16 x i8> %l2 to <16 x i16>
946   %le22 = zext <16 x i8> %l4 to <16 x i16>
947   store <16 x i16> %le22, ptr %z
948   %la1 = add <16 x i16> %le11, %le12
949   %la2 = add <16 x i16> %le21, %le22
950   %e1 = zext <16 x i16> %la1 to <16 x i32>
951   %e2 = zext <16 x i16> %la2 to <16 x i32>
952   %se2 = shl <16 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
953   %a = add <16 x i32> %e1, %se2
954   ret <16 x i32> %a
957 define <16 x i32> @extrause_add(ptr %p, ptr %q, ptr %r, ptr %s, ptr %z) {
958 ; CHECK-LABEL: extrause_add:
959 ; CHECK:       // %bb.0:
960 ; CHECK-NEXT:    ldp s0, s1, [x0]
961 ; CHECK-NEXT:    add x8, x3, #8
962 ; CHECK-NEXT:    ldp s2, s3, [x2]
963 ; CHECK-NEXT:    add x9, x1, #8
964 ; CHECK-NEXT:    add x10, x3, #12
965 ; CHECK-NEXT:    ldp s4, s5, [x0, #8]
966 ; CHECK-NEXT:    ldp s6, s7, [x2, #8]
967 ; CHECK-NEXT:    add x11, x1, #12
968 ; CHECK-NEXT:    ld1 { v2.s }[1], [x3], #4
969 ; CHECK-NEXT:    ld1 { v0.s }[1], [x1], #4
970 ; CHECK-NEXT:    ld1 { v5.s }[1], [x11]
971 ; CHECK-NEXT:    ld1 { v7.s }[1], [x10]
972 ; CHECK-NEXT:    ld1 { v4.s }[1], [x9]
973 ; CHECK-NEXT:    ld1 { v6.s }[1], [x8]
974 ; CHECK-NEXT:    ld1 { v3.s }[1], [x3]
975 ; CHECK-NEXT:    ld1 { v1.s }[1], [x1]
976 ; CHECK-NEXT:    uaddl v2.8h, v2.8b, v6.8b
977 ; CHECK-NEXT:    uaddl v7.8h, v3.8b, v7.8b
978 ; CHECK-NEXT:    uaddl v5.8h, v1.8b, v5.8b
979 ; CHECK-NEXT:    uaddl v1.8h, v0.8b, v4.8b
980 ; CHECK-NEXT:    ushll v4.4s, v7.4h, #3
981 ; CHECK-NEXT:    ushll2 v3.4s, v7.8h, #3
982 ; CHECK-NEXT:    ushll v0.4s, v5.4h, #3
983 ; CHECK-NEXT:    ushll2 v6.4s, v5.8h, #3
984 ; CHECK-NEXT:    stp q5, q7, [x4]
985 ; CHECK-NEXT:    uaddw2 v3.4s, v3.4s, v2.8h
986 ; CHECK-NEXT:    uaddw v2.4s, v4.4s, v2.4h
987 ; CHECK-NEXT:    uaddw v0.4s, v0.4s, v1.4h
988 ; CHECK-NEXT:    uaddw2 v1.4s, v6.4s, v1.8h
989 ; CHECK-NEXT:    ret
990   %lp1 = load <4 x i8>, ptr %p
991   %p2 = getelementptr i8, ptr %p, i32 4
992   %lp2 = load <4 x i8>, ptr %p2
993   %p3 = getelementptr i8, ptr %p, i32 8
994   %lp3 = load <4 x i8>, ptr %p3
995   %p4 = getelementptr i8, ptr %p, i32 12
996   %lp4 = load <4 x i8>, ptr %p4
997   %lq1 = load <4 x i8>, ptr %q
998   %q2 = getelementptr i8, ptr %q, i32 4
999   %lq2 = load <4 x i8>, ptr %q2
1000   %q3 = getelementptr i8, ptr %q, i32 8
1001   %lq3 = load <4 x i8>, ptr %q3
1002   %q4 = getelementptr i8, ptr %q, i32 12
1003   %lq4 = load <4 x i8>, ptr %q4
1004   %lr1 = load <4 x i8>, ptr %r
1005   %r2 = getelementptr i8, ptr %r, i32 4
1006   %lr2 = load <4 x i8>, ptr %r2
1007   %r3 = getelementptr i8, ptr %r, i32 8
1008   %lr3 = load <4 x i8>, ptr %r3
1009   %r4 = getelementptr i8, ptr %r, i32 12
1010   %lr4 = load <4 x i8>, ptr %r4
1011   %ls1 = load <4 x i8>, ptr %s
1012   %s2 = getelementptr i8, ptr %s, i32 4
1013   %ls2 = load <4 x i8>, ptr %s2
1014   %s3 = getelementptr i8, ptr %s, i32 8
1015   %ls3 = load <4 x i8>, ptr %s3
1016   %s4 = getelementptr i8, ptr %s, i32 12
1017   %ls4 = load <4 x i8>, ptr %s4
1019   %jk1 = shufflevector <4 x i8> %lp1, <4 x i8> %lq1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1020   %m1l = shufflevector <4 x i8> %lr1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1021   %jkm1 = shufflevector <16 x i8> %jk1, <16 x i8> %m1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1022   %n1l = shufflevector <4 x i8> %ls1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1023   %l1 = shufflevector <16 x i8> %jkm1, <16 x i8> %n1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1024   %jk2 = shufflevector <4 x i8> %lp2, <4 x i8> %lq2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1025   %m2l = shufflevector <4 x i8> %lr2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1026   %jkm2 = shufflevector <16 x i8> %jk2, <16 x i8> %m2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1027   %n2l = shufflevector <4 x i8> %ls2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1028   %l2 = shufflevector <16 x i8> %jkm2, <16 x i8> %n2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1029   %jk3 = shufflevector <4 x i8> %lp3, <4 x i8> %lq3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1030   %m3l = shufflevector <4 x i8> %lr3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1031   %jkm3 = shufflevector <16 x i8> %jk3, <16 x i8> %m3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1032   %n3l = shufflevector <4 x i8> %ls3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1033   %l3 = shufflevector <16 x i8> %jkm3, <16 x i8> %n3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1034   %jk4 = shufflevector <4 x i8> %lp4, <4 x i8> %lq4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1035   %m4l = shufflevector <4 x i8> %lr4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1036   %jkm4 = shufflevector <16 x i8> %jk4, <16 x i8> %m4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1037   %n4l = shufflevector <4 x i8> %ls4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1038   %l4 = shufflevector <16 x i8> %jkm4, <16 x i8> %n4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1040   %le11 = zext <16 x i8> %l1 to <16 x i16>
1041   %le12 = zext <16 x i8> %l3 to <16 x i16>
1042   %le21 = zext <16 x i8> %l2 to <16 x i16>
1043   %le22 = zext <16 x i8> %l4 to <16 x i16>
1044   %la1 = add <16 x i16> %le11, %le12
1045   %la2 = add <16 x i16> %le21, %le22
1046   store <16 x i16> %la2, ptr %z
1047   %e1 = zext <16 x i16> %la1 to <16 x i32>
1048   %e2 = zext <16 x i16> %la2 to <16 x i32>
1049   %se2 = shl <16 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1050   %a = add <16 x i32> %e1, %se2
1051   ret <16 x i32> %a
1054 define <16 x i32> @extrause_ext2(ptr %p, ptr %q, ptr %r, ptr %s, ptr %z) {
1055 ; CHECK-LABEL: extrause_ext2:
1056 ; CHECK:       // %bb.0:
1057 ; CHECK-NEXT:    ldp s0, s1, [x2]
1058 ; CHECK-NEXT:    add x8, x3, #8
1059 ; CHECK-NEXT:    ldp s2, s3, [x0]
1060 ; CHECK-NEXT:    add x9, x1, #8
1061 ; CHECK-NEXT:    add x10, x3, #12
1062 ; CHECK-NEXT:    ldp s4, s5, [x2, #8]
1063 ; CHECK-NEXT:    ldp s6, s7, [x0, #8]
1064 ; CHECK-NEXT:    add x11, x1, #12
1065 ; CHECK-NEXT:    ld1 { v0.s }[1], [x3], #4
1066 ; CHECK-NEXT:    ld1 { v2.s }[1], [x1], #4
1067 ; CHECK-NEXT:    ld1 { v5.s }[1], [x10]
1068 ; CHECK-NEXT:    ld1 { v7.s }[1], [x11]
1069 ; CHECK-NEXT:    ld1 { v6.s }[1], [x9]
1070 ; CHECK-NEXT:    ld1 { v4.s }[1], [x8]
1071 ; CHECK-NEXT:    ld1 { v1.s }[1], [x3]
1072 ; CHECK-NEXT:    ld1 { v3.s }[1], [x1]
1073 ; CHECK-NEXT:    uaddl v2.8h, v2.8b, v6.8b
1074 ; CHECK-NEXT:    uaddl v4.8h, v0.8b, v4.8b
1075 ; CHECK-NEXT:    uaddl v7.8h, v3.8b, v7.8b
1076 ; CHECK-NEXT:    uaddl v3.8h, v1.8b, v5.8b
1077 ; CHECK-NEXT:    ushll v0.4s, v7.4h, #3
1078 ; CHECK-NEXT:    ushll2 v1.4s, v7.8h, #3
1079 ; CHECK-NEXT:    ushll v5.4s, v3.4h, #3
1080 ; CHECK-NEXT:    ushll2 v6.4s, v3.8h, #3
1081 ; CHECK-NEXT:    ushll2 v16.4s, v3.8h, #0
1082 ; CHECK-NEXT:    ushll v17.4s, v3.4h, #0
1083 ; CHECK-NEXT:    uaddw2 v1.4s, v1.4s, v2.8h
1084 ; CHECK-NEXT:    uaddw v0.4s, v0.4s, v2.4h
1085 ; CHECK-NEXT:    uaddw v2.4s, v5.4s, v4.4h
1086 ; CHECK-NEXT:    uaddw2 v3.4s, v6.4s, v4.8h
1087 ; CHECK-NEXT:    ushll2 v4.4s, v7.8h, #0
1088 ; CHECK-NEXT:    ushll v5.4s, v7.4h, #0
1089 ; CHECK-NEXT:    stp q17, q16, [x4, #32]
1090 ; CHECK-NEXT:    stp q5, q4, [x4]
1091 ; CHECK-NEXT:    ret
1092   %lp1 = load <4 x i8>, ptr %p
1093   %p2 = getelementptr i8, ptr %p, i32 4
1094   %lp2 = load <4 x i8>, ptr %p2
1095   %p3 = getelementptr i8, ptr %p, i32 8
1096   %lp3 = load <4 x i8>, ptr %p3
1097   %p4 = getelementptr i8, ptr %p, i32 12
1098   %lp4 = load <4 x i8>, ptr %p4
1099   %lq1 = load <4 x i8>, ptr %q
1100   %q2 = getelementptr i8, ptr %q, i32 4
1101   %lq2 = load <4 x i8>, ptr %q2
1102   %q3 = getelementptr i8, ptr %q, i32 8
1103   %lq3 = load <4 x i8>, ptr %q3
1104   %q4 = getelementptr i8, ptr %q, i32 12
1105   %lq4 = load <4 x i8>, ptr %q4
1106   %lr1 = load <4 x i8>, ptr %r
1107   %r2 = getelementptr i8, ptr %r, i32 4
1108   %lr2 = load <4 x i8>, ptr %r2
1109   %r3 = getelementptr i8, ptr %r, i32 8
1110   %lr3 = load <4 x i8>, ptr %r3
1111   %r4 = getelementptr i8, ptr %r, i32 12
1112   %lr4 = load <4 x i8>, ptr %r4
1113   %ls1 = load <4 x i8>, ptr %s
1114   %s2 = getelementptr i8, ptr %s, i32 4
1115   %ls2 = load <4 x i8>, ptr %s2
1116   %s3 = getelementptr i8, ptr %s, i32 8
1117   %ls3 = load <4 x i8>, ptr %s3
1118   %s4 = getelementptr i8, ptr %s, i32 12
1119   %ls4 = load <4 x i8>, ptr %s4
1121   %jk1 = shufflevector <4 x i8> %lp1, <4 x i8> %lq1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1122   %m1l = shufflevector <4 x i8> %lr1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1123   %jkm1 = shufflevector <16 x i8> %jk1, <16 x i8> %m1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1124   %n1l = shufflevector <4 x i8> %ls1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1125   %l1 = shufflevector <16 x i8> %jkm1, <16 x i8> %n1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1126   %jk2 = shufflevector <4 x i8> %lp2, <4 x i8> %lq2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1127   %m2l = shufflevector <4 x i8> %lr2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1128   %jkm2 = shufflevector <16 x i8> %jk2, <16 x i8> %m2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1129   %n2l = shufflevector <4 x i8> %ls2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1130   %l2 = shufflevector <16 x i8> %jkm2, <16 x i8> %n2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1131   %jk3 = shufflevector <4 x i8> %lp3, <4 x i8> %lq3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1132   %m3l = shufflevector <4 x i8> %lr3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1133   %jkm3 = shufflevector <16 x i8> %jk3, <16 x i8> %m3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1134   %n3l = shufflevector <4 x i8> %ls3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1135   %l3 = shufflevector <16 x i8> %jkm3, <16 x i8> %n3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1136   %jk4 = shufflevector <4 x i8> %lp4, <4 x i8> %lq4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1137   %m4l = shufflevector <4 x i8> %lr4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1138   %jkm4 = shufflevector <16 x i8> %jk4, <16 x i8> %m4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1139   %n4l = shufflevector <4 x i8> %ls4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1140   %l4 = shufflevector <16 x i8> %jkm4, <16 x i8> %n4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1142   %le11 = zext <16 x i8> %l1 to <16 x i16>
1143   %le12 = zext <16 x i8> %l3 to <16 x i16>
1144   %le21 = zext <16 x i8> %l2 to <16 x i16>
1145   %le22 = zext <16 x i8> %l4 to <16 x i16>
1146   %la1 = add <16 x i16> %le11, %le12
1147   %la2 = add <16 x i16> %le21, %le22
1148   %e1 = zext <16 x i16> %la1 to <16 x i32>
1149   %e2 = zext <16 x i16> %la2 to <16 x i32>
1150   store <16 x i32> %e2, ptr %z
1151   %se2 = shl <16 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1152   %a = add <16 x i32> %e1, %se2
1153   ret <16 x i32> %a
1156 define <16 x i32> @extrause_shl(ptr %p, ptr %q, ptr %r, ptr %s, ptr %z) {
1157 ; CHECK-LABEL: extrause_shl:
1158 ; CHECK:       // %bb.0:
1159 ; CHECK-NEXT:    ldp s0, s1, [x0]
1160 ; CHECK-NEXT:    add x8, x3, #8
1161 ; CHECK-NEXT:    ldp s2, s3, [x2]
1162 ; CHECK-NEXT:    add x9, x1, #8
1163 ; CHECK-NEXT:    add x10, x3, #12
1164 ; CHECK-NEXT:    ldp s4, s5, [x0, #8]
1165 ; CHECK-NEXT:    ldp s6, s7, [x2, #8]
1166 ; CHECK-NEXT:    add x11, x1, #12
1167 ; CHECK-NEXT:    ld1 { v2.s }[1], [x3], #4
1168 ; CHECK-NEXT:    ld1 { v0.s }[1], [x1], #4
1169 ; CHECK-NEXT:    ld1 { v5.s }[1], [x11]
1170 ; CHECK-NEXT:    ld1 { v7.s }[1], [x10]
1171 ; CHECK-NEXT:    ld1 { v4.s }[1], [x9]
1172 ; CHECK-NEXT:    ld1 { v6.s }[1], [x8]
1173 ; CHECK-NEXT:    ld1 { v3.s }[1], [x3]
1174 ; CHECK-NEXT:    ld1 { v1.s }[1], [x1]
1175 ; CHECK-NEXT:    uaddl v4.8h, v0.8b, v4.8b
1176 ; CHECK-NEXT:    uaddl v2.8h, v2.8b, v6.8b
1177 ; CHECK-NEXT:    uaddl v3.8h, v3.8b, v7.8b
1178 ; CHECK-NEXT:    uaddl v1.8h, v1.8b, v5.8b
1179 ; CHECK-NEXT:    ushll v6.4s, v3.4h, #3
1180 ; CHECK-NEXT:    ushll2 v16.4s, v3.8h, #3
1181 ; CHECK-NEXT:    ushll v5.4s, v1.4h, #3
1182 ; CHECK-NEXT:    ushll2 v7.4s, v1.8h, #3
1183 ; CHECK-NEXT:    uaddw2 v3.4s, v16.4s, v2.8h
1184 ; CHECK-NEXT:    uaddw v2.4s, v6.4s, v2.4h
1185 ; CHECK-NEXT:    stp q6, q16, [x4, #32]
1186 ; CHECK-NEXT:    uaddw v0.4s, v5.4s, v4.4h
1187 ; CHECK-NEXT:    uaddw2 v1.4s, v7.4s, v4.8h
1188 ; CHECK-NEXT:    stp q5, q7, [x4]
1189 ; CHECK-NEXT:    ret
1190   %lp1 = load <4 x i8>, ptr %p
1191   %p2 = getelementptr i8, ptr %p, i32 4
1192   %lp2 = load <4 x i8>, ptr %p2
1193   %p3 = getelementptr i8, ptr %p, i32 8
1194   %lp3 = load <4 x i8>, ptr %p3
1195   %p4 = getelementptr i8, ptr %p, i32 12
1196   %lp4 = load <4 x i8>, ptr %p4
1197   %lq1 = load <4 x i8>, ptr %q
1198   %q2 = getelementptr i8, ptr %q, i32 4
1199   %lq2 = load <4 x i8>, ptr %q2
1200   %q3 = getelementptr i8, ptr %q, i32 8
1201   %lq3 = load <4 x i8>, ptr %q3
1202   %q4 = getelementptr i8, ptr %q, i32 12
1203   %lq4 = load <4 x i8>, ptr %q4
1204   %lr1 = load <4 x i8>, ptr %r
1205   %r2 = getelementptr i8, ptr %r, i32 4
1206   %lr2 = load <4 x i8>, ptr %r2
1207   %r3 = getelementptr i8, ptr %r, i32 8
1208   %lr3 = load <4 x i8>, ptr %r3
1209   %r4 = getelementptr i8, ptr %r, i32 12
1210   %lr4 = load <4 x i8>, ptr %r4
1211   %ls1 = load <4 x i8>, ptr %s
1212   %s2 = getelementptr i8, ptr %s, i32 4
1213   %ls2 = load <4 x i8>, ptr %s2
1214   %s3 = getelementptr i8, ptr %s, i32 8
1215   %ls3 = load <4 x i8>, ptr %s3
1216   %s4 = getelementptr i8, ptr %s, i32 12
1217   %ls4 = load <4 x i8>, ptr %s4
1219   %jk1 = shufflevector <4 x i8> %lp1, <4 x i8> %lq1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1220   %m1l = shufflevector <4 x i8> %lr1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1221   %jkm1 = shufflevector <16 x i8> %jk1, <16 x i8> %m1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1222   %n1l = shufflevector <4 x i8> %ls1, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1223   %l1 = shufflevector <16 x i8> %jkm1, <16 x i8> %n1l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1224   %jk2 = shufflevector <4 x i8> %lp2, <4 x i8> %lq2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1225   %m2l = shufflevector <4 x i8> %lr2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1226   %jkm2 = shufflevector <16 x i8> %jk2, <16 x i8> %m2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1227   %n2l = shufflevector <4 x i8> %ls2, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1228   %l2 = shufflevector <16 x i8> %jkm2, <16 x i8> %n2l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1229   %jk3 = shufflevector <4 x i8> %lp3, <4 x i8> %lq3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1230   %m3l = shufflevector <4 x i8> %lr3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1231   %jkm3 = shufflevector <16 x i8> %jk3, <16 x i8> %m3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1232   %n3l = shufflevector <4 x i8> %ls3, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1233   %l3 = shufflevector <16 x i8> %jkm3, <16 x i8> %n3l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1234   %jk4 = shufflevector <4 x i8> %lp4, <4 x i8> %lq4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1235   %m4l = shufflevector <4 x i8> %lr4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1236   %jkm4 = shufflevector <16 x i8> %jk4, <16 x i8> %m4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison>
1237   %n4l = shufflevector <4 x i8> %ls4, <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
1238   %l4 = shufflevector <16 x i8> %jkm4, <16 x i8> %n4l, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>
1240   %le11 = zext <16 x i8> %l1 to <16 x i16>
1241   %le12 = zext <16 x i8> %l3 to <16 x i16>
1242   %le21 = zext <16 x i8> %l2 to <16 x i16>
1243   %le22 = zext <16 x i8> %l4 to <16 x i16>
1244   %la1 = add <16 x i16> %le11, %le12
1245   %la2 = add <16 x i16> %le21, %le22
1246   %e1 = zext <16 x i16> %la1 to <16 x i32>
1247   %e2 = zext <16 x i16> %la2 to <16 x i32>
1248   %se2 = shl <16 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1249   store <16 x i32> %se2, ptr %z
1250   %a = add <16 x i32> %e1, %se2
1251   ret <16 x i32> %a
1255 define <8 x i32> @commuted_loads(ptr %p1, ptr %p2) {
1256 ; CHECK-LABEL: commuted_loads:
1257 ; CHECK:       // %bb.0:
1258 ; CHECK-NEXT:    ldr q0, [x0]
1259 ; CHECK-NEXT:    ldr q1, [x1]
1260 ; CHECK-NEXT:    add v0.16b, v1.16b, v0.16b
1261 ; CHECK-NEXT:    ushll2 v1.8h, v0.16b, #0
1262 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
1263 ; CHECK-NEXT:    ushll2 v2.4s, v1.8h, #3
1264 ; CHECK-NEXT:    ushll v3.4s, v1.4h, #3
1265 ; CHECK-NEXT:    uaddw2 v1.4s, v2.4s, v0.8h
1266 ; CHECK-NEXT:    uaddw v0.4s, v3.4s, v0.4h
1267 ; CHECK-NEXT:    ret
1268   %l11 = load <8 x i8>, ptr %p1
1269   %q1 = getelementptr i8, ptr %p1, i32 8
1270   %l12 = load <8 x i8>, ptr %q1
1271   %l21 = load <8 x i8>, ptr %p2
1272   %q2 = getelementptr i8, ptr %p2, i32 8
1273   %l22 = load <8 x i8>, ptr %q2
1274   %l1 = add <8 x i8> %l21, %l11
1275   %l2 = add <8 x i8> %l22, %l12
1276   %e1 = zext <8 x i8> %l1 to <8 x i32>
1277   %e2 = zext <8 x i8> %l2 to <8 x i32>
1278   %se2 = shl <8 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1279   %a = add <8 x i32> %e1, %se2
1280   ret <8 x i32> %a
1283 define <8 x i32> @commuted_loads2(ptr %p1, ptr %p2) {
1284 ; CHECK-LABEL: commuted_loads2:
1285 ; CHECK:       // %bb.0:
1286 ; CHECK-NEXT:    ldp d0, d3, [x1]
1287 ; CHECK-NEXT:    ldp d1, d2, [x0]
1288 ; CHECK-NEXT:    add v0.8b, v1.8b, v0.8b
1289 ; CHECK-NEXT:    add v1.8b, v2.8b, v3.8b
1290 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
1291 ; CHECK-NEXT:    ushll v2.8h, v1.8b, #0
1292 ; CHECK-NEXT:    ushll v3.4s, v0.4h, #3
1293 ; CHECK-NEXT:    ushll2 v0.4s, v0.8h, #3
1294 ; CHECK-NEXT:    uaddw2 v1.4s, v0.4s, v2.8h
1295 ; CHECK-NEXT:    uaddw v0.4s, v3.4s, v2.4h
1296 ; CHECK-NEXT:    ret
1297   %l11 = load <8 x i8>, ptr %p1
1298   %q1 = getelementptr i8, ptr %p1, i32 8
1299   %l12 = load <8 x i8>, ptr %q1
1300   %l21 = load <8 x i8>, ptr %p2
1301   %q2 = getelementptr i8, ptr %p2, i32 8
1302   %l22 = load <8 x i8>, ptr %q2
1303   %l1 = add <8 x i8> %l11, %l21
1304   %l2 = add <8 x i8> %l12, %l22
1305   %e1 = zext <8 x i8> %l2 to <8 x i32>
1306   %e2 = zext <8 x i8> %l1 to <8 x i32>
1307   %se2 = shl <8 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1308   %a = add <8 x i32> %e1, %se2
1309   ret <8 x i32> %a
1312 define <8 x i32> @commuted_sub(ptr %p1, ptr %p2) {
1313 ; CHECK-LABEL: commuted_sub:
1314 ; CHECK:       // %bb.0:
1315 ; CHECK-NEXT:    ldp d2, d1, [x1]
1316 ; CHECK-NEXT:    ldr d0, [x0, #8]
1317 ; CHECK-NEXT:    add v0.8b, v0.8b, v1.8b
1318 ; CHECK-NEXT:    ldr d1, [x0]
1319 ; CHECK-NEXT:    add v1.8b, v1.8b, v2.8b
1320 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
1321 ; CHECK-NEXT:    ushll v2.8h, v1.8b, #0
1322 ; CHECK-NEXT:    ushll v3.4s, v0.4h, #3
1323 ; CHECK-NEXT:    ushll2 v0.4s, v0.8h, #3
1324 ; CHECK-NEXT:    usubw2 v1.4s, v0.4s, v2.8h
1325 ; CHECK-NEXT:    usubw v0.4s, v3.4s, v2.4h
1326 ; CHECK-NEXT:    ret
1327   %l11 = load <8 x i8>, ptr %p1
1328   %q1 = getelementptr i8, ptr %p1, i32 8
1329   %l12 = load <8 x i8>, ptr %q1
1330   %l21 = load <8 x i8>, ptr %p2
1331   %q2 = getelementptr i8, ptr %p2, i32 8
1332   %l22 = load <8 x i8>, ptr %q2
1333   %l1 = add <8 x i8> %l11, %l21
1334   %l2 = add <8 x i8> %l12, %l22
1335   %e1 = zext <8 x i8> %l1 to <8 x i32>
1336   %e2 = zext <8 x i8> %l2 to <8 x i32>
1337   %se2 = shl <8 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1338   %a = sub <8 x i32> %se2, %e1
1339   ret <8 x i32> %a
1342 define <4 x i32> @bitcast(ptr %p) {
1343 ; CHECK-LABEL: bitcast:
1344 ; CHECK:       // %bb.0:
1345 ; CHECK-NEXT:    ldr d0, [x0]
1346 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
1347 ; CHECK-NEXT:    ushll2 v1.4s, v0.8h, #3
1348 ; CHECK-NEXT:    uaddw v0.4s, v1.4s, v0.4h
1349 ; CHECK-NEXT:    ret
1350   %l1b = load float, ptr %p
1351   %l1 = bitcast float %l1b to <4 x i8>
1352   %q = getelementptr i8, ptr %p, i32 4
1353   %l2b = load float, ptr %q
1354   %l2 = bitcast float %l2b to <4 x i8>
1355   %e1 = zext <4 x i8> %l1 to <4 x i32>
1356   %e2 = zext <4 x i8> %l2 to <4 x i32>
1357   %e3 = shl <4 x i32> %e2, <i32 3, i32 3, i32 3, i32 3>
1358   %a = add <4 x i32> %e1, %e3
1359   ret <4 x i32> %a
1362 define <4 x i32> @atomic(ptr %p) {
1363 ; CHECK-LABEL: atomic:
1364 ; CHECK:       // %bb.0:
1365 ; CHECK-NEXT:    ldar w8, [x0]
1366 ; CHECK-NEXT:    movi v0.2d, #0x0000ff000000ff
1367 ; CHECK-NEXT:    ldr s1, [x0, #4]
1368 ; CHECK-NEXT:    fmov s2, w8
1369 ; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
1370 ; CHECK-NEXT:    zip1 v2.8b, v2.8b, v0.8b
1371 ; CHECK-NEXT:    ushll v1.4s, v1.4h, #3
1372 ; CHECK-NEXT:    ushll v2.4s, v2.4h, #0
1373 ; CHECK-NEXT:    and v0.16b, v2.16b, v0.16b
1374 ; CHECK-NEXT:    add v0.4s, v0.4s, v1.4s
1375 ; CHECK-NEXT:    ret
1376   %l1b = load atomic float, ptr %p acquire, align 4
1377   %l1 = bitcast float %l1b to <4 x i8>
1378   %q = getelementptr i8, ptr %p, i32 4
1379   %l2b = load float, ptr %q
1380   %l2 = bitcast float %l2b to <4 x i8>
1381   %e1 = zext <4 x i8> %l1 to <4 x i32>
1382   %e2 = zext <4 x i8> %l2 to <4 x i32>
1383   %e3 = shl <4 x i32> %e2, <i32 3, i32 3, i32 3, i32 3>
1384   %a = add <4 x i32> %e1, %e3
1385   ret <4 x i32> %a
1388 define <4 x i32> @volatile(ptr %p) {
1389 ; CHECK-LABEL: volatile:
1390 ; CHECK:       // %bb.0:
1391 ; CHECK-NEXT:    sub sp, sp, #16
1392 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
1393 ; CHECK-NEXT:    ldr s0, [x0]
1394 ; CHECK-NEXT:    ldr s1, [x0, #4]
1395 ; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
1396 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
1397 ; CHECK-NEXT:    ushll v1.4s, v1.4h, #3
1398 ; CHECK-NEXT:    uaddw v0.4s, v1.4s, v0.4h
1399 ; CHECK-NEXT:    add sp, sp, #16
1400 ; CHECK-NEXT:    ret
1401   %l1b = load volatile float, ptr %p
1402   %l1 = bitcast float %l1b to <4 x i8>
1403   %q = getelementptr i8, ptr %p, i32 4
1404   %l2b = load float, ptr %q
1405   %l2 = bitcast float %l2b to <4 x i8>
1406   %e1 = zext <4 x i8> %l1 to <4 x i32>
1407   %e2 = zext <4 x i8> %l2 to <4 x i32>
1408   %e3 = shl <4 x i32> %e2, <i32 3, i32 3, i32 3, i32 3>
1409   %a = add <4 x i32> %e1, %e3
1410   ret <4 x i32> %a