xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-int-extends.ll (revision 8e0cd7382adacd8bc1741dc26bc0be6bdf8e238a)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mattr=+sve -force-streaming-compatible  < %s | FileCheck %s --check-prefixes=CHECK,SVE
3; RUN: llc -mattr=+sve2 -force-streaming-compatible  < %s | FileCheck %s --check-prefixes=CHECK,SVE2
4; RUN: llc -mattr=+sme -force-streaming  < %s | FileCheck %s --check-prefixes=CHECK,SVE2
5; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
6
7target triple = "aarch64-unknown-linux-gnu"
8
9;
10; sext i1 -> i32
11;
12
13; NOTE: Covers the scenario where a SIGN_EXTEND_INREG is required, whose inreg
14; type's element type is not byte based and thus cannot be lowered directly to
15; an SVE instruction.
16define void @sext_v8i1_v8i32(<8 x i1> %a, ptr %out) {
17; CHECK-LABEL: sext_v8i1_v8i32:
18; CHECK:       // %bb.0:
19; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
20; CHECK-NEXT:    uunpklo z0.h, z0.b
21; CHECK-NEXT:    uunpklo z1.s, z0.h
22; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
23; CHECK-NEXT:    uunpklo z0.s, z0.h
24; CHECK-NEXT:    lsl z1.s, z1.s, #31
25; CHECK-NEXT:    lsl z0.s, z0.s, #31
26; CHECK-NEXT:    asr z1.s, z1.s, #31
27; CHECK-NEXT:    asr z0.s, z0.s, #31
28; CHECK-NEXT:    stp q1, q0, [x0]
29; CHECK-NEXT:    ret
30;
31; NONEON-NOSVE-LABEL: sext_v8i1_v8i32:
32; NONEON-NOSVE:       // %bb.0:
33; NONEON-NOSVE-NEXT:    sub sp, sp, #80
34; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 80
35; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
36; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
37; NONEON-NOSVE-NEXT:    strh w8, [sp, #22]
38; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
39; NONEON-NOSVE-NEXT:    strh w8, [sp, #20]
40; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
41; NONEON-NOSVE-NEXT:    strh w8, [sp, #18]
42; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
43; NONEON-NOSVE-NEXT:    strh w8, [sp, #16]
44; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
45; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
46; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
47; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
48; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
49; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
50; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
51; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
52; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #16]
53; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #32]
54; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #46]
55; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #44]
56; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #42]
57; NONEON-NOSVE-NEXT:    ldrh w14, [sp, #40]
58; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #32]
59; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #34]
60; NONEON-NOSVE-NEXT:    sbfx w8, w8, #0, #1
61; NONEON-NOSVE-NEXT:    sbfx w10, w10, #0, #1
62; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #36]
63; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #38]
64; NONEON-NOSVE-NEXT:    sbfx w12, w12, #0, #1
65; NONEON-NOSVE-NEXT:    sbfx w9, w9, #0, #1
66; NONEON-NOSVE-NEXT:    stp w10, w8, [sp, #72]
67; NONEON-NOSVE-NEXT:    sbfx w8, w14, #0, #1
68; NONEON-NOSVE-NEXT:    sbfx w10, w15, #0, #1
69; NONEON-NOSVE-NEXT:    stp w8, w12, [sp, #64]
70; NONEON-NOSVE-NEXT:    sbfx w12, w13, #0, #1
71; NONEON-NOSVE-NEXT:    sbfx w8, w11, #0, #1
72; NONEON-NOSVE-NEXT:    stp w12, w10, [sp, #56]
73; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #48]
74; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #48]
75; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
76; NONEON-NOSVE-NEXT:    add sp, sp, #80
77; NONEON-NOSVE-NEXT:    ret
78  %b = sext <8 x i1> %a to <8 x i32>
79  store <8 x i32> %b, ptr %out
80  ret void
81}
82
83;
84; sext i3 -> i64
85;
86
87; NOTE: Covers the scenario where a SIGN_EXTEND_INREG is required, whose inreg
88; type's element type is not power-of-2 based and thus cannot be lowered
89; directly to an SVE instruction.
90define void @sext_v4i3_v4i64(<4 x i3> %a, ptr %out) {
91; CHECK-LABEL: sext_v4i3_v4i64:
92; CHECK:       // %bb.0:
93; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
94; CHECK-NEXT:    uunpklo z0.s, z0.h
95; CHECK-NEXT:    uunpklo z1.d, z0.s
96; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
97; CHECK-NEXT:    uunpklo z0.d, z0.s
98; CHECK-NEXT:    lsl z1.d, z1.d, #61
99; CHECK-NEXT:    lsl z0.d, z0.d, #61
100; CHECK-NEXT:    asr z1.d, z1.d, #61
101; CHECK-NEXT:    asr z0.d, z0.d, #61
102; CHECK-NEXT:    stp q1, q0, [x0]
103; CHECK-NEXT:    ret
104;
105; NONEON-NOSVE-LABEL: sext_v4i3_v4i64:
106; NONEON-NOSVE:       // %bb.0:
107; NONEON-NOSVE-NEXT:    ushll v0.4s, v0.4h, #0
108; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
109; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
110; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp]
111; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #16]
112; NONEON-NOSVE-NEXT:    ldp w9, w8, [sp, #24]
113; NONEON-NOSVE-NEXT:    ldp w11, w10, [sp, #16]
114; NONEON-NOSVE-NEXT:    sbfx x8, x8, #0, #3
115; NONEON-NOSVE-NEXT:    sbfx x9, x9, #0, #3
116; NONEON-NOSVE-NEXT:    sbfx x10, x10, #0, #3
117; NONEON-NOSVE-NEXT:    stp x9, x8, [sp, #48]
118; NONEON-NOSVE-NEXT:    sbfx x8, x11, #0, #3
119; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #32]
120; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
121; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
122; NONEON-NOSVE-NEXT:    add sp, sp, #64
123; NONEON-NOSVE-NEXT:    ret
124  %b = sext <4 x i3> %a to <4 x i64>
125  store <4 x i64> %b, ptr %out
126  ret void
127}
128
129;
130; sext i8 -> i16
131;
132
133define void @sext_v16i8_v16i16(<16 x i8> %a, ptr %out) {
134; CHECK-LABEL: sext_v16i8_v16i16:
135; CHECK:       // %bb.0:
136; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
137; CHECK-NEXT:    sunpklo z1.h, z0.b
138; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
139; CHECK-NEXT:    sunpklo z0.h, z0.b
140; CHECK-NEXT:    stp q1, q0, [x0]
141; CHECK-NEXT:    ret
142;
143; NONEON-NOSVE-LABEL: sext_v16i8_v16i16:
144; NONEON-NOSVE:       // %bb.0:
145; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
146; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
147; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
148; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
149; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #31]
150; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
151; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #30]
152; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
153; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #29]
154; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
155; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #28]
156; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
157; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #27]
158; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
159; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #26]
160; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
161; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #25]
162; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
163; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #24]
164; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
165; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #23]
166; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
167; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]
168; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
169; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #21]
170; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
171; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #20]
172; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
173; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #19]
174; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
175; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #18]
176; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
177; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #17]
178; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
179; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #16]
180; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
181; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
182; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
183; NONEON-NOSVE-NEXT:    add sp, sp, #64
184; NONEON-NOSVE-NEXT:    ret
185  %b = sext <16 x i8> %a to <16 x i16>
186  store <16 x i16>%b, ptr %out
187  ret void
188}
189
190; NOTE: Extra 'add' is to prevent the extend being combined with the load.
191define void @sext_v32i8_v32i16(ptr %in, ptr %out) {
192; CHECK-LABEL: sext_v32i8_v32i16:
193; CHECK:       // %bb.0:
194; CHECK-NEXT:    ldp q1, q0, [x0]
195; CHECK-NEXT:    add z0.b, z0.b, z0.b
196; CHECK-NEXT:    add z1.b, z1.b, z1.b
197; CHECK-NEXT:    sunpklo z2.h, z0.b
198; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
199; CHECK-NEXT:    sunpklo z3.h, z1.b
200; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
201; CHECK-NEXT:    sunpklo z0.h, z0.b
202; CHECK-NEXT:    sunpklo z1.h, z1.b
203; CHECK-NEXT:    stp q2, q0, [x1, #32]
204; CHECK-NEXT:    stp q3, q1, [x1]
205; CHECK-NEXT:    ret
206;
207; NONEON-NOSVE-LABEL: sext_v32i8_v32i16:
208; NONEON-NOSVE:       // %bb.0:
209; NONEON-NOSVE-NEXT:    sub sp, sp, #272
210; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #176] // 16-byte Folded Spill
211; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #192] // 16-byte Folded Spill
212; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #208] // 16-byte Folded Spill
213; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #224] // 16-byte Folded Spill
214; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #240] // 16-byte Folded Spill
215; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #256] // 16-byte Folded Spill
216; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 272
217; NONEON-NOSVE-NEXT:    .cfi_offset w19, -8
218; NONEON-NOSVE-NEXT:    .cfi_offset w20, -16
219; NONEON-NOSVE-NEXT:    .cfi_offset w21, -24
220; NONEON-NOSVE-NEXT:    .cfi_offset w22, -32
221; NONEON-NOSVE-NEXT:    .cfi_offset w23, -40
222; NONEON-NOSVE-NEXT:    .cfi_offset w24, -48
223; NONEON-NOSVE-NEXT:    .cfi_offset w25, -56
224; NONEON-NOSVE-NEXT:    .cfi_offset w26, -64
225; NONEON-NOSVE-NEXT:    .cfi_offset w27, -72
226; NONEON-NOSVE-NEXT:    .cfi_offset w28, -80
227; NONEON-NOSVE-NEXT:    .cfi_offset w30, -88
228; NONEON-NOSVE-NEXT:    .cfi_offset w29, -96
229; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
230; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]
231; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
232; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #41]
233; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #18]
234; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #16]
235; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #30]
236; NONEON-NOSVE-NEXT:    ldrb w23, [sp, #28]
237; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill
238; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
239; NONEON-NOSVE-NEXT:    ldrb w21, [sp, #26]
240; NONEON-NOSVE-NEXT:    ldrb w19, [sp, #24]
241; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #19]
242; NONEON-NOSVE-NEXT:    ldrb w6, [sp, #38]
243; NONEON-NOSVE-NEXT:    add w8, w8, w8
244; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #17]
245; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #22]
246; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
247; NONEON-NOSVE-NEXT:    add w8, w29, w29
248; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #36]
249; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
250; NONEON-NOSVE-NEXT:    add w8, w27, w27
251; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #31]
252; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
253; NONEON-NOSVE-NEXT:    add w8, w25, w25
254; NONEON-NOSVE-NEXT:    add w9, w9, w9
255; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
256; NONEON-NOSVE-NEXT:    add w8, w23, w23
257; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #34]
258; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
259; NONEON-NOSVE-NEXT:    add w8, w21, w21
260; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #29]
261; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
262; NONEON-NOSVE-NEXT:    add w8, w19, w19
263; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #23]
264; NONEON-NOSVE-NEXT:    strb w9, [sp, #59]
265; NONEON-NOSVE-NEXT:    add w9, w28, w28
266; NONEON-NOSVE-NEXT:    add w18, w16, w16
267; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
268; NONEON-NOSVE-NEXT:    add w8, w6, w6
269; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #32]
270; NONEON-NOSVE-NEXT:    ldrb w22, [sp, #27]
271; NONEON-NOSVE-NEXT:    strb w9, [sp, #57]
272; NONEON-NOSVE-NEXT:    add w9, w26, w26
273; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
274; NONEON-NOSVE-NEXT:    add w8, w4, w4
275; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #46]
276; NONEON-NOSVE-NEXT:    ldrb w20, [sp, #25]
277; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #21]
278; NONEON-NOSVE-NEXT:    strb w9, [sp, #55]
279; NONEON-NOSVE-NEXT:    add w9, w24, w24
280; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
281; NONEON-NOSVE-NEXT:    add w8, w2, w2
282; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #44]
283; NONEON-NOSVE-NEXT:    add w17, w17, w17
284; NONEON-NOSVE-NEXT:    strb w9, [sp, #53]
285; NONEON-NOSVE-NEXT:    add w9, w22, w22
286; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
287; NONEON-NOSVE-NEXT:    add w8, w16, w16
288; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #42]
289; NONEON-NOSVE-NEXT:    strb w17, [sp, #63]
290; NONEON-NOSVE-NEXT:    add w17, w30, w30
291; NONEON-NOSVE-NEXT:    strb w9, [sp, #51]
292; NONEON-NOSVE-NEXT:    add w9, w20, w20
293; NONEON-NOSVE-NEXT:    ldrb w7, [sp, #39]
294; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
295; NONEON-NOSVE-NEXT:    add w8, w14, w14
296; NONEON-NOSVE-NEXT:    ldrb w5, [sp, #37]
297; NONEON-NOSVE-NEXT:    strb w18, [sp, #62]
298; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #35]
299; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #33]
300; NONEON-NOSVE-NEXT:    strb w17, [sp, #61]
301; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #47]
302; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #45]
303; NONEON-NOSVE-NEXT:    strb w9, [sp, #49]
304; NONEON-NOSVE-NEXT:    add w9, w7, w7
305; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #43]
306; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
307; NONEON-NOSVE-NEXT:    add w8, w12, w12
308; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
309; NONEON-NOSVE-NEXT:    add w8, w10, w10
310; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
311; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
312; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12] // 4-byte Folded Reload
313; NONEON-NOSVE-NEXT:    strb w9, [sp, #79]
314; NONEON-NOSVE-NEXT:    add w9, w5, w5
315; NONEON-NOSVE-NEXT:    strb w9, [sp, #77]
316; NONEON-NOSVE-NEXT:    add w9, w3, w3
317; NONEON-NOSVE-NEXT:    add w8, w8, w8
318; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
319; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
320; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #95]
321; NONEON-NOSVE-NEXT:    strb w9, [sp, #75]
322; NONEON-NOSVE-NEXT:    add w9, w0, w0
323; NONEON-NOSVE-NEXT:    strh w8, [sp, #142]
324; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #94]
325; NONEON-NOSVE-NEXT:    strb w9, [sp, #73]
326; NONEON-NOSVE-NEXT:    add w9, w15, w15
327; NONEON-NOSVE-NEXT:    strh w8, [sp, #140]
328; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #93]
329; NONEON-NOSVE-NEXT:    strb w9, [sp, #71]
330; NONEON-NOSVE-NEXT:    add w9, w13, w13
331; NONEON-NOSVE-NEXT:    strh w8, [sp, #138]
332; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #92]
333; NONEON-NOSVE-NEXT:    strb w9, [sp, #69]
334; NONEON-NOSVE-NEXT:    add w9, w11, w11
335; NONEON-NOSVE-NEXT:    strh w8, [sp, #136]
336; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #91]
337; NONEON-NOSVE-NEXT:    strb w9, [sp, #67]
338; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8] // 4-byte Folded Reload
339; NONEON-NOSVE-NEXT:    strh w8, [sp, #134]
340; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #90]
341; NONEON-NOSVE-NEXT:    add w9, w9, w9
342; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #256] // 16-byte Folded Reload
343; NONEON-NOSVE-NEXT:    strh w8, [sp, #132]
344; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #89]
345; NONEON-NOSVE-NEXT:    strb w9, [sp, #65]
346; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #240] // 16-byte Folded Reload
347; NONEON-NOSVE-NEXT:    strh w8, [sp, #130]
348; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #88]
349; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #64]
350; NONEON-NOSVE-NEXT:    strh w8, [sp, #128]
351; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #87]
352; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #224] // 16-byte Folded Reload
353; NONEON-NOSVE-NEXT:    strh w8, [sp, #126]
354; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #86]
355; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
356; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #208] // 16-byte Folded Reload
357; NONEON-NOSVE-NEXT:    strh w8, [sp, #124]
358; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #85]
359; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #192] // 16-byte Folded Reload
360; NONEON-NOSVE-NEXT:    strh w8, [sp, #122]
361; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #84]
362; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #176] // 16-byte Folded Reload
363; NONEON-NOSVE-NEXT:    strh w8, [sp, #120]
364; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #83]
365; NONEON-NOSVE-NEXT:    strh w8, [sp, #118]
366; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #82]
367; NONEON-NOSVE-NEXT:    strh w8, [sp, #116]
368; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #81]
369; NONEON-NOSVE-NEXT:    strh w8, [sp, #114]
370; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #80]
371; NONEON-NOSVE-NEXT:    strh w8, [sp, #112]
372; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #111]
373; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #112]
374; NONEON-NOSVE-NEXT:    strh w8, [sp, #174]
375; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #110]
376; NONEON-NOSVE-NEXT:    strh w8, [sp, #172]
377; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #109]
378; NONEON-NOSVE-NEXT:    strh w8, [sp, #170]
379; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #108]
380; NONEON-NOSVE-NEXT:    strh w8, [sp, #168]
381; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #107]
382; NONEON-NOSVE-NEXT:    strh w8, [sp, #166]
383; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #106]
384; NONEON-NOSVE-NEXT:    strh w8, [sp, #164]
385; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #105]
386; NONEON-NOSVE-NEXT:    strh w8, [sp, #162]
387; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #104]
388; NONEON-NOSVE-NEXT:    strh w8, [sp, #160]
389; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #103]
390; NONEON-NOSVE-NEXT:    strh w8, [sp, #158]
391; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #102]
392; NONEON-NOSVE-NEXT:    strh w8, [sp, #156]
393; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #101]
394; NONEON-NOSVE-NEXT:    strh w8, [sp, #154]
395; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #100]
396; NONEON-NOSVE-NEXT:    strh w8, [sp, #152]
397; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #99]
398; NONEON-NOSVE-NEXT:    strh w8, [sp, #150]
399; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #98]
400; NONEON-NOSVE-NEXT:    strh w8, [sp, #148]
401; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #97]
402; NONEON-NOSVE-NEXT:    strh w8, [sp, #146]
403; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #96]
404; NONEON-NOSVE-NEXT:    strh w8, [sp, #144]
405; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #144]
406; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
407; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
408; NONEON-NOSVE-NEXT:    add sp, sp, #272
409; NONEON-NOSVE-NEXT:    ret
410  %a = load <32 x i8>, ptr %in
411  %b = add <32 x i8> %a, %a
412  %c = sext <32 x i8> %b to <32 x i16>
413  store <32 x i16> %c, ptr %out
414  ret void
415}
416
417;
418; sext i8 -> i32
419;
420
421define void @sext_v8i8_v8i32(<8 x i8> %a, ptr %out) {
422; CHECK-LABEL: sext_v8i8_v8i32:
423; CHECK:       // %bb.0:
424; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
425; CHECK-NEXT:    sunpklo z0.h, z0.b
426; CHECK-NEXT:    sunpklo z1.s, z0.h
427; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
428; CHECK-NEXT:    sunpklo z0.s, z0.h
429; CHECK-NEXT:    stp q1, q0, [x0]
430; CHECK-NEXT:    ret
431;
432; NONEON-NOSVE-LABEL: sext_v8i8_v8i32:
433; NONEON-NOSVE:       // %bb.0:
434; NONEON-NOSVE-NEXT:    sub sp, sp, #80
435; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 80
436; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
437; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #11]
438; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
439; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #10]
440; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
441; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #9]
442; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
443; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #8]
444; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
445; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #15]
446; NONEON-NOSVE-NEXT:    strh w8, [sp, #22]
447; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #14]
448; NONEON-NOSVE-NEXT:    strh w8, [sp, #20]
449; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #13]
450; NONEON-NOSVE-NEXT:    strh w8, [sp, #18]
451; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #12]
452; NONEON-NOSVE-NEXT:    strh w8, [sp, #16]
453; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #16]
454; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
455; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #46]
456; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #44]
457; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #72]
458; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #42]
459; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #40]
460; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64]
461; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #38]
462; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #36]
463; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
464; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #34]
465; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #32]
466; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
467; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #48]
468; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
469; NONEON-NOSVE-NEXT:    add sp, sp, #80
470; NONEON-NOSVE-NEXT:    ret
471  %b = sext <8 x i8> %a to <8 x i32>
472  store <8 x i32>%b, ptr %out
473  ret void
474}
475
476define void @sext_v16i8_v16i32(<16 x i8> %a, ptr %out) {
477; CHECK-LABEL: sext_v16i8_v16i32:
478; CHECK:       // %bb.0:
479; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
480; CHECK-NEXT:    sunpklo z1.h, z0.b
481; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
482; CHECK-NEXT:    sunpklo z0.h, z0.b
483; CHECK-NEXT:    sunpklo z2.s, z1.h
484; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
485; CHECK-NEXT:    sunpklo z1.s, z1.h
486; CHECK-NEXT:    sunpklo z3.s, z0.h
487; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
488; CHECK-NEXT:    sunpklo z0.s, z0.h
489; CHECK-NEXT:    stp q2, q1, [x0]
490; CHECK-NEXT:    stp q3, q0, [x0, #32]
491; CHECK-NEXT:    ret
492;
493; NONEON-NOSVE-LABEL: sext_v16i8_v16i32:
494; NONEON-NOSVE:       // %bb.0:
495; NONEON-NOSVE-NEXT:    str q0, [sp, #-160]!
496; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160
497; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
498; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
499; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #27]
500; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
501; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #26]
502; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
503; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #25]
504; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
505; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #24]
506; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
507; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #31]
508; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
509; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #30]
510; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
511; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #29]
512; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
513; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #28]
514; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
515; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #19]
516; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
517; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
518; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #18]
519; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
520; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #17]
521; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
522; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
523; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #16]
524; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #94]
525; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
526; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #23]
527; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
528; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #22]
529; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
530; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #21]
531; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
532; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #20]
533; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
534; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #92]
535; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
536; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #152]
537; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #90]
538; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #88]
539; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144]
540; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #86]
541; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #84]
542; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
543; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136]
544; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #82]
545; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #80]
546; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]
547; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #78]
548; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #76]
549; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #128]
550; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]
551; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #74]
552; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #72]
553; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112]
554; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #70]
555; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #68]
556; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104]
557; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #66]
558; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #64]
559; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #96]
560; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
561; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]
562; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]
563; NONEON-NOSVE-NEXT:    add sp, sp, #160
564; NONEON-NOSVE-NEXT:    ret
565  %b = sext <16 x i8> %a to <16 x i32>
566  store <16 x i32> %b, ptr %out
567  ret void
568}
569
570define void @sext_v32i8_v32i32(ptr %in, ptr %out) {
571; CHECK-LABEL: sext_v32i8_v32i32:
572; CHECK:       // %bb.0:
573; CHECK-NEXT:    ldp q1, q0, [x0]
574; CHECK-NEXT:    add z0.b, z0.b, z0.b
575; CHECK-NEXT:    add z1.b, z1.b, z1.b
576; CHECK-NEXT:    sunpklo z2.h, z0.b
577; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
578; CHECK-NEXT:    sunpklo z3.h, z1.b
579; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
580; CHECK-NEXT:    sunpklo z0.h, z0.b
581; CHECK-NEXT:    sunpklo z1.h, z1.b
582; CHECK-NEXT:    sunpklo z4.s, z2.h
583; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
584; CHECK-NEXT:    sunpklo z5.s, z3.h
585; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
586; CHECK-NEXT:    sunpklo z6.s, z0.h
587; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
588; CHECK-NEXT:    sunpklo z2.s, z2.h
589; CHECK-NEXT:    sunpklo z7.s, z1.h
590; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
591; CHECK-NEXT:    sunpklo z3.s, z3.h
592; CHECK-NEXT:    sunpklo z0.s, z0.h
593; CHECK-NEXT:    sunpklo z1.s, z1.h
594; CHECK-NEXT:    stp q4, q2, [x1, #64]
595; CHECK-NEXT:    stp q5, q3, [x1]
596; CHECK-NEXT:    stp q6, q0, [x1, #96]
597; CHECK-NEXT:    stp q7, q1, [x1, #32]
598; CHECK-NEXT:    ret
599;
600; NONEON-NOSVE-LABEL: sext_v32i8_v32i32:
601; NONEON-NOSVE:       // %bb.0:
602; NONEON-NOSVE-NEXT:    sub sp, sp, #464
603; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #368] // 16-byte Folded Spill
604; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #384] // 16-byte Folded Spill
605; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #400] // 16-byte Folded Spill
606; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #416] // 16-byte Folded Spill
607; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #432] // 16-byte Folded Spill
608; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #448] // 16-byte Folded Spill
609; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 464
610; NONEON-NOSVE-NEXT:    .cfi_offset w19, -8
611; NONEON-NOSVE-NEXT:    .cfi_offset w20, -16
612; NONEON-NOSVE-NEXT:    .cfi_offset w21, -24
613; NONEON-NOSVE-NEXT:    .cfi_offset w22, -32
614; NONEON-NOSVE-NEXT:    .cfi_offset w23, -40
615; NONEON-NOSVE-NEXT:    .cfi_offset w24, -48
616; NONEON-NOSVE-NEXT:    .cfi_offset w25, -56
617; NONEON-NOSVE-NEXT:    .cfi_offset w26, -64
618; NONEON-NOSVE-NEXT:    .cfi_offset w27, -72
619; NONEON-NOSVE-NEXT:    .cfi_offset w28, -80
620; NONEON-NOSVE-NEXT:    .cfi_offset w30, -88
621; NONEON-NOSVE-NEXT:    .cfi_offset w29, -96
622; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
623; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]
624; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
625; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #41]
626; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #18]
627; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #16]
628; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #30]
629; NONEON-NOSVE-NEXT:    ldrb w23, [sp, #28]
630; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill
631; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
632; NONEON-NOSVE-NEXT:    ldrb w21, [sp, #26]
633; NONEON-NOSVE-NEXT:    ldrb w19, [sp, #24]
634; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #19]
635; NONEON-NOSVE-NEXT:    ldrb w6, [sp, #38]
636; NONEON-NOSVE-NEXT:    add w8, w8, w8
637; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #17]
638; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #22]
639; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
640; NONEON-NOSVE-NEXT:    add w8, w29, w29
641; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #36]
642; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
643; NONEON-NOSVE-NEXT:    add w8, w27, w27
644; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #31]
645; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
646; NONEON-NOSVE-NEXT:    add w8, w25, w25
647; NONEON-NOSVE-NEXT:    add w9, w9, w9
648; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
649; NONEON-NOSVE-NEXT:    add w8, w23, w23
650; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #34]
651; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
652; NONEON-NOSVE-NEXT:    add w8, w21, w21
653; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #29]
654; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
655; NONEON-NOSVE-NEXT:    add w8, w19, w19
656; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #23]
657; NONEON-NOSVE-NEXT:    strb w9, [sp, #59]
658; NONEON-NOSVE-NEXT:    add w9, w28, w28
659; NONEON-NOSVE-NEXT:    add w18, w16, w16
660; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
661; NONEON-NOSVE-NEXT:    add w8, w6, w6
662; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #32]
663; NONEON-NOSVE-NEXT:    ldrb w22, [sp, #27]
664; NONEON-NOSVE-NEXT:    strb w9, [sp, #57]
665; NONEON-NOSVE-NEXT:    add w9, w26, w26
666; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
667; NONEON-NOSVE-NEXT:    add w8, w4, w4
668; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #46]
669; NONEON-NOSVE-NEXT:    ldrb w20, [sp, #25]
670; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #21]
671; NONEON-NOSVE-NEXT:    strb w9, [sp, #55]
672; NONEON-NOSVE-NEXT:    add w9, w24, w24
673; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
674; NONEON-NOSVE-NEXT:    add w8, w2, w2
675; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #44]
676; NONEON-NOSVE-NEXT:    add w17, w17, w17
677; NONEON-NOSVE-NEXT:    strb w9, [sp, #53]
678; NONEON-NOSVE-NEXT:    add w9, w22, w22
679; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
680; NONEON-NOSVE-NEXT:    add w8, w16, w16
681; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #42]
682; NONEON-NOSVE-NEXT:    strb w17, [sp, #63]
683; NONEON-NOSVE-NEXT:    add w17, w30, w30
684; NONEON-NOSVE-NEXT:    strb w9, [sp, #51]
685; NONEON-NOSVE-NEXT:    add w9, w20, w20
686; NONEON-NOSVE-NEXT:    ldrb w7, [sp, #39]
687; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
688; NONEON-NOSVE-NEXT:    add w8, w14, w14
689; NONEON-NOSVE-NEXT:    ldrb w5, [sp, #37]
690; NONEON-NOSVE-NEXT:    strb w18, [sp, #62]
691; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #35]
692; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #33]
693; NONEON-NOSVE-NEXT:    strb w17, [sp, #61]
694; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #47]
695; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #45]
696; NONEON-NOSVE-NEXT:    strb w9, [sp, #49]
697; NONEON-NOSVE-NEXT:    add w9, w7, w7
698; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #43]
699; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
700; NONEON-NOSVE-NEXT:    add w8, w12, w12
701; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
702; NONEON-NOSVE-NEXT:    add w8, w10, w10
703; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
704; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
705; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12] // 4-byte Folded Reload
706; NONEON-NOSVE-NEXT:    strb w9, [sp, #79]
707; NONEON-NOSVE-NEXT:    add w9, w5, w5
708; NONEON-NOSVE-NEXT:    strb w9, [sp, #77]
709; NONEON-NOSVE-NEXT:    add w9, w3, w3
710; NONEON-NOSVE-NEXT:    add w8, w8, w8
711; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
712; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
713; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #91]
714; NONEON-NOSVE-NEXT:    strb w9, [sp, #75]
715; NONEON-NOSVE-NEXT:    add w9, w0, w0
716; NONEON-NOSVE-NEXT:    strh w8, [sp, #134]
717; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #90]
718; NONEON-NOSVE-NEXT:    strb w9, [sp, #73]
719; NONEON-NOSVE-NEXT:    add w9, w15, w15
720; NONEON-NOSVE-NEXT:    strh w8, [sp, #132]
721; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #89]
722; NONEON-NOSVE-NEXT:    strb w9, [sp, #71]
723; NONEON-NOSVE-NEXT:    add w9, w13, w13
724; NONEON-NOSVE-NEXT:    strh w8, [sp, #130]
725; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #88]
726; NONEON-NOSVE-NEXT:    strb w9, [sp, #69]
727; NONEON-NOSVE-NEXT:    add w9, w11, w11
728; NONEON-NOSVE-NEXT:    strh w8, [sp, #128]
729; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #95]
730; NONEON-NOSVE-NEXT:    strb w9, [sp, #67]
731; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8] // 4-byte Folded Reload
732; NONEON-NOSVE-NEXT:    strh w8, [sp, #142]
733; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #94]
734; NONEON-NOSVE-NEXT:    add w9, w9, w9
735; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #448] // 16-byte Folded Reload
736; NONEON-NOSVE-NEXT:    strh w8, [sp, #140]
737; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #93]
738; NONEON-NOSVE-NEXT:    strb w9, [sp, #65]
739; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #432] // 16-byte Folded Reload
740; NONEON-NOSVE-NEXT:    strh w8, [sp, #138]
741; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #92]
742; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #64]
743; NONEON-NOSVE-NEXT:    strh w8, [sp, #136]
744; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #83]
745; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #416] // 16-byte Folded Reload
746; NONEON-NOSVE-NEXT:    strh w8, [sp, #118]
747; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #82]
748; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
749; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #128]
750; NONEON-NOSVE-NEXT:    strh w8, [sp, #116]
751; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #81]
752; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #400] // 16-byte Folded Reload
753; NONEON-NOSVE-NEXT:    strh w8, [sp, #114]
754; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #80]
755; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #192]
756; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #384] // 16-byte Folded Reload
757; NONEON-NOSVE-NEXT:    strh w8, [sp, #112]
758; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #87]
759; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #368] // 16-byte Folded Reload
760; NONEON-NOSVE-NEXT:    strh w8, [sp, #126]
761; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #86]
762; NONEON-NOSVE-NEXT:    strh w8, [sp, #124]
763; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #85]
764; NONEON-NOSVE-NEXT:    strh w8, [sp, #122]
765; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #84]
766; NONEON-NOSVE-NEXT:    strh w8, [sp, #120]
767; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #107]
768; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #112]
769; NONEON-NOSVE-NEXT:    strh w8, [sp, #166]
770; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #106]
771; NONEON-NOSVE-NEXT:    strh w8, [sp, #164]
772; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #105]
773; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #176]
774; NONEON-NOSVE-NEXT:    strh w8, [sp, #162]
775; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #104]
776; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #182]
777; NONEON-NOSVE-NEXT:    strh w8, [sp, #160]
778; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #111]
779; NONEON-NOSVE-NEXT:    strh w8, [sp, #174]
780; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #110]
781; NONEON-NOSVE-NEXT:    strh w8, [sp, #172]
782; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #109]
783; NONEON-NOSVE-NEXT:    strh w8, [sp, #170]
784; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #108]
785; NONEON-NOSVE-NEXT:    strh w8, [sp, #168]
786; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #99]
787; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #160]
788; NONEON-NOSVE-NEXT:    strh w8, [sp, #150]
789; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #98]
790; NONEON-NOSVE-NEXT:    strh w8, [sp, #148]
791; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #97]
792; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #224]
793; NONEON-NOSVE-NEXT:    strh w8, [sp, #146]
794; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #96]
795; NONEON-NOSVE-NEXT:    strh w8, [sp, #144]
796; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #103]
797; NONEON-NOSVE-NEXT:    strh w8, [sp, #158]
798; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #102]
799; NONEON-NOSVE-NEXT:    strh w8, [sp, #156]
800; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #101]
801; NONEON-NOSVE-NEXT:    strh w8, [sp, #154]
802; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #100]
803; NONEON-NOSVE-NEXT:    strh w8, [sp, #152]
804; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #198]
805; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #144]
806; NONEON-NOSVE-NEXT:    str w8, [sp, #284]
807; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #196]
808; NONEON-NOSVE-NEXT:    str w8, [sp, #280]
809; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #194]
810; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #208]
811; NONEON-NOSVE-NEXT:    str w8, [sp, #276]
812; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #192]
813; NONEON-NOSVE-NEXT:    str w8, [sp, #272]
814; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #206]
815; NONEON-NOSVE-NEXT:    str w8, [sp, #300]
816; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #204]
817; NONEON-NOSVE-NEXT:    str w8, [sp, #296]
818; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #202]
819; NONEON-NOSVE-NEXT:    str w8, [sp, #292]
820; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #200]
821; NONEON-NOSVE-NEXT:    str w8, [sp, #288]
822; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #180]
823; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #272]
824; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #248]
825; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #178]
826; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #176]
827; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #240]
828; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #190]
829; NONEON-NOSVE-NEXT:    str w8, [sp, #268]
830; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #188]
831; NONEON-NOSVE-NEXT:    str w8, [sp, #264]
832; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #186]
833; NONEON-NOSVE-NEXT:    str w8, [sp, #260]
834; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #184]
835; NONEON-NOSVE-NEXT:    str w8, [sp, #256]
836; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #230]
837; NONEON-NOSVE-NEXT:    ldp q3, q4, [sp, #240]
838; NONEON-NOSVE-NEXT:    str w8, [sp, #348]
839; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #228]
840; NONEON-NOSVE-NEXT:    str w8, [sp, #344]
841; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #226]
842; NONEON-NOSVE-NEXT:    str w8, [sp, #340]
843; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #224]
844; NONEON-NOSVE-NEXT:    str w8, [sp, #336]
845; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #238]
846; NONEON-NOSVE-NEXT:    str w8, [sp, #364]
847; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #236]
848; NONEON-NOSVE-NEXT:    str w8, [sp, #360]
849; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #234]
850; NONEON-NOSVE-NEXT:    str w8, [sp, #356]
851; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #232]
852; NONEON-NOSVE-NEXT:    str w8, [sp, #352]
853; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #214]
854; NONEON-NOSVE-NEXT:    ldp q6, q7, [sp, #336]
855; NONEON-NOSVE-NEXT:    str w8, [sp, #316]
856; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #212]
857; NONEON-NOSVE-NEXT:    str w8, [sp, #312]
858; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #210]
859; NONEON-NOSVE-NEXT:    str w8, [sp, #308]
860; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #208]
861; NONEON-NOSVE-NEXT:    str w8, [sp, #304]
862; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #222]
863; NONEON-NOSVE-NEXT:    str w8, [sp, #332]
864; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #220]
865; NONEON-NOSVE-NEXT:    str w8, [sp, #328]
866; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #218]
867; NONEON-NOSVE-NEXT:    str w8, [sp, #324]
868; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #216]
869; NONEON-NOSVE-NEXT:    str w8, [sp, #320]
870; NONEON-NOSVE-NEXT:    ldp q5, q2, [sp, #304]
871; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
872; NONEON-NOSVE-NEXT:    stp q3, q4, [x1, #32]
873; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #64]
874; NONEON-NOSVE-NEXT:    stp q5, q2, [x1, #96]
875; NONEON-NOSVE-NEXT:    add sp, sp, #464
876; NONEON-NOSVE-NEXT:    ret
877  %a = load <32 x i8>, ptr %in
878  %b = add <32 x i8> %a, %a
879  %c = sext <32 x i8> %b to <32 x i32>
880  store <32 x i32> %c, ptr %out
881  ret void
882}
883
884;
885; sext i8 -> i64
886;
887
888; NOTE: v4i8 is an unpacked typed stored within a v4i16 container. The sign
889; extend is a two step process where the container is any_extend'd with the
890; result feeding an inreg sign extend.
891define void @sext_v4i8_v4i64(<4 x i8> %a, ptr %out) {
892; CHECK-LABEL: sext_v4i8_v4i64:
893; CHECK:       // %bb.0:
894; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
895; CHECK-NEXT:    ptrue p0.d, vl2
896; CHECK-NEXT:    uunpklo z0.s, z0.h
897; CHECK-NEXT:    uunpklo z1.d, z0.s
898; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
899; CHECK-NEXT:    uunpklo z0.d, z0.s
900; CHECK-NEXT:    sxtb z1.d, p0/m, z1.d
901; CHECK-NEXT:    sxtb z0.d, p0/m, z0.d
902; CHECK-NEXT:    stp q1, q0, [x0]
903; CHECK-NEXT:    ret
904;
905; NONEON-NOSVE-LABEL: sext_v4i8_v4i64:
906; NONEON-NOSVE:       // %bb.0:
907; NONEON-NOSVE-NEXT:    ushll v0.4s, v0.4h, #0
908; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
909; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
910; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp]
911; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #16]
912; NONEON-NOSVE-NEXT:    ldrsb x8, [sp, #28]
913; NONEON-NOSVE-NEXT:    ldrsb x9, [sp, #24]
914; NONEON-NOSVE-NEXT:    ldrsb x10, [sp, #16]
915; NONEON-NOSVE-NEXT:    ldrsb x11, [sp, #20]
916; NONEON-NOSVE-NEXT:    stp x9, x8, [sp, #48]
917; NONEON-NOSVE-NEXT:    stp x10, x11, [sp, #32]
918; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
919; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
920; NONEON-NOSVE-NEXT:    add sp, sp, #64
921; NONEON-NOSVE-NEXT:    ret
922  %b = sext <4 x i8> %a to <4 x i64>
923  store <4 x i64>%b, ptr %out
924  ret void
925}
926
927define void @sext_v8i8_v8i64(<8 x i8> %a, ptr %out) {
928; CHECK-LABEL: sext_v8i8_v8i64:
929; CHECK:       // %bb.0:
930; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
931; CHECK-NEXT:    sunpklo z0.h, z0.b
932; CHECK-NEXT:    sunpklo z1.s, z0.h
933; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
934; CHECK-NEXT:    sunpklo z0.s, z0.h
935; CHECK-NEXT:    sunpklo z2.d, z1.s
936; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
937; CHECK-NEXT:    sunpklo z3.d, z0.s
938; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
939; CHECK-NEXT:    sunpklo z1.d, z1.s
940; CHECK-NEXT:    sunpklo z0.d, z0.s
941; CHECK-NEXT:    stp q2, q1, [x0]
942; CHECK-NEXT:    stp q3, q0, [x0, #32]
943; CHECK-NEXT:    ret
944;
945; NONEON-NOSVE-LABEL: sext_v8i8_v8i64:
946; NONEON-NOSVE:       // %bb.0:
947; NONEON-NOSVE-NEXT:    sub sp, sp, #176
948; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 176
949; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
950; NONEON-NOSVE-NEXT:    add x8, sp, #144
951; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]
952; NONEON-NOSVE-NEXT:    strh w9, [sp, #30]
953; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]
954; NONEON-NOSVE-NEXT:    strh w9, [sp, #28]
955; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]
956; NONEON-NOSVE-NEXT:    strh w9, [sp, #26]
957; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]
958; NONEON-NOSVE-NEXT:    strh w9, [sp, #24]
959; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]
960; NONEON-NOSVE-NEXT:    strh w9, [sp, #22]
961; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]
962; NONEON-NOSVE-NEXT:    strh w9, [sp, #20]
963; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]
964; NONEON-NOSVE-NEXT:    strh w9, [sp, #18]
965; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]
966; NONEON-NOSVE-NEXT:    strh w9, [sp, #16]
967; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #16]
968; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
969; NONEON-NOSVE-NEXT:    ldrsh w10, [sp, #42]
970; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #40]
971; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #64]
972; NONEON-NOSVE-NEXT:    ldrsh w10, [sp, #46]
973; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #44]
974; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #72]
975; NONEON-NOSVE-NEXT:    ldrsh w10, [sp, #34]
976; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #32]
977; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #64]
978; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #48]
979; NONEON-NOSVE-NEXT:    ldrsh w10, [sp, #38]
980; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #36]
981; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #56]
982; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #96]
983; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #48]
984; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #80]
985; NONEON-NOSVE-NEXT:    ldpsw x9, x10, [sp, #96]
986; NONEON-NOSVE-NEXT:    stp x9, x10, [sp, #144]
987; NONEON-NOSVE-NEXT:    ldpsw x9, x10, [sp, #104]
988; NONEON-NOSVE-NEXT:    stp x9, x10, [sp, #160]
989; NONEON-NOSVE-NEXT:    ldpsw x9, x10, [sp, #80]
990; NONEON-NOSVE-NEXT:    stp x9, x10, [sp, #112]
991; NONEON-NOSVE-NEXT:    ldpsw x9, x10, [sp, #88]
992; NONEON-NOSVE-NEXT:    stp x9, x10, [sp, #128]
993; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #112]
994; NONEON-NOSVE-NEXT:    ldp q2, q3, [x8]
995; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]
996; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]
997; NONEON-NOSVE-NEXT:    add sp, sp, #176
998; NONEON-NOSVE-NEXT:    ret
999  %b = sext <8 x i8> %a to <8 x i64>
1000  store <8 x i64>%b, ptr %out
1001  ret void
1002}
1003
1004define void @sext_v16i8_v16i64(<16 x i8> %a, ptr %out) {
1005; CHECK-LABEL: sext_v16i8_v16i64:
1006; CHECK:       // %bb.0:
1007; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1008; CHECK-NEXT:    sunpklo z1.h, z0.b
1009; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1010; CHECK-NEXT:    sunpklo z0.h, z0.b
1011; CHECK-NEXT:    sunpklo z2.s, z1.h
1012; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1013; CHECK-NEXT:    sunpklo z1.s, z1.h
1014; CHECK-NEXT:    sunpklo z3.s, z0.h
1015; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1016; CHECK-NEXT:    sunpklo z4.d, z2.s
1017; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
1018; CHECK-NEXT:    sunpklo z0.s, z0.h
1019; CHECK-NEXT:    sunpklo z6.d, z1.s
1020; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1021; CHECK-NEXT:    sunpklo z5.d, z3.s
1022; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
1023; CHECK-NEXT:    sunpklo z2.d, z2.s
1024; CHECK-NEXT:    sunpklo z1.d, z1.s
1025; CHECK-NEXT:    sunpklo z7.d, z0.s
1026; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1027; CHECK-NEXT:    sunpklo z3.d, z3.s
1028; CHECK-NEXT:    stp q4, q2, [x0]
1029; CHECK-NEXT:    sunpklo z0.d, z0.s
1030; CHECK-NEXT:    stp q6, q1, [x0, #32]
1031; CHECK-NEXT:    stp q5, q3, [x0, #64]
1032; CHECK-NEXT:    stp q7, q0, [x0, #96]
1033; CHECK-NEXT:    ret
1034;
1035; NONEON-NOSVE-LABEL: sext_v16i8_v16i64:
1036; NONEON-NOSVE:       // %bb.0:
1037; NONEON-NOSVE-NEXT:    sub sp, sp, #368
1038; NONEON-NOSVE-NEXT:    str x29, [sp, #352] // 8-byte Folded Spill
1039; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 368
1040; NONEON-NOSVE-NEXT:    .cfi_offset w29, -16
1041; NONEON-NOSVE-NEXT:    str q0, [sp]
1042; NONEON-NOSVE-NEXT:    ldr x29, [sp, #352] // 8-byte Folded Reload
1043; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
1044; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #24]
1045; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #35]
1046; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1047; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #34]
1048; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1049; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #33]
1050; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1051; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #32]
1052; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1053; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #39]
1054; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
1055; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #38]
1056; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
1057; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #37]
1058; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
1059; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #36]
1060; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
1061; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #27]
1062; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #56]
1063; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
1064; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #26]
1065; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
1066; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #25]
1067; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #88]
1068; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
1069; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #24]
1070; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #98]
1071; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
1072; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #31]
1073; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
1074; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #30]
1075; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
1076; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #29]
1077; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
1078; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #28]
1079; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
1080; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #96]
1081; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #40]
1082; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #152]
1083; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #102]
1084; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #100]
1085; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #160]
1086; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #90]
1087; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #88]
1088; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #72]
1089; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #152]
1090; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136]
1091; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #94]
1092; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #92]
1093; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144]
1094; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #82]
1095; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #80]
1096; NONEON-NOSVE-NEXT:    str d0, [sp, #360]
1097; NONEON-NOSVE-NEXT:    ldp d2, d0, [sp, #136]
1098; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]
1099; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #86]
1100; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #84]
1101; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]
1102; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #74]
1103; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #72]
1104; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #208]
1105; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #120]
1106; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104]
1107; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #78]
1108; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #76]
1109; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112]
1110; NONEON-NOSVE-NEXT:    stp d0, d2, [sp, #192]
1111; NONEON-NOSVE-NEXT:    ldp d2, d0, [sp, #104]
1112; NONEON-NOSVE-NEXT:    str d2, [sp, #168]
1113; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #176]
1114; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #216]
1115; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #320]
1116; NONEON-NOSVE-NEXT:    ldrsw x9, [sp, #364]
1117; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #360]
1118; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #336]
1119; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #200]
1120; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #320]
1121; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #288]
1122; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #208]
1123; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #304]
1124; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #184]
1125; NONEON-NOSVE-NEXT:    ldp q3, q4, [sp, #288]
1126; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #256]
1127; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #192]
1128; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #272]
1129; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #168]
1130; NONEON-NOSVE-NEXT:    ldp q6, q7, [sp, #256]
1131; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #224]
1132; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #176]
1133; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #240]
1134; NONEON-NOSVE-NEXT:    ldp q5, q2, [sp, #224]
1135; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1136; NONEON-NOSVE-NEXT:    stp q3, q4, [x0, #32]
1137; NONEON-NOSVE-NEXT:    stp q6, q7, [x0, #64]
1138; NONEON-NOSVE-NEXT:    stp q5, q2, [x0, #96]
1139; NONEON-NOSVE-NEXT:    add sp, sp, #368
1140; NONEON-NOSVE-NEXT:    ret
1141  %b = sext <16 x i8> %a to <16 x i64>
1142  store <16 x i64> %b, ptr %out
1143  ret void
1144}
1145
1146define void @sext_v32i8_v32i64(ptr %in, ptr %out) {
1147; CHECK-LABEL: sext_v32i8_v32i64:
1148; CHECK:       // %bb.0:
1149; CHECK-NEXT:    ldp q1, q0, [x0]
1150; CHECK-NEXT:    add z0.b, z0.b, z0.b
1151; CHECK-NEXT:    add z1.b, z1.b, z1.b
1152; CHECK-NEXT:    mov z2.d, z0.d
1153; CHECK-NEXT:    sunpklo z0.h, z0.b
1154; CHECK-NEXT:    mov z3.d, z1.d
1155; CHECK-NEXT:    sunpklo z1.h, z1.b
1156; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
1157; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
1158; CHECK-NEXT:    sunpklo z4.s, z0.h
1159; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1160; CHECK-NEXT:    sunpklo z5.s, z1.h
1161; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1162; CHECK-NEXT:    sunpklo z2.h, z2.b
1163; CHECK-NEXT:    sunpklo z3.h, z3.b
1164; CHECK-NEXT:    sunpklo z0.s, z0.h
1165; CHECK-NEXT:    sunpklo z16.d, z4.s
1166; CHECK-NEXT:    ext z4.b, z4.b, z4.b, #8
1167; CHECK-NEXT:    sunpklo z1.s, z1.h
1168; CHECK-NEXT:    sunpklo z17.d, z5.s
1169; CHECK-NEXT:    ext z5.b, z5.b, z5.b, #8
1170; CHECK-NEXT:    sunpklo z6.s, z2.h
1171; CHECK-NEXT:    sunpklo z7.s, z3.h
1172; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
1173; CHECK-NEXT:    sunpklo z4.d, z4.s
1174; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
1175; CHECK-NEXT:    sunpklo z19.d, z0.s
1176; CHECK-NEXT:    sunpklo z5.d, z5.s
1177; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1178; CHECK-NEXT:    sunpklo z2.s, z2.h
1179; CHECK-NEXT:    sunpklo z18.d, z6.s
1180; CHECK-NEXT:    ext z6.b, z6.b, z6.b, #8
1181; CHECK-NEXT:    sunpklo z3.s, z3.h
1182; CHECK-NEXT:    stp q16, q4, [x1, #128]
1183; CHECK-NEXT:    mov z16.d, z7.d
1184; CHECK-NEXT:    sunpklo z0.d, z0.s
1185; CHECK-NEXT:    stp q17, q5, [x1]
1186; CHECK-NEXT:    sunpklo z5.d, z7.s
1187; CHECK-NEXT:    sunpklo z4.d, z6.s
1188; CHECK-NEXT:    mov z6.d, z1.d
1189; CHECK-NEXT:    ext z16.b, z16.b, z7.b, #8
1190; CHECK-NEXT:    mov z7.d, z2.d
1191; CHECK-NEXT:    stp q19, q0, [x1, #160]
1192; CHECK-NEXT:    sunpklo z0.d, z2.s
1193; CHECK-NEXT:    ext z6.b, z6.b, z1.b, #8
1194; CHECK-NEXT:    sunpklo z1.d, z1.s
1195; CHECK-NEXT:    stp q18, q4, [x1, #192]
1196; CHECK-NEXT:    mov z4.d, z3.d
1197; CHECK-NEXT:    ext z7.b, z7.b, z2.b, #8
1198; CHECK-NEXT:    sunpklo z16.d, z16.s
1199; CHECK-NEXT:    sunpklo z6.d, z6.s
1200; CHECK-NEXT:    ext z4.b, z4.b, z3.b, #8
1201; CHECK-NEXT:    sunpklo z2.d, z7.s
1202; CHECK-NEXT:    sunpklo z3.d, z3.s
1203; CHECK-NEXT:    stp q5, q16, [x1, #64]
1204; CHECK-NEXT:    stp q1, q6, [x1, #32]
1205; CHECK-NEXT:    sunpklo z1.d, z4.s
1206; CHECK-NEXT:    stp q0, q2, [x1, #224]
1207; CHECK-NEXT:    stp q3, q1, [x1, #96]
1208; CHECK-NEXT:    ret
1209;
1210; NONEON-NOSVE-LABEL: sext_v32i8_v32i64:
1211; NONEON-NOSVE:       // %bb.0:
1212; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #-96]! // 16-byte Folded Spill
1213; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #16] // 16-byte Folded Spill
1214; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #32] // 16-byte Folded Spill
1215; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #48] // 16-byte Folded Spill
1216; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #64] // 16-byte Folded Spill
1217; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #80] // 16-byte Folded Spill
1218; NONEON-NOSVE-NEXT:    sub sp, sp, #752
1219; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 848
1220; NONEON-NOSVE-NEXT:    .cfi_offset w19, -8
1221; NONEON-NOSVE-NEXT:    .cfi_offset w20, -16
1222; NONEON-NOSVE-NEXT:    .cfi_offset w21, -24
1223; NONEON-NOSVE-NEXT:    .cfi_offset w22, -32
1224; NONEON-NOSVE-NEXT:    .cfi_offset w23, -40
1225; NONEON-NOSVE-NEXT:    .cfi_offset w24, -48
1226; NONEON-NOSVE-NEXT:    .cfi_offset w25, -56
1227; NONEON-NOSVE-NEXT:    .cfi_offset w26, -64
1228; NONEON-NOSVE-NEXT:    .cfi_offset w27, -72
1229; NONEON-NOSVE-NEXT:    .cfi_offset w28, -80
1230; NONEON-NOSVE-NEXT:    .cfi_offset w30, -88
1231; NONEON-NOSVE-NEXT:    .cfi_offset w29, -96
1232; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1233; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]
1234; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
1235; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #41]
1236; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #18]
1237; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #16]
1238; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #30]
1239; NONEON-NOSVE-NEXT:    ldrb w23, [sp, #28]
1240; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill
1241; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1242; NONEON-NOSVE-NEXT:    ldrb w21, [sp, #26]
1243; NONEON-NOSVE-NEXT:    ldrb w19, [sp, #24]
1244; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #19]
1245; NONEON-NOSVE-NEXT:    ldrb w6, [sp, #38]
1246; NONEON-NOSVE-NEXT:    add w8, w8, w8
1247; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #17]
1248; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #22]
1249; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
1250; NONEON-NOSVE-NEXT:    add w8, w29, w29
1251; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #36]
1252; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
1253; NONEON-NOSVE-NEXT:    add w8, w27, w27
1254; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #31]
1255; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
1256; NONEON-NOSVE-NEXT:    add w8, w25, w25
1257; NONEON-NOSVE-NEXT:    add w9, w9, w9
1258; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
1259; NONEON-NOSVE-NEXT:    add w8, w23, w23
1260; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #34]
1261; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
1262; NONEON-NOSVE-NEXT:    add w8, w21, w21
1263; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #29]
1264; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
1265; NONEON-NOSVE-NEXT:    add w8, w19, w19
1266; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #23]
1267; NONEON-NOSVE-NEXT:    strb w9, [sp, #59]
1268; NONEON-NOSVE-NEXT:    add w9, w28, w28
1269; NONEON-NOSVE-NEXT:    add w18, w16, w16
1270; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
1271; NONEON-NOSVE-NEXT:    add w8, w6, w6
1272; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #32]
1273; NONEON-NOSVE-NEXT:    ldrb w22, [sp, #27]
1274; NONEON-NOSVE-NEXT:    strb w9, [sp, #57]
1275; NONEON-NOSVE-NEXT:    add w9, w26, w26
1276; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
1277; NONEON-NOSVE-NEXT:    add w8, w4, w4
1278; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #46]
1279; NONEON-NOSVE-NEXT:    ldrb w20, [sp, #25]
1280; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #21]
1281; NONEON-NOSVE-NEXT:    strb w9, [sp, #55]
1282; NONEON-NOSVE-NEXT:    add w9, w24, w24
1283; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
1284; NONEON-NOSVE-NEXT:    add w8, w2, w2
1285; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #44]
1286; NONEON-NOSVE-NEXT:    add w17, w17, w17
1287; NONEON-NOSVE-NEXT:    strb w9, [sp, #53]
1288; NONEON-NOSVE-NEXT:    add w9, w22, w22
1289; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
1290; NONEON-NOSVE-NEXT:    add w8, w16, w16
1291; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #42]
1292; NONEON-NOSVE-NEXT:    strb w17, [sp, #63]
1293; NONEON-NOSVE-NEXT:    add w17, w30, w30
1294; NONEON-NOSVE-NEXT:    strb w9, [sp, #51]
1295; NONEON-NOSVE-NEXT:    add w9, w20, w20
1296; NONEON-NOSVE-NEXT:    ldrb w7, [sp, #39]
1297; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
1298; NONEON-NOSVE-NEXT:    add w8, w14, w14
1299; NONEON-NOSVE-NEXT:    ldrb w5, [sp, #37]
1300; NONEON-NOSVE-NEXT:    strb w18, [sp, #62]
1301; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #35]
1302; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #33]
1303; NONEON-NOSVE-NEXT:    strb w17, [sp, #61]
1304; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #47]
1305; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #45]
1306; NONEON-NOSVE-NEXT:    strb w9, [sp, #49]
1307; NONEON-NOSVE-NEXT:    add w9, w7, w7
1308; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #43]
1309; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
1310; NONEON-NOSVE-NEXT:    add w8, w12, w12
1311; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
1312; NONEON-NOSVE-NEXT:    add w8, w10, w10
1313; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
1314; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
1315; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12] // 4-byte Folded Reload
1316; NONEON-NOSVE-NEXT:    strb w9, [sp, #79]
1317; NONEON-NOSVE-NEXT:    add w9, w5, w5
1318; NONEON-NOSVE-NEXT:    strb w9, [sp, #77]
1319; NONEON-NOSVE-NEXT:    add w9, w3, w3
1320; NONEON-NOSVE-NEXT:    add w8, w8, w8
1321; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
1322; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
1323; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #91]
1324; NONEON-NOSVE-NEXT:    strb w9, [sp, #75]
1325; NONEON-NOSVE-NEXT:    add w9, w0, w0
1326; NONEON-NOSVE-NEXT:    strh w8, [sp, #134]
1327; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #90]
1328; NONEON-NOSVE-NEXT:    strb w9, [sp, #73]
1329; NONEON-NOSVE-NEXT:    add w9, w15, w15
1330; NONEON-NOSVE-NEXT:    strh w8, [sp, #132]
1331; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #89]
1332; NONEON-NOSVE-NEXT:    strb w9, [sp, #71]
1333; NONEON-NOSVE-NEXT:    add w9, w13, w13
1334; NONEON-NOSVE-NEXT:    strh w8, [sp, #130]
1335; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #88]
1336; NONEON-NOSVE-NEXT:    strb w9, [sp, #69]
1337; NONEON-NOSVE-NEXT:    add w9, w11, w11
1338; NONEON-NOSVE-NEXT:    strh w8, [sp, #128]
1339; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #95]
1340; NONEON-NOSVE-NEXT:    strb w9, [sp, #67]
1341; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8] // 4-byte Folded Reload
1342; NONEON-NOSVE-NEXT:    strh w8, [sp, #142]
1343; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #94]
1344; NONEON-NOSVE-NEXT:    add w9, w9, w9
1345; NONEON-NOSVE-NEXT:    strh w8, [sp, #140]
1346; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #93]
1347; NONEON-NOSVE-NEXT:    strb w9, [sp, #65]
1348; NONEON-NOSVE-NEXT:    strh w8, [sp, #138]
1349; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #92]
1350; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #64]
1351; NONEON-NOSVE-NEXT:    strh w8, [sp, #136]
1352; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #83]
1353; NONEON-NOSVE-NEXT:    strh w8, [sp, #118]
1354; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #82]
1355; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
1356; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #128]
1357; NONEON-NOSVE-NEXT:    strh w8, [sp, #116]
1358; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #81]
1359; NONEON-NOSVE-NEXT:    strh w8, [sp, #114]
1360; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #80]
1361; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #192]
1362; NONEON-NOSVE-NEXT:    strh w8, [sp, #112]
1363; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #87]
1364; NONEON-NOSVE-NEXT:    strh w8, [sp, #126]
1365; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #86]
1366; NONEON-NOSVE-NEXT:    strh w8, [sp, #124]
1367; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #85]
1368; NONEON-NOSVE-NEXT:    strh w8, [sp, #122]
1369; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #84]
1370; NONEON-NOSVE-NEXT:    strh w8, [sp, #120]
1371; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #107]
1372; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #112]
1373; NONEON-NOSVE-NEXT:    strh w8, [sp, #166]
1374; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #106]
1375; NONEON-NOSVE-NEXT:    strh w8, [sp, #164]
1376; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #105]
1377; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #176]
1378; NONEON-NOSVE-NEXT:    strh w8, [sp, #162]
1379; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #104]
1380; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #178]
1381; NONEON-NOSVE-NEXT:    strh w8, [sp, #160]
1382; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #111]
1383; NONEON-NOSVE-NEXT:    strh w8, [sp, #174]
1384; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #110]
1385; NONEON-NOSVE-NEXT:    strh w8, [sp, #172]
1386; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #109]
1387; NONEON-NOSVE-NEXT:    strh w8, [sp, #170]
1388; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #108]
1389; NONEON-NOSVE-NEXT:    strh w8, [sp, #168]
1390; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #99]
1391; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #160]
1392; NONEON-NOSVE-NEXT:    strh w8, [sp, #150]
1393; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #98]
1394; NONEON-NOSVE-NEXT:    strh w8, [sp, #148]
1395; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #97]
1396; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #224]
1397; NONEON-NOSVE-NEXT:    strh w8, [sp, #146]
1398; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #96]
1399; NONEON-NOSVE-NEXT:    strh w8, [sp, #144]
1400; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #103]
1401; NONEON-NOSVE-NEXT:    strh w8, [sp, #158]
1402; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #102]
1403; NONEON-NOSVE-NEXT:    strh w8, [sp, #156]
1404; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #101]
1405; NONEON-NOSVE-NEXT:    strh w8, [sp, #154]
1406; NONEON-NOSVE-NEXT:    ldrsb w8, [sp, #100]
1407; NONEON-NOSVE-NEXT:    strh w8, [sp, #152]
1408; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #194]
1409; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #144]
1410; NONEON-NOSVE-NEXT:    str w8, [sp, #276]
1411; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #192]
1412; NONEON-NOSVE-NEXT:    str w8, [sp, #272]
1413; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #198]
1414; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #208]
1415; NONEON-NOSVE-NEXT:    str w8, [sp, #284]
1416; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #196]
1417; NONEON-NOSVE-NEXT:    str w8, [sp, #280]
1418; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #202]
1419; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #272]
1420; NONEON-NOSVE-NEXT:    str w8, [sp, #292]
1421; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #200]
1422; NONEON-NOSVE-NEXT:    str w8, [sp, #288]
1423; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #206]
1424; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #400]
1425; NONEON-NOSVE-NEXT:    str w8, [sp, #300]
1426; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #204]
1427; NONEON-NOSVE-NEXT:    str w8, [sp, #296]
1428; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #176]
1429; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #288]
1430; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #240]
1431; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #182]
1432; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #180]
1433; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #248]
1434; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #186]
1435; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #416]
1436; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #240]
1437; NONEON-NOSVE-NEXT:    str w8, [sp, #260]
1438; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #184]
1439; NONEON-NOSVE-NEXT:    str w8, [sp, #256]
1440; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #190]
1441; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #368]
1442; NONEON-NOSVE-NEXT:    str w8, [sp, #268]
1443; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #188]
1444; NONEON-NOSVE-NEXT:    ldrsw x9, [sp, #372]
1445; NONEON-NOSVE-NEXT:    str w8, [sp, #264]
1446; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #226]
1447; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #256]
1448; NONEON-NOSVE-NEXT:    str w8, [sp, #340]
1449; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #224]
1450; NONEON-NOSVE-NEXT:    str w8, [sp, #336]
1451; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #230]
1452; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #384]
1453; NONEON-NOSVE-NEXT:    str w8, [sp, #348]
1454; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #228]
1455; NONEON-NOSVE-NEXT:    str w8, [sp, #344]
1456; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #234]
1457; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #336]
1458; NONEON-NOSVE-NEXT:    str w8, [sp, #356]
1459; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #232]
1460; NONEON-NOSVE-NEXT:    str w8, [sp, #352]
1461; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #238]
1462; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #464]
1463; NONEON-NOSVE-NEXT:    str w8, [sp, #364]
1464; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #236]
1465; NONEON-NOSVE-NEXT:    str w8, [sp, #360]
1466; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #210]
1467; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #352]
1468; NONEON-NOSVE-NEXT:    str w8, [sp, #308]
1469; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #208]
1470; NONEON-NOSVE-NEXT:    str w8, [sp, #304]
1471; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #214]
1472; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #480]
1473; NONEON-NOSVE-NEXT:    str w8, [sp, #316]
1474; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #212]
1475; NONEON-NOSVE-NEXT:    str w8, [sp, #312]
1476; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #218]
1477; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #304]
1478; NONEON-NOSVE-NEXT:    str w8, [sp, #324]
1479; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #216]
1480; NONEON-NOSVE-NEXT:    str w8, [sp, #320]
1481; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #222]
1482; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #432]
1483; NONEON-NOSVE-NEXT:    str w8, [sp, #332]
1484; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #220]
1485; NONEON-NOSVE-NEXT:    str w8, [sp, #328]
1486; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #404]
1487; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #320]
1488; NONEON-NOSVE-NEXT:    str x8, [sp, #568]
1489; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #400]
1490; NONEON-NOSVE-NEXT:    str x8, [sp, #560]
1491; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #412]
1492; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #448]
1493; NONEON-NOSVE-NEXT:    str x8, [sp, #584]
1494; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #408]
1495; NONEON-NOSVE-NEXT:    str x8, [sp, #576]
1496; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #420]
1497; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #560]
1498; NONEON-NOSVE-NEXT:    str x8, [sp, #600]
1499; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #416]
1500; NONEON-NOSVE-NEXT:    str x8, [sp, #592]
1501; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #428]
1502; NONEON-NOSVE-NEXT:    str x8, [sp, #616]
1503; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #424]
1504; NONEON-NOSVE-NEXT:    str x8, [sp, #608]
1505; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #368]
1506; NONEON-NOSVE-NEXT:    ldp q2, q3, [sp, #592]
1507; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #496]
1508; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #380]
1509; NONEON-NOSVE-NEXT:    str x8, [sp, #520]
1510; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #376]
1511; NONEON-NOSVE-NEXT:    str x8, [sp, #512]
1512; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #388]
1513; NONEON-NOSVE-NEXT:    ldp q4, q5, [sp, #496]
1514; NONEON-NOSVE-NEXT:    str x8, [sp, #536]
1515; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #384]
1516; NONEON-NOSVE-NEXT:    str x8, [sp, #528]
1517; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #396]
1518; NONEON-NOSVE-NEXT:    str x8, [sp, #552]
1519; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #392]
1520; NONEON-NOSVE-NEXT:    str x8, [sp, #544]
1521; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #468]
1522; NONEON-NOSVE-NEXT:    ldp q6, q7, [sp, #528]
1523; NONEON-NOSVE-NEXT:    str x8, [sp, #696]
1524; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #464]
1525; NONEON-NOSVE-NEXT:    str x8, [sp, #688]
1526; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #476]
1527; NONEON-NOSVE-NEXT:    str x8, [sp, #712]
1528; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #472]
1529; NONEON-NOSVE-NEXT:    str x8, [sp, #704]
1530; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #484]
1531; NONEON-NOSVE-NEXT:    ldp q16, q17, [sp, #688]
1532; NONEON-NOSVE-NEXT:    str x8, [sp, #728]
1533; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #480]
1534; NONEON-NOSVE-NEXT:    str x8, [sp, #720]
1535; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #492]
1536; NONEON-NOSVE-NEXT:    str x8, [sp, #744]
1537; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #488]
1538; NONEON-NOSVE-NEXT:    str x8, [sp, #736]
1539; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #436]
1540; NONEON-NOSVE-NEXT:    ldp q19, q20, [sp, #720]
1541; NONEON-NOSVE-NEXT:    str x8, [sp, #632]
1542; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #432]
1543; NONEON-NOSVE-NEXT:    str x8, [sp, #624]
1544; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #444]
1545; NONEON-NOSVE-NEXT:    str x8, [sp, #648]
1546; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #440]
1547; NONEON-NOSVE-NEXT:    str x8, [sp, #640]
1548; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #452]
1549; NONEON-NOSVE-NEXT:    ldp q22, q23, [sp, #624]
1550; NONEON-NOSVE-NEXT:    str x8, [sp, #664]
1551; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #448]
1552; NONEON-NOSVE-NEXT:    str x8, [sp, #656]
1553; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #460]
1554; NONEON-NOSVE-NEXT:    str x8, [sp, #680]
1555; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #456]
1556; NONEON-NOSVE-NEXT:    str x8, [sp, #672]
1557; NONEON-NOSVE-NEXT:    ldp q21, q18, [sp, #656]
1558; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
1559; NONEON-NOSVE-NEXT:    stp q2, q3, [x1, #32]
1560; NONEON-NOSVE-NEXT:    stp q4, q5, [x1, #64]
1561; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #96]
1562; NONEON-NOSVE-NEXT:    stp q16, q17, [x1, #128]
1563; NONEON-NOSVE-NEXT:    stp q19, q20, [x1, #160]
1564; NONEON-NOSVE-NEXT:    stp q22, q23, [x1, #192]
1565; NONEON-NOSVE-NEXT:    stp q21, q18, [x1, #224]
1566; NONEON-NOSVE-NEXT:    add sp, sp, #752
1567; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #80] // 16-byte Folded Reload
1568; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #64] // 16-byte Folded Reload
1569; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #48] // 16-byte Folded Reload
1570; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #32] // 16-byte Folded Reload
1571; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #16] // 16-byte Folded Reload
1572; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp], #96 // 16-byte Folded Reload
1573; NONEON-NOSVE-NEXT:    ret
1574  %a = load <32 x i8>, ptr %in
1575  %b = add <32 x i8> %a, %a
1576  %c = sext <32 x i8> %b to <32 x i64>
1577  store <32 x i64> %c, ptr %out
1578  ret void
1579}
1580
1581;
1582; sext i16 -> i32
1583;
1584
1585define void @sext_v8i16_v8i32(<8 x i16> %a, ptr %out) {
1586; CHECK-LABEL: sext_v8i16_v8i32:
1587; CHECK:       // %bb.0:
1588; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1589; CHECK-NEXT:    sunpklo z1.s, z0.h
1590; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1591; CHECK-NEXT:    sunpklo z0.s, z0.h
1592; CHECK-NEXT:    stp q1, q0, [x0]
1593; CHECK-NEXT:    ret
1594;
1595; NONEON-NOSVE-LABEL: sext_v8i16_v8i32:
1596; NONEON-NOSVE:       // %bb.0:
1597; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
1598; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1599; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
1600; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
1601; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #30]
1602; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]
1603; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
1604; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #26]
1605; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]
1606; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
1607; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #22]
1608; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
1609; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
1610; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #18]
1611; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
1612; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
1613; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1614; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
1615; NONEON-NOSVE-NEXT:    add sp, sp, #64
1616; NONEON-NOSVE-NEXT:    ret
1617  %b = sext <8 x i16> %a to <8 x i32>
1618  store <8 x i32>%b, ptr %out
1619  ret void
1620}
1621
1622define void @sext_v16i16_v16i32(ptr %in, ptr %out) {
1623; CHECK-LABEL: sext_v16i16_v16i32:
1624; CHECK:       // %bb.0:
1625; CHECK-NEXT:    ldp q1, q0, [x0]
1626; CHECK-NEXT:    add z0.h, z0.h, z0.h
1627; CHECK-NEXT:    add z1.h, z1.h, z1.h
1628; CHECK-NEXT:    sunpklo z2.s, z0.h
1629; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1630; CHECK-NEXT:    sunpklo z3.s, z1.h
1631; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1632; CHECK-NEXT:    sunpklo z0.s, z0.h
1633; CHECK-NEXT:    sunpklo z1.s, z1.h
1634; CHECK-NEXT:    stp q2, q0, [x1, #32]
1635; CHECK-NEXT:    stp q3, q1, [x1]
1636; CHECK-NEXT:    ret
1637;
1638; NONEON-NOSVE-LABEL: sext_v16i16_v16i32:
1639; NONEON-NOSVE:       // %bb.0:
1640; NONEON-NOSVE-NEXT:    sub sp, sp, #160
1641; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160
1642; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1643; NONEON-NOSVE-NEXT:    stp q1, q0, [sp]
1644; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #4]
1645; NONEON-NOSVE-NEXT:    ldrh w14, [sp, #6]
1646; NONEON-NOSVE-NEXT:    ldrh w3, [sp, #2]
1647; NONEON-NOSVE-NEXT:    ldrh w5, [sp]
1648; NONEON-NOSVE-NEXT:    ldrh w2, [sp, #12]
1649; NONEON-NOSVE-NEXT:    ldrh w4, [sp, #14]
1650; NONEON-NOSVE-NEXT:    add w13, w13, w13
1651; NONEON-NOSVE-NEXT:    add w14, w14, w14
1652; NONEON-NOSVE-NEXT:    ldrh w18, [sp, #8]
1653; NONEON-NOSVE-NEXT:    ldrh w0, [sp, #10]
1654; NONEON-NOSVE-NEXT:    strh w14, [sp, #46]
1655; NONEON-NOSVE-NEXT:    add w14, w3, w3
1656; NONEON-NOSVE-NEXT:    strh w13, [sp, #44]
1657; NONEON-NOSVE-NEXT:    add w13, w5, w5
1658; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1659; NONEON-NOSVE-NEXT:    strh w14, [sp, #42]
1660; NONEON-NOSVE-NEXT:    add w14, w4, w4
1661; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]
1662; NONEON-NOSVE-NEXT:    strh w13, [sp, #40]
1663; NONEON-NOSVE-NEXT:    add w13, w2, w2
1664; NONEON-NOSVE-NEXT:    ldrh w17, [sp, #22]
1665; NONEON-NOSVE-NEXT:    strh w14, [sp, #38]
1666; NONEON-NOSVE-NEXT:    add w14, w0, w0
1667; NONEON-NOSVE-NEXT:    add w9, w9, w9
1668; NONEON-NOSVE-NEXT:    strh w13, [sp, #36]
1669; NONEON-NOSVE-NEXT:    add w13, w18, w18
1670; NONEON-NOSVE-NEXT:    add w8, w8, w8
1671; NONEON-NOSVE-NEXT:    strh w14, [sp, #34]
1672; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #28]
1673; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #30]
1674; NONEON-NOSVE-NEXT:    strh w13, [sp, #32]
1675; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #16]
1676; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #18]
1677; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
1678; NONEON-NOSVE-NEXT:    ldrh w16, [sp, #20]
1679; NONEON-NOSVE-NEXT:    strh w9, [sp, #50]
1680; NONEON-NOSVE-NEXT:    add w14, w17, w17
1681; NONEON-NOSVE-NEXT:    add w12, w12, w12
1682; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
1683; NONEON-NOSVE-NEXT:    add w13, w16, w16
1684; NONEON-NOSVE-NEXT:    add w11, w11, w11
1685; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
1686; NONEON-NOSVE-NEXT:    add w10, w10, w10
1687; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #78]
1688; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #76]
1689; NONEON-NOSVE-NEXT:    strh w14, [sp, #62]
1690; NONEON-NOSVE-NEXT:    add w14, w15, w15
1691; NONEON-NOSVE-NEXT:    strh w13, [sp, #60]
1692; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]
1693; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #74]
1694; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #72]
1695; NONEON-NOSVE-NEXT:    strh w14, [sp, #58]
1696; NONEON-NOSVE-NEXT:    strh w12, [sp, #56]
1697; NONEON-NOSVE-NEXT:    strh w11, [sp, #54]
1698; NONEON-NOSVE-NEXT:    strh w10, [sp, #52]
1699; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
1700; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112]
1701; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #70]
1702; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #68]
1703; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104]
1704; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #66]
1705; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #64]
1706; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
1707; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #96]
1708; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #94]
1709; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #92]
1710; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #96]
1711; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #152]
1712; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #90]
1713; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #88]
1714; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144]
1715; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #86]
1716; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #84]
1717; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136]
1718; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #82]
1719; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #80]
1720; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]
1721; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #128]
1722; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
1723; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
1724; NONEON-NOSVE-NEXT:    add sp, sp, #160
1725; NONEON-NOSVE-NEXT:    ret
1726  %a = load <16 x i16>, ptr %in
1727  %b = add <16 x i16> %a, %a
1728  %c = sext <16 x i16> %b to <16 x i32>
1729  store <16 x i32> %c, ptr %out
1730  ret void
1731}
1732
1733;
1734; sext i16 -> i64
1735;
1736
1737define void @sext_v4i16_v4i64(<4 x i16> %a, ptr %out) {
1738; CHECK-LABEL: sext_v4i16_v4i64:
1739; CHECK:       // %bb.0:
1740; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1741; CHECK-NEXT:    sunpklo z0.s, z0.h
1742; CHECK-NEXT:    sunpklo z1.d, z0.s
1743; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1744; CHECK-NEXT:    sunpklo z0.d, z0.s
1745; CHECK-NEXT:    stp q1, q0, [x0]
1746; CHECK-NEXT:    ret
1747;
1748; NONEON-NOSVE-LABEL: sext_v4i16_v4i64:
1749; NONEON-NOSVE:       // %bb.0:
1750; NONEON-NOSVE-NEXT:    sub sp, sp, #80
1751; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 80
1752; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
1753; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
1754; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #8]
1755; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]
1756; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
1757; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #12]
1758; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16]
1759; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #16]
1760; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
1761; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #40]
1762; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #64]
1763; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #32]
1764; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
1765; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #48]
1766; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
1767; NONEON-NOSVE-NEXT:    add sp, sp, #80
1768; NONEON-NOSVE-NEXT:    ret
1769  %b = sext <4 x i16> %a to <4 x i64>
1770  store <4 x i64>%b, ptr %out
1771  ret void
1772}
1773
1774define void @sext_v8i16_v8i64(<8 x i16> %a, ptr %out) {
1775; CHECK-LABEL: sext_v8i16_v8i64:
1776; CHECK:       // %bb.0:
1777; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1778; CHECK-NEXT:    sunpklo z1.s, z0.h
1779; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1780; CHECK-NEXT:    sunpklo z0.s, z0.h
1781; CHECK-NEXT:    sunpklo z2.d, z1.s
1782; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1783; CHECK-NEXT:    sunpklo z1.d, z1.s
1784; CHECK-NEXT:    sunpklo z3.d, z0.s
1785; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1786; CHECK-NEXT:    sunpklo z0.d, z0.s
1787; CHECK-NEXT:    stp q2, q1, [x0]
1788; CHECK-NEXT:    stp q3, q0, [x0, #32]
1789; CHECK-NEXT:    ret
1790;
1791; NONEON-NOSVE-LABEL: sext_v8i16_v8i64:
1792; NONEON-NOSVE:       // %bb.0:
1793; NONEON-NOSVE-NEXT:    str q0, [sp, #-160]!
1794; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160
1795; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
1796; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
1797; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #26]
1798; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]
1799; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
1800; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #30]
1801; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]
1802; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
1803; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #18]
1804; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
1805; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
1806; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
1807; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #22]
1808; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
1809; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
1810; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
1811; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
1812; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
1813; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #88]
1814; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #144]
1815; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #80]
1816; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #128]
1817; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #72]
1818; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #128]
1819; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #112]
1820; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #64]
1821; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #96]
1822; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
1823; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]
1824; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]
1825; NONEON-NOSVE-NEXT:    add sp, sp, #160
1826; NONEON-NOSVE-NEXT:    ret
1827  %b = sext <8 x i16> %a to <8 x i64>
1828  store <8 x i64>%b, ptr %out
1829  ret void
1830}
1831
1832define void @sext_v16i16_v16i64(ptr %in, ptr %out) {
1833; CHECK-LABEL: sext_v16i16_v16i64:
1834; CHECK:       // %bb.0:
1835; CHECK-NEXT:    ldp q1, q0, [x0]
1836; CHECK-NEXT:    add z0.h, z0.h, z0.h
1837; CHECK-NEXT:    add z1.h, z1.h, z1.h
1838; CHECK-NEXT:    sunpklo z2.s, z0.h
1839; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1840; CHECK-NEXT:    sunpklo z3.s, z1.h
1841; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1842; CHECK-NEXT:    sunpklo z0.s, z0.h
1843; CHECK-NEXT:    sunpklo z1.s, z1.h
1844; CHECK-NEXT:    sunpklo z4.d, z2.s
1845; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
1846; CHECK-NEXT:    sunpklo z5.d, z3.s
1847; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
1848; CHECK-NEXT:    sunpklo z6.d, z0.s
1849; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1850; CHECK-NEXT:    sunpklo z2.d, z2.s
1851; CHECK-NEXT:    sunpklo z7.d, z1.s
1852; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1853; CHECK-NEXT:    sunpklo z3.d, z3.s
1854; CHECK-NEXT:    sunpklo z0.d, z0.s
1855; CHECK-NEXT:    sunpklo z1.d, z1.s
1856; CHECK-NEXT:    stp q4, q2, [x1, #64]
1857; CHECK-NEXT:    stp q5, q3, [x1]
1858; CHECK-NEXT:    stp q6, q0, [x1, #96]
1859; CHECK-NEXT:    stp q7, q1, [x1, #32]
1860; CHECK-NEXT:    ret
1861;
1862; NONEON-NOSVE-LABEL: sext_v16i16_v16i64:
1863; NONEON-NOSVE:       // %bb.0:
1864; NONEON-NOSVE-NEXT:    sub sp, sp, #368
1865; NONEON-NOSVE-NEXT:    str x29, [sp, #352] // 8-byte Folded Spill
1866; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 368
1867; NONEON-NOSVE-NEXT:    .cfi_offset w29, -16
1868; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1869; NONEON-NOSVE-NEXT:    ldr x29, [sp, #352] // 8-byte Folded Reload
1870; NONEON-NOSVE-NEXT:    stp q1, q0, [sp]
1871; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #4]
1872; NONEON-NOSVE-NEXT:    ldrh w14, [sp, #6]
1873; NONEON-NOSVE-NEXT:    ldrh w3, [sp, #2]
1874; NONEON-NOSVE-NEXT:    ldrh w5, [sp]
1875; NONEON-NOSVE-NEXT:    ldrh w2, [sp, #12]
1876; NONEON-NOSVE-NEXT:    ldrh w4, [sp, #14]
1877; NONEON-NOSVE-NEXT:    add w13, w13, w13
1878; NONEON-NOSVE-NEXT:    add w14, w14, w14
1879; NONEON-NOSVE-NEXT:    ldrh w18, [sp, #8]
1880; NONEON-NOSVE-NEXT:    ldrh w0, [sp, #10]
1881; NONEON-NOSVE-NEXT:    strh w14, [sp, #54]
1882; NONEON-NOSVE-NEXT:    add w14, w3, w3
1883; NONEON-NOSVE-NEXT:    strh w13, [sp, #52]
1884; NONEON-NOSVE-NEXT:    add w13, w5, w5
1885; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1886; NONEON-NOSVE-NEXT:    strh w14, [sp, #50]
1887; NONEON-NOSVE-NEXT:    add w14, w4, w4
1888; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]
1889; NONEON-NOSVE-NEXT:    strh w13, [sp, #48]
1890; NONEON-NOSVE-NEXT:    add w13, w2, w2
1891; NONEON-NOSVE-NEXT:    ldrh w17, [sp, #22]
1892; NONEON-NOSVE-NEXT:    strh w14, [sp, #46]
1893; NONEON-NOSVE-NEXT:    add w14, w0, w0
1894; NONEON-NOSVE-NEXT:    add w9, w9, w9
1895; NONEON-NOSVE-NEXT:    strh w13, [sp, #44]
1896; NONEON-NOSVE-NEXT:    add w13, w18, w18
1897; NONEON-NOSVE-NEXT:    add w8, w8, w8
1898; NONEON-NOSVE-NEXT:    strh w14, [sp, #42]
1899; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #28]
1900; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #30]
1901; NONEON-NOSVE-NEXT:    strh w13, [sp, #40]
1902; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #16]
1903; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #18]
1904; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #40]
1905; NONEON-NOSVE-NEXT:    ldrh w16, [sp, #20]
1906; NONEON-NOSVE-NEXT:    strh w9, [sp, #58]
1907; NONEON-NOSVE-NEXT:    add w14, w17, w17
1908; NONEON-NOSVE-NEXT:    add w12, w12, w12
1909; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
1910; NONEON-NOSVE-NEXT:    add w13, w16, w16
1911; NONEON-NOSVE-NEXT:    add w11, w11, w11
1912; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #72]
1913; NONEON-NOSVE-NEXT:    add w10, w10, w10
1914; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #82]
1915; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #80]
1916; NONEON-NOSVE-NEXT:    strh w14, [sp, #70]
1917; NONEON-NOSVE-NEXT:    add w14, w15, w15
1918; NONEON-NOSVE-NEXT:    strh w13, [sp, #68]
1919; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]
1920; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #86]
1921; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #84]
1922; NONEON-NOSVE-NEXT:    strh w14, [sp, #66]
1923; NONEON-NOSVE-NEXT:    strh w12, [sp, #64]
1924; NONEON-NOSVE-NEXT:    strh w11, [sp, #62]
1925; NONEON-NOSVE-NEXT:    strh w10, [sp, #60]
1926; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #56]
1927; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]
1928; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #74]
1929; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #72]
1930; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104]
1931; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #78]
1932; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #76]
1933; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #88]
1934; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #120]
1935; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112]
1936; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #98]
1937; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #96]
1938; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #152]
1939; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #102]
1940; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #100]
1941; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #184]
1942; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #104]
1943; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #160]
1944; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #90]
1945; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #88]
1946; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136]
1947; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #94]
1948; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #92]
1949; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #168]
1950; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #152]
1951; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144]
1952; NONEON-NOSVE-NEXT:    str d0, [sp, #360]
1953; NONEON-NOSVE-NEXT:    ldp d2, d0, [sp, #136]
1954; NONEON-NOSVE-NEXT:    str d2, [sp, #200]
1955; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #208]
1956; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #184]
1957; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #256]
1958; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #192]
1959; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #272]
1960; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #168]
1961; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #256]
1962; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #224]
1963; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #176]
1964; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #240]
1965; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #216]
1966; NONEON-NOSVE-NEXT:    ldp q3, q4, [sp, #224]
1967; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #320]
1968; NONEON-NOSVE-NEXT:    ldrsw x9, [sp, #364]
1969; NONEON-NOSVE-NEXT:    ldrsw x8, [sp, #360]
1970; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #336]
1971; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #200]
1972; NONEON-NOSVE-NEXT:    ldp q6, q7, [sp, #320]
1973; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #288]
1974; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #208]
1975; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #304]
1976; NONEON-NOSVE-NEXT:    ldp q5, q2, [sp, #288]
1977; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
1978; NONEON-NOSVE-NEXT:    stp q3, q4, [x1, #32]
1979; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #64]
1980; NONEON-NOSVE-NEXT:    stp q5, q2, [x1, #96]
1981; NONEON-NOSVE-NEXT:    add sp, sp, #368
1982; NONEON-NOSVE-NEXT:    ret
1983  %a = load <16 x i16>, ptr %in
1984  %b = add <16 x i16> %a, %a
1985  %c = sext <16 x i16> %b to <16 x i64>
1986  store <16 x i64> %c, ptr %out
1987  ret void
1988}
1989
1990;
1991; sext i32 -> i64
1992;
1993
1994define void @sext_v4i32_v4i64(<4 x i32> %a, ptr %out) {
1995; CHECK-LABEL: sext_v4i32_v4i64:
1996; CHECK:       // %bb.0:
1997; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1998; CHECK-NEXT:    sunpklo z1.d, z0.s
1999; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2000; CHECK-NEXT:    sunpklo z0.d, z0.s
2001; CHECK-NEXT:    stp q1, q0, [x0]
2002; CHECK-NEXT:    ret
2003;
2004; NONEON-NOSVE-LABEL: sext_v4i32_v4i64:
2005; NONEON-NOSVE:       // %bb.0:
2006; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
2007; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2008; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
2009; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
2010; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #24]
2011; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #48]
2012; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #16]
2013; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #32]
2014; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2015; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
2016; NONEON-NOSVE-NEXT:    add sp, sp, #64
2017; NONEON-NOSVE-NEXT:    ret
2018  %b = sext <4 x i32> %a to <4 x i64>
2019  store <4 x i64>%b, ptr %out
2020  ret void
2021}
2022
2023define void @sext_v8i32_v8i64(ptr %in, ptr %out) {
2024; CHECK-LABEL: sext_v8i32_v8i64:
2025; CHECK:       // %bb.0:
2026; CHECK-NEXT:    ldp q1, q0, [x0]
2027; CHECK-NEXT:    add z0.s, z0.s, z0.s
2028; CHECK-NEXT:    add z1.s, z1.s, z1.s
2029; CHECK-NEXT:    sunpklo z2.d, z0.s
2030; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2031; CHECK-NEXT:    sunpklo z3.d, z1.s
2032; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
2033; CHECK-NEXT:    sunpklo z0.d, z0.s
2034; CHECK-NEXT:    sunpklo z1.d, z1.s
2035; CHECK-NEXT:    stp q2, q0, [x1, #32]
2036; CHECK-NEXT:    stp q3, q1, [x1]
2037; CHECK-NEXT:    ret
2038;
2039; NONEON-NOSVE-LABEL: sext_v8i32_v8i64:
2040; NONEON-NOSVE:       // %bb.0:
2041; NONEON-NOSVE-NEXT:    sub sp, sp, #160
2042; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160
2043; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2044; NONEON-NOSVE-NEXT:    stp q1, q0, [sp]
2045; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
2046; NONEON-NOSVE-NEXT:    ldp w12, w13, [sp, #8]
2047; NONEON-NOSVE-NEXT:    ldp w14, w15, [sp, #16]
2048; NONEON-NOSVE-NEXT:    add w9, w9, w9
2049; NONEON-NOSVE-NEXT:    add w8, w8, w8
2050; NONEON-NOSVE-NEXT:    ldp w10, w11, [sp, #24]
2051; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
2052; NONEON-NOSVE-NEXT:    add w9, w13, w13
2053; NONEON-NOSVE-NEXT:    add w8, w12, w12
2054; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
2055; NONEON-NOSVE-NEXT:    add w9, w15, w15
2056; NONEON-NOSVE-NEXT:    add w8, w14, w14
2057; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
2058; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
2059; NONEON-NOSVE-NEXT:    add w9, w11, w11
2060; NONEON-NOSVE-NEXT:    add w8, w10, w10
2061; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
2062; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
2063; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
2064; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
2065; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #72]
2066; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #112]
2067; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #64]
2068; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #96]
2069; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #88]
2070; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #96]
2071; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #144]
2072; NONEON-NOSVE-NEXT:    ldpsw x8, x9, [sp, #80]
2073; NONEON-NOSVE-NEXT:    stp x8, x9, [sp, #128]
2074; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #128]
2075; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
2076; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
2077; NONEON-NOSVE-NEXT:    add sp, sp, #160
2078; NONEON-NOSVE-NEXT:    ret
2079  %a = load <8 x i32>, ptr %in
2080  %b = add <8 x i32> %a, %a
2081  %c = sext <8 x i32> %b to <8 x i64>
2082  store <8 x i64> %c, ptr %out
2083  ret void
2084}
2085
2086;
2087; zext i8 -> i16
2088;
2089
2090define void @zext_v16i8_v16i16(<16 x i8> %a, ptr %out) {
2091; CHECK-LABEL: zext_v16i8_v16i16:
2092; CHECK:       // %bb.0:
2093; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2094; CHECK-NEXT:    uunpklo z1.h, z0.b
2095; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2096; CHECK-NEXT:    uunpklo z0.h, z0.b
2097; CHECK-NEXT:    stp q1, q0, [x0]
2098; CHECK-NEXT:    ret
2099;
2100; NONEON-NOSVE-LABEL: zext_v16i8_v16i16:
2101; NONEON-NOSVE:       // %bb.0:
2102; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
2103; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2104; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
2105; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
2106; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
2107; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
2108; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
2109; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
2110; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
2111; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
2112; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
2113; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
2114; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
2115; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
2116; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
2117; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
2118; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
2119; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
2120; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
2121; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
2122; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
2123; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
2124; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
2125; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
2126; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
2127; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
2128; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
2129; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
2130; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
2131; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
2132; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
2133; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
2134; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
2135; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
2136; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
2137; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
2138; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2139; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
2140; NONEON-NOSVE-NEXT:    add sp, sp, #64
2141; NONEON-NOSVE-NEXT:    ret
2142  %b = zext <16 x i8> %a to <16 x i16>
2143  store <16 x i16>%b, ptr %out
2144  ret void
2145}
2146
2147; NOTE: Extra 'add' is to prevent the extend being combined with the load.
2148define void @zext_v32i8_v32i16(ptr %in, ptr %out) {
2149; CHECK-LABEL: zext_v32i8_v32i16:
2150; CHECK:       // %bb.0:
2151; CHECK-NEXT:    ldp q1, q0, [x0]
2152; CHECK-NEXT:    add z0.b, z0.b, z0.b
2153; CHECK-NEXT:    add z1.b, z1.b, z1.b
2154; CHECK-NEXT:    uunpklo z2.h, z0.b
2155; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2156; CHECK-NEXT:    uunpklo z3.h, z1.b
2157; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
2158; CHECK-NEXT:    uunpklo z0.h, z0.b
2159; CHECK-NEXT:    uunpklo z1.h, z1.b
2160; CHECK-NEXT:    stp q2, q0, [x1, #32]
2161; CHECK-NEXT:    stp q3, q1, [x1]
2162; CHECK-NEXT:    ret
2163;
2164; NONEON-NOSVE-LABEL: zext_v32i8_v32i16:
2165; NONEON-NOSVE:       // %bb.0:
2166; NONEON-NOSVE-NEXT:    sub sp, sp, #272
2167; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #176] // 16-byte Folded Spill
2168; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #192] // 16-byte Folded Spill
2169; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #208] // 16-byte Folded Spill
2170; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #224] // 16-byte Folded Spill
2171; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #240] // 16-byte Folded Spill
2172; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #256] // 16-byte Folded Spill
2173; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 272
2174; NONEON-NOSVE-NEXT:    .cfi_offset w19, -8
2175; NONEON-NOSVE-NEXT:    .cfi_offset w20, -16
2176; NONEON-NOSVE-NEXT:    .cfi_offset w21, -24
2177; NONEON-NOSVE-NEXT:    .cfi_offset w22, -32
2178; NONEON-NOSVE-NEXT:    .cfi_offset w23, -40
2179; NONEON-NOSVE-NEXT:    .cfi_offset w24, -48
2180; NONEON-NOSVE-NEXT:    .cfi_offset w25, -56
2181; NONEON-NOSVE-NEXT:    .cfi_offset w26, -64
2182; NONEON-NOSVE-NEXT:    .cfi_offset w27, -72
2183; NONEON-NOSVE-NEXT:    .cfi_offset w28, -80
2184; NONEON-NOSVE-NEXT:    .cfi_offset w30, -88
2185; NONEON-NOSVE-NEXT:    .cfi_offset w29, -96
2186; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2187; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]
2188; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
2189; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #41]
2190; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #18]
2191; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #16]
2192; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #30]
2193; NONEON-NOSVE-NEXT:    ldrb w23, [sp, #28]
2194; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill
2195; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
2196; NONEON-NOSVE-NEXT:    ldrb w21, [sp, #26]
2197; NONEON-NOSVE-NEXT:    ldrb w19, [sp, #24]
2198; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #19]
2199; NONEON-NOSVE-NEXT:    ldrb w6, [sp, #38]
2200; NONEON-NOSVE-NEXT:    add w8, w8, w8
2201; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #17]
2202; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #22]
2203; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
2204; NONEON-NOSVE-NEXT:    add w8, w29, w29
2205; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #36]
2206; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
2207; NONEON-NOSVE-NEXT:    add w8, w27, w27
2208; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #31]
2209; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
2210; NONEON-NOSVE-NEXT:    add w8, w25, w25
2211; NONEON-NOSVE-NEXT:    add w9, w9, w9
2212; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
2213; NONEON-NOSVE-NEXT:    add w8, w23, w23
2214; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #34]
2215; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
2216; NONEON-NOSVE-NEXT:    add w8, w21, w21
2217; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #29]
2218; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
2219; NONEON-NOSVE-NEXT:    add w8, w19, w19
2220; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #23]
2221; NONEON-NOSVE-NEXT:    strb w9, [sp, #59]
2222; NONEON-NOSVE-NEXT:    add w9, w28, w28
2223; NONEON-NOSVE-NEXT:    add w18, w16, w16
2224; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
2225; NONEON-NOSVE-NEXT:    add w8, w6, w6
2226; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #32]
2227; NONEON-NOSVE-NEXT:    ldrb w22, [sp, #27]
2228; NONEON-NOSVE-NEXT:    strb w9, [sp, #57]
2229; NONEON-NOSVE-NEXT:    add w9, w26, w26
2230; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
2231; NONEON-NOSVE-NEXT:    add w8, w4, w4
2232; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #46]
2233; NONEON-NOSVE-NEXT:    ldrb w20, [sp, #25]
2234; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #21]
2235; NONEON-NOSVE-NEXT:    strb w9, [sp, #55]
2236; NONEON-NOSVE-NEXT:    add w9, w24, w24
2237; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
2238; NONEON-NOSVE-NEXT:    add w8, w2, w2
2239; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #44]
2240; NONEON-NOSVE-NEXT:    add w17, w17, w17
2241; NONEON-NOSVE-NEXT:    strb w9, [sp, #53]
2242; NONEON-NOSVE-NEXT:    add w9, w22, w22
2243; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
2244; NONEON-NOSVE-NEXT:    add w8, w16, w16
2245; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #42]
2246; NONEON-NOSVE-NEXT:    strb w17, [sp, #63]
2247; NONEON-NOSVE-NEXT:    add w17, w30, w30
2248; NONEON-NOSVE-NEXT:    strb w9, [sp, #51]
2249; NONEON-NOSVE-NEXT:    add w9, w20, w20
2250; NONEON-NOSVE-NEXT:    ldrb w7, [sp, #39]
2251; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
2252; NONEON-NOSVE-NEXT:    add w8, w14, w14
2253; NONEON-NOSVE-NEXT:    ldrb w5, [sp, #37]
2254; NONEON-NOSVE-NEXT:    strb w18, [sp, #62]
2255; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #35]
2256; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #33]
2257; NONEON-NOSVE-NEXT:    strb w17, [sp, #61]
2258; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #47]
2259; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #45]
2260; NONEON-NOSVE-NEXT:    strb w9, [sp, #49]
2261; NONEON-NOSVE-NEXT:    add w9, w7, w7
2262; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #43]
2263; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
2264; NONEON-NOSVE-NEXT:    add w8, w12, w12
2265; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
2266; NONEON-NOSVE-NEXT:    add w8, w10, w10
2267; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
2268; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
2269; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12] // 4-byte Folded Reload
2270; NONEON-NOSVE-NEXT:    strb w9, [sp, #79]
2271; NONEON-NOSVE-NEXT:    add w9, w5, w5
2272; NONEON-NOSVE-NEXT:    strb w9, [sp, #77]
2273; NONEON-NOSVE-NEXT:    add w9, w3, w3
2274; NONEON-NOSVE-NEXT:    add w8, w8, w8
2275; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
2276; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
2277; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #95]
2278; NONEON-NOSVE-NEXT:    strb w9, [sp, #75]
2279; NONEON-NOSVE-NEXT:    add w9, w0, w0
2280; NONEON-NOSVE-NEXT:    strh w8, [sp, #142]
2281; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #94]
2282; NONEON-NOSVE-NEXT:    strb w9, [sp, #73]
2283; NONEON-NOSVE-NEXT:    add w9, w15, w15
2284; NONEON-NOSVE-NEXT:    strh w8, [sp, #140]
2285; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #93]
2286; NONEON-NOSVE-NEXT:    strb w9, [sp, #71]
2287; NONEON-NOSVE-NEXT:    add w9, w13, w13
2288; NONEON-NOSVE-NEXT:    strh w8, [sp, #138]
2289; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #92]
2290; NONEON-NOSVE-NEXT:    strb w9, [sp, #69]
2291; NONEON-NOSVE-NEXT:    add w9, w11, w11
2292; NONEON-NOSVE-NEXT:    strh w8, [sp, #136]
2293; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #91]
2294; NONEON-NOSVE-NEXT:    strb w9, [sp, #67]
2295; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8] // 4-byte Folded Reload
2296; NONEON-NOSVE-NEXT:    strh w8, [sp, #134]
2297; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #90]
2298; NONEON-NOSVE-NEXT:    add w9, w9, w9
2299; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #256] // 16-byte Folded Reload
2300; NONEON-NOSVE-NEXT:    strh w8, [sp, #132]
2301; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #89]
2302; NONEON-NOSVE-NEXT:    strb w9, [sp, #65]
2303; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #240] // 16-byte Folded Reload
2304; NONEON-NOSVE-NEXT:    strh w8, [sp, #130]
2305; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #88]
2306; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #64]
2307; NONEON-NOSVE-NEXT:    strh w8, [sp, #128]
2308; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #87]
2309; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #224] // 16-byte Folded Reload
2310; NONEON-NOSVE-NEXT:    strh w8, [sp, #126]
2311; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #86]
2312; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
2313; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #208] // 16-byte Folded Reload
2314; NONEON-NOSVE-NEXT:    strh w8, [sp, #124]
2315; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #85]
2316; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #192] // 16-byte Folded Reload
2317; NONEON-NOSVE-NEXT:    strh w8, [sp, #122]
2318; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #84]
2319; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #176] // 16-byte Folded Reload
2320; NONEON-NOSVE-NEXT:    strh w8, [sp, #120]
2321; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #83]
2322; NONEON-NOSVE-NEXT:    strh w8, [sp, #118]
2323; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #82]
2324; NONEON-NOSVE-NEXT:    strh w8, [sp, #116]
2325; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #81]
2326; NONEON-NOSVE-NEXT:    strh w8, [sp, #114]
2327; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #80]
2328; NONEON-NOSVE-NEXT:    strh w8, [sp, #112]
2329; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #111]
2330; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #112]
2331; NONEON-NOSVE-NEXT:    strh w8, [sp, #174]
2332; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #110]
2333; NONEON-NOSVE-NEXT:    strh w8, [sp, #172]
2334; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #109]
2335; NONEON-NOSVE-NEXT:    strh w8, [sp, #170]
2336; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #108]
2337; NONEON-NOSVE-NEXT:    strh w8, [sp, #168]
2338; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #107]
2339; NONEON-NOSVE-NEXT:    strh w8, [sp, #166]
2340; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #106]
2341; NONEON-NOSVE-NEXT:    strh w8, [sp, #164]
2342; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #105]
2343; NONEON-NOSVE-NEXT:    strh w8, [sp, #162]
2344; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #104]
2345; NONEON-NOSVE-NEXT:    strh w8, [sp, #160]
2346; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #103]
2347; NONEON-NOSVE-NEXT:    strh w8, [sp, #158]
2348; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #102]
2349; NONEON-NOSVE-NEXT:    strh w8, [sp, #156]
2350; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #101]
2351; NONEON-NOSVE-NEXT:    strh w8, [sp, #154]
2352; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #100]
2353; NONEON-NOSVE-NEXT:    strh w8, [sp, #152]
2354; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #99]
2355; NONEON-NOSVE-NEXT:    strh w8, [sp, #150]
2356; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #98]
2357; NONEON-NOSVE-NEXT:    strh w8, [sp, #148]
2358; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #97]
2359; NONEON-NOSVE-NEXT:    strh w8, [sp, #146]
2360; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #96]
2361; NONEON-NOSVE-NEXT:    strh w8, [sp, #144]
2362; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #144]
2363; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
2364; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
2365; NONEON-NOSVE-NEXT:    add sp, sp, #272
2366; NONEON-NOSVE-NEXT:    ret
2367  %a = load <32 x i8>, ptr %in
2368  %b = add <32 x i8> %a, %a
2369  %c = zext <32 x i8> %b to <32 x i16>
2370  store <32 x i16> %c, ptr %out
2371  ret void
2372}
2373
2374;
2375; zext i8 -> i32
2376;
2377
2378define void @zext_v8i8_v8i32(<8 x i8> %a, ptr %out) {
2379; CHECK-LABEL: zext_v8i8_v8i32:
2380; CHECK:       // %bb.0:
2381; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2382; CHECK-NEXT:    uunpklo z0.h, z0.b
2383; CHECK-NEXT:    uunpklo z1.s, z0.h
2384; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2385; CHECK-NEXT:    uunpklo z0.s, z0.h
2386; CHECK-NEXT:    stp q1, q0, [x0]
2387; CHECK-NEXT:    ret
2388;
2389; NONEON-NOSVE-LABEL: zext_v8i8_v8i32:
2390; NONEON-NOSVE:       // %bb.0:
2391; NONEON-NOSVE-NEXT:    sub sp, sp, #80
2392; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 80
2393; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
2394; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
2395; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
2396; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #10]
2397; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
2398; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
2399; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
2400; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
2401; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
2402; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
2403; NONEON-NOSVE-NEXT:    strh w8, [sp, #22]
2404; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
2405; NONEON-NOSVE-NEXT:    strh w8, [sp, #20]
2406; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
2407; NONEON-NOSVE-NEXT:    strh w8, [sp, #18]
2408; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
2409; NONEON-NOSVE-NEXT:    strh w8, [sp, #16]
2410; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #16]
2411; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
2412; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]
2413; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #44]
2414; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #72]
2415; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #42]
2416; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #40]
2417; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #64]
2418; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #38]
2419; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #36]
2420; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
2421; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #34]
2422; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #32]
2423; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
2424; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #48]
2425; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
2426; NONEON-NOSVE-NEXT:    add sp, sp, #80
2427; NONEON-NOSVE-NEXT:    ret
2428  %b = zext <8 x i8> %a to <8 x i32>
2429  store <8 x i32>%b, ptr %out
2430  ret void
2431}
2432
2433define void @zext_v16i8_v16i32(<16 x i8> %a, ptr %out) {
2434; CHECK-LABEL: zext_v16i8_v16i32:
2435; CHECK:       // %bb.0:
2436; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2437; CHECK-NEXT:    uunpklo z1.h, z0.b
2438; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2439; CHECK-NEXT:    uunpklo z0.h, z0.b
2440; CHECK-NEXT:    uunpklo z2.s, z1.h
2441; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
2442; CHECK-NEXT:    uunpklo z1.s, z1.h
2443; CHECK-NEXT:    uunpklo z3.s, z0.h
2444; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2445; CHECK-NEXT:    uunpklo z0.s, z0.h
2446; CHECK-NEXT:    stp q2, q1, [x0]
2447; CHECK-NEXT:    stp q3, q0, [x0, #32]
2448; CHECK-NEXT:    ret
2449;
2450; NONEON-NOSVE-LABEL: zext_v16i8_v16i32:
2451; NONEON-NOSVE:       // %bb.0:
2452; NONEON-NOSVE-NEXT:    str q0, [sp, #-160]!
2453; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160
2454; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
2455; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
2456; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
2457; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
2458; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
2459; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
2460; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
2461; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
2462; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
2463; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
2464; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
2465; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
2466; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
2467; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
2468; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
2469; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
2470; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
2471; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
2472; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
2473; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
2474; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
2475; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
2476; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
2477; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
2478; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
2479; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
2480; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
2481; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #94]
2482; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
2483; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
2484; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
2485; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
2486; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
2487; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
2488; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
2489; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
2490; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
2491; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #92]
2492; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
2493; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #152]
2494; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #90]
2495; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #88]
2496; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144]
2497; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #86]
2498; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #84]
2499; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
2500; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136]
2501; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #82]
2502; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #80]
2503; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]
2504; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #78]
2505; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #76]
2506; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #128]
2507; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]
2508; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #74]
2509; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #72]
2510; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112]
2511; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #70]
2512; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #68]
2513; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104]
2514; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #66]
2515; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #64]
2516; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #96]
2517; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
2518; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]
2519; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]
2520; NONEON-NOSVE-NEXT:    add sp, sp, #160
2521; NONEON-NOSVE-NEXT:    ret
2522  %b = zext <16 x i8> %a to <16 x i32>
2523  store <16 x i32> %b, ptr %out
2524  ret void
2525}
2526
2527define void @zext_v32i8_v32i32(ptr %in, ptr %out) {
2528; CHECK-LABEL: zext_v32i8_v32i32:
2529; CHECK:       // %bb.0:
2530; CHECK-NEXT:    ldp q1, q0, [x0]
2531; CHECK-NEXT:    add z0.b, z0.b, z0.b
2532; CHECK-NEXT:    add z1.b, z1.b, z1.b
2533; CHECK-NEXT:    uunpklo z2.h, z0.b
2534; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2535; CHECK-NEXT:    uunpklo z3.h, z1.b
2536; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
2537; CHECK-NEXT:    uunpklo z0.h, z0.b
2538; CHECK-NEXT:    uunpklo z1.h, z1.b
2539; CHECK-NEXT:    uunpklo z4.s, z2.h
2540; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
2541; CHECK-NEXT:    uunpklo z5.s, z3.h
2542; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
2543; CHECK-NEXT:    uunpklo z6.s, z0.h
2544; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2545; CHECK-NEXT:    uunpklo z2.s, z2.h
2546; CHECK-NEXT:    uunpklo z7.s, z1.h
2547; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
2548; CHECK-NEXT:    uunpklo z3.s, z3.h
2549; CHECK-NEXT:    uunpklo z0.s, z0.h
2550; CHECK-NEXT:    uunpklo z1.s, z1.h
2551; CHECK-NEXT:    stp q4, q2, [x1, #64]
2552; CHECK-NEXT:    stp q5, q3, [x1]
2553; CHECK-NEXT:    stp q6, q0, [x1, #96]
2554; CHECK-NEXT:    stp q7, q1, [x1, #32]
2555; CHECK-NEXT:    ret
2556;
2557; NONEON-NOSVE-LABEL: zext_v32i8_v32i32:
2558; NONEON-NOSVE:       // %bb.0:
2559; NONEON-NOSVE-NEXT:    sub sp, sp, #464
2560; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #368] // 16-byte Folded Spill
2561; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #384] // 16-byte Folded Spill
2562; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #400] // 16-byte Folded Spill
2563; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #416] // 16-byte Folded Spill
2564; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #432] // 16-byte Folded Spill
2565; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #448] // 16-byte Folded Spill
2566; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 464
2567; NONEON-NOSVE-NEXT:    .cfi_offset w19, -8
2568; NONEON-NOSVE-NEXT:    .cfi_offset w20, -16
2569; NONEON-NOSVE-NEXT:    .cfi_offset w21, -24
2570; NONEON-NOSVE-NEXT:    .cfi_offset w22, -32
2571; NONEON-NOSVE-NEXT:    .cfi_offset w23, -40
2572; NONEON-NOSVE-NEXT:    .cfi_offset w24, -48
2573; NONEON-NOSVE-NEXT:    .cfi_offset w25, -56
2574; NONEON-NOSVE-NEXT:    .cfi_offset w26, -64
2575; NONEON-NOSVE-NEXT:    .cfi_offset w27, -72
2576; NONEON-NOSVE-NEXT:    .cfi_offset w28, -80
2577; NONEON-NOSVE-NEXT:    .cfi_offset w30, -88
2578; NONEON-NOSVE-NEXT:    .cfi_offset w29, -96
2579; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2580; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]
2581; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
2582; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #41]
2583; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #18]
2584; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #16]
2585; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #30]
2586; NONEON-NOSVE-NEXT:    ldrb w23, [sp, #28]
2587; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill
2588; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
2589; NONEON-NOSVE-NEXT:    ldrb w21, [sp, #26]
2590; NONEON-NOSVE-NEXT:    ldrb w19, [sp, #24]
2591; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #19]
2592; NONEON-NOSVE-NEXT:    ldrb w6, [sp, #38]
2593; NONEON-NOSVE-NEXT:    add w8, w8, w8
2594; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #17]
2595; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #22]
2596; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
2597; NONEON-NOSVE-NEXT:    add w8, w29, w29
2598; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #36]
2599; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
2600; NONEON-NOSVE-NEXT:    add w8, w27, w27
2601; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #31]
2602; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
2603; NONEON-NOSVE-NEXT:    add w8, w25, w25
2604; NONEON-NOSVE-NEXT:    add w9, w9, w9
2605; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
2606; NONEON-NOSVE-NEXT:    add w8, w23, w23
2607; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #34]
2608; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
2609; NONEON-NOSVE-NEXT:    add w8, w21, w21
2610; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #29]
2611; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
2612; NONEON-NOSVE-NEXT:    add w8, w19, w19
2613; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #23]
2614; NONEON-NOSVE-NEXT:    strb w9, [sp, #59]
2615; NONEON-NOSVE-NEXT:    add w9, w28, w28
2616; NONEON-NOSVE-NEXT:    add w18, w16, w16
2617; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
2618; NONEON-NOSVE-NEXT:    add w8, w6, w6
2619; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #32]
2620; NONEON-NOSVE-NEXT:    ldrb w22, [sp, #27]
2621; NONEON-NOSVE-NEXT:    strb w9, [sp, #57]
2622; NONEON-NOSVE-NEXT:    add w9, w26, w26
2623; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
2624; NONEON-NOSVE-NEXT:    add w8, w4, w4
2625; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #46]
2626; NONEON-NOSVE-NEXT:    ldrb w20, [sp, #25]
2627; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #21]
2628; NONEON-NOSVE-NEXT:    strb w9, [sp, #55]
2629; NONEON-NOSVE-NEXT:    add w9, w24, w24
2630; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
2631; NONEON-NOSVE-NEXT:    add w8, w2, w2
2632; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #44]
2633; NONEON-NOSVE-NEXT:    add w17, w17, w17
2634; NONEON-NOSVE-NEXT:    strb w9, [sp, #53]
2635; NONEON-NOSVE-NEXT:    add w9, w22, w22
2636; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
2637; NONEON-NOSVE-NEXT:    add w8, w16, w16
2638; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #42]
2639; NONEON-NOSVE-NEXT:    strb w17, [sp, #63]
2640; NONEON-NOSVE-NEXT:    add w17, w30, w30
2641; NONEON-NOSVE-NEXT:    strb w9, [sp, #51]
2642; NONEON-NOSVE-NEXT:    add w9, w20, w20
2643; NONEON-NOSVE-NEXT:    ldrb w7, [sp, #39]
2644; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
2645; NONEON-NOSVE-NEXT:    add w8, w14, w14
2646; NONEON-NOSVE-NEXT:    ldrb w5, [sp, #37]
2647; NONEON-NOSVE-NEXT:    strb w18, [sp, #62]
2648; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #35]
2649; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #33]
2650; NONEON-NOSVE-NEXT:    strb w17, [sp, #61]
2651; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #47]
2652; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #45]
2653; NONEON-NOSVE-NEXT:    strb w9, [sp, #49]
2654; NONEON-NOSVE-NEXT:    add w9, w7, w7
2655; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #43]
2656; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
2657; NONEON-NOSVE-NEXT:    add w8, w12, w12
2658; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
2659; NONEON-NOSVE-NEXT:    add w8, w10, w10
2660; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
2661; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
2662; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12] // 4-byte Folded Reload
2663; NONEON-NOSVE-NEXT:    strb w9, [sp, #79]
2664; NONEON-NOSVE-NEXT:    add w9, w5, w5
2665; NONEON-NOSVE-NEXT:    strb w9, [sp, #77]
2666; NONEON-NOSVE-NEXT:    add w9, w3, w3
2667; NONEON-NOSVE-NEXT:    add w8, w8, w8
2668; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
2669; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
2670; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #91]
2671; NONEON-NOSVE-NEXT:    strb w9, [sp, #75]
2672; NONEON-NOSVE-NEXT:    add w9, w0, w0
2673; NONEON-NOSVE-NEXT:    strh w8, [sp, #134]
2674; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #90]
2675; NONEON-NOSVE-NEXT:    strb w9, [sp, #73]
2676; NONEON-NOSVE-NEXT:    add w9, w15, w15
2677; NONEON-NOSVE-NEXT:    strh w8, [sp, #132]
2678; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #89]
2679; NONEON-NOSVE-NEXT:    strb w9, [sp, #71]
2680; NONEON-NOSVE-NEXT:    add w9, w13, w13
2681; NONEON-NOSVE-NEXT:    strh w8, [sp, #130]
2682; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #88]
2683; NONEON-NOSVE-NEXT:    strb w9, [sp, #69]
2684; NONEON-NOSVE-NEXT:    add w9, w11, w11
2685; NONEON-NOSVE-NEXT:    strh w8, [sp, #128]
2686; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #95]
2687; NONEON-NOSVE-NEXT:    strb w9, [sp, #67]
2688; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8] // 4-byte Folded Reload
2689; NONEON-NOSVE-NEXT:    strh w8, [sp, #142]
2690; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #94]
2691; NONEON-NOSVE-NEXT:    add w9, w9, w9
2692; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #448] // 16-byte Folded Reload
2693; NONEON-NOSVE-NEXT:    strh w8, [sp, #140]
2694; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #93]
2695; NONEON-NOSVE-NEXT:    strb w9, [sp, #65]
2696; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #432] // 16-byte Folded Reload
2697; NONEON-NOSVE-NEXT:    strh w8, [sp, #138]
2698; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #92]
2699; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #64]
2700; NONEON-NOSVE-NEXT:    strh w8, [sp, #136]
2701; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #83]
2702; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #416] // 16-byte Folded Reload
2703; NONEON-NOSVE-NEXT:    strh w8, [sp, #118]
2704; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #82]
2705; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
2706; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #128]
2707; NONEON-NOSVE-NEXT:    strh w8, [sp, #116]
2708; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #81]
2709; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #400] // 16-byte Folded Reload
2710; NONEON-NOSVE-NEXT:    strh w8, [sp, #114]
2711; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #80]
2712; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #192]
2713; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #384] // 16-byte Folded Reload
2714; NONEON-NOSVE-NEXT:    strh w8, [sp, #112]
2715; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #87]
2716; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp, #368] // 16-byte Folded Reload
2717; NONEON-NOSVE-NEXT:    strh w8, [sp, #126]
2718; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #86]
2719; NONEON-NOSVE-NEXT:    strh w8, [sp, #124]
2720; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #85]
2721; NONEON-NOSVE-NEXT:    strh w8, [sp, #122]
2722; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #84]
2723; NONEON-NOSVE-NEXT:    strh w8, [sp, #120]
2724; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #107]
2725; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #112]
2726; NONEON-NOSVE-NEXT:    strh w8, [sp, #166]
2727; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #106]
2728; NONEON-NOSVE-NEXT:    strh w8, [sp, #164]
2729; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #105]
2730; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #176]
2731; NONEON-NOSVE-NEXT:    strh w8, [sp, #162]
2732; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #104]
2733; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #182]
2734; NONEON-NOSVE-NEXT:    strh w8, [sp, #160]
2735; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #111]
2736; NONEON-NOSVE-NEXT:    strh w8, [sp, #174]
2737; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #110]
2738; NONEON-NOSVE-NEXT:    strh w8, [sp, #172]
2739; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #109]
2740; NONEON-NOSVE-NEXT:    strh w8, [sp, #170]
2741; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #108]
2742; NONEON-NOSVE-NEXT:    strh w8, [sp, #168]
2743; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #99]
2744; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #160]
2745; NONEON-NOSVE-NEXT:    strh w8, [sp, #150]
2746; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #98]
2747; NONEON-NOSVE-NEXT:    strh w8, [sp, #148]
2748; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #97]
2749; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #224]
2750; NONEON-NOSVE-NEXT:    strh w8, [sp, #146]
2751; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #96]
2752; NONEON-NOSVE-NEXT:    strh w8, [sp, #144]
2753; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #103]
2754; NONEON-NOSVE-NEXT:    strh w8, [sp, #158]
2755; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #102]
2756; NONEON-NOSVE-NEXT:    strh w8, [sp, #156]
2757; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #101]
2758; NONEON-NOSVE-NEXT:    strh w8, [sp, #154]
2759; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #100]
2760; NONEON-NOSVE-NEXT:    strh w8, [sp, #152]
2761; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #198]
2762; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #144]
2763; NONEON-NOSVE-NEXT:    str w8, [sp, #284]
2764; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #196]
2765; NONEON-NOSVE-NEXT:    str w8, [sp, #280]
2766; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #194]
2767; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #208]
2768; NONEON-NOSVE-NEXT:    str w8, [sp, #276]
2769; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #192]
2770; NONEON-NOSVE-NEXT:    str w8, [sp, #272]
2771; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #206]
2772; NONEON-NOSVE-NEXT:    str w8, [sp, #300]
2773; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #204]
2774; NONEON-NOSVE-NEXT:    str w8, [sp, #296]
2775; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #202]
2776; NONEON-NOSVE-NEXT:    str w8, [sp, #292]
2777; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #200]
2778; NONEON-NOSVE-NEXT:    str w8, [sp, #288]
2779; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #180]
2780; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #272]
2781; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #248]
2782; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #178]
2783; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #176]
2784; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #240]
2785; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #190]
2786; NONEON-NOSVE-NEXT:    str w8, [sp, #268]
2787; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #188]
2788; NONEON-NOSVE-NEXT:    str w8, [sp, #264]
2789; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #186]
2790; NONEON-NOSVE-NEXT:    str w8, [sp, #260]
2791; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #184]
2792; NONEON-NOSVE-NEXT:    str w8, [sp, #256]
2793; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #230]
2794; NONEON-NOSVE-NEXT:    ldp q3, q4, [sp, #240]
2795; NONEON-NOSVE-NEXT:    str w8, [sp, #348]
2796; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #228]
2797; NONEON-NOSVE-NEXT:    str w8, [sp, #344]
2798; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #226]
2799; NONEON-NOSVE-NEXT:    str w8, [sp, #340]
2800; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #224]
2801; NONEON-NOSVE-NEXT:    str w8, [sp, #336]
2802; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #238]
2803; NONEON-NOSVE-NEXT:    str w8, [sp, #364]
2804; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #236]
2805; NONEON-NOSVE-NEXT:    str w8, [sp, #360]
2806; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #234]
2807; NONEON-NOSVE-NEXT:    str w8, [sp, #356]
2808; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #232]
2809; NONEON-NOSVE-NEXT:    str w8, [sp, #352]
2810; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #214]
2811; NONEON-NOSVE-NEXT:    ldp q6, q7, [sp, #336]
2812; NONEON-NOSVE-NEXT:    str w8, [sp, #316]
2813; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #212]
2814; NONEON-NOSVE-NEXT:    str w8, [sp, #312]
2815; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #210]
2816; NONEON-NOSVE-NEXT:    str w8, [sp, #308]
2817; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #208]
2818; NONEON-NOSVE-NEXT:    str w8, [sp, #304]
2819; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #222]
2820; NONEON-NOSVE-NEXT:    str w8, [sp, #332]
2821; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #220]
2822; NONEON-NOSVE-NEXT:    str w8, [sp, #328]
2823; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #218]
2824; NONEON-NOSVE-NEXT:    str w8, [sp, #324]
2825; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #216]
2826; NONEON-NOSVE-NEXT:    str w8, [sp, #320]
2827; NONEON-NOSVE-NEXT:    ldp q5, q2, [sp, #304]
2828; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
2829; NONEON-NOSVE-NEXT:    stp q3, q4, [x1, #32]
2830; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #64]
2831; NONEON-NOSVE-NEXT:    stp q5, q2, [x1, #96]
2832; NONEON-NOSVE-NEXT:    add sp, sp, #464
2833; NONEON-NOSVE-NEXT:    ret
2834  %a = load <32 x i8>, ptr %in
2835  %b = add <32 x i8> %a, %a
2836  %c = zext <32 x i8> %b to <32 x i32>
2837  store <32 x i32> %c, ptr %out
2838  ret void
2839}
2840
2841;
2842; zext i8 -> i64
2843;
2844
2845; NOTE: v4i8 is an unpacked typed stored within a v4i16 container. The zero
2846; extend is a two step process where the container is zero_extend_inreg'd with
2847; the result feeding a normal zero extend from halfs to doublewords.
2848define void @zext_v4i8_v4i64(<4 x i8> %a, ptr %out) {
2849; CHECK-LABEL: zext_v4i8_v4i64:
2850; CHECK:       // %bb.0:
2851; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2852; CHECK-NEXT:    and z0.h, z0.h, #0xff
2853; CHECK-NEXT:    uunpklo z0.s, z0.h
2854; CHECK-NEXT:    uunpklo z1.d, z0.s
2855; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2856; CHECK-NEXT:    uunpklo z0.d, z0.s
2857; CHECK-NEXT:    stp q1, q0, [x0]
2858; CHECK-NEXT:    ret
2859;
2860; NONEON-NOSVE-LABEL: zext_v4i8_v4i64:
2861; NONEON-NOSVE:       // %bb.0:
2862; NONEON-NOSVE-NEXT:    sub sp, sp, #80
2863; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 80
2864; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
2865; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
2866; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
2867; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]
2868; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
2869; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #12]
2870; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16]
2871; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #16]
2872; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
2873; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #40]
2874; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #72]
2875; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #64]
2876; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #32]
2877; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #56]
2878; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #48]
2879; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #48]
2880; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
2881; NONEON-NOSVE-NEXT:    add sp, sp, #80
2882; NONEON-NOSVE-NEXT:    ret
2883  %b = zext <4 x i8> %a to <4 x i64>
2884  store <4 x i64>%b, ptr %out
2885  ret void
2886}
2887
2888define void @zext_v8i8_v8i64(<8 x i8> %a, ptr %out) {
2889; CHECK-LABEL: zext_v8i8_v8i64:
2890; CHECK:       // %bb.0:
2891; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2892; CHECK-NEXT:    uunpklo z0.h, z0.b
2893; CHECK-NEXT:    uunpklo z1.s, z0.h
2894; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2895; CHECK-NEXT:    uunpklo z0.s, z0.h
2896; CHECK-NEXT:    uunpklo z2.d, z1.s
2897; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
2898; CHECK-NEXT:    uunpklo z3.d, z0.s
2899; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2900; CHECK-NEXT:    uunpklo z1.d, z1.s
2901; CHECK-NEXT:    uunpklo z0.d, z0.s
2902; CHECK-NEXT:    stp q2, q1, [x0]
2903; CHECK-NEXT:    stp q3, q0, [x0, #32]
2904; CHECK-NEXT:    ret
2905;
2906; NONEON-NOSVE-LABEL: zext_v8i8_v8i64:
2907; NONEON-NOSVE:       // %bb.0:
2908; NONEON-NOSVE-NEXT:    sub sp, sp, #176
2909; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 176
2910; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
2911; NONEON-NOSVE-NEXT:    add x8, sp, #144
2912; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
2913; NONEON-NOSVE-NEXT:    strh w9, [sp, #30]
2914; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
2915; NONEON-NOSVE-NEXT:    strh w9, [sp, #28]
2916; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
2917; NONEON-NOSVE-NEXT:    strh w9, [sp, #26]
2918; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
2919; NONEON-NOSVE-NEXT:    strh w9, [sp, #24]
2920; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
2921; NONEON-NOSVE-NEXT:    strh w9, [sp, #22]
2922; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
2923; NONEON-NOSVE-NEXT:    strh w9, [sp, #20]
2924; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
2925; NONEON-NOSVE-NEXT:    strh w9, [sp, #18]
2926; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
2927; NONEON-NOSVE-NEXT:    strh w9, [sp, #16]
2928; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #16]
2929; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
2930; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #42]
2931; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
2932; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #64]
2933; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #46]
2934; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]
2935; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #72]
2936; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #34]
2937; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #32]
2938; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #64]
2939; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #48]
2940; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #38]
2941; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #36]
2942; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #96]
2943; NONEON-NOSVE-NEXT:    stp w9, w10, [sp, #56]
2944; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #96]
2945; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #48]
2946; NONEON-NOSVE-NEXT:    stp w10, wzr, [sp, #152]
2947; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #144]
2948; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #104]
2949; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #80]
2950; NONEON-NOSVE-NEXT:    stp w10, wzr, [sp, #168]
2951; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #160]
2952; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #80]
2953; NONEON-NOSVE-NEXT:    stp w10, wzr, [sp, #120]
2954; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #112]
2955; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #88]
2956; NONEON-NOSVE-NEXT:    stp w10, wzr, [sp, #136]
2957; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #128]
2958; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #112]
2959; NONEON-NOSVE-NEXT:    ldp q2, q3, [x8]
2960; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]
2961; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]
2962; NONEON-NOSVE-NEXT:    add sp, sp, #176
2963; NONEON-NOSVE-NEXT:    ret
2964  %b = zext <8 x i8> %a to <8 x i64>
2965  store <8 x i64>%b, ptr %out
2966  ret void
2967}
2968
2969define void @zext_v16i8_v16i64(<16 x i8> %a, ptr %out) {
2970; CHECK-LABEL: zext_v16i8_v16i64:
2971; CHECK:       // %bb.0:
2972; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2973; CHECK-NEXT:    uunpklo z1.h, z0.b
2974; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2975; CHECK-NEXT:    uunpklo z0.h, z0.b
2976; CHECK-NEXT:    uunpklo z2.s, z1.h
2977; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
2978; CHECK-NEXT:    uunpklo z1.s, z1.h
2979; CHECK-NEXT:    uunpklo z3.s, z0.h
2980; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2981; CHECK-NEXT:    uunpklo z4.d, z2.s
2982; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
2983; CHECK-NEXT:    uunpklo z0.s, z0.h
2984; CHECK-NEXT:    uunpklo z6.d, z1.s
2985; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
2986; CHECK-NEXT:    uunpklo z5.d, z3.s
2987; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
2988; CHECK-NEXT:    uunpklo z2.d, z2.s
2989; CHECK-NEXT:    uunpklo z1.d, z1.s
2990; CHECK-NEXT:    uunpklo z7.d, z0.s
2991; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2992; CHECK-NEXT:    uunpklo z3.d, z3.s
2993; CHECK-NEXT:    stp q4, q2, [x0]
2994; CHECK-NEXT:    uunpklo z0.d, z0.s
2995; CHECK-NEXT:    stp q6, q1, [x0, #32]
2996; CHECK-NEXT:    stp q5, q3, [x0, #64]
2997; CHECK-NEXT:    stp q7, q0, [x0, #96]
2998; CHECK-NEXT:    ret
2999;
3000; NONEON-NOSVE-LABEL: zext_v16i8_v16i64:
3001; NONEON-NOSVE:       // %bb.0:
3002; NONEON-NOSVE-NEXT:    sub sp, sp, #368
3003; NONEON-NOSVE-NEXT:    str x29, [sp, #352] // 8-byte Folded Spill
3004; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 368
3005; NONEON-NOSVE-NEXT:    .cfi_offset w29, -16
3006; NONEON-NOSVE-NEXT:    str q0, [sp]
3007; NONEON-NOSVE-NEXT:    ldr x29, [sp, #352] // 8-byte Folded Reload
3008; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
3009; NONEON-NOSVE-NEXT:    str wzr, [sp, #332]
3010; NONEON-NOSVE-NEXT:    str wzr, [sp, #324]
3011; NONEON-NOSVE-NEXT:    str wzr, [sp, #348]
3012; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #24]
3013; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #35]
3014; NONEON-NOSVE-NEXT:    str wzr, [sp, #340]
3015; NONEON-NOSVE-NEXT:    str wzr, [sp, #300]
3016; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
3017; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #34]
3018; NONEON-NOSVE-NEXT:    str wzr, [sp, #292]
3019; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
3020; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #33]
3021; NONEON-NOSVE-NEXT:    str wzr, [sp, #316]
3022; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
3023; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #32]
3024; NONEON-NOSVE-NEXT:    str wzr, [sp, #308]
3025; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
3026; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #39]
3027; NONEON-NOSVE-NEXT:    str wzr, [sp, #268]
3028; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
3029; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #38]
3030; NONEON-NOSVE-NEXT:    str wzr, [sp, #260]
3031; NONEON-NOSVE-NEXT:    strh w8, [sp, #60]
3032; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #37]
3033; NONEON-NOSVE-NEXT:    str wzr, [sp, #284]
3034; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
3035; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #36]
3036; NONEON-NOSVE-NEXT:    str wzr, [sp, #276]
3037; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
3038; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
3039; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #56]
3040; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
3041; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
3042; NONEON-NOSVE-NEXT:    strh w8, [sp, #52]
3043; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
3044; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #88]
3045; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
3046; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
3047; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #98]
3048; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
3049; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
3050; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
3051; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
3052; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
3053; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
3054; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
3055; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
3056; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
3057; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #96]
3058; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #40]
3059; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #152]
3060; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #102]
3061; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #100]
3062; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #160]
3063; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #90]
3064; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #88]
3065; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #72]
3066; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #152]
3067; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136]
3068; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #94]
3069; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #92]
3070; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144]
3071; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #82]
3072; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #80]
3073; NONEON-NOSVE-NEXT:    str d0, [sp, #360]
3074; NONEON-NOSVE-NEXT:    ldp d2, d0, [sp, #136]
3075; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]
3076; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #86]
3077; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #84]
3078; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]
3079; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #74]
3080; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #72]
3081; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #208]
3082; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #120]
3083; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104]
3084; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #78]
3085; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #76]
3086; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112]
3087; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #216]
3088; NONEON-NOSVE-NEXT:    stp d0, d2, [sp, #192]
3089; NONEON-NOSVE-NEXT:    ldp d2, d0, [sp, #104]
3090; NONEON-NOSVE-NEXT:    str w8, [sp, #320]
3091; NONEON-NOSVE-NEXT:    ldr w8, [sp, #364]
3092; NONEON-NOSVE-NEXT:    str w9, [sp, #328]
3093; NONEON-NOSVE-NEXT:    str w8, [sp, #344]
3094; NONEON-NOSVE-NEXT:    ldr w8, [sp, #360]
3095; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #176]
3096; NONEON-NOSVE-NEXT:    str w8, [sp, #336]
3097; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #200]
3098; NONEON-NOSVE-NEXT:    str d2, [sp, #168]
3099; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #320]
3100; NONEON-NOSVE-NEXT:    str w9, [sp, #296]
3101; NONEON-NOSVE-NEXT:    str w8, [sp, #288]
3102; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #208]
3103; NONEON-NOSVE-NEXT:    str w9, [sp, #312]
3104; NONEON-NOSVE-NEXT:    str w8, [sp, #304]
3105; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #184]
3106; NONEON-NOSVE-NEXT:    ldp q3, q4, [sp, #288]
3107; NONEON-NOSVE-NEXT:    str w9, [sp, #264]
3108; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #252]
3109; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #192]
3110; NONEON-NOSVE-NEXT:    str w9, [sp, #280]
3111; NONEON-NOSVE-NEXT:    str w8, [sp, #272]
3112; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #168]
3113; NONEON-NOSVE-NEXT:    ldp q6, q7, [sp, #256]
3114; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #232]
3115; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #224]
3116; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #176]
3117; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #244]
3118; NONEON-NOSVE-NEXT:    str w8, [sp, #240]
3119; NONEON-NOSVE-NEXT:    ldp q5, q2, [sp, #224]
3120; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
3121; NONEON-NOSVE-NEXT:    stp q3, q4, [x0, #32]
3122; NONEON-NOSVE-NEXT:    stp q6, q7, [x0, #64]
3123; NONEON-NOSVE-NEXT:    stp q5, q2, [x0, #96]
3124; NONEON-NOSVE-NEXT:    add sp, sp, #368
3125; NONEON-NOSVE-NEXT:    ret
3126  %b = zext <16 x i8> %a to <16 x i64>
3127  store <16 x i64> %b, ptr %out
3128  ret void
3129}
3130
3131define void @zext_v32i8_v32i64(ptr %in, ptr %out) {
3132; CHECK-LABEL: zext_v32i8_v32i64:
3133; CHECK:       // %bb.0:
3134; CHECK-NEXT:    ldp q1, q0, [x0]
3135; CHECK-NEXT:    add z0.b, z0.b, z0.b
3136; CHECK-NEXT:    add z1.b, z1.b, z1.b
3137; CHECK-NEXT:    mov z2.d, z0.d
3138; CHECK-NEXT:    uunpklo z0.h, z0.b
3139; CHECK-NEXT:    mov z3.d, z1.d
3140; CHECK-NEXT:    uunpklo z1.h, z1.b
3141; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
3142; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
3143; CHECK-NEXT:    uunpklo z4.s, z0.h
3144; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
3145; CHECK-NEXT:    uunpklo z5.s, z1.h
3146; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
3147; CHECK-NEXT:    uunpklo z2.h, z2.b
3148; CHECK-NEXT:    uunpklo z3.h, z3.b
3149; CHECK-NEXT:    uunpklo z0.s, z0.h
3150; CHECK-NEXT:    uunpklo z16.d, z4.s
3151; CHECK-NEXT:    ext z4.b, z4.b, z4.b, #8
3152; CHECK-NEXT:    uunpklo z1.s, z1.h
3153; CHECK-NEXT:    uunpklo z17.d, z5.s
3154; CHECK-NEXT:    ext z5.b, z5.b, z5.b, #8
3155; CHECK-NEXT:    uunpklo z6.s, z2.h
3156; CHECK-NEXT:    uunpklo z7.s, z3.h
3157; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
3158; CHECK-NEXT:    uunpklo z4.d, z4.s
3159; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
3160; CHECK-NEXT:    uunpklo z19.d, z0.s
3161; CHECK-NEXT:    uunpklo z5.d, z5.s
3162; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
3163; CHECK-NEXT:    uunpklo z2.s, z2.h
3164; CHECK-NEXT:    uunpklo z18.d, z6.s
3165; CHECK-NEXT:    ext z6.b, z6.b, z6.b, #8
3166; CHECK-NEXT:    uunpklo z3.s, z3.h
3167; CHECK-NEXT:    stp q16, q4, [x1, #128]
3168; CHECK-NEXT:    mov z16.d, z7.d
3169; CHECK-NEXT:    uunpklo z0.d, z0.s
3170; CHECK-NEXT:    stp q17, q5, [x1]
3171; CHECK-NEXT:    uunpklo z5.d, z7.s
3172; CHECK-NEXT:    uunpklo z4.d, z6.s
3173; CHECK-NEXT:    mov z6.d, z1.d
3174; CHECK-NEXT:    ext z16.b, z16.b, z7.b, #8
3175; CHECK-NEXT:    mov z7.d, z2.d
3176; CHECK-NEXT:    stp q19, q0, [x1, #160]
3177; CHECK-NEXT:    uunpklo z0.d, z2.s
3178; CHECK-NEXT:    ext z6.b, z6.b, z1.b, #8
3179; CHECK-NEXT:    uunpklo z1.d, z1.s
3180; CHECK-NEXT:    stp q18, q4, [x1, #192]
3181; CHECK-NEXT:    mov z4.d, z3.d
3182; CHECK-NEXT:    ext z7.b, z7.b, z2.b, #8
3183; CHECK-NEXT:    uunpklo z16.d, z16.s
3184; CHECK-NEXT:    uunpklo z6.d, z6.s
3185; CHECK-NEXT:    ext z4.b, z4.b, z3.b, #8
3186; CHECK-NEXT:    uunpklo z2.d, z7.s
3187; CHECK-NEXT:    uunpklo z3.d, z3.s
3188; CHECK-NEXT:    stp q5, q16, [x1, #64]
3189; CHECK-NEXT:    stp q1, q6, [x1, #32]
3190; CHECK-NEXT:    uunpklo z1.d, z4.s
3191; CHECK-NEXT:    stp q0, q2, [x1, #224]
3192; CHECK-NEXT:    stp q3, q1, [x1, #96]
3193; CHECK-NEXT:    ret
3194;
3195; NONEON-NOSVE-LABEL: zext_v32i8_v32i64:
3196; NONEON-NOSVE:       // %bb.0:
3197; NONEON-NOSVE-NEXT:    stp x29, x30, [sp, #-96]! // 16-byte Folded Spill
3198; NONEON-NOSVE-NEXT:    stp x28, x27, [sp, #16] // 16-byte Folded Spill
3199; NONEON-NOSVE-NEXT:    stp x26, x25, [sp, #32] // 16-byte Folded Spill
3200; NONEON-NOSVE-NEXT:    stp x24, x23, [sp, #48] // 16-byte Folded Spill
3201; NONEON-NOSVE-NEXT:    stp x22, x21, [sp, #64] // 16-byte Folded Spill
3202; NONEON-NOSVE-NEXT:    stp x20, x19, [sp, #80] // 16-byte Folded Spill
3203; NONEON-NOSVE-NEXT:    sub sp, sp, #752
3204; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 848
3205; NONEON-NOSVE-NEXT:    .cfi_offset w19, -8
3206; NONEON-NOSVE-NEXT:    .cfi_offset w20, -16
3207; NONEON-NOSVE-NEXT:    .cfi_offset w21, -24
3208; NONEON-NOSVE-NEXT:    .cfi_offset w22, -32
3209; NONEON-NOSVE-NEXT:    .cfi_offset w23, -40
3210; NONEON-NOSVE-NEXT:    .cfi_offset w24, -48
3211; NONEON-NOSVE-NEXT:    .cfi_offset w25, -56
3212; NONEON-NOSVE-NEXT:    .cfi_offset w26, -64
3213; NONEON-NOSVE-NEXT:    .cfi_offset w27, -72
3214; NONEON-NOSVE-NEXT:    .cfi_offset w28, -80
3215; NONEON-NOSVE-NEXT:    .cfi_offset w30, -88
3216; NONEON-NOSVE-NEXT:    .cfi_offset w29, -96
3217; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3218; NONEON-NOSVE-NEXT:    str wzr, [sp, #572]
3219; NONEON-NOSVE-NEXT:    str wzr, [sp, #564]
3220; NONEON-NOSVE-NEXT:    str wzr, [sp, #588]
3221; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #16]
3222; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
3223; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #41]
3224; NONEON-NOSVE-NEXT:    ldrb w29, [sp, #18]
3225; NONEON-NOSVE-NEXT:    ldrb w27, [sp, #16]
3226; NONEON-NOSVE-NEXT:    ldrb w25, [sp, #30]
3227; NONEON-NOSVE-NEXT:    ldrb w23, [sp, #28]
3228; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #8] // 8-byte Folded Spill
3229; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
3230; NONEON-NOSVE-NEXT:    ldrb w21, [sp, #26]
3231; NONEON-NOSVE-NEXT:    ldrb w19, [sp, #24]
3232; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #19]
3233; NONEON-NOSVE-NEXT:    ldrb w6, [sp, #38]
3234; NONEON-NOSVE-NEXT:    add w8, w8, w8
3235; NONEON-NOSVE-NEXT:    ldrb w28, [sp, #17]
3236; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #22]
3237; NONEON-NOSVE-NEXT:    add w9, w9, w9
3238; NONEON-NOSVE-NEXT:    strb w8, [sp, #60]
3239; NONEON-NOSVE-NEXT:    add w8, w29, w29
3240; NONEON-NOSVE-NEXT:    strb w8, [sp, #58]
3241; NONEON-NOSVE-NEXT:    add w8, w27, w27
3242; NONEON-NOSVE-NEXT:    add w18, w16, w16
3243; NONEON-NOSVE-NEXT:    strb w8, [sp, #56]
3244; NONEON-NOSVE-NEXT:    add w8, w25, w25
3245; NONEON-NOSVE-NEXT:    ldrb w4, [sp, #36]
3246; NONEON-NOSVE-NEXT:    strb w8, [sp, #54]
3247; NONEON-NOSVE-NEXT:    add w8, w23, w23
3248; NONEON-NOSVE-NEXT:    ldrb w26, [sp, #31]
3249; NONEON-NOSVE-NEXT:    strb w8, [sp, #52]
3250; NONEON-NOSVE-NEXT:    add w8, w21, w21
3251; NONEON-NOSVE-NEXT:    ldrb w2, [sp, #34]
3252; NONEON-NOSVE-NEXT:    strb w8, [sp, #50]
3253; NONEON-NOSVE-NEXT:    add w8, w19, w19
3254; NONEON-NOSVE-NEXT:    ldrb w24, [sp, #29]
3255; NONEON-NOSVE-NEXT:    strb w9, [sp, #59]
3256; NONEON-NOSVE-NEXT:    add w9, w28, w28
3257; NONEON-NOSVE-NEXT:    ldrb w17, [sp, #23]
3258; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
3259; NONEON-NOSVE-NEXT:    add w8, w6, w6
3260; NONEON-NOSVE-NEXT:    ldrb w16, [sp, #32]
3261; NONEON-NOSVE-NEXT:    ldrb w22, [sp, #27]
3262; NONEON-NOSVE-NEXT:    strb w9, [sp, #57]
3263; NONEON-NOSVE-NEXT:    add w9, w26, w26
3264; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
3265; NONEON-NOSVE-NEXT:    add w8, w4, w4
3266; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #46]
3267; NONEON-NOSVE-NEXT:    ldrb w20, [sp, #25]
3268; NONEON-NOSVE-NEXT:    ldrb w30, [sp, #21]
3269; NONEON-NOSVE-NEXT:    add w17, w17, w17
3270; NONEON-NOSVE-NEXT:    strb w9, [sp, #55]
3271; NONEON-NOSVE-NEXT:    add w9, w24, w24
3272; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #44]
3273; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
3274; NONEON-NOSVE-NEXT:    add w8, w2, w2
3275; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #42]
3276; NONEON-NOSVE-NEXT:    strb w9, [sp, #53]
3277; NONEON-NOSVE-NEXT:    add w9, w22, w22
3278; NONEON-NOSVE-NEXT:    ldrb w7, [sp, #39]
3279; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
3280; NONEON-NOSVE-NEXT:    add w8, w16, w16
3281; NONEON-NOSVE-NEXT:    ldrb w5, [sp, #37]
3282; NONEON-NOSVE-NEXT:    strb w17, [sp, #63]
3283; NONEON-NOSVE-NEXT:    add w17, w30, w30
3284; NONEON-NOSVE-NEXT:    ldrb w3, [sp, #35]
3285; NONEON-NOSVE-NEXT:    strb w9, [sp, #51]
3286; NONEON-NOSVE-NEXT:    add w9, w20, w20
3287; NONEON-NOSVE-NEXT:    ldrb w0, [sp, #33]
3288; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
3289; NONEON-NOSVE-NEXT:    add w8, w14, w14
3290; NONEON-NOSVE-NEXT:    ldrb w15, [sp, #47]
3291; NONEON-NOSVE-NEXT:    strb w18, [sp, #62]
3292; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #45]
3293; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #43]
3294; NONEON-NOSVE-NEXT:    strb w17, [sp, #61]
3295; NONEON-NOSVE-NEXT:    strb w9, [sp, #49]
3296; NONEON-NOSVE-NEXT:    add w9, w7, w7
3297; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
3298; NONEON-NOSVE-NEXT:    add w8, w12, w12
3299; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
3300; NONEON-NOSVE-NEXT:    add w8, w10, w10
3301; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
3302; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
3303; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12] // 4-byte Folded Reload
3304; NONEON-NOSVE-NEXT:    strb w9, [sp, #79]
3305; NONEON-NOSVE-NEXT:    add w9, w5, w5
3306; NONEON-NOSVE-NEXT:    strb w9, [sp, #77]
3307; NONEON-NOSVE-NEXT:    add w9, w3, w3
3308; NONEON-NOSVE-NEXT:    add w8, w8, w8
3309; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
3310; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
3311; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #91]
3312; NONEON-NOSVE-NEXT:    strb w9, [sp, #75]
3313; NONEON-NOSVE-NEXT:    add w9, w0, w0
3314; NONEON-NOSVE-NEXT:    strh w8, [sp, #134]
3315; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #90]
3316; NONEON-NOSVE-NEXT:    strb w9, [sp, #73]
3317; NONEON-NOSVE-NEXT:    add w9, w15, w15
3318; NONEON-NOSVE-NEXT:    strh w8, [sp, #132]
3319; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #89]
3320; NONEON-NOSVE-NEXT:    strb w9, [sp, #71]
3321; NONEON-NOSVE-NEXT:    add w9, w13, w13
3322; NONEON-NOSVE-NEXT:    strh w8, [sp, #130]
3323; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #88]
3324; NONEON-NOSVE-NEXT:    strb w9, [sp, #69]
3325; NONEON-NOSVE-NEXT:    add w9, w11, w11
3326; NONEON-NOSVE-NEXT:    strh w8, [sp, #128]
3327; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #95]
3328; NONEON-NOSVE-NEXT:    strb w9, [sp, #67]
3329; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8] // 4-byte Folded Reload
3330; NONEON-NOSVE-NEXT:    strh w8, [sp, #142]
3331; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #94]
3332; NONEON-NOSVE-NEXT:    add w9, w9, w9
3333; NONEON-NOSVE-NEXT:    str wzr, [sp, #580]
3334; NONEON-NOSVE-NEXT:    strh w8, [sp, #140]
3335; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #93]
3336; NONEON-NOSVE-NEXT:    strb w9, [sp, #65]
3337; NONEON-NOSVE-NEXT:    strh w8, [sp, #138]
3338; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #92]
3339; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #64]
3340; NONEON-NOSVE-NEXT:    str wzr, [sp, #604]
3341; NONEON-NOSVE-NEXT:    strh w8, [sp, #136]
3342; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #83]
3343; NONEON-NOSVE-NEXT:    str wzr, [sp, #596]
3344; NONEON-NOSVE-NEXT:    strh w8, [sp, #118]
3345; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #82]
3346; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
3347; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #128]
3348; NONEON-NOSVE-NEXT:    strh w8, [sp, #116]
3349; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #81]
3350; NONEON-NOSVE-NEXT:    str wzr, [sp, #620]
3351; NONEON-NOSVE-NEXT:    strh w8, [sp, #114]
3352; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #80]
3353; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #192]
3354; NONEON-NOSVE-NEXT:    strh w8, [sp, #112]
3355; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #87]
3356; NONEON-NOSVE-NEXT:    str wzr, [sp, #612]
3357; NONEON-NOSVE-NEXT:    strh w8, [sp, #126]
3358; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #86]
3359; NONEON-NOSVE-NEXT:    str wzr, [sp, #508]
3360; NONEON-NOSVE-NEXT:    strh w8, [sp, #124]
3361; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #85]
3362; NONEON-NOSVE-NEXT:    str wzr, [sp, #500]
3363; NONEON-NOSVE-NEXT:    strh w8, [sp, #122]
3364; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #84]
3365; NONEON-NOSVE-NEXT:    str wzr, [sp, #524]
3366; NONEON-NOSVE-NEXT:    strh w8, [sp, #120]
3367; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #107]
3368; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #112]
3369; NONEON-NOSVE-NEXT:    str wzr, [sp, #516]
3370; NONEON-NOSVE-NEXT:    strh w8, [sp, #166]
3371; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #106]
3372; NONEON-NOSVE-NEXT:    str wzr, [sp, #540]
3373; NONEON-NOSVE-NEXT:    strh w8, [sp, #164]
3374; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #105]
3375; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #176]
3376; NONEON-NOSVE-NEXT:    strh w8, [sp, #162]
3377; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #104]
3378; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #178]
3379; NONEON-NOSVE-NEXT:    str wzr, [sp, #532]
3380; NONEON-NOSVE-NEXT:    strh w8, [sp, #160]
3381; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #111]
3382; NONEON-NOSVE-NEXT:    str wzr, [sp, #556]
3383; NONEON-NOSVE-NEXT:    strh w8, [sp, #174]
3384; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #110]
3385; NONEON-NOSVE-NEXT:    str wzr, [sp, #548]
3386; NONEON-NOSVE-NEXT:    strh w8, [sp, #172]
3387; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #109]
3388; NONEON-NOSVE-NEXT:    str wzr, [sp, #700]
3389; NONEON-NOSVE-NEXT:    strh w8, [sp, #170]
3390; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #108]
3391; NONEON-NOSVE-NEXT:    str wzr, [sp, #692]
3392; NONEON-NOSVE-NEXT:    strh w8, [sp, #168]
3393; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #99]
3394; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #160]
3395; NONEON-NOSVE-NEXT:    str wzr, [sp, #716]
3396; NONEON-NOSVE-NEXT:    strh w8, [sp, #150]
3397; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #98]
3398; NONEON-NOSVE-NEXT:    str wzr, [sp, #708]
3399; NONEON-NOSVE-NEXT:    strh w8, [sp, #148]
3400; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #97]
3401; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #224]
3402; NONEON-NOSVE-NEXT:    strh w8, [sp, #146]
3403; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #96]
3404; NONEON-NOSVE-NEXT:    str wzr, [sp, #732]
3405; NONEON-NOSVE-NEXT:    strh w8, [sp, #144]
3406; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #103]
3407; NONEON-NOSVE-NEXT:    str wzr, [sp, #724]
3408; NONEON-NOSVE-NEXT:    strh w8, [sp, #158]
3409; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #102]
3410; NONEON-NOSVE-NEXT:    str wzr, [sp, #748]
3411; NONEON-NOSVE-NEXT:    strh w8, [sp, #156]
3412; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #101]
3413; NONEON-NOSVE-NEXT:    str wzr, [sp, #740]
3414; NONEON-NOSVE-NEXT:    strh w8, [sp, #154]
3415; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #100]
3416; NONEON-NOSVE-NEXT:    str wzr, [sp, #636]
3417; NONEON-NOSVE-NEXT:    strh w8, [sp, #152]
3418; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #194]
3419; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #144]
3420; NONEON-NOSVE-NEXT:    str wzr, [sp, #628]
3421; NONEON-NOSVE-NEXT:    str w8, [sp, #276]
3422; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #192]
3423; NONEON-NOSVE-NEXT:    str wzr, [sp, #652]
3424; NONEON-NOSVE-NEXT:    str w8, [sp, #272]
3425; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #198]
3426; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #208]
3427; NONEON-NOSVE-NEXT:    str w8, [sp, #284]
3428; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #196]
3429; NONEON-NOSVE-NEXT:    str wzr, [sp, #644]
3430; NONEON-NOSVE-NEXT:    str w8, [sp, #280]
3431; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #202]
3432; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #272]
3433; NONEON-NOSVE-NEXT:    str wzr, [sp, #668]
3434; NONEON-NOSVE-NEXT:    str w8, [sp, #292]
3435; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #200]
3436; NONEON-NOSVE-NEXT:    str wzr, [sp, #660]
3437; NONEON-NOSVE-NEXT:    str w8, [sp, #288]
3438; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #206]
3439; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #400]
3440; NONEON-NOSVE-NEXT:    str w8, [sp, #300]
3441; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #204]
3442; NONEON-NOSVE-NEXT:    str wzr, [sp, #684]
3443; NONEON-NOSVE-NEXT:    str w8, [sp, #296]
3444; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #176]
3445; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #288]
3446; NONEON-NOSVE-NEXT:    str wzr, [sp, #676]
3447; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #240]
3448; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #182]
3449; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #180]
3450; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #248]
3451; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #186]
3452; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #416]
3453; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #240]
3454; NONEON-NOSVE-NEXT:    str w8, [sp, #260]
3455; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #184]
3456; NONEON-NOSVE-NEXT:    str w8, [sp, #256]
3457; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #190]
3458; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #368]
3459; NONEON-NOSVE-NEXT:    str w8, [sp, #268]
3460; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #188]
3461; NONEON-NOSVE-NEXT:    str w8, [sp, #264]
3462; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #226]
3463; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #256]
3464; NONEON-NOSVE-NEXT:    str w8, [sp, #340]
3465; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #224]
3466; NONEON-NOSVE-NEXT:    str w8, [sp, #336]
3467; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #230]
3468; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #384]
3469; NONEON-NOSVE-NEXT:    str w8, [sp, #348]
3470; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #228]
3471; NONEON-NOSVE-NEXT:    str w8, [sp, #344]
3472; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #234]
3473; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #336]
3474; NONEON-NOSVE-NEXT:    str w8, [sp, #356]
3475; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #232]
3476; NONEON-NOSVE-NEXT:    str w8, [sp, #352]
3477; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #238]
3478; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #464]
3479; NONEON-NOSVE-NEXT:    str w8, [sp, #364]
3480; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #236]
3481; NONEON-NOSVE-NEXT:    str w8, [sp, #360]
3482; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #210]
3483; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #352]
3484; NONEON-NOSVE-NEXT:    str w8, [sp, #308]
3485; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #208]
3486; NONEON-NOSVE-NEXT:    str w8, [sp, #304]
3487; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #214]
3488; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #480]
3489; NONEON-NOSVE-NEXT:    str w8, [sp, #316]
3490; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #212]
3491; NONEON-NOSVE-NEXT:    str w8, [sp, #312]
3492; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #218]
3493; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #304]
3494; NONEON-NOSVE-NEXT:    str w8, [sp, #324]
3495; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #216]
3496; NONEON-NOSVE-NEXT:    str w8, [sp, #320]
3497; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #222]
3498; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #432]
3499; NONEON-NOSVE-NEXT:    str w8, [sp, #332]
3500; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #220]
3501; NONEON-NOSVE-NEXT:    str w8, [sp, #328]
3502; NONEON-NOSVE-NEXT:    ldr w8, [sp, #404]
3503; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #320]
3504; NONEON-NOSVE-NEXT:    str w8, [sp, #568]
3505; NONEON-NOSVE-NEXT:    ldr w8, [sp, #400]
3506; NONEON-NOSVE-NEXT:    str w8, [sp, #560]
3507; NONEON-NOSVE-NEXT:    ldr w8, [sp, #412]
3508; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #448]
3509; NONEON-NOSVE-NEXT:    str w8, [sp, #584]
3510; NONEON-NOSVE-NEXT:    ldr w8, [sp, #408]
3511; NONEON-NOSVE-NEXT:    str w8, [sp, #576]
3512; NONEON-NOSVE-NEXT:    ldr w8, [sp, #420]
3513; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #560]
3514; NONEON-NOSVE-NEXT:    str w8, [sp, #600]
3515; NONEON-NOSVE-NEXT:    ldr w8, [sp, #416]
3516; NONEON-NOSVE-NEXT:    str w8, [sp, #592]
3517; NONEON-NOSVE-NEXT:    ldr w8, [sp, #428]
3518; NONEON-NOSVE-NEXT:    str w8, [sp, #616]
3519; NONEON-NOSVE-NEXT:    ldr w8, [sp, #424]
3520; NONEON-NOSVE-NEXT:    str w8, [sp, #608]
3521; NONEON-NOSVE-NEXT:    ldr w8, [sp, #372]
3522; NONEON-NOSVE-NEXT:    ldp q2, q3, [sp, #592]
3523; NONEON-NOSVE-NEXT:    str w8, [sp, #504]
3524; NONEON-NOSVE-NEXT:    ldr w8, [sp, #368]
3525; NONEON-NOSVE-NEXT:    str w8, [sp, #496]
3526; NONEON-NOSVE-NEXT:    ldr w8, [sp, #380]
3527; NONEON-NOSVE-NEXT:    str w8, [sp, #520]
3528; NONEON-NOSVE-NEXT:    ldr w8, [sp, #376]
3529; NONEON-NOSVE-NEXT:    str w8, [sp, #512]
3530; NONEON-NOSVE-NEXT:    ldr w8, [sp, #388]
3531; NONEON-NOSVE-NEXT:    ldp q4, q5, [sp, #496]
3532; NONEON-NOSVE-NEXT:    str w8, [sp, #536]
3533; NONEON-NOSVE-NEXT:    ldr w8, [sp, #384]
3534; NONEON-NOSVE-NEXT:    str w8, [sp, #528]
3535; NONEON-NOSVE-NEXT:    ldr w8, [sp, #396]
3536; NONEON-NOSVE-NEXT:    str w8, [sp, #552]
3537; NONEON-NOSVE-NEXT:    ldr w8, [sp, #392]
3538; NONEON-NOSVE-NEXT:    str w8, [sp, #544]
3539; NONEON-NOSVE-NEXT:    ldr w8, [sp, #468]
3540; NONEON-NOSVE-NEXT:    ldp q6, q7, [sp, #528]
3541; NONEON-NOSVE-NEXT:    str w8, [sp, #696]
3542; NONEON-NOSVE-NEXT:    ldr w8, [sp, #464]
3543; NONEON-NOSVE-NEXT:    str w8, [sp, #688]
3544; NONEON-NOSVE-NEXT:    ldr w8, [sp, #476]
3545; NONEON-NOSVE-NEXT:    str w8, [sp, #712]
3546; NONEON-NOSVE-NEXT:    ldr w8, [sp, #472]
3547; NONEON-NOSVE-NEXT:    str w8, [sp, #704]
3548; NONEON-NOSVE-NEXT:    ldr w8, [sp, #484]
3549; NONEON-NOSVE-NEXT:    ldp q16, q17, [sp, #688]
3550; NONEON-NOSVE-NEXT:    str w8, [sp, #728]
3551; NONEON-NOSVE-NEXT:    ldr w8, [sp, #480]
3552; NONEON-NOSVE-NEXT:    str w8, [sp, #720]
3553; NONEON-NOSVE-NEXT:    ldr w8, [sp, #492]
3554; NONEON-NOSVE-NEXT:    str w8, [sp, #744]
3555; NONEON-NOSVE-NEXT:    ldr w8, [sp, #488]
3556; NONEON-NOSVE-NEXT:    str w8, [sp, #736]
3557; NONEON-NOSVE-NEXT:    ldr w8, [sp, #436]
3558; NONEON-NOSVE-NEXT:    ldp q19, q20, [sp, #720]
3559; NONEON-NOSVE-NEXT:    str w8, [sp, #632]
3560; NONEON-NOSVE-NEXT:    ldr w8, [sp, #432]
3561; NONEON-NOSVE-NEXT:    str w8, [sp, #624]
3562; NONEON-NOSVE-NEXT:    ldr w8, [sp, #444]
3563; NONEON-NOSVE-NEXT:    str w8, [sp, #648]
3564; NONEON-NOSVE-NEXT:    ldr w8, [sp, #440]
3565; NONEON-NOSVE-NEXT:    str w8, [sp, #640]
3566; NONEON-NOSVE-NEXT:    ldr w8, [sp, #452]
3567; NONEON-NOSVE-NEXT:    ldp q22, q23, [sp, #624]
3568; NONEON-NOSVE-NEXT:    str w8, [sp, #664]
3569; NONEON-NOSVE-NEXT:    ldr w8, [sp, #448]
3570; NONEON-NOSVE-NEXT:    str w8, [sp, #656]
3571; NONEON-NOSVE-NEXT:    ldr w8, [sp, #460]
3572; NONEON-NOSVE-NEXT:    str w8, [sp, #680]
3573; NONEON-NOSVE-NEXT:    ldr w8, [sp, #456]
3574; NONEON-NOSVE-NEXT:    str w8, [sp, #672]
3575; NONEON-NOSVE-NEXT:    ldp q21, q18, [sp, #656]
3576; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
3577; NONEON-NOSVE-NEXT:    stp q2, q3, [x1, #32]
3578; NONEON-NOSVE-NEXT:    stp q4, q5, [x1, #64]
3579; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #96]
3580; NONEON-NOSVE-NEXT:    stp q16, q17, [x1, #128]
3581; NONEON-NOSVE-NEXT:    stp q19, q20, [x1, #160]
3582; NONEON-NOSVE-NEXT:    stp q22, q23, [x1, #192]
3583; NONEON-NOSVE-NEXT:    stp q21, q18, [x1, #224]
3584; NONEON-NOSVE-NEXT:    add sp, sp, #752
3585; NONEON-NOSVE-NEXT:    ldp x20, x19, [sp, #80] // 16-byte Folded Reload
3586; NONEON-NOSVE-NEXT:    ldp x22, x21, [sp, #64] // 16-byte Folded Reload
3587; NONEON-NOSVE-NEXT:    ldp x24, x23, [sp, #48] // 16-byte Folded Reload
3588; NONEON-NOSVE-NEXT:    ldp x26, x25, [sp, #32] // 16-byte Folded Reload
3589; NONEON-NOSVE-NEXT:    ldp x28, x27, [sp, #16] // 16-byte Folded Reload
3590; NONEON-NOSVE-NEXT:    ldp x29, x30, [sp], #96 // 16-byte Folded Reload
3591; NONEON-NOSVE-NEXT:    ret
3592  %a = load <32 x i8>, ptr %in
3593  %b = add <32 x i8> %a, %a
3594  %c = zext <32 x i8> %b to <32 x i64>
3595  store <32 x i64> %c, ptr %out
3596  ret void
3597}
3598
3599;
3600; zext i16 -> i32
3601;
3602
3603define void @zext_v8i16_v8i32(<8 x i16> %a, ptr %out) {
3604; CHECK-LABEL: zext_v8i16_v8i32:
3605; CHECK:       // %bb.0:
3606; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
3607; CHECK-NEXT:    uunpklo z1.s, z0.h
3608; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
3609; CHECK-NEXT:    uunpklo z0.s, z0.h
3610; CHECK-NEXT:    stp q1, q0, [x0]
3611; CHECK-NEXT:    ret
3612;
3613; NONEON-NOSVE-LABEL: zext_v8i16_v8i32:
3614; NONEON-NOSVE:       // %bb.0:
3615; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
3616; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
3617; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
3618; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
3619; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #30]
3620; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
3621; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
3622; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]
3623; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
3624; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
3625; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #22]
3626; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
3627; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
3628; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #18]
3629; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
3630; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
3631; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
3632; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
3633; NONEON-NOSVE-NEXT:    add sp, sp, #64
3634; NONEON-NOSVE-NEXT:    ret
3635  %b = zext <8 x i16> %a to <8 x i32>
3636  store <8 x i32>%b, ptr %out
3637  ret void
3638}
3639
3640define void @zext_v16i16_v16i32(ptr %in, ptr %out) {
3641; CHECK-LABEL: zext_v16i16_v16i32:
3642; CHECK:       // %bb.0:
3643; CHECK-NEXT:    ldp q1, q0, [x0]
3644; CHECK-NEXT:    add z0.h, z0.h, z0.h
3645; CHECK-NEXT:    add z1.h, z1.h, z1.h
3646; CHECK-NEXT:    uunpklo z2.s, z0.h
3647; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
3648; CHECK-NEXT:    uunpklo z3.s, z1.h
3649; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
3650; CHECK-NEXT:    uunpklo z0.s, z0.h
3651; CHECK-NEXT:    uunpklo z1.s, z1.h
3652; CHECK-NEXT:    stp q2, q0, [x1, #32]
3653; CHECK-NEXT:    stp q3, q1, [x1]
3654; CHECK-NEXT:    ret
3655;
3656; NONEON-NOSVE-LABEL: zext_v16i16_v16i32:
3657; NONEON-NOSVE:       // %bb.0:
3658; NONEON-NOSVE-NEXT:    sub sp, sp, #160
3659; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160
3660; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3661; NONEON-NOSVE-NEXT:    stp q1, q0, [sp]
3662; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #4]
3663; NONEON-NOSVE-NEXT:    ldrh w14, [sp, #6]
3664; NONEON-NOSVE-NEXT:    ldrh w3, [sp, #2]
3665; NONEON-NOSVE-NEXT:    ldrh w5, [sp]
3666; NONEON-NOSVE-NEXT:    ldrh w2, [sp, #12]
3667; NONEON-NOSVE-NEXT:    ldrh w4, [sp, #14]
3668; NONEON-NOSVE-NEXT:    add w13, w13, w13
3669; NONEON-NOSVE-NEXT:    add w14, w14, w14
3670; NONEON-NOSVE-NEXT:    ldrh w18, [sp, #8]
3671; NONEON-NOSVE-NEXT:    ldrh w0, [sp, #10]
3672; NONEON-NOSVE-NEXT:    strh w14, [sp, #46]
3673; NONEON-NOSVE-NEXT:    add w14, w3, w3
3674; NONEON-NOSVE-NEXT:    strh w13, [sp, #44]
3675; NONEON-NOSVE-NEXT:    add w13, w5, w5
3676; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
3677; NONEON-NOSVE-NEXT:    strh w14, [sp, #42]
3678; NONEON-NOSVE-NEXT:    add w14, w4, w4
3679; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]
3680; NONEON-NOSVE-NEXT:    strh w13, [sp, #40]
3681; NONEON-NOSVE-NEXT:    add w13, w2, w2
3682; NONEON-NOSVE-NEXT:    ldrh w17, [sp, #22]
3683; NONEON-NOSVE-NEXT:    strh w14, [sp, #38]
3684; NONEON-NOSVE-NEXT:    add w14, w0, w0
3685; NONEON-NOSVE-NEXT:    add w9, w9, w9
3686; NONEON-NOSVE-NEXT:    strh w13, [sp, #36]
3687; NONEON-NOSVE-NEXT:    add w13, w18, w18
3688; NONEON-NOSVE-NEXT:    add w8, w8, w8
3689; NONEON-NOSVE-NEXT:    strh w14, [sp, #34]
3690; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #28]
3691; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #30]
3692; NONEON-NOSVE-NEXT:    strh w13, [sp, #32]
3693; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #16]
3694; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #18]
3695; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
3696; NONEON-NOSVE-NEXT:    ldrh w16, [sp, #20]
3697; NONEON-NOSVE-NEXT:    strh w9, [sp, #50]
3698; NONEON-NOSVE-NEXT:    add w14, w17, w17
3699; NONEON-NOSVE-NEXT:    add w12, w12, w12
3700; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
3701; NONEON-NOSVE-NEXT:    add w13, w16, w16
3702; NONEON-NOSVE-NEXT:    add w11, w11, w11
3703; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
3704; NONEON-NOSVE-NEXT:    add w10, w10, w10
3705; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #78]
3706; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #76]
3707; NONEON-NOSVE-NEXT:    strh w14, [sp, #62]
3708; NONEON-NOSVE-NEXT:    add w14, w15, w15
3709; NONEON-NOSVE-NEXT:    strh w13, [sp, #60]
3710; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]
3711; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #74]
3712; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #72]
3713; NONEON-NOSVE-NEXT:    strh w14, [sp, #58]
3714; NONEON-NOSVE-NEXT:    strh w12, [sp, #56]
3715; NONEON-NOSVE-NEXT:    strh w11, [sp, #54]
3716; NONEON-NOSVE-NEXT:    strh w10, [sp, #52]
3717; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
3718; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112]
3719; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #70]
3720; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #68]
3721; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104]
3722; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #66]
3723; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #64]
3724; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
3725; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #96]
3726; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #94]
3727; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #92]
3728; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #96]
3729; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #152]
3730; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #90]
3731; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #88]
3732; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144]
3733; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #86]
3734; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #84]
3735; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136]
3736; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #82]
3737; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #80]
3738; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]
3739; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #128]
3740; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
3741; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
3742; NONEON-NOSVE-NEXT:    add sp, sp, #160
3743; NONEON-NOSVE-NEXT:    ret
3744  %a = load <16 x i16>, ptr %in
3745  %b = add <16 x i16> %a, %a
3746  %c = zext <16 x i16> %b to <16 x i32>
3747  store <16 x i32> %c, ptr %out
3748  ret void
3749}
3750
3751;
3752; zext i16 -> i64
3753;
3754
3755define void @zext_v4i16_v4i64(<4 x i16> %a, ptr %out) {
3756; CHECK-LABEL: zext_v4i16_v4i64:
3757; CHECK:       // %bb.0:
3758; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
3759; CHECK-NEXT:    uunpklo z0.s, z0.h
3760; CHECK-NEXT:    uunpklo z1.d, z0.s
3761; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
3762; CHECK-NEXT:    uunpklo z0.d, z0.s
3763; CHECK-NEXT:    stp q1, q0, [x0]
3764; CHECK-NEXT:    ret
3765;
3766; NONEON-NOSVE-LABEL: zext_v4i16_v4i64:
3767; NONEON-NOSVE:       // %bb.0:
3768; NONEON-NOSVE-NEXT:    sub sp, sp, #80
3769; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 80
3770; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
3771; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
3772; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
3773; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]
3774; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
3775; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
3776; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16]
3777; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #16]
3778; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
3779; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #40]
3780; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #72]
3781; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #64]
3782; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #32]
3783; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #56]
3784; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #48]
3785; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #48]
3786; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
3787; NONEON-NOSVE-NEXT:    add sp, sp, #80
3788; NONEON-NOSVE-NEXT:    ret
3789  %b = zext <4 x i16> %a to <4 x i64>
3790  store <4 x i64>%b, ptr %out
3791  ret void
3792}
3793
3794define void @zext_v8i16_v8i64(<8 x i16> %a, ptr %out) {
3795; CHECK-LABEL: zext_v8i16_v8i64:
3796; CHECK:       // %bb.0:
3797; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
3798; CHECK-NEXT:    uunpklo z1.s, z0.h
3799; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
3800; CHECK-NEXT:    uunpklo z0.s, z0.h
3801; CHECK-NEXT:    uunpklo z2.d, z1.s
3802; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
3803; CHECK-NEXT:    uunpklo z1.d, z1.s
3804; CHECK-NEXT:    uunpklo z3.d, z0.s
3805; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
3806; CHECK-NEXT:    uunpklo z0.d, z0.s
3807; CHECK-NEXT:    stp q2, q1, [x0]
3808; CHECK-NEXT:    stp q3, q0, [x0, #32]
3809; CHECK-NEXT:    ret
3810;
3811; NONEON-NOSVE-LABEL: zext_v8i16_v8i64:
3812; NONEON-NOSVE:       // %bb.0:
3813; NONEON-NOSVE-NEXT:    str q0, [sp, #-160]!
3814; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160
3815; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
3816; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
3817; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]
3818; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
3819; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
3820; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #30]
3821; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
3822; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
3823; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #18]
3824; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
3825; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
3826; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
3827; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #22]
3828; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
3829; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
3830; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
3831; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #88]
3832; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
3833; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #152]
3834; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #144]
3835; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #80]
3836; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
3837; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #136]
3838; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #128]
3839; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #72]
3840; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #128]
3841; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #120]
3842; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #112]
3843; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #64]
3844; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #104]
3845; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #96]
3846; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
3847; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]
3848; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]
3849; NONEON-NOSVE-NEXT:    add sp, sp, #160
3850; NONEON-NOSVE-NEXT:    ret
3851  %b = zext <8 x i16> %a to <8 x i64>
3852  store <8 x i64>%b, ptr %out
3853  ret void
3854}
3855
3856define void @zext_v16i16_v16i64(ptr %in, ptr %out) {
3857; CHECK-LABEL: zext_v16i16_v16i64:
3858; CHECK:       // %bb.0:
3859; CHECK-NEXT:    ldp q1, q0, [x0]
3860; CHECK-NEXT:    add z0.h, z0.h, z0.h
3861; CHECK-NEXT:    add z1.h, z1.h, z1.h
3862; CHECK-NEXT:    uunpklo z2.s, z0.h
3863; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
3864; CHECK-NEXT:    uunpklo z3.s, z1.h
3865; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
3866; CHECK-NEXT:    uunpklo z0.s, z0.h
3867; CHECK-NEXT:    uunpklo z1.s, z1.h
3868; CHECK-NEXT:    uunpklo z4.d, z2.s
3869; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
3870; CHECK-NEXT:    uunpklo z5.d, z3.s
3871; CHECK-NEXT:    ext z3.b, z3.b, z3.b, #8
3872; CHECK-NEXT:    uunpklo z6.d, z0.s
3873; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
3874; CHECK-NEXT:    uunpklo z2.d, z2.s
3875; CHECK-NEXT:    uunpklo z7.d, z1.s
3876; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
3877; CHECK-NEXT:    uunpklo z3.d, z3.s
3878; CHECK-NEXT:    uunpklo z0.d, z0.s
3879; CHECK-NEXT:    uunpklo z1.d, z1.s
3880; CHECK-NEXT:    stp q4, q2, [x1, #64]
3881; CHECK-NEXT:    stp q5, q3, [x1]
3882; CHECK-NEXT:    stp q6, q0, [x1, #96]
3883; CHECK-NEXT:    stp q7, q1, [x1, #32]
3884; CHECK-NEXT:    ret
3885;
3886; NONEON-NOSVE-LABEL: zext_v16i16_v16i64:
3887; NONEON-NOSVE:       // %bb.0:
3888; NONEON-NOSVE-NEXT:    sub sp, sp, #368
3889; NONEON-NOSVE-NEXT:    str x29, [sp, #352] // 8-byte Folded Spill
3890; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 368
3891; NONEON-NOSVE-NEXT:    .cfi_offset w29, -16
3892; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
3893; NONEON-NOSVE-NEXT:    str wzr, [sp, #268]
3894; NONEON-NOSVE-NEXT:    str wzr, [sp, #260]
3895; NONEON-NOSVE-NEXT:    ldr x29, [sp, #352] // 8-byte Folded Reload
3896; NONEON-NOSVE-NEXT:    str wzr, [sp, #284]
3897; NONEON-NOSVE-NEXT:    stp q1, q0, [sp]
3898; NONEON-NOSVE-NEXT:    ldrh w13, [sp, #4]
3899; NONEON-NOSVE-NEXT:    ldrh w14, [sp, #6]
3900; NONEON-NOSVE-NEXT:    ldrh w3, [sp, #2]
3901; NONEON-NOSVE-NEXT:    ldrh w5, [sp]
3902; NONEON-NOSVE-NEXT:    ldrh w2, [sp, #12]
3903; NONEON-NOSVE-NEXT:    ldrh w4, [sp, #14]
3904; NONEON-NOSVE-NEXT:    add w13, w13, w13
3905; NONEON-NOSVE-NEXT:    add w14, w14, w14
3906; NONEON-NOSVE-NEXT:    ldrh w18, [sp, #8]
3907; NONEON-NOSVE-NEXT:    ldrh w0, [sp, #10]
3908; NONEON-NOSVE-NEXT:    strh w14, [sp, #54]
3909; NONEON-NOSVE-NEXT:    add w14, w3, w3
3910; NONEON-NOSVE-NEXT:    strh w13, [sp, #52]
3911; NONEON-NOSVE-NEXT:    add w13, w5, w5
3912; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
3913; NONEON-NOSVE-NEXT:    strh w14, [sp, #50]
3914; NONEON-NOSVE-NEXT:    add w14, w4, w4
3915; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]
3916; NONEON-NOSVE-NEXT:    strh w13, [sp, #48]
3917; NONEON-NOSVE-NEXT:    add w13, w2, w2
3918; NONEON-NOSVE-NEXT:    ldrh w17, [sp, #22]
3919; NONEON-NOSVE-NEXT:    strh w14, [sp, #46]
3920; NONEON-NOSVE-NEXT:    add w14, w0, w0
3921; NONEON-NOSVE-NEXT:    add w9, w9, w9
3922; NONEON-NOSVE-NEXT:    strh w13, [sp, #44]
3923; NONEON-NOSVE-NEXT:    add w13, w18, w18
3924; NONEON-NOSVE-NEXT:    add w8, w8, w8
3925; NONEON-NOSVE-NEXT:    strh w14, [sp, #42]
3926; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #28]
3927; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #30]
3928; NONEON-NOSVE-NEXT:    strh w13, [sp, #40]
3929; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #16]
3930; NONEON-NOSVE-NEXT:    ldrh w15, [sp, #18]
3931; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #40]
3932; NONEON-NOSVE-NEXT:    add w14, w17, w17
3933; NONEON-NOSVE-NEXT:    ldrh w16, [sp, #20]
3934; NONEON-NOSVE-NEXT:    strh w9, [sp, #58]
3935; NONEON-NOSVE-NEXT:    add w12, w12, w12
3936; NONEON-NOSVE-NEXT:    strh w8, [sp, #56]
3937; NONEON-NOSVE-NEXT:    add w11, w11, w11
3938; NONEON-NOSVE-NEXT:    add w10, w10, w10
3939; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #72]
3940; NONEON-NOSVE-NEXT:    add w13, w16, w16
3941; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #82]
3942; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #80]
3943; NONEON-NOSVE-NEXT:    strh w14, [sp, #70]
3944; NONEON-NOSVE-NEXT:    add w14, w15, w15
3945; NONEON-NOSVE-NEXT:    strh w13, [sp, #68]
3946; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]
3947; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #86]
3948; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #84]
3949; NONEON-NOSVE-NEXT:    strh w14, [sp, #66]
3950; NONEON-NOSVE-NEXT:    strh w12, [sp, #64]
3951; NONEON-NOSVE-NEXT:    strh w11, [sp, #62]
3952; NONEON-NOSVE-NEXT:    strh w10, [sp, #60]
3953; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #56]
3954; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]
3955; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #74]
3956; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #72]
3957; NONEON-NOSVE-NEXT:    str wzr, [sp, #276]
3958; NONEON-NOSVE-NEXT:    str wzr, [sp, #332]
3959; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104]
3960; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #78]
3961; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #76]
3962; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #88]
3963; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #120]
3964; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112]
3965; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #98]
3966; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #96]
3967; NONEON-NOSVE-NEXT:    str wzr, [sp, #324]
3968; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #152]
3969; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #102]
3970; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #100]
3971; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #184]
3972; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #104]
3973; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #160]
3974; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #90]
3975; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #88]
3976; NONEON-NOSVE-NEXT:    str wzr, [sp, #348]
3977; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #136]
3978; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #94]
3979; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #92]
3980; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #168]
3981; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #152]
3982; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #144]
3983; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #184]
3984; NONEON-NOSVE-NEXT:    str d0, [sp, #360]
3985; NONEON-NOSVE-NEXT:    ldp d2, d0, [sp, #136]
3986; NONEON-NOSVE-NEXT:    str wzr, [sp, #340]
3987; NONEON-NOSVE-NEXT:    str w9, [sp, #264]
3988; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #252]
3989; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #192]
3990; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #208]
3991; NONEON-NOSVE-NEXT:    str d2, [sp, #200]
3992; NONEON-NOSVE-NEXT:    str w9, [sp, #280]
3993; NONEON-NOSVE-NEXT:    str w8, [sp, #272]
3994; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #168]
3995; NONEON-NOSVE-NEXT:    str wzr, [sp, #300]
3996; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #256]
3997; NONEON-NOSVE-NEXT:    str wzr, [sp, #292]
3998; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #232]
3999; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #224]
4000; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #176]
4001; NONEON-NOSVE-NEXT:    str wzr, [sp, #316]
4002; NONEON-NOSVE-NEXT:    str wzr, [sp, #308]
4003; NONEON-NOSVE-NEXT:    stp wzr, w9, [sp, #244]
4004; NONEON-NOSVE-NEXT:    str w8, [sp, #240]
4005; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #216]
4006; NONEON-NOSVE-NEXT:    ldp q3, q4, [sp, #224]
4007; NONEON-NOSVE-NEXT:    str w8, [sp, #320]
4008; NONEON-NOSVE-NEXT:    ldr w8, [sp, #364]
4009; NONEON-NOSVE-NEXT:    str w9, [sp, #328]
4010; NONEON-NOSVE-NEXT:    str w8, [sp, #344]
4011; NONEON-NOSVE-NEXT:    ldr w8, [sp, #360]
4012; NONEON-NOSVE-NEXT:    str w8, [sp, #336]
4013; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #200]
4014; NONEON-NOSVE-NEXT:    ldp q6, q7, [sp, #320]
4015; NONEON-NOSVE-NEXT:    str w9, [sp, #296]
4016; NONEON-NOSVE-NEXT:    str w8, [sp, #288]
4017; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #208]
4018; NONEON-NOSVE-NEXT:    str w9, [sp, #312]
4019; NONEON-NOSVE-NEXT:    str w8, [sp, #304]
4020; NONEON-NOSVE-NEXT:    ldp q5, q2, [sp, #288]
4021; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
4022; NONEON-NOSVE-NEXT:    stp q3, q4, [x1, #32]
4023; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #64]
4024; NONEON-NOSVE-NEXT:    stp q5, q2, [x1, #96]
4025; NONEON-NOSVE-NEXT:    add sp, sp, #368
4026; NONEON-NOSVE-NEXT:    ret
4027  %a = load <16 x i16>, ptr %in
4028  %b = add <16 x i16> %a, %a
4029  %c = zext <16 x i16> %b to <16 x i64>
4030  store <16 x i64> %c, ptr %out
4031  ret void
4032}
4033
4034;
4035; zext i32 -> i64
4036;
4037
4038define void @zext_v4i32_v4i64(<4 x i32> %a, ptr %out) {
4039; CHECK-LABEL: zext_v4i32_v4i64:
4040; CHECK:       // %bb.0:
4041; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
4042; CHECK-NEXT:    uunpklo z1.d, z0.s
4043; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
4044; CHECK-NEXT:    uunpklo z0.d, z0.s
4045; CHECK-NEXT:    stp q1, q0, [x0]
4046; CHECK-NEXT:    ret
4047;
4048; NONEON-NOSVE-LABEL: zext_v4i32_v4i64:
4049; NONEON-NOSVE:       // %bb.0:
4050; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
4051; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
4052; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
4053; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
4054; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]
4055; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #56]
4056; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #48]
4057; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]
4058; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #40]
4059; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #32]
4060; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
4061; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
4062; NONEON-NOSVE-NEXT:    add sp, sp, #64
4063; NONEON-NOSVE-NEXT:    ret
4064  %b = zext <4 x i32> %a to <4 x i64>
4065  store <4 x i64>%b, ptr %out
4066  ret void
4067}
4068
4069define void @zext_v8i32_v8i64(ptr %in, ptr %out) {
4070; CHECK-LABEL: zext_v8i32_v8i64:
4071; CHECK:       // %bb.0:
4072; CHECK-NEXT:    ldp q1, q0, [x0]
4073; CHECK-NEXT:    add z0.s, z0.s, z0.s
4074; CHECK-NEXT:    add z1.s, z1.s, z1.s
4075; CHECK-NEXT:    uunpklo z2.d, z0.s
4076; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
4077; CHECK-NEXT:    uunpklo z3.d, z1.s
4078; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
4079; CHECK-NEXT:    uunpklo z0.d, z0.s
4080; CHECK-NEXT:    uunpklo z1.d, z1.s
4081; CHECK-NEXT:    stp q2, q0, [x1, #32]
4082; CHECK-NEXT:    stp q3, q1, [x1]
4083; CHECK-NEXT:    ret
4084;
4085; NONEON-NOSVE-LABEL: zext_v8i32_v8i64:
4086; NONEON-NOSVE:       // %bb.0:
4087; NONEON-NOSVE-NEXT:    sub sp, sp, #160
4088; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160
4089; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
4090; NONEON-NOSVE-NEXT:    stp q1, q0, [sp]
4091; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
4092; NONEON-NOSVE-NEXT:    ldp w12, w13, [sp, #8]
4093; NONEON-NOSVE-NEXT:    ldp w14, w15, [sp, #16]
4094; NONEON-NOSVE-NEXT:    add w9, w9, w9
4095; NONEON-NOSVE-NEXT:    add w8, w8, w8
4096; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
4097; NONEON-NOSVE-NEXT:    add w9, w13, w13
4098; NONEON-NOSVE-NEXT:    add w8, w12, w12
4099; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
4100; NONEON-NOSVE-NEXT:    add w9, w15, w15
4101; NONEON-NOSVE-NEXT:    add w8, w14, w14
4102; NONEON-NOSVE-NEXT:    ldp w10, w11, [sp, #24]
4103; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
4104; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
4105; NONEON-NOSVE-NEXT:    add w9, w11, w11
4106; NONEON-NOSVE-NEXT:    add w8, w10, w10
4107; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
4108; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
4109; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #72]
4110; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
4111; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #120]
4112; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #112]
4113; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #64]
4114; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
4115; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #104]
4116; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #96]
4117; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #88]
4118; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #96]
4119; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #152]
4120; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #144]
4121; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #80]
4122; NONEON-NOSVE-NEXT:    stp w9, wzr, [sp, #136]
4123; NONEON-NOSVE-NEXT:    stp w8, wzr, [sp, #128]
4124; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #128]
4125; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
4126; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
4127; NONEON-NOSVE-NEXT:    add sp, sp, #160
4128; NONEON-NOSVE-NEXT:    ret
4129  %a = load <8 x i32>, ptr %in
4130  %b = add <8 x i32> %a, %a
4131  %c = zext <8 x i32> %b to <8 x i64>
4132  store <8 x i64> %c, ptr %out
4133  ret void
4134}
4135
4136define void @extend_and_mul(i32 %0, <2 x i64> %1, ptr %2) {
4137; SVE-LABEL: extend_and_mul:
4138; SVE:       // %bb.0:
4139; SVE-NEXT:    mov z1.s, w0
4140; SVE-NEXT:    ptrue p0.d, vl2
4141; SVE-NEXT:    // kill: def $q0 killed $q0 def $z0
4142; SVE-NEXT:    uunpklo z1.d, z1.s
4143; SVE-NEXT:    mul z0.d, p0/m, z0.d, z1.d
4144; SVE-NEXT:    str q0, [x1]
4145; SVE-NEXT:    ret
4146;
4147; SVE2-LABEL: extend_and_mul:
4148; SVE2:       // %bb.0:
4149; SVE2-NEXT:    mov z1.s, w0
4150; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0
4151; SVE2-NEXT:    uunpklo z1.d, z1.s
4152; SVE2-NEXT:    mul z0.d, z1.d, z0.d
4153; SVE2-NEXT:    str q0, [x1]
4154; SVE2-NEXT:    ret
4155;
4156; NONEON-NOSVE-LABEL: extend_and_mul:
4157; NONEON-NOSVE:       // %bb.0:
4158; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
4159; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
4160; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
4161; NONEON-NOSVE-NEXT:    mov w9, w0
4162; NONEON-NOSVE-NEXT:    mul x10, x9, x8
4163; NONEON-NOSVE-NEXT:    ldr x8, [sp]
4164; NONEON-NOSVE-NEXT:    mul x8, x9, x8
4165; NONEON-NOSVE-NEXT:    stp x8, x10, [sp, #16]
4166; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
4167; NONEON-NOSVE-NEXT:    str q0, [x1]
4168; NONEON-NOSVE-NEXT:    add sp, sp, #32
4169; NONEON-NOSVE-NEXT:    ret
4170  %broadcast.splatinsert2 = insertelement <2 x i32> poison, i32 %0, i64 0
4171  %broadcast.splat3 = shufflevector <2 x i32> %broadcast.splatinsert2, <2 x i32> poison, <2 x i32> zeroinitializer
4172  %4 = zext <2 x i32> %broadcast.splat3 to <2 x i64>
4173  %5 = mul <2 x i64> %4, %1
4174  store <2 x i64> %5, ptr %2, align 2
4175  ret void
4176}
4177
4178define void @extend_no_mul(i32 %0, <2 x i64> %1, ptr %2) {
4179; CHECK-LABEL: extend_no_mul:
4180; CHECK:       // %bb.0: // %entry
4181; CHECK-NEXT:    mov w8, w0
4182; CHECK-NEXT:    mov z0.d, x8
4183; CHECK-NEXT:    str q0, [x1]
4184; CHECK-NEXT:    ret
4185;
4186; NONEON-NOSVE-LABEL: extend_no_mul:
4187; NONEON-NOSVE:       // %bb.0: // %entry
4188; NONEON-NOSVE-NEXT:    mov w8, w0
4189; NONEON-NOSVE-NEXT:    stp x8, x8, [sp, #-16]!
4190; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
4191; NONEON-NOSVE-NEXT:    ldr q0, [sp]
4192; NONEON-NOSVE-NEXT:    str q0, [x1]
4193; NONEON-NOSVE-NEXT:    add sp, sp, #16
4194; NONEON-NOSVE-NEXT:    ret
4195entry:
4196  %broadcast.splatinsert2 = insertelement <2 x i32> poison, i32 %0, i64 0
4197  %broadcast.splat3 = shufflevector <2 x i32> %broadcast.splatinsert2, <2 x i32> poison, <2 x i32> zeroinitializer
4198  %3 = zext <2 x i32> %broadcast.splat3 to <2 x i64>
4199  store <2 x i64> %3, ptr %2, align 2
4200  ret void
4201}
4202