xref: /llvm-project/llvm/test/CodeGen/AArch64/extbinopload.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s
3
4define <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
18}
19
20define <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
33}
34
35define <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
52}
53
54define <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
69}
70
71define <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
88}
89
90define <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
106}
107
108define <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
142}
143
144define <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
159}
160
161define <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
183}
184
185define <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
214}
215
216define <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
242}
243
244define <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
261}
262
263define <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
285}
286
287define <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
309}
310
311define <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
336}
337
338define <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
361}
362
363define <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:    ld1 { v1.s }[1], [x1]
369; CHECK-NEXT:    ldp s3, s2, [x2]
370; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
371; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
372; CHECK-NEXT:    ushll v2.8h, v2.8b, #0
373; CHECK-NEXT:    ushll v3.8h, v3.8b, #0
374; CHECK-NEXT:    ushll2 v4.4s, v1.8h, #3
375; CHECK-NEXT:    ushll v1.4s, v1.4h, #3
376; CHECK-NEXT:    ushll v2.4s, v2.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
403}
404
405define <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:    ld1 { v1.s }[1], [x1]
411; CHECK-NEXT:    ldp s2, s3, [x2]
412; CHECK-NEXT:    uaddl v0.8h, v0.8b, v1.8b
413; CHECK-NEXT:    ld1 { v2.s }[1], [x3], #4
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
440}
441
442define <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:    ld1 { v1.s }[1], [x1]
448; CHECK-NEXT:    ldp s2, s3, [x2]
449; CHECK-NEXT:    usubl v0.8h, v0.8b, v1.8b
450; CHECK-NEXT:    ld1 { v2.s }[1], [x3], #4
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
485}
486
487define <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:    ld1 { v1.s }[1], [x1]
493; CHECK-NEXT:    ldp s2, s3, [x2]
494; CHECK-NEXT:    usubl v1.8h, v0.8b, v1.8b
495; CHECK-NEXT:    ld1 { v2.s }[1], [x3], #4
496; CHECK-NEXT:    ld1 { v3.s }[1], [x3]
497; CHECK-NEXT:    ldp s4, s5, [x4]
498; CHECK-NEXT:    usubl v2.8h, v2.8b, v3.8b
499; CHECK-NEXT:    ld1 { v4.s }[1], [x5], #4
500; CHECK-NEXT:    ld1 { v5.s }[1], [x5]
501; CHECK-NEXT:    ldp s6, s7, [x6]
502; CHECK-NEXT:    usubl v4.8h, v4.8b, v5.8b
503; CHECK-NEXT:    ld1 { v6.s }[1], [x7], #4
504; CHECK-NEXT:    ld1 { v7.s }[1], [x7]
505; CHECK-NEXT:    shll v0.4s, v4.4h, #16
506; CHECK-NEXT:    shll2 v4.4s, v4.8h, #16
507; CHECK-NEXT:    usubl v5.8h, v6.8b, v7.8b
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
562}
563
564define <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
643}
644
645define <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 s1, [x0]
649; CHECK-NEXT:    add x8, x3, #8
650; CHECK-NEXT:    add x11, x1, #12
651; CHECK-NEXT:    str s1, [x4]
652; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
653; CHECK-NEXT:    ldr s0, [x2]
654; CHECK-NEXT:    ushll v2.8h, v0.8b, #0
655; CHECK-NEXT:    umov w9, v2.h[0]
656; CHECK-NEXT:    umov w10, v2.h[1]
657; CHECK-NEXT:    mov v0.b[8], w9
658; CHECK-NEXT:    umov w9, v2.h[2]
659; CHECK-NEXT:    mov v0.b[9], w10
660; CHECK-NEXT:    umov w10, v2.h[3]
661; CHECK-NEXT:    ldr s2, [x1]
662; CHECK-NEXT:    ushll v2.8h, v2.8b, #0
663; CHECK-NEXT:    mov v0.b[10], w9
664; CHECK-NEXT:    add x9, x1, #4
665; CHECK-NEXT:    mov v1.d[1], v2.d[0]
666; CHECK-NEXT:    mov v0.b[11], w10
667; CHECK-NEXT:    add x10, x3, #12
668; CHECK-NEXT:    bic v1.8h, #255, lsl #8
669; CHECK-NEXT:    ld1 { v0.s }[3], [x3], #4
670; CHECK-NEXT:    ldr s3, [x0, #12]
671; CHECK-NEXT:    ldp s2, s7, [x0, #4]
672; CHECK-NEXT:    ldr s6, [x2, #12]
673; CHECK-NEXT:    ldp s5, s4, [x2, #4]
674; CHECK-NEXT:    ld1 { v3.s }[1], [x11]
675; CHECK-NEXT:    ld1 { v6.s }[1], [x10]
676; CHECK-NEXT:    ld1 { v2.s }[1], [x9]
677; CHECK-NEXT:    ld1 { v4.s }[1], [x8]
678; CHECK-NEXT:    ld1 { v5.s }[1], [x3]
679; CHECK-NEXT:    add x8, x1, #8
680; CHECK-NEXT:    ld1 { v7.s }[1], [x8]
681; CHECK-NEXT:    uaddl v2.8h, v2.8b, v3.8b
682; CHECK-NEXT:    ushll v4.8h, v4.8b, #0
683; CHECK-NEXT:    uaddl v3.8h, v5.8b, v6.8b
684; CHECK-NEXT:    uaddw v1.8h, v1.8h, v7.8b
685; CHECK-NEXT:    uaddw2 v4.8h, v4.8h, v0.16b
686; CHECK-NEXT:    ushll v0.4s, v2.4h, #3
687; CHECK-NEXT:    ushll v5.4s, v3.4h, #3
688; CHECK-NEXT:    ushll2 v3.4s, v3.8h, #3
689; CHECK-NEXT:    ushll2 v2.4s, v2.8h, #3
690; CHECK-NEXT:    uaddw v0.4s, v0.4s, v1.4h
691; CHECK-NEXT:    uaddw2 v1.4s, v2.4s, v1.8h
692; CHECK-NEXT:    uaddw2 v3.4s, v3.4s, v4.8h
693; CHECK-NEXT:    uaddw v2.4s, v5.4s, v4.4h
694; CHECK-NEXT:    ret
695  %lp1 = load <4 x i8>, ptr %p
696  store <4 x i8> %lp1, ptr %z
697  %p2 = getelementptr i8, ptr %p, i32 4
698  %lp2 = load <4 x i8>, ptr %p2
699  %p3 = getelementptr i8, ptr %p, i32 8
700  %lp3 = load <4 x i8>, ptr %p3
701  %p4 = getelementptr i8, ptr %p, i32 12
702  %lp4 = load <4 x i8>, ptr %p4
703  %lq1 = load <4 x i8>, ptr %q
704  %q2 = getelementptr i8, ptr %q, i32 4
705  %lq2 = load <4 x i8>, ptr %q2
706  %q3 = getelementptr i8, ptr %q, i32 8
707  %lq3 = load <4 x i8>, ptr %q3
708  %q4 = getelementptr i8, ptr %q, i32 12
709  %lq4 = load <4 x i8>, ptr %q4
710  %lr1 = load <4 x i8>, ptr %r
711  %r2 = getelementptr i8, ptr %r, i32 4
712  %lr2 = load <4 x i8>, ptr %r2
713  %r3 = getelementptr i8, ptr %r, i32 8
714  %lr3 = load <4 x i8>, ptr %r3
715  %r4 = getelementptr i8, ptr %r, i32 12
716  %lr4 = load <4 x i8>, ptr %r4
717  %ls1 = load <4 x i8>, ptr %s
718  %s2 = getelementptr i8, ptr %s, i32 4
719  %ls2 = load <4 x i8>, ptr %s2
720  %s3 = getelementptr i8, ptr %s, i32 8
721  %ls3 = load <4 x i8>, ptr %s3
722  %s4 = getelementptr i8, ptr %s, i32 12
723  %ls4 = load <4 x i8>, ptr %s4
724
725  %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>
726  %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>
727  %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>
728  %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>
729  %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>
730  %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>
731  %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>
732  %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>
733  %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>
734  %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>
735  %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>
736  %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>
737  %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>
738  %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>
739  %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>
740  %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>
741  %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>
742  %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>
743  %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>
744  %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>
745
746  %le11 = zext <16 x i8> %l1 to <16 x i16>
747  %le12 = zext <16 x i8> %l3 to <16 x i16>
748  %le21 = zext <16 x i8> %l2 to <16 x i16>
749  %le22 = zext <16 x i8> %l4 to <16 x i16>
750  %la1 = add <16 x i16> %le11, %le12
751  %la2 = add <16 x i16> %le21, %le22
752  %e1 = zext <16 x i16> %la1 to <16 x i32>
753  %e2 = zext <16 x i16> %la2 to <16 x i32>
754  %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>
755  %a = add <16 x i32> %e1, %se2
756  ret <16 x i32> %a
757}
758
759define <16 x i32> @extrause_shuffle(ptr %p, ptr %q, ptr %r, ptr %s, ptr %z) {
760; CHECK-LABEL: extrause_shuffle:
761; CHECK:       // %bb.0:
762; CHECK-NEXT:    ldp s17, s0, [x0, #8]
763; CHECK-NEXT:    add x8, x3, #8
764; CHECK-NEXT:    ldr s3, [x1, #12]
765; CHECK-NEXT:    ldp s2, s16, [x2]
766; CHECK-NEXT:    ldr s5, [x2, #12]
767; CHECK-NEXT:    add x9, x1, #8
768; CHECK-NEXT:    ldr s1, [x3, #12]
769; CHECK-NEXT:    mov v4.16b, v0.16b
770; CHECK-NEXT:    mov v0.s[1], v3.s[0]
771; CHECK-NEXT:    ld1 { v2.s }[1], [x3], #4
772; CHECK-NEXT:    ldp s6, s7, [x0]
773; CHECK-NEXT:    mov v4.s[1], v3.s[0]
774; CHECK-NEXT:    ld1 { v6.s }[1], [x1], #4
775; CHECK-NEXT:    ld1 { v7.s }[1], [x1]
776; CHECK-NEXT:    ld1 { v16.s }[1], [x3]
777; CHECK-NEXT:    ldr s3, [x2, #8]
778; CHECK-NEXT:    ld1 { v17.s }[1], [x9]
779; CHECK-NEXT:    mov v4.s[2], v5.s[0]
780; CHECK-NEXT:    mov v5.s[1], v1.s[0]
781; CHECK-NEXT:    ld1 { v3.s }[1], [x8]
782; CHECK-NEXT:    uaddl v0.8h, v7.8b, v0.8b
783; CHECK-NEXT:    uaddl v6.8h, v6.8b, v17.8b
784; CHECK-NEXT:    uaddl v5.8h, v16.8b, v5.8b
785; CHECK-NEXT:    uaddl v2.8h, v2.8b, v3.8b
786; CHECK-NEXT:    ushll v3.4s, v0.4h, #3
787; CHECK-NEXT:    ushll2 v16.4s, v0.8h, #3
788; CHECK-NEXT:    mov v4.s[3], v1.s[0]
789; CHECK-NEXT:    ushll v7.4s, v5.4h, #3
790; CHECK-NEXT:    ushll2 v5.4s, v5.8h, #3
791; CHECK-NEXT:    uaddw v0.4s, v3.4s, v6.4h
792; CHECK-NEXT:    uaddw2 v1.4s, v16.4s, v6.8h
793; CHECK-NEXT:    str q4, [x4]
794; CHECK-NEXT:    uaddw2 v3.4s, v5.4s, v2.8h
795; CHECK-NEXT:    uaddw v2.4s, v7.4s, v2.4h
796; CHECK-NEXT:    ret
797  %lp1 = load <4 x i8>, ptr %p
798  %p2 = getelementptr i8, ptr %p, i32 4
799  %lp2 = load <4 x i8>, ptr %p2
800  %p3 = getelementptr i8, ptr %p, i32 8
801  %lp3 = load <4 x i8>, ptr %p3
802  %p4 = getelementptr i8, ptr %p, i32 12
803  %lp4 = load <4 x i8>, ptr %p4
804  %lq1 = load <4 x i8>, ptr %q
805  %q2 = getelementptr i8, ptr %q, i32 4
806  %lq2 = load <4 x i8>, ptr %q2
807  %q3 = getelementptr i8, ptr %q, i32 8
808  %lq3 = load <4 x i8>, ptr %q3
809  %q4 = getelementptr i8, ptr %q, i32 12
810  %lq4 = load <4 x i8>, ptr %q4
811  %lr1 = load <4 x i8>, ptr %r
812  %r2 = getelementptr i8, ptr %r, i32 4
813  %lr2 = load <4 x i8>, ptr %r2
814  %r3 = getelementptr i8, ptr %r, i32 8
815  %lr3 = load <4 x i8>, ptr %r3
816  %r4 = getelementptr i8, ptr %r, i32 12
817  %lr4 = load <4 x i8>, ptr %r4
818  %ls1 = load <4 x i8>, ptr %s
819  %s2 = getelementptr i8, ptr %s, i32 4
820  %ls2 = load <4 x i8>, ptr %s2
821  %s3 = getelementptr i8, ptr %s, i32 8
822  %ls3 = load <4 x i8>, ptr %s3
823  %s4 = getelementptr i8, ptr %s, i32 12
824  %ls4 = load <4 x i8>, ptr %s4
825
826  %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>
827  %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>
828  %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>
829  %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>
830  %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>
831  %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>
832  %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>
833  %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>
834  %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>
835  %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>
836  %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>
837  %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>
838  %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>
839  %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>
840  %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>
841  %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>
842  %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>
843  %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>
844  %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>
845  %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>
846  store <16 x i8> %l4, ptr %z
847
848  %le11 = zext <16 x i8> %l1 to <16 x i16>
849  %le12 = zext <16 x i8> %l3 to <16 x i16>
850  %le21 = zext <16 x i8> %l2 to <16 x i16>
851  %le22 = zext <16 x i8> %l4 to <16 x i16>
852  %la1 = add <16 x i16> %le11, %le12
853  %la2 = add <16 x i16> %le21, %le22
854  %e1 = zext <16 x i16> %la1 to <16 x i32>
855  %e2 = zext <16 x i16> %la2 to <16 x i32>
856  %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>
857  %a = add <16 x i32> %e1, %se2
858  ret <16 x i32> %a
859}
860
861define <16 x i32> @extrause_ext(ptr %p, ptr %q, ptr %r, ptr %s, ptr %z) {
862; CHECK-LABEL: extrause_ext:
863; CHECK:       // %bb.0:
864; CHECK-NEXT:    ldp s0, s3, [x2]
865; CHECK-NEXT:    add x8, x3, #8
866; CHECK-NEXT:    add x9, x3, #12
867; CHECK-NEXT:    add x10, x1, #8
868; CHECK-NEXT:    add x11, x1, #12
869; CHECK-NEXT:    ld1 { v0.s }[1], [x3], #4
870; CHECK-NEXT:    ldp s1, s2, [x0]
871; CHECK-NEXT:    ld1 { v1.s }[1], [x1], #4
872; CHECK-NEXT:    ld1 { v2.s }[1], [x1]
873; CHECK-NEXT:    ldp s7, s4, [x0, #8]
874; CHECK-NEXT:    ld1 { v3.s }[1], [x3]
875; CHECK-NEXT:    ldp s6, s5, [x2, #8]
876; CHECK-NEXT:    ld1 { v4.s }[1], [x11]
877; CHECK-NEXT:    ld1 { v7.s }[1], [x10]
878; CHECK-NEXT:    ld1 { v5.s }[1], [x9]
879; CHECK-NEXT:    ld1 { v6.s }[1], [x8]
880; CHECK-NEXT:    uaddl v2.8h, v2.8b, v4.8b
881; CHECK-NEXT:    uaddl v1.8h, v1.8b, v7.8b
882; CHECK-NEXT:    ushll v4.8h, v4.8b, #0
883; CHECK-NEXT:    uaddl v3.8h, v3.8b, v5.8b
884; CHECK-NEXT:    uaddl v6.8h, v0.8b, v6.8b
885; CHECK-NEXT:    ushll v5.8h, v5.8b, #0
886; CHECK-NEXT:    ushll v0.4s, v2.4h, #3
887; CHECK-NEXT:    ushll2 v2.4s, v2.8h, #3
888; CHECK-NEXT:    ushll v7.4s, v3.4h, #3
889; CHECK-NEXT:    ushll2 v3.4s, v3.8h, #3
890; CHECK-NEXT:    stp q4, q5, [x4]
891; CHECK-NEXT:    uaddw v0.4s, v0.4s, v1.4h
892; CHECK-NEXT:    uaddw2 v1.4s, v2.4s, v1.8h
893; CHECK-NEXT:    uaddw2 v3.4s, v3.4s, v6.8h
894; CHECK-NEXT:    uaddw v2.4s, v7.4s, v6.4h
895; CHECK-NEXT:    ret
896  %lp1 = load <4 x i8>, ptr %p
897  %p2 = getelementptr i8, ptr %p, i32 4
898  %lp2 = load <4 x i8>, ptr %p2
899  %p3 = getelementptr i8, ptr %p, i32 8
900  %lp3 = load <4 x i8>, ptr %p3
901  %p4 = getelementptr i8, ptr %p, i32 12
902  %lp4 = load <4 x i8>, ptr %p4
903  %lq1 = load <4 x i8>, ptr %q
904  %q2 = getelementptr i8, ptr %q, i32 4
905  %lq2 = load <4 x i8>, ptr %q2
906  %q3 = getelementptr i8, ptr %q, i32 8
907  %lq3 = load <4 x i8>, ptr %q3
908  %q4 = getelementptr i8, ptr %q, i32 12
909  %lq4 = load <4 x i8>, ptr %q4
910  %lr1 = load <4 x i8>, ptr %r
911  %r2 = getelementptr i8, ptr %r, i32 4
912  %lr2 = load <4 x i8>, ptr %r2
913  %r3 = getelementptr i8, ptr %r, i32 8
914  %lr3 = load <4 x i8>, ptr %r3
915  %r4 = getelementptr i8, ptr %r, i32 12
916  %lr4 = load <4 x i8>, ptr %r4
917  %ls1 = load <4 x i8>, ptr %s
918  %s2 = getelementptr i8, ptr %s, i32 4
919  %ls2 = load <4 x i8>, ptr %s2
920  %s3 = getelementptr i8, ptr %s, i32 8
921  %ls3 = load <4 x i8>, ptr %s3
922  %s4 = getelementptr i8, ptr %s, i32 12
923  %ls4 = load <4 x i8>, ptr %s4
924
925  %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>
926  %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>
927  %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>
928  %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>
929  %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>
930  %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>
931  %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>
932  %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>
933  %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>
934  %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>
935  %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>
936  %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>
937  %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>
938  %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>
939  %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>
940  %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>
941  %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>
942  %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>
943  %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>
944  %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>
945
946  %le11 = zext <16 x i8> %l1 to <16 x i16>
947  %le12 = zext <16 x i8> %l3 to <16 x i16>
948  %le21 = zext <16 x i8> %l2 to <16 x i16>
949  %le22 = zext <16 x i8> %l4 to <16 x i16>
950  store <16 x i16> %le22, ptr %z
951  %la1 = add <16 x i16> %le11, %le12
952  %la2 = add <16 x i16> %le21, %le22
953  %e1 = zext <16 x i16> %la1 to <16 x i32>
954  %e2 = zext <16 x i16> %la2 to <16 x i32>
955  %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>
956  %a = add <16 x i32> %e1, %se2
957  ret <16 x i32> %a
958}
959
960define <16 x i32> @extrause_add(ptr %p, ptr %q, ptr %r, ptr %s, ptr %z) {
961; CHECK-LABEL: extrause_add:
962; CHECK:       // %bb.0:
963; CHECK-NEXT:    ldp s0, s4, [x2]
964; CHECK-NEXT:    add x8, x3, #8
965; CHECK-NEXT:    add x9, x3, #12
966; CHECK-NEXT:    add x10, x1, #8
967; CHECK-NEXT:    add x11, x1, #12
968; CHECK-NEXT:    ld1 { v0.s }[1], [x3], #4
969; CHECK-NEXT:    ldp s1, s2, [x0]
970; CHECK-NEXT:    ld1 { v1.s }[1], [x1], #4
971; CHECK-NEXT:    ld1 { v2.s }[1], [x1]
972; CHECK-NEXT:    ldp s7, s3, [x0, #8]
973; CHECK-NEXT:    ld1 { v4.s }[1], [x3]
974; CHECK-NEXT:    ldp s6, s5, [x2, #8]
975; CHECK-NEXT:    ld1 { v3.s }[1], [x11]
976; CHECK-NEXT:    ld1 { v7.s }[1], [x10]
977; CHECK-NEXT:    ld1 { v5.s }[1], [x9]
978; CHECK-NEXT:    ld1 { v6.s }[1], [x8]
979; CHECK-NEXT:    uaddl v16.8h, v2.8b, v3.8b
980; CHECK-NEXT:    uaddl v1.8h, v1.8b, v7.8b
981; CHECK-NEXT:    uaddl v4.8h, v4.8b, v5.8b
982; CHECK-NEXT:    uaddl v2.8h, v0.8b, v6.8b
983; CHECK-NEXT:    ushll v0.4s, v16.4h, #3
984; CHECK-NEXT:    ushll2 v6.4s, v16.8h, #3
985; CHECK-NEXT:    ushll v5.4s, v4.4h, #3
986; CHECK-NEXT:    ushll2 v3.4s, v4.8h, #3
987; CHECK-NEXT:    stp q16, q4, [x4]
988; CHECK-NEXT:    uaddw v0.4s, v0.4s, v1.4h
989; CHECK-NEXT:    uaddw2 v1.4s, v6.4s, v1.8h
990; CHECK-NEXT:    uaddw2 v3.4s, v3.4s, v2.8h
991; CHECK-NEXT:    uaddw v2.4s, v5.4s, v2.4h
992; CHECK-NEXT:    ret
993  %lp1 = load <4 x i8>, ptr %p
994  %p2 = getelementptr i8, ptr %p, i32 4
995  %lp2 = load <4 x i8>, ptr %p2
996  %p3 = getelementptr i8, ptr %p, i32 8
997  %lp3 = load <4 x i8>, ptr %p3
998  %p4 = getelementptr i8, ptr %p, i32 12
999  %lp4 = load <4 x i8>, ptr %p4
1000  %lq1 = load <4 x i8>, ptr %q
1001  %q2 = getelementptr i8, ptr %q, i32 4
1002  %lq2 = load <4 x i8>, ptr %q2
1003  %q3 = getelementptr i8, ptr %q, i32 8
1004  %lq3 = load <4 x i8>, ptr %q3
1005  %q4 = getelementptr i8, ptr %q, i32 12
1006  %lq4 = load <4 x i8>, ptr %q4
1007  %lr1 = load <4 x i8>, ptr %r
1008  %r2 = getelementptr i8, ptr %r, i32 4
1009  %lr2 = load <4 x i8>, ptr %r2
1010  %r3 = getelementptr i8, ptr %r, i32 8
1011  %lr3 = load <4 x i8>, ptr %r3
1012  %r4 = getelementptr i8, ptr %r, i32 12
1013  %lr4 = load <4 x i8>, ptr %r4
1014  %ls1 = load <4 x i8>, ptr %s
1015  %s2 = getelementptr i8, ptr %s, i32 4
1016  %ls2 = load <4 x i8>, ptr %s2
1017  %s3 = getelementptr i8, ptr %s, i32 8
1018  %ls3 = load <4 x i8>, ptr %s3
1019  %s4 = getelementptr i8, ptr %s, i32 12
1020  %ls4 = load <4 x i8>, ptr %s4
1021
1022  %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>
1023  %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>
1024  %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>
1025  %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>
1026  %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>
1027  %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>
1028  %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>
1029  %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>
1030  %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>
1031  %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>
1032  %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>
1033  %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>
1034  %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>
1035  %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>
1036  %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>
1037  %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>
1038  %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>
1039  %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>
1040  %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>
1041  %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>
1042
1043  %le11 = zext <16 x i8> %l1 to <16 x i16>
1044  %le12 = zext <16 x i8> %l3 to <16 x i16>
1045  %le21 = zext <16 x i8> %l2 to <16 x i16>
1046  %le22 = zext <16 x i8> %l4 to <16 x i16>
1047  %la1 = add <16 x i16> %le11, %le12
1048  %la2 = add <16 x i16> %le21, %le22
1049  store <16 x i16> %la2, ptr %z
1050  %e1 = zext <16 x i16> %la1 to <16 x i32>
1051  %e2 = zext <16 x i16> %la2 to <16 x i32>
1052  %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>
1053  %a = add <16 x i32> %e1, %se2
1054  ret <16 x i32> %a
1055}
1056
1057define <16 x i32> @extrause_ext2(ptr %p, ptr %q, ptr %r, ptr %s, ptr %z) {
1058; CHECK-LABEL: extrause_ext2:
1059; CHECK:       // %bb.0:
1060; CHECK-NEXT:    ldp s0, s4, [x2]
1061; CHECK-NEXT:    add x8, x3, #8
1062; CHECK-NEXT:    add x9, x3, #12
1063; CHECK-NEXT:    add x10, x1, #8
1064; CHECK-NEXT:    add x11, x1, #12
1065; CHECK-NEXT:    ld1 { v0.s }[1], [x3], #4
1066; CHECK-NEXT:    ldp s1, s2, [x0]
1067; CHECK-NEXT:    ld1 { v1.s }[1], [x1], #4
1068; CHECK-NEXT:    ld1 { v2.s }[1], [x1]
1069; CHECK-NEXT:    ldp s6, s3, [x0, #8]
1070; CHECK-NEXT:    ld1 { v4.s }[1], [x3]
1071; CHECK-NEXT:    ldp s7, s5, [x2, #8]
1072; CHECK-NEXT:    ld1 { v3.s }[1], [x11]
1073; CHECK-NEXT:    ld1 { v6.s }[1], [x10]
1074; CHECK-NEXT:    ld1 { v5.s }[1], [x9]
1075; CHECK-NEXT:    ld1 { v7.s }[1], [x8]
1076; CHECK-NEXT:    uaddl v16.8h, v2.8b, v3.8b
1077; CHECK-NEXT:    uaddl v3.8h, v1.8b, v6.8b
1078; CHECK-NEXT:    uaddl v2.8h, v4.8b, v5.8b
1079; CHECK-NEXT:    uaddl v4.8h, v0.8b, v7.8b
1080; CHECK-NEXT:    ushll v0.4s, v16.4h, #3
1081; CHECK-NEXT:    ushll2 v1.4s, v16.8h, #3
1082; CHECK-NEXT:    ushll2 v18.4s, v16.8h, #0
1083; CHECK-NEXT:    ushll v6.4s, v2.4h, #3
1084; CHECK-NEXT:    ushll2 v7.4s, v2.8h, #3
1085; CHECK-NEXT:    ushll2 v5.4s, v2.8h, #0
1086; CHECK-NEXT:    ushll v17.4s, v2.4h, #0
1087; CHECK-NEXT:    uaddw2 v1.4s, v1.4s, v3.8h
1088; CHECK-NEXT:    uaddw v0.4s, v0.4s, v3.4h
1089; CHECK-NEXT:    uaddw2 v3.4s, v7.4s, v4.8h
1090; CHECK-NEXT:    uaddw v2.4s, v6.4s, v4.4h
1091; CHECK-NEXT:    ushll v4.4s, v16.4h, #0
1092; CHECK-NEXT:    stp q17, q5, [x4, #32]
1093; CHECK-NEXT:    stp q4, q18, [x4]
1094; CHECK-NEXT:    ret
1095  %lp1 = load <4 x i8>, ptr %p
1096  %p2 = getelementptr i8, ptr %p, i32 4
1097  %lp2 = load <4 x i8>, ptr %p2
1098  %p3 = getelementptr i8, ptr %p, i32 8
1099  %lp3 = load <4 x i8>, ptr %p3
1100  %p4 = getelementptr i8, ptr %p, i32 12
1101  %lp4 = load <4 x i8>, ptr %p4
1102  %lq1 = load <4 x i8>, ptr %q
1103  %q2 = getelementptr i8, ptr %q, i32 4
1104  %lq2 = load <4 x i8>, ptr %q2
1105  %q3 = getelementptr i8, ptr %q, i32 8
1106  %lq3 = load <4 x i8>, ptr %q3
1107  %q4 = getelementptr i8, ptr %q, i32 12
1108  %lq4 = load <4 x i8>, ptr %q4
1109  %lr1 = load <4 x i8>, ptr %r
1110  %r2 = getelementptr i8, ptr %r, i32 4
1111  %lr2 = load <4 x i8>, ptr %r2
1112  %r3 = getelementptr i8, ptr %r, i32 8
1113  %lr3 = load <4 x i8>, ptr %r3
1114  %r4 = getelementptr i8, ptr %r, i32 12
1115  %lr4 = load <4 x i8>, ptr %r4
1116  %ls1 = load <4 x i8>, ptr %s
1117  %s2 = getelementptr i8, ptr %s, i32 4
1118  %ls2 = load <4 x i8>, ptr %s2
1119  %s3 = getelementptr i8, ptr %s, i32 8
1120  %ls3 = load <4 x i8>, ptr %s3
1121  %s4 = getelementptr i8, ptr %s, i32 12
1122  %ls4 = load <4 x i8>, ptr %s4
1123
1124  %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>
1125  %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>
1126  %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>
1127  %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>
1128  %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>
1129  %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>
1130  %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>
1131  %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>
1132  %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>
1133  %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>
1134  %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>
1135  %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>
1136  %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>
1137  %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>
1138  %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>
1139  %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>
1140  %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>
1141  %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>
1142  %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>
1143  %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>
1144
1145  %le11 = zext <16 x i8> %l1 to <16 x i16>
1146  %le12 = zext <16 x i8> %l3 to <16 x i16>
1147  %le21 = zext <16 x i8> %l2 to <16 x i16>
1148  %le22 = zext <16 x i8> %l4 to <16 x i16>
1149  %la1 = add <16 x i16> %le11, %le12
1150  %la2 = add <16 x i16> %le21, %le22
1151  %e1 = zext <16 x i16> %la1 to <16 x i32>
1152  %e2 = zext <16 x i16> %la2 to <16 x i32>
1153  store <16 x i32> %e2, ptr %z
1154  %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>
1155  %a = add <16 x i32> %e1, %se2
1156  ret <16 x i32> %a
1157}
1158
1159define <16 x i32> @extrause_shl(ptr %p, ptr %q, ptr %r, ptr %s, ptr %z) {
1160; CHECK-LABEL: extrause_shl:
1161; CHECK:       // %bb.0:
1162; CHECK-NEXT:    ldp s0, s4, [x2]
1163; CHECK-NEXT:    add x8, x3, #8
1164; CHECK-NEXT:    add x9, x3, #12
1165; CHECK-NEXT:    add x10, x1, #8
1166; CHECK-NEXT:    add x11, x1, #12
1167; CHECK-NEXT:    ld1 { v0.s }[1], [x3], #4
1168; CHECK-NEXT:    ldp s1, s2, [x0]
1169; CHECK-NEXT:    ld1 { v1.s }[1], [x1], #4
1170; CHECK-NEXT:    ld1 { v2.s }[1], [x1]
1171; CHECK-NEXT:    ldp s6, s3, [x0, #8]
1172; CHECK-NEXT:    ld1 { v4.s }[1], [x3]
1173; CHECK-NEXT:    ldp s7, s5, [x2, #8]
1174; CHECK-NEXT:    ld1 { v3.s }[1], [x11]
1175; CHECK-NEXT:    ld1 { v6.s }[1], [x10]
1176; CHECK-NEXT:    ld1 { v5.s }[1], [x9]
1177; CHECK-NEXT:    ld1 { v7.s }[1], [x8]
1178; CHECK-NEXT:    uaddl v2.8h, v2.8b, v3.8b
1179; CHECK-NEXT:    uaddl v3.8h, v4.8b, v5.8b
1180; CHECK-NEXT:    uaddl v4.8h, v1.8b, v6.8b
1181; CHECK-NEXT:    ushll v5.4s, v2.4h, #3
1182; CHECK-NEXT:    ushll2 v6.4s, v2.8h, #3
1183; CHECK-NEXT:    uaddl v2.8h, v0.8b, v7.8b
1184; CHECK-NEXT:    ushll v7.4s, v3.4h, #3
1185; CHECK-NEXT:    ushll2 v16.4s, v3.8h, #3
1186; CHECK-NEXT:    uaddw2 v1.4s, v6.4s, v4.8h
1187; CHECK-NEXT:    uaddw v0.4s, v5.4s, v4.4h
1188; CHECK-NEXT:    stp q5, q6, [x4]
1189; CHECK-NEXT:    uaddw2 v3.4s, v16.4s, v2.8h
1190; CHECK-NEXT:    uaddw v2.4s, v7.4s, v2.4h
1191; CHECK-NEXT:    stp q7, q16, [x4, #32]
1192; CHECK-NEXT:    ret
1193  %lp1 = load <4 x i8>, ptr %p
1194  %p2 = getelementptr i8, ptr %p, i32 4
1195  %lp2 = load <4 x i8>, ptr %p2
1196  %p3 = getelementptr i8, ptr %p, i32 8
1197  %lp3 = load <4 x i8>, ptr %p3
1198  %p4 = getelementptr i8, ptr %p, i32 12
1199  %lp4 = load <4 x i8>, ptr %p4
1200  %lq1 = load <4 x i8>, ptr %q
1201  %q2 = getelementptr i8, ptr %q, i32 4
1202  %lq2 = load <4 x i8>, ptr %q2
1203  %q3 = getelementptr i8, ptr %q, i32 8
1204  %lq3 = load <4 x i8>, ptr %q3
1205  %q4 = getelementptr i8, ptr %q, i32 12
1206  %lq4 = load <4 x i8>, ptr %q4
1207  %lr1 = load <4 x i8>, ptr %r
1208  %r2 = getelementptr i8, ptr %r, i32 4
1209  %lr2 = load <4 x i8>, ptr %r2
1210  %r3 = getelementptr i8, ptr %r, i32 8
1211  %lr3 = load <4 x i8>, ptr %r3
1212  %r4 = getelementptr i8, ptr %r, i32 12
1213  %lr4 = load <4 x i8>, ptr %r4
1214  %ls1 = load <4 x i8>, ptr %s
1215  %s2 = getelementptr i8, ptr %s, i32 4
1216  %ls2 = load <4 x i8>, ptr %s2
1217  %s3 = getelementptr i8, ptr %s, i32 8
1218  %ls3 = load <4 x i8>, ptr %s3
1219  %s4 = getelementptr i8, ptr %s, i32 12
1220  %ls4 = load <4 x i8>, ptr %s4
1221
1222  %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>
1223  %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>
1224  %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>
1225  %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>
1226  %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>
1227  %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>
1228  %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>
1229  %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>
1230  %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>
1231  %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>
1232  %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>
1233  %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>
1234  %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>
1235  %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>
1236  %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>
1237  %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>
1238  %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>
1239  %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>
1240  %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>
1241  %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>
1242
1243  %le11 = zext <16 x i8> %l1 to <16 x i16>
1244  %le12 = zext <16 x i8> %l3 to <16 x i16>
1245  %le21 = zext <16 x i8> %l2 to <16 x i16>
1246  %le22 = zext <16 x i8> %l4 to <16 x i16>
1247  %la1 = add <16 x i16> %le11, %le12
1248  %la2 = add <16 x i16> %le21, %le22
1249  %e1 = zext <16 x i16> %la1 to <16 x i32>
1250  %e2 = zext <16 x i16> %la2 to <16 x i32>
1251  %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>
1252  store <16 x i32> %se2, ptr %z
1253  %a = add <16 x i32> %e1, %se2
1254  ret <16 x i32> %a
1255}
1256
1257
1258define <8 x i32> @commuted_loads(ptr %p1, ptr %p2) {
1259; CHECK-LABEL: commuted_loads:
1260; CHECK:       // %bb.0:
1261; CHECK-NEXT:    ldr q0, [x0]
1262; CHECK-NEXT:    ldr q1, [x1]
1263; CHECK-NEXT:    add v0.16b, v1.16b, v0.16b
1264; CHECK-NEXT:    ushll2 v1.8h, v0.16b, #0
1265; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
1266; CHECK-NEXT:    ushll2 v2.4s, v1.8h, #3
1267; CHECK-NEXT:    ushll v3.4s, v1.4h, #3
1268; CHECK-NEXT:    uaddw2 v1.4s, v2.4s, v0.8h
1269; CHECK-NEXT:    uaddw v0.4s, v3.4s, v0.4h
1270; CHECK-NEXT:    ret
1271  %l11 = load <8 x i8>, ptr %p1
1272  %q1 = getelementptr i8, ptr %p1, i32 8
1273  %l12 = load <8 x i8>, ptr %q1
1274  %l21 = load <8 x i8>, ptr %p2
1275  %q2 = getelementptr i8, ptr %p2, i32 8
1276  %l22 = load <8 x i8>, ptr %q2
1277  %l1 = add <8 x i8> %l21, %l11
1278  %l2 = add <8 x i8> %l22, %l12
1279  %e1 = zext <8 x i8> %l1 to <8 x i32>
1280  %e2 = zext <8 x i8> %l2 to <8 x i32>
1281  %se2 = shl <8 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1282  %a = add <8 x i32> %e1, %se2
1283  ret <8 x i32> %a
1284}
1285
1286define <8 x i32> @commuted_loads2(ptr %p1, ptr %p2) {
1287; CHECK-LABEL: commuted_loads2:
1288; CHECK:       // %bb.0:
1289; CHECK-NEXT:    ldp d0, d3, [x1]
1290; CHECK-NEXT:    ldp d1, d2, [x0]
1291; CHECK-NEXT:    add v0.8b, v1.8b, v0.8b
1292; CHECK-NEXT:    add v1.8b, v2.8b, v3.8b
1293; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
1294; CHECK-NEXT:    ushll v2.8h, v1.8b, #0
1295; CHECK-NEXT:    ushll v3.4s, v0.4h, #3
1296; CHECK-NEXT:    ushll2 v0.4s, v0.8h, #3
1297; CHECK-NEXT:    uaddw2 v1.4s, v0.4s, v2.8h
1298; CHECK-NEXT:    uaddw v0.4s, v3.4s, v2.4h
1299; CHECK-NEXT:    ret
1300  %l11 = load <8 x i8>, ptr %p1
1301  %q1 = getelementptr i8, ptr %p1, i32 8
1302  %l12 = load <8 x i8>, ptr %q1
1303  %l21 = load <8 x i8>, ptr %p2
1304  %q2 = getelementptr i8, ptr %p2, i32 8
1305  %l22 = load <8 x i8>, ptr %q2
1306  %l1 = add <8 x i8> %l11, %l21
1307  %l2 = add <8 x i8> %l12, %l22
1308  %e1 = zext <8 x i8> %l2 to <8 x i32>
1309  %e2 = zext <8 x i8> %l1 to <8 x i32>
1310  %se2 = shl <8 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1311  %a = add <8 x i32> %e1, %se2
1312  ret <8 x i32> %a
1313}
1314
1315define <8 x i32> @commuted_sub(ptr %p1, ptr %p2) {
1316; CHECK-LABEL: commuted_sub:
1317; CHECK:       // %bb.0:
1318; CHECK-NEXT:    ldp d2, d1, [x1]
1319; CHECK-NEXT:    ldr d0, [x0, #8]
1320; CHECK-NEXT:    add v0.8b, v0.8b, v1.8b
1321; CHECK-NEXT:    ldr d1, [x0]
1322; CHECK-NEXT:    add v1.8b, v1.8b, v2.8b
1323; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
1324; CHECK-NEXT:    ushll v2.8h, v1.8b, #0
1325; CHECK-NEXT:    ushll v3.4s, v0.4h, #3
1326; CHECK-NEXT:    ushll2 v0.4s, v0.8h, #3
1327; CHECK-NEXT:    usubw2 v1.4s, v0.4s, v2.8h
1328; CHECK-NEXT:    usubw v0.4s, v3.4s, v2.4h
1329; CHECK-NEXT:    ret
1330  %l11 = load <8 x i8>, ptr %p1
1331  %q1 = getelementptr i8, ptr %p1, i32 8
1332  %l12 = load <8 x i8>, ptr %q1
1333  %l21 = load <8 x i8>, ptr %p2
1334  %q2 = getelementptr i8, ptr %p2, i32 8
1335  %l22 = load <8 x i8>, ptr %q2
1336  %l1 = add <8 x i8> %l11, %l21
1337  %l2 = add <8 x i8> %l12, %l22
1338  %e1 = zext <8 x i8> %l1 to <8 x i32>
1339  %e2 = zext <8 x i8> %l2 to <8 x i32>
1340  %se2 = shl <8 x i32> %e2, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1341  %a = sub <8 x i32> %se2, %e1
1342  ret <8 x i32> %a
1343}
1344
1345define <4 x i32> @bitcast(ptr %p) {
1346; CHECK-LABEL: bitcast:
1347; CHECK:       // %bb.0:
1348; CHECK-NEXT:    ldr d0, [x0]
1349; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
1350; CHECK-NEXT:    ushll2 v1.4s, v0.8h, #3
1351; CHECK-NEXT:    uaddw v0.4s, v1.4s, v0.4h
1352; CHECK-NEXT:    ret
1353  %l1b = load float, ptr %p
1354  %l1 = bitcast float %l1b to <4 x i8>
1355  %q = getelementptr i8, ptr %p, i32 4
1356  %l2b = load float, ptr %q
1357  %l2 = bitcast float %l2b to <4 x i8>
1358  %e1 = zext <4 x i8> %l1 to <4 x i32>
1359  %e2 = zext <4 x i8> %l2 to <4 x i32>
1360  %e3 = shl <4 x i32> %e2, <i32 3, i32 3, i32 3, i32 3>
1361  %a = add <4 x i32> %e1, %e3
1362  ret <4 x i32> %a
1363}
1364
1365define <4 x i32> @atomic(ptr %p) {
1366; CHECK-LABEL: atomic:
1367; CHECK:       // %bb.0:
1368; CHECK-NEXT:    ldar w8, [x0]
1369; CHECK-NEXT:    movi v0.2d, #0x0000ff000000ff
1370; CHECK-NEXT:    ldr s1, [x0, #4]
1371; CHECK-NEXT:    fmov s2, w8
1372; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
1373; CHECK-NEXT:    zip1 v2.8b, v2.8b, v0.8b
1374; CHECK-NEXT:    ushll v1.4s, v1.4h, #3
1375; CHECK-NEXT:    ushll v2.4s, v2.4h, #0
1376; CHECK-NEXT:    and v0.16b, v2.16b, v0.16b
1377; CHECK-NEXT:    add v0.4s, v0.4s, v1.4s
1378; CHECK-NEXT:    ret
1379  %l1b = load atomic float, ptr %p acquire, align 4
1380  %l1 = bitcast float %l1b to <4 x i8>
1381  %q = getelementptr i8, ptr %p, i32 4
1382  %l2b = load float, ptr %q
1383  %l2 = bitcast float %l2b to <4 x i8>
1384  %e1 = zext <4 x i8> %l1 to <4 x i32>
1385  %e2 = zext <4 x i8> %l2 to <4 x i32>
1386  %e3 = shl <4 x i32> %e2, <i32 3, i32 3, i32 3, i32 3>
1387  %a = add <4 x i32> %e1, %e3
1388  ret <4 x i32> %a
1389}
1390
1391define <4 x i32> @volatile(ptr %p) {
1392; CHECK-LABEL: volatile:
1393; CHECK:       // %bb.0:
1394; CHECK-NEXT:    sub sp, sp, #16
1395; CHECK-NEXT:    .cfi_def_cfa_offset 16
1396; CHECK-NEXT:    ldr s0, [x0]
1397; CHECK-NEXT:    ldr s1, [x0, #4]
1398; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
1399; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
1400; CHECK-NEXT:    ushll v1.4s, v1.4h, #3
1401; CHECK-NEXT:    uaddw v0.4s, v1.4s, v0.4h
1402; CHECK-NEXT:    add sp, sp, #16
1403; CHECK-NEXT:    ret
1404  %l1b = load volatile float, ptr %p
1405  %l1 = bitcast float %l1b to <4 x i8>
1406  %q = getelementptr i8, ptr %p, i32 4
1407  %l2b = load float, ptr %q
1408  %l2 = bitcast float %l2b to <4 x i8>
1409  %e1 = zext <4 x i8> %l1 to <4 x i32>
1410  %e2 = zext <4 x i8> %l2 to <4 x i32>
1411  %e3 = shl <4 x i32> %e2, <i32 3, i32 3, i32 3, i32 3>
1412  %a = add <4 x i32> %e1, %e3
1413  ret <4 x i32> %a
1414}
1415