xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-int-shifts.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
3; RUN: llc -mattr=+sme -force-streaming  < %s | FileCheck %s
4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
5
6target triple = "aarch64-unknown-linux-gnu"
7
8;
9; ASHR
10;
11
12define <4 x i8> @ashr_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
13; CHECK-LABEL: ashr_v4i8:
14; CHECK:       // %bb.0:
15; CHECK-NEXT:    ptrue p0.h, vl4
16; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
17; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
18; CHECK-NEXT:    and z1.h, z1.h, #0xff
19; CHECK-NEXT:    sxtb z0.h, p0/m, z0.h
20; CHECK-NEXT:    asr z0.h, p0/m, z0.h, z1.h
21; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
22; CHECK-NEXT:    ret
23;
24; NONEON-NOSVE-LABEL: ashr_v4i8:
25; NONEON-NOSVE:       // %bb.0:
26; NONEON-NOSVE-NEXT:    sub sp, sp, #32
27; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
28; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
29; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
30; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]
31; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #20]
32; NONEON-NOSVE-NEXT:    ldrsb w11, [sp, #12]
33; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #18]
34; NONEON-NOSVE-NEXT:    ldrsb w13, [sp, #10]
35; NONEON-NOSVE-NEXT:    asr w8, w9, w8
36; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #16]
37; NONEON-NOSVE-NEXT:    ldrsb w14, [sp, #8]
38; NONEON-NOSVE-NEXT:    asr w10, w11, w10
39; NONEON-NOSVE-NEXT:    asr w11, w13, w12
40; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
41; NONEON-NOSVE-NEXT:    asr w8, w14, w9
42; NONEON-NOSVE-NEXT:    strh w10, [sp, #28]
43; NONEON-NOSVE-NEXT:    strh w11, [sp, #26]
44; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
45; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
46; NONEON-NOSVE-NEXT:    add sp, sp, #32
47; NONEON-NOSVE-NEXT:    ret
48  %res = ashr <4 x i8> %op1, %op2
49  ret <4 x i8> %res
50}
51
52define <8 x i8> @ashr_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
53; CHECK-LABEL: ashr_v8i8:
54; CHECK:       // %bb.0:
55; CHECK-NEXT:    ptrue p0.b, vl8
56; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
57; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
58; CHECK-NEXT:    asr z0.b, p0/m, z0.b, z1.b
59; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
60; CHECK-NEXT:    ret
61;
62; NONEON-NOSVE-LABEL: ashr_v8i8:
63; NONEON-NOSVE:       // %bb.0:
64; NONEON-NOSVE-NEXT:    sub sp, sp, #32
65; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
66; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
67; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
68; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]
69; NONEON-NOSVE-NEXT:    asr w8, w9, w8
70; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]
71; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
72; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
73; NONEON-NOSVE-NEXT:    asr w8, w9, w8
74; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]
75; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
76; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
77; NONEON-NOSVE-NEXT:    asr w8, w9, w8
78; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]
79; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
80; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
81; NONEON-NOSVE-NEXT:    asr w8, w9, w8
82; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]
83; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
84; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
85; NONEON-NOSVE-NEXT:    asr w8, w9, w8
86; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]
87; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
88; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
89; NONEON-NOSVE-NEXT:    asr w8, w9, w8
90; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]
91; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
92; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
93; NONEON-NOSVE-NEXT:    asr w8, w9, w8
94; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]
95; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
96; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
97; NONEON-NOSVE-NEXT:    asr w8, w9, w8
98; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
99; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
100; NONEON-NOSVE-NEXT:    add sp, sp, #32
101; NONEON-NOSVE-NEXT:    ret
102  %res = ashr <8 x i8> %op1, %op2
103  ret <8 x i8> %res
104}
105
106define <16 x i8> @ashr_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
107; CHECK-LABEL: ashr_v16i8:
108; CHECK:       // %bb.0:
109; CHECK-NEXT:    ptrue p0.b, vl16
110; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
111; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
112; CHECK-NEXT:    asr z0.b, p0/m, z0.b, z1.b
113; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
114; CHECK-NEXT:    ret
115;
116; NONEON-NOSVE-LABEL: ashr_v16i8:
117; NONEON-NOSVE:       // %bb.0:
118; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
119; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
120; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
121; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]
122; NONEON-NOSVE-NEXT:    asr w8, w9, w8
123; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]
124; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
125; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
126; NONEON-NOSVE-NEXT:    asr w8, w9, w8
127; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]
128; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
129; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
130; NONEON-NOSVE-NEXT:    asr w8, w9, w8
131; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]
132; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
133; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
134; NONEON-NOSVE-NEXT:    asr w8, w9, w8
135; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]
136; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
137; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
138; NONEON-NOSVE-NEXT:    asr w8, w9, w8
139; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]
140; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
141; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
142; NONEON-NOSVE-NEXT:    asr w8, w9, w8
143; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]
144; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
145; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
146; NONEON-NOSVE-NEXT:    asr w8, w9, w8
147; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]
148; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
149; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
150; NONEON-NOSVE-NEXT:    asr w8, w9, w8
151; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #7]
152; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
153; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
154; NONEON-NOSVE-NEXT:    asr w8, w9, w8
155; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #6]
156; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
157; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
158; NONEON-NOSVE-NEXT:    asr w8, w9, w8
159; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #5]
160; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
161; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
162; NONEON-NOSVE-NEXT:    asr w8, w9, w8
163; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #4]
164; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
165; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
166; NONEON-NOSVE-NEXT:    asr w8, w9, w8
167; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #3]
168; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
169; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
170; NONEON-NOSVE-NEXT:    asr w8, w9, w8
171; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #2]
172; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
173; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
174; NONEON-NOSVE-NEXT:    asr w8, w9, w8
175; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #1]
176; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
177; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
178; NONEON-NOSVE-NEXT:    asr w8, w9, w8
179; NONEON-NOSVE-NEXT:    ldrsb w9, [sp]
180; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
181; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
182; NONEON-NOSVE-NEXT:    asr w8, w9, w8
183; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
184; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
185; NONEON-NOSVE-NEXT:    add sp, sp, #48
186; NONEON-NOSVE-NEXT:    ret
187  %res = ashr <16 x i8> %op1, %op2
188  ret <16 x i8> %res
189}
190
191define void @ashr_v32i8(ptr %a, ptr %b) {
192; CHECK-LABEL: ashr_v32i8:
193; CHECK:       // %bb.0:
194; CHECK-NEXT:    ldp q0, q3, [x1]
195; CHECK-NEXT:    ptrue p0.b, vl16
196; CHECK-NEXT:    ldp q1, q2, [x0]
197; CHECK-NEXT:    asrr z0.b, p0/m, z0.b, z1.b
198; CHECK-NEXT:    movprfx z1, z2
199; CHECK-NEXT:    asr z1.b, p0/m, z1.b, z3.b
200; CHECK-NEXT:    stp q0, q1, [x0]
201; CHECK-NEXT:    ret
202;
203; NONEON-NOSVE-LABEL: ashr_v32i8:
204; NONEON-NOSVE:       // %bb.0:
205; NONEON-NOSVE-NEXT:    sub sp, sp, #96
206; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
207; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
208; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
209; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
210; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
211; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #63]
212; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #47]
213; NONEON-NOSVE-NEXT:    asr w8, w9, w8
214; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #46]
215; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]
216; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #62]
217; NONEON-NOSVE-NEXT:    asr w8, w9, w8
218; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #45]
219; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]
220; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #61]
221; NONEON-NOSVE-NEXT:    asr w8, w9, w8
222; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #44]
223; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]
224; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #60]
225; NONEON-NOSVE-NEXT:    asr w8, w9, w8
226; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #43]
227; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]
228; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #59]
229; NONEON-NOSVE-NEXT:    asr w8, w9, w8
230; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #42]
231; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]
232; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #58]
233; NONEON-NOSVE-NEXT:    asr w8, w9, w8
234; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #41]
235; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]
236; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #57]
237; NONEON-NOSVE-NEXT:    asr w8, w9, w8
238; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #40]
239; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]
240; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #56]
241; NONEON-NOSVE-NEXT:    asr w8, w9, w8
242; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #39]
243; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]
244; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #55]
245; NONEON-NOSVE-NEXT:    asr w8, w9, w8
246; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #38]
247; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]
248; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #54]
249; NONEON-NOSVE-NEXT:    asr w8, w9, w8
250; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #37]
251; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]
252; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #53]
253; NONEON-NOSVE-NEXT:    asr w8, w9, w8
254; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #36]
255; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]
256; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #52]
257; NONEON-NOSVE-NEXT:    asr w8, w9, w8
258; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #35]
259; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]
260; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #51]
261; NONEON-NOSVE-NEXT:    asr w8, w9, w8
262; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #34]
263; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]
264; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #50]
265; NONEON-NOSVE-NEXT:    asr w8, w9, w8
266; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #33]
267; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]
268; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #49]
269; NONEON-NOSVE-NEXT:    asr w8, w9, w8
270; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #32]
271; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]
272; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #48]
273; NONEON-NOSVE-NEXT:    asr w8, w9, w8
274; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #15]
275; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]
276; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
277; NONEON-NOSVE-NEXT:    asr w8, w9, w8
278; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #14]
279; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]
280; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
281; NONEON-NOSVE-NEXT:    asr w8, w9, w8
282; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #13]
283; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
284; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
285; NONEON-NOSVE-NEXT:    asr w8, w9, w8
286; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #12]
287; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]
288; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
289; NONEON-NOSVE-NEXT:    asr w8, w9, w8
290; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #11]
291; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
292; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
293; NONEON-NOSVE-NEXT:    asr w8, w9, w8
294; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #10]
295; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]
296; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
297; NONEON-NOSVE-NEXT:    asr w8, w9, w8
298; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #9]
299; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
300; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
301; NONEON-NOSVE-NEXT:    asr w8, w9, w8
302; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #8]
303; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]
304; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
305; NONEON-NOSVE-NEXT:    asr w8, w9, w8
306; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #7]
307; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
308; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
309; NONEON-NOSVE-NEXT:    asr w8, w9, w8
310; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #6]
311; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]
312; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
313; NONEON-NOSVE-NEXT:    asr w8, w9, w8
314; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #5]
315; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
316; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
317; NONEON-NOSVE-NEXT:    asr w8, w9, w8
318; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #4]
319; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]
320; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
321; NONEON-NOSVE-NEXT:    asr w8, w9, w8
322; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #3]
323; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
324; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
325; NONEON-NOSVE-NEXT:    asr w8, w9, w8
326; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #2]
327; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]
328; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
329; NONEON-NOSVE-NEXT:    asr w8, w9, w8
330; NONEON-NOSVE-NEXT:    ldrsb w9, [sp, #1]
331; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
332; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
333; NONEON-NOSVE-NEXT:    asr w8, w9, w8
334; NONEON-NOSVE-NEXT:    ldrsb w9, [sp]
335; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]
336; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
337; NONEON-NOSVE-NEXT:    asr w8, w9, w8
338; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
339; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
340; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
341; NONEON-NOSVE-NEXT:    add sp, sp, #96
342; NONEON-NOSVE-NEXT:    ret
343  %op1 = load <32 x i8>, ptr %a
344  %op2 = load <32 x i8>, ptr %b
345  %res = ashr <32 x i8> %op1, %op2
346  store <32 x i8> %res, ptr %a
347  ret void
348}
349
350define <2 x i16> @ashr_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
351; CHECK-LABEL: ashr_v2i16:
352; CHECK:       // %bb.0:
353; CHECK-NEXT:    ptrue p0.s, vl2
354; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
355; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
356; CHECK-NEXT:    and z1.s, z1.s, #0xffff
357; CHECK-NEXT:    sxth z0.s, p0/m, z0.s
358; CHECK-NEXT:    asr z0.s, p0/m, z0.s, z1.s
359; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
360; CHECK-NEXT:    ret
361;
362; NONEON-NOSVE-LABEL: ashr_v2i16:
363; NONEON-NOSVE:       // %bb.0:
364; NONEON-NOSVE-NEXT:    sub sp, sp, #32
365; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
366; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
367; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
368; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
369; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #16]
370; NONEON-NOSVE-NEXT:    ldrsh w11, [sp, #8]
371; NONEON-NOSVE-NEXT:    asr w8, w9, w8
372; NONEON-NOSVE-NEXT:    asr w9, w11, w10
373; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #24]
374; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
375; NONEON-NOSVE-NEXT:    add sp, sp, #32
376; NONEON-NOSVE-NEXT:    ret
377  %res = ashr <2 x i16> %op1, %op2
378  ret <2 x i16> %res
379}
380
381define <4 x i16> @ashr_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
382; CHECK-LABEL: ashr_v4i16:
383; CHECK:       // %bb.0:
384; CHECK-NEXT:    ptrue p0.h, vl4
385; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
386; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
387; CHECK-NEXT:    asr z0.h, p0/m, z0.h, z1.h
388; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
389; CHECK-NEXT:    ret
390;
391; NONEON-NOSVE-LABEL: ashr_v4i16:
392; NONEON-NOSVE:       // %bb.0:
393; NONEON-NOSVE-NEXT:    sub sp, sp, #32
394; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
395; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
396; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
397; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
398; NONEON-NOSVE-NEXT:    asr w8, w9, w8
399; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
400; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
401; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
402; NONEON-NOSVE-NEXT:    asr w8, w9, w8
403; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
404; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
405; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
406; NONEON-NOSVE-NEXT:    asr w8, w9, w8
407; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]
408; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
409; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
410; NONEON-NOSVE-NEXT:    asr w8, w9, w8
411; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
412; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
413; NONEON-NOSVE-NEXT:    add sp, sp, #32
414; NONEON-NOSVE-NEXT:    ret
415  %res = ashr <4 x i16> %op1, %op2
416  ret <4 x i16> %res
417}
418
419define <8 x i16> @ashr_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
420; CHECK-LABEL: ashr_v8i16:
421; CHECK:       // %bb.0:
422; CHECK-NEXT:    ptrue p0.h, vl8
423; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
424; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
425; CHECK-NEXT:    asr z0.h, p0/m, z0.h, z1.h
426; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
427; CHECK-NEXT:    ret
428;
429; NONEON-NOSVE-LABEL: ashr_v8i16:
430; NONEON-NOSVE:       // %bb.0:
431; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
432; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
433; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
434; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
435; NONEON-NOSVE-NEXT:    asr w8, w9, w8
436; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
437; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
438; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
439; NONEON-NOSVE-NEXT:    asr w8, w9, w8
440; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
441; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
442; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
443; NONEON-NOSVE-NEXT:    asr w8, w9, w8
444; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]
445; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
446; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
447; NONEON-NOSVE-NEXT:    asr w8, w9, w8
448; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #6]
449; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
450; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
451; NONEON-NOSVE-NEXT:    asr w8, w9, w8
452; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #4]
453; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
454; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
455; NONEON-NOSVE-NEXT:    asr w8, w9, w8
456; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #2]
457; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
458; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
459; NONEON-NOSVE-NEXT:    asr w8, w9, w8
460; NONEON-NOSVE-NEXT:    ldrsh w9, [sp]
461; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
462; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
463; NONEON-NOSVE-NEXT:    asr w8, w9, w8
464; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
465; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
466; NONEON-NOSVE-NEXT:    add sp, sp, #48
467; NONEON-NOSVE-NEXT:    ret
468  %res = ashr <8 x i16> %op1, %op2
469  ret <8 x i16> %res
470}
471
472define void @ashr_v16i16(ptr %a, ptr %b) {
473; CHECK-LABEL: ashr_v16i16:
474; CHECK:       // %bb.0:
475; CHECK-NEXT:    ldp q0, q3, [x1]
476; CHECK-NEXT:    ptrue p0.h, vl8
477; CHECK-NEXT:    ldp q1, q2, [x0]
478; CHECK-NEXT:    asrr z0.h, p0/m, z0.h, z1.h
479; CHECK-NEXT:    movprfx z1, z2
480; CHECK-NEXT:    asr z1.h, p0/m, z1.h, z3.h
481; CHECK-NEXT:    stp q0, q1, [x0]
482; CHECK-NEXT:    ret
483;
484; NONEON-NOSVE-LABEL: ashr_v16i16:
485; NONEON-NOSVE:       // %bb.0:
486; NONEON-NOSVE-NEXT:    sub sp, sp, #96
487; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
488; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
489; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
490; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
491; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
492; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #62]
493; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #46]
494; NONEON-NOSVE-NEXT:    asr w8, w9, w8
495; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #44]
496; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
497; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]
498; NONEON-NOSVE-NEXT:    asr w8, w9, w8
499; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #42]
500; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
501; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #58]
502; NONEON-NOSVE-NEXT:    asr w8, w9, w8
503; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #40]
504; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
505; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]
506; NONEON-NOSVE-NEXT:    asr w8, w9, w8
507; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #38]
508; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
509; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #54]
510; NONEON-NOSVE-NEXT:    asr w8, w9, w8
511; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #36]
512; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
513; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]
514; NONEON-NOSVE-NEXT:    asr w8, w9, w8
515; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #34]
516; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
517; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #50]
518; NONEON-NOSVE-NEXT:    asr w8, w9, w8
519; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #32]
520; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
521; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]
522; NONEON-NOSVE-NEXT:    asr w8, w9, w8
523; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
524; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
525; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
526; NONEON-NOSVE-NEXT:    asr w8, w9, w8
527; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #12]
528; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
529; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
530; NONEON-NOSVE-NEXT:    asr w8, w9, w8
531; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
532; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
533; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
534; NONEON-NOSVE-NEXT:    asr w8, w9, w8
535; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]
536; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
537; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
538; NONEON-NOSVE-NEXT:    asr w8, w9, w8
539; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #6]
540; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
541; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
542; NONEON-NOSVE-NEXT:    asr w8, w9, w8
543; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #4]
544; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
545; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
546; NONEON-NOSVE-NEXT:    asr w8, w9, w8
547; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #2]
548; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
549; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
550; NONEON-NOSVE-NEXT:    asr w8, w9, w8
551; NONEON-NOSVE-NEXT:    ldrsh w9, [sp]
552; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
553; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
554; NONEON-NOSVE-NEXT:    asr w8, w9, w8
555; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
556; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
557; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
558; NONEON-NOSVE-NEXT:    add sp, sp, #96
559; NONEON-NOSVE-NEXT:    ret
560  %op1 = load <16 x i16>, ptr %a
561  %op2 = load <16 x i16>, ptr %b
562  %res = ashr <16 x i16> %op1, %op2
563  store <16 x i16> %res, ptr %a
564  ret void
565}
566
567define <2 x i32> @ashr_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
568; CHECK-LABEL: ashr_v2i32:
569; CHECK:       // %bb.0:
570; CHECK-NEXT:    ptrue p0.s, vl2
571; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
572; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
573; CHECK-NEXT:    asr z0.s, p0/m, z0.s, z1.s
574; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
575; CHECK-NEXT:    ret
576;
577; NONEON-NOSVE-LABEL: ashr_v2i32:
578; NONEON-NOSVE:       // %bb.0:
579; NONEON-NOSVE-NEXT:    sub sp, sp, #32
580; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
581; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
582; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
583; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
584; NONEON-NOSVE-NEXT:    asr w11, w10, w8
585; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
586; NONEON-NOSVE-NEXT:    asr w8, w9, w8
587; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #24]
588; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
589; NONEON-NOSVE-NEXT:    add sp, sp, #32
590; NONEON-NOSVE-NEXT:    ret
591  %res = ashr <2 x i32> %op1, %op2
592  ret <2 x i32> %res
593}
594
595define <4 x i32> @ashr_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
596; CHECK-LABEL: ashr_v4i32:
597; CHECK:       // %bb.0:
598; CHECK-NEXT:    ptrue p0.s, vl4
599; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
600; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
601; CHECK-NEXT:    asr z0.s, p0/m, z0.s, z1.s
602; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
603; CHECK-NEXT:    ret
604;
605; NONEON-NOSVE-LABEL: ashr_v4i32:
606; NONEON-NOSVE:       // %bb.0:
607; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
608; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
609; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
610; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
611; NONEON-NOSVE-NEXT:    asr w11, w10, w8
612; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
613; NONEON-NOSVE-NEXT:    asr w8, w9, w8
614; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
615; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #40]
616; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
617; NONEON-NOSVE-NEXT:    asr w11, w10, w8
618; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
619; NONEON-NOSVE-NEXT:    asr w8, w9, w8
620; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #32]
621; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
622; NONEON-NOSVE-NEXT:    add sp, sp, #48
623; NONEON-NOSVE-NEXT:    ret
624  %res = ashr <4 x i32> %op1, %op2
625  ret <4 x i32> %res
626}
627
628define void @ashr_v8i32(ptr %a, ptr %b) {
629; CHECK-LABEL: ashr_v8i32:
630; CHECK:       // %bb.0:
631; CHECK-NEXT:    ldp q0, q3, [x1]
632; CHECK-NEXT:    ptrue p0.s, vl4
633; CHECK-NEXT:    ldp q1, q2, [x0]
634; CHECK-NEXT:    asrr z0.s, p0/m, z0.s, z1.s
635; CHECK-NEXT:    movprfx z1, z2
636; CHECK-NEXT:    asr z1.s, p0/m, z1.s, z3.s
637; CHECK-NEXT:    stp q0, q1, [x0]
638; CHECK-NEXT:    ret
639;
640; NONEON-NOSVE-LABEL: ashr_v8i32:
641; NONEON-NOSVE:       // %bb.0:
642; NONEON-NOSVE-NEXT:    sub sp, sp, #96
643; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
644; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
645; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
646; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
647; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
648; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #40]
649; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]
650; NONEON-NOSVE-NEXT:    asr w11, w10, w8
651; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]
652; NONEON-NOSVE-NEXT:    asr w8, w9, w8
653; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #32]
654; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #88]
655; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]
656; NONEON-NOSVE-NEXT:    asr w11, w10, w8
657; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]
658; NONEON-NOSVE-NEXT:    asr w8, w9, w8
659; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
660; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #80]
661; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
662; NONEON-NOSVE-NEXT:    asr w11, w10, w8
663; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
664; NONEON-NOSVE-NEXT:    asr w8, w9, w8
665; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
666; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #72]
667; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
668; NONEON-NOSVE-NEXT:    asr w11, w10, w8
669; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
670; NONEON-NOSVE-NEXT:    asr w8, w9, w8
671; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #64]
672; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
673; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
674; NONEON-NOSVE-NEXT:    add sp, sp, #96
675; NONEON-NOSVE-NEXT:    ret
676  %op1 = load <8 x i32>, ptr %a
677  %op2 = load <8 x i32>, ptr %b
678  %res = ashr <8 x i32> %op1, %op2
679  store <8 x i32> %res, ptr %a
680  ret void
681}
682
683define <1 x i64> @ashr_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
684; CHECK-LABEL: ashr_v1i64:
685; CHECK:       // %bb.0:
686; CHECK-NEXT:    ptrue p0.d, vl1
687; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
688; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
689; CHECK-NEXT:    asr z0.d, p0/m, z0.d, z1.d
690; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
691; CHECK-NEXT:    ret
692;
693; NONEON-NOSVE-LABEL: ashr_v1i64:
694; NONEON-NOSVE:       // %bb.0:
695; NONEON-NOSVE-NEXT:    sub sp, sp, #16
696; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
697; NONEON-NOSVE-NEXT:    fmov x8, d1
698; NONEON-NOSVE-NEXT:    fmov x9, d0
699; NONEON-NOSVE-NEXT:    asr x8, x9, x8
700; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
701; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
702; NONEON-NOSVE-NEXT:    add sp, sp, #16
703; NONEON-NOSVE-NEXT:    ret
704  %res = ashr <1 x i64> %op1, %op2
705  ret <1 x i64> %res
706}
707
708define <2 x i64> @ashr_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
709; CHECK-LABEL: ashr_v2i64:
710; CHECK:       // %bb.0:
711; CHECK-NEXT:    ptrue p0.d, vl2
712; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
713; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
714; CHECK-NEXT:    asr z0.d, p0/m, z0.d, z1.d
715; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
716; CHECK-NEXT:    ret
717;
718; NONEON-NOSVE-LABEL: ashr_v2i64:
719; NONEON-NOSVE:       // %bb.0:
720; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
721; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
722; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
723; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
724; NONEON-NOSVE-NEXT:    asr x11, x10, x8
725; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
726; NONEON-NOSVE-NEXT:    asr x8, x9, x8
727; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #32]
728; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
729; NONEON-NOSVE-NEXT:    add sp, sp, #48
730; NONEON-NOSVE-NEXT:    ret
731  %res = ashr <2 x i64> %op1, %op2
732  ret <2 x i64> %res
733}
734
735define void @ashr_v4i64(ptr %a, ptr %b) {
736; CHECK-LABEL: ashr_v4i64:
737; CHECK:       // %bb.0:
738; CHECK-NEXT:    ldp q0, q3, [x1]
739; CHECK-NEXT:    ptrue p0.d, vl2
740; CHECK-NEXT:    ldp q1, q2, [x0]
741; CHECK-NEXT:    asrr z0.d, p0/m, z0.d, z1.d
742; CHECK-NEXT:    movprfx z1, z2
743; CHECK-NEXT:    asr z1.d, p0/m, z1.d, z3.d
744; CHECK-NEXT:    stp q0, q1, [x0]
745; CHECK-NEXT:    ret
746;
747; NONEON-NOSVE-LABEL: ashr_v4i64:
748; NONEON-NOSVE:       // %bb.0:
749; NONEON-NOSVE-NEXT:    sub sp, sp, #96
750; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
751; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
752; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
753; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
754; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
755; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp, #32]
756; NONEON-NOSVE-NEXT:    ldr x8, [sp, #56]
757; NONEON-NOSVE-NEXT:    asr x11, x10, x8
758; NONEON-NOSVE-NEXT:    ldr x8, [sp, #48]
759; NONEON-NOSVE-NEXT:    asr x8, x9, x8
760; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
761; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #80]
762; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
763; NONEON-NOSVE-NEXT:    asr x11, x10, x8
764; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
765; NONEON-NOSVE-NEXT:    asr x8, x9, x8
766; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #64]
767; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
768; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
769; NONEON-NOSVE-NEXT:    add sp, sp, #96
770; NONEON-NOSVE-NEXT:    ret
771  %op1 = load <4 x i64>, ptr %a
772  %op2 = load <4 x i64>, ptr %b
773  %res = ashr <4 x i64> %op1, %op2
774  store <4 x i64> %res, ptr %a
775  ret void
776}
777
778;
779; LSHR
780;
781
782define <4 x i8> @lshr_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
783; CHECK-LABEL: lshr_v4i8:
784; CHECK:       // %bb.0:
785; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
786; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
787; CHECK-NEXT:    ptrue p0.h, vl4
788; CHECK-NEXT:    and z1.h, z1.h, #0xff
789; CHECK-NEXT:    and z0.h, z0.h, #0xff
790; CHECK-NEXT:    lsr z0.h, p0/m, z0.h, z1.h
791; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
792; CHECK-NEXT:    ret
793;
794; NONEON-NOSVE-LABEL: lshr_v4i8:
795; NONEON-NOSVE:       // %bb.0:
796; NONEON-NOSVE-NEXT:    sub sp, sp, #32
797; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
798; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
799; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
800; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
801; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #20]
802; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #12]
803; NONEON-NOSVE-NEXT:    ldrb w12, [sp, #18]
804; NONEON-NOSVE-NEXT:    ldrb w13, [sp, #10]
805; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
806; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #16]
807; NONEON-NOSVE-NEXT:    ldrb w14, [sp, #8]
808; NONEON-NOSVE-NEXT:    lsr w10, w11, w10
809; NONEON-NOSVE-NEXT:    lsr w11, w13, w12
810; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
811; NONEON-NOSVE-NEXT:    lsr w8, w14, w9
812; NONEON-NOSVE-NEXT:    strh w10, [sp, #28]
813; NONEON-NOSVE-NEXT:    strh w11, [sp, #26]
814; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
815; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
816; NONEON-NOSVE-NEXT:    add sp, sp, #32
817; NONEON-NOSVE-NEXT:    ret
818  %res = lshr <4 x i8> %op1, %op2
819  ret <4 x i8> %res
820}
821
822define <8 x i8> @lshr_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
823; CHECK-LABEL: lshr_v8i8:
824; CHECK:       // %bb.0:
825; CHECK-NEXT:    ptrue p0.b, vl8
826; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
827; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
828; CHECK-NEXT:    lsr z0.b, p0/m, z0.b, z1.b
829; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
830; CHECK-NEXT:    ret
831;
832; NONEON-NOSVE-LABEL: lshr_v8i8:
833; NONEON-NOSVE:       // %bb.0:
834; NONEON-NOSVE-NEXT:    sub sp, sp, #32
835; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
836; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
837; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
838; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
839; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
840; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
841; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
842; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
843; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
844; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
845; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
846; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
847; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
848; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
849; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
850; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
851; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
852; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
853; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
854; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
855; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
856; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
857; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
858; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
859; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
860; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
861; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
862; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
863; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
864; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
865; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
866; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
867; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
868; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
869; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
870; NONEON-NOSVE-NEXT:    add sp, sp, #32
871; NONEON-NOSVE-NEXT:    ret
872  %res = lshr <8 x i8> %op1, %op2
873  ret <8 x i8> %res
874}
875
876define <16 x i8> @lshr_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
877; CHECK-LABEL: lshr_v16i8:
878; CHECK:       // %bb.0:
879; CHECK-NEXT:    ptrue p0.b, vl16
880; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
881; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
882; CHECK-NEXT:    lsr z0.b, p0/m, z0.b, z1.b
883; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
884; CHECK-NEXT:    ret
885;
886; NONEON-NOSVE-LABEL: lshr_v16i8:
887; NONEON-NOSVE:       // %bb.0:
888; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
889; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
890; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
891; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
892; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
893; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
894; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
895; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
896; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
897; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
898; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
899; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
900; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
901; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
902; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
903; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
904; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
905; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
906; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
907; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
908; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
909; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
910; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
911; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
912; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
913; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
914; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
915; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
916; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
917; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
918; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
919; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
920; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
921; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
922; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
923; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
924; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
925; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
926; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
927; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
928; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
929; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
930; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
931; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
932; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
933; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
934; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
935; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
936; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
937; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
938; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
939; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
940; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
941; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
942; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
943; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
944; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
945; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
946; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
947; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
948; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
949; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
950; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
951; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
952; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
953; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
954; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
955; NONEON-NOSVE-NEXT:    add sp, sp, #48
956; NONEON-NOSVE-NEXT:    ret
957  %res = lshr <16 x i8> %op1, %op2
958  ret <16 x i8> %res
959}
960
961define void @lshr_v32i8(ptr %a, ptr %b) {
962; CHECK-LABEL: lshr_v32i8:
963; CHECK:       // %bb.0:
964; CHECK-NEXT:    ldp q0, q3, [x1]
965; CHECK-NEXT:    ptrue p0.b, vl16
966; CHECK-NEXT:    ldp q1, q2, [x0]
967; CHECK-NEXT:    lsrr z0.b, p0/m, z0.b, z1.b
968; CHECK-NEXT:    movprfx z1, z2
969; CHECK-NEXT:    lsr z1.b, p0/m, z1.b, z3.b
970; CHECK-NEXT:    stp q0, q1, [x0]
971; CHECK-NEXT:    ret
972;
973; NONEON-NOSVE-LABEL: lshr_v32i8:
974; NONEON-NOSVE:       // %bb.0:
975; NONEON-NOSVE-NEXT:    sub sp, sp, #96
976; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
977; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
978; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
979; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
980; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
981; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #63]
982; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #47]
983; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
984; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]
985; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]
986; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #62]
987; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
988; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #45]
989; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]
990; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #61]
991; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
992; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]
993; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]
994; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #60]
995; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
996; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #43]
997; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]
998; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #59]
999; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1000; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #42]
1001; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]
1002; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #58]
1003; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1004; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #41]
1005; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]
1006; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #57]
1007; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1008; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
1009; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]
1010; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #56]
1011; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1012; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #39]
1013; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]
1014; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #55]
1015; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1016; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #38]
1017; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]
1018; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #54]
1019; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1020; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #37]
1021; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]
1022; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #53]
1023; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1024; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #36]
1025; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]
1026; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #52]
1027; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1028; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #35]
1029; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]
1030; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #51]
1031; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1032; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #34]
1033; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]
1034; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #50]
1035; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1036; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #33]
1037; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]
1038; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #49]
1039; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1040; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #32]
1041; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]
1042; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #48]
1043; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1044; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
1045; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]
1046; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
1047; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1048; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
1049; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]
1050; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
1051; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1052; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
1053; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
1054; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
1055; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1056; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
1057; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]
1058; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
1059; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1060; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
1061; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
1062; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
1063; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1064; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1065; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]
1066; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
1067; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1068; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1069; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
1070; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
1071; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1072; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1073; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]
1074; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
1075; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1076; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
1077; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
1078; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1079; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1080; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
1081; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]
1082; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1083; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1084; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
1085; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
1086; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1087; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1088; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
1089; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]
1090; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1091; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1092; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
1093; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
1094; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1095; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1096; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
1097; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]
1098; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1099; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1100; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
1101; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
1102; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1103; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1104; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
1105; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]
1106; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1107; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1108; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
1109; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1110; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1111; NONEON-NOSVE-NEXT:    add sp, sp, #96
1112; NONEON-NOSVE-NEXT:    ret
1113  %op1 = load <32 x i8>, ptr %a
1114  %op2 = load <32 x i8>, ptr %b
1115  %res = lshr <32 x i8> %op1, %op2
1116  store <32 x i8> %res, ptr %a
1117  ret void
1118}
1119
1120define <2 x i16> @lshr_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
1121; CHECK-LABEL: lshr_v2i16:
1122; CHECK:       // %bb.0:
1123; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1124; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1125; CHECK-NEXT:    ptrue p0.s, vl2
1126; CHECK-NEXT:    and z1.s, z1.s, #0xffff
1127; CHECK-NEXT:    and z0.s, z0.s, #0xffff
1128; CHECK-NEXT:    lsr z0.s, p0/m, z0.s, z1.s
1129; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1130; CHECK-NEXT:    ret
1131;
1132; NONEON-NOSVE-LABEL: lshr_v2i16:
1133; NONEON-NOSVE:       // %bb.0:
1134; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1135; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1136; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1137; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1138; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1139; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #16]
1140; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #8]
1141; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1142; NONEON-NOSVE-NEXT:    lsr w9, w11, w10
1143; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #24]
1144; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1145; NONEON-NOSVE-NEXT:    add sp, sp, #32
1146; NONEON-NOSVE-NEXT:    ret
1147  %res = lshr <2 x i16> %op1, %op2
1148  ret <2 x i16> %res
1149}
1150
1151define <4 x i16> @lshr_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
1152; CHECK-LABEL: lshr_v4i16:
1153; CHECK:       // %bb.0:
1154; CHECK-NEXT:    ptrue p0.h, vl4
1155; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1156; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1157; CHECK-NEXT:    lsr z0.h, p0/m, z0.h, z1.h
1158; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1159; CHECK-NEXT:    ret
1160;
1161; NONEON-NOSVE-LABEL: lshr_v4i16:
1162; NONEON-NOSVE:       // %bb.0:
1163; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1164; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1165; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1166; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1167; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1168; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1169; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1170; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
1171; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1172; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1173; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1174; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
1175; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1176; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1177; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1178; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
1179; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1180; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1181; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
1182; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1183; NONEON-NOSVE-NEXT:    add sp, sp, #32
1184; NONEON-NOSVE-NEXT:    ret
1185  %res = lshr <4 x i16> %op1, %op2
1186  ret <4 x i16> %res
1187}
1188
1189define <8 x i16> @lshr_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
1190; CHECK-LABEL: lshr_v8i16:
1191; CHECK:       // %bb.0:
1192; CHECK-NEXT:    ptrue p0.h, vl8
1193; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1194; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1195; CHECK-NEXT:    lsr z0.h, p0/m, z0.h, z1.h
1196; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1197; CHECK-NEXT:    ret
1198;
1199; NONEON-NOSVE-LABEL: lshr_v8i16:
1200; NONEON-NOSVE:       // %bb.0:
1201; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1202; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1203; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1204; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1205; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1206; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1207; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
1208; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1209; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1210; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1211; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
1212; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1213; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1214; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1215; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
1216; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1217; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1218; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
1219; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
1220; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1221; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1222; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1223; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
1224; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1225; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1226; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
1227; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
1228; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1229; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1230; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
1231; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
1232; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1233; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1234; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
1235; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1236; NONEON-NOSVE-NEXT:    add sp, sp, #48
1237; NONEON-NOSVE-NEXT:    ret
1238  %res = lshr <8 x i16> %op1, %op2
1239  ret <8 x i16> %res
1240}
1241
1242define void @lshr_v16i16(ptr %a, ptr %b) {
1243; CHECK-LABEL: lshr_v16i16:
1244; CHECK:       // %bb.0:
1245; CHECK-NEXT:    ldp q0, q3, [x1]
1246; CHECK-NEXT:    ptrue p0.h, vl8
1247; CHECK-NEXT:    ldp q1, q2, [x0]
1248; CHECK-NEXT:    lsrr z0.h, p0/m, z0.h, z1.h
1249; CHECK-NEXT:    movprfx z1, z2
1250; CHECK-NEXT:    lsr z1.h, p0/m, z1.h, z3.h
1251; CHECK-NEXT:    stp q0, q1, [x0]
1252; CHECK-NEXT:    ret
1253;
1254; NONEON-NOSVE-LABEL: lshr_v16i16:
1255; NONEON-NOSVE:       // %bb.0:
1256; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1257; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1258; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1259; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1260; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1261; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1262; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #62]
1263; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #46]
1264; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1265; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #44]
1266; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
1267; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]
1268; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1269; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #42]
1270; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
1271; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #58]
1272; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1273; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #40]
1274; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
1275; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]
1276; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1277; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #38]
1278; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
1279; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #54]
1280; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1281; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #36]
1282; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
1283; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]
1284; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1285; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #34]
1286; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
1287; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #50]
1288; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1289; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #32]
1290; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
1291; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]
1292; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1293; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1294; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
1295; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1296; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1297; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1298; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
1299; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1300; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1301; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1302; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
1303; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1304; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1305; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1306; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
1307; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1308; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1309; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
1310; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
1311; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1312; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1313; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1314; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
1315; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1316; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1317; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
1318; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
1319; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1320; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1321; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
1322; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
1323; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1324; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1325; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
1326; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1327; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1328; NONEON-NOSVE-NEXT:    add sp, sp, #96
1329; NONEON-NOSVE-NEXT:    ret
1330  %op1 = load <16 x i16>, ptr %a
1331  %op2 = load <16 x i16>, ptr %b
1332  %res = lshr <16 x i16> %op1, %op2
1333  store <16 x i16> %res, ptr %a
1334  ret void
1335}
1336
1337define <2 x i32> @lshr_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
1338; CHECK-LABEL: lshr_v2i32:
1339; CHECK:       // %bb.0:
1340; CHECK-NEXT:    ptrue p0.s, vl2
1341; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1342; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1343; CHECK-NEXT:    lsr z0.s, p0/m, z0.s, z1.s
1344; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1345; CHECK-NEXT:    ret
1346;
1347; NONEON-NOSVE-LABEL: lshr_v2i32:
1348; NONEON-NOSVE:       // %bb.0:
1349; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1350; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1351; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1352; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1353; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1354; NONEON-NOSVE-NEXT:    lsr w11, w10, w8
1355; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1356; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1357; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #24]
1358; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1359; NONEON-NOSVE-NEXT:    add sp, sp, #32
1360; NONEON-NOSVE-NEXT:    ret
1361  %res = lshr <2 x i32> %op1, %op2
1362  ret <2 x i32> %res
1363}
1364
1365define <4 x i32> @lshr_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
1366; CHECK-LABEL: lshr_v4i32:
1367; CHECK:       // %bb.0:
1368; CHECK-NEXT:    ptrue p0.s, vl4
1369; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1370; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1371; CHECK-NEXT:    lsr z0.s, p0/m, z0.s, z1.s
1372; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1373; CHECK-NEXT:    ret
1374;
1375; NONEON-NOSVE-LABEL: lshr_v4i32:
1376; NONEON-NOSVE:       // %bb.0:
1377; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1378; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1379; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1380; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1381; NONEON-NOSVE-NEXT:    lsr w11, w10, w8
1382; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1383; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1384; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
1385; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #40]
1386; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1387; NONEON-NOSVE-NEXT:    lsr w11, w10, w8
1388; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1389; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1390; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #32]
1391; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1392; NONEON-NOSVE-NEXT:    add sp, sp, #48
1393; NONEON-NOSVE-NEXT:    ret
1394  %res = lshr <4 x i32> %op1, %op2
1395  ret <4 x i32> %res
1396}
1397
1398define void @lshr_v8i32(ptr %a, ptr %b) {
1399; CHECK-LABEL: lshr_v8i32:
1400; CHECK:       // %bb.0:
1401; CHECK-NEXT:    ldp q0, q3, [x1]
1402; CHECK-NEXT:    ptrue p0.s, vl4
1403; CHECK-NEXT:    ldp q1, q2, [x0]
1404; CHECK-NEXT:    lsrr z0.s, p0/m, z0.s, z1.s
1405; CHECK-NEXT:    movprfx z1, z2
1406; CHECK-NEXT:    lsr z1.s, p0/m, z1.s, z3.s
1407; CHECK-NEXT:    stp q0, q1, [x0]
1408; CHECK-NEXT:    ret
1409;
1410; NONEON-NOSVE-LABEL: lshr_v8i32:
1411; NONEON-NOSVE:       // %bb.0:
1412; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1413; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1414; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1415; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1416; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1417; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1418; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #40]
1419; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]
1420; NONEON-NOSVE-NEXT:    lsr w11, w10, w8
1421; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]
1422; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1423; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #32]
1424; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #88]
1425; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]
1426; NONEON-NOSVE-NEXT:    lsr w11, w10, w8
1427; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]
1428; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1429; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
1430; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #80]
1431; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
1432; NONEON-NOSVE-NEXT:    lsr w11, w10, w8
1433; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1434; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1435; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
1436; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #72]
1437; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
1438; NONEON-NOSVE-NEXT:    lsr w11, w10, w8
1439; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
1440; NONEON-NOSVE-NEXT:    lsr w8, w9, w8
1441; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #64]
1442; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1443; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1444; NONEON-NOSVE-NEXT:    add sp, sp, #96
1445; NONEON-NOSVE-NEXT:    ret
1446  %op1 = load <8 x i32>, ptr %a
1447  %op2 = load <8 x i32>, ptr %b
1448  %res = lshr <8 x i32> %op1, %op2
1449  store <8 x i32> %res, ptr %a
1450  ret void
1451}
1452
1453define <1 x i64> @lshr_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
1454; CHECK-LABEL: lshr_v1i64:
1455; CHECK:       // %bb.0:
1456; CHECK-NEXT:    ptrue p0.d, vl1
1457; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1458; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1459; CHECK-NEXT:    lsr z0.d, p0/m, z0.d, z1.d
1460; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1461; CHECK-NEXT:    ret
1462;
1463; NONEON-NOSVE-LABEL: lshr_v1i64:
1464; NONEON-NOSVE:       // %bb.0:
1465; NONEON-NOSVE-NEXT:    sub sp, sp, #16
1466; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
1467; NONEON-NOSVE-NEXT:    fmov x8, d1
1468; NONEON-NOSVE-NEXT:    fmov x9, d0
1469; NONEON-NOSVE-NEXT:    lsr x8, x9, x8
1470; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
1471; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
1472; NONEON-NOSVE-NEXT:    add sp, sp, #16
1473; NONEON-NOSVE-NEXT:    ret
1474  %res = lshr <1 x i64> %op1, %op2
1475  ret <1 x i64> %res
1476}
1477
1478define <2 x i64> @lshr_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
1479; CHECK-LABEL: lshr_v2i64:
1480; CHECK:       // %bb.0:
1481; CHECK-NEXT:    ptrue p0.d, vl2
1482; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1483; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1484; CHECK-NEXT:    lsr z0.d, p0/m, z0.d, z1.d
1485; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1486; CHECK-NEXT:    ret
1487;
1488; NONEON-NOSVE-LABEL: lshr_v2i64:
1489; NONEON-NOSVE:       // %bb.0:
1490; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1491; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1492; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
1493; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1494; NONEON-NOSVE-NEXT:    lsr x11, x10, x8
1495; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1496; NONEON-NOSVE-NEXT:    lsr x8, x9, x8
1497; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #32]
1498; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1499; NONEON-NOSVE-NEXT:    add sp, sp, #48
1500; NONEON-NOSVE-NEXT:    ret
1501  %res = lshr <2 x i64> %op1, %op2
1502  ret <2 x i64> %res
1503}
1504
1505define void @lshr_v4i64(ptr %a, ptr %b) {
1506; CHECK-LABEL: lshr_v4i64:
1507; CHECK:       // %bb.0:
1508; CHECK-NEXT:    ldp q0, q3, [x1]
1509; CHECK-NEXT:    ptrue p0.d, vl2
1510; CHECK-NEXT:    ldp q1, q2, [x0]
1511; CHECK-NEXT:    lsrr z0.d, p0/m, z0.d, z1.d
1512; CHECK-NEXT:    movprfx z1, z2
1513; CHECK-NEXT:    lsr z1.d, p0/m, z1.d, z3.d
1514; CHECK-NEXT:    stp q0, q1, [x0]
1515; CHECK-NEXT:    ret
1516;
1517; NONEON-NOSVE-LABEL: lshr_v4i64:
1518; NONEON-NOSVE:       // %bb.0:
1519; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1520; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1521; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1522; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1523; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1524; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1525; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp, #32]
1526; NONEON-NOSVE-NEXT:    ldr x8, [sp, #56]
1527; NONEON-NOSVE-NEXT:    lsr x11, x10, x8
1528; NONEON-NOSVE-NEXT:    ldr x8, [sp, #48]
1529; NONEON-NOSVE-NEXT:    lsr x8, x9, x8
1530; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
1531; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #80]
1532; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
1533; NONEON-NOSVE-NEXT:    lsr x11, x10, x8
1534; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
1535; NONEON-NOSVE-NEXT:    lsr x8, x9, x8
1536; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #64]
1537; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1538; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1539; NONEON-NOSVE-NEXT:    add sp, sp, #96
1540; NONEON-NOSVE-NEXT:    ret
1541  %op1 = load <4 x i64>, ptr %a
1542  %op2 = load <4 x i64>, ptr %b
1543  %res = lshr <4 x i64> %op1, %op2
1544  store <4 x i64> %res, ptr %a
1545  ret void
1546}
1547
1548;
1549; SHL
1550;
1551
1552define <2 x i8> @shl_v2i8(<2 x i8> %op1, <2 x i8> %op2) {
1553; CHECK-LABEL: shl_v2i8:
1554; CHECK:       // %bb.0:
1555; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1556; CHECK-NEXT:    ptrue p0.s, vl2
1557; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1558; CHECK-NEXT:    and z1.s, z1.s, #0xff
1559; CHECK-NEXT:    lsl z0.s, p0/m, z0.s, z1.s
1560; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1561; CHECK-NEXT:    ret
1562;
1563; NONEON-NOSVE-LABEL: shl_v2i8:
1564; NONEON-NOSVE:       // %bb.0:
1565; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1566; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1567; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1568; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #20]
1569; NONEON-NOSVE-NEXT:    ldr w10, [sp, #12]
1570; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1571; NONEON-NOSVE-NEXT:    lsl w11, w10, w9
1572; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8]
1573; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1574; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #24]
1575; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1576; NONEON-NOSVE-NEXT:    add sp, sp, #32
1577; NONEON-NOSVE-NEXT:    ret
1578  %res = shl <2 x i8> %op1, %op2
1579  ret <2 x i8> %res
1580}
1581
1582define <4 x i8> @shl_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
1583; CHECK-LABEL: shl_v4i8:
1584; CHECK:       // %bb.0:
1585; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1586; CHECK-NEXT:    ptrue p0.h, vl4
1587; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1588; CHECK-NEXT:    and z1.h, z1.h, #0xff
1589; CHECK-NEXT:    lsl z0.h, p0/m, z0.h, z1.h
1590; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1591; CHECK-NEXT:    ret
1592;
1593; NONEON-NOSVE-LABEL: shl_v4i8:
1594; NONEON-NOSVE:       // %bb.0:
1595; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1596; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1597; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1598; NONEON-NOSVE-NEXT:    ldrb w11, [sp, #22]
1599; NONEON-NOSVE-NEXT:    ldrh w12, [sp, #14]
1600; NONEON-NOSVE-NEXT:    ldrb w10, [sp, #20]
1601; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #18]
1602; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1603; NONEON-NOSVE-NEXT:    lsl w11, w12, w11
1604; NONEON-NOSVE-NEXT:    strh w11, [sp, #30]
1605; NONEON-NOSVE-NEXT:    ldrh w11, [sp, #12]
1606; NONEON-NOSVE-NEXT:    lsl w10, w11, w10
1607; NONEON-NOSVE-NEXT:    strh w10, [sp, #28]
1608; NONEON-NOSVE-NEXT:    ldrh w10, [sp, #10]
1609; NONEON-NOSVE-NEXT:    lsl w9, w10, w9
1610; NONEON-NOSVE-NEXT:    strh w9, [sp, #26]
1611; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1612; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1613; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
1614; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1615; NONEON-NOSVE-NEXT:    add sp, sp, #32
1616; NONEON-NOSVE-NEXT:    ret
1617  %res = shl <4 x i8> %op1, %op2
1618  ret <4 x i8> %res
1619}
1620
1621define <8 x i8> @shl_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
1622; CHECK-LABEL: shl_v8i8:
1623; CHECK:       // %bb.0:
1624; CHECK-NEXT:    ptrue p0.b, vl8
1625; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1626; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1627; CHECK-NEXT:    lsl z0.b, p0/m, z0.b, z1.b
1628; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1629; CHECK-NEXT:    ret
1630;
1631; NONEON-NOSVE-LABEL: shl_v8i8:
1632; NONEON-NOSVE:       // %bb.0:
1633; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1634; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1635; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1636; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1637; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
1638; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1639; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
1640; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
1641; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1642; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1643; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
1644; NONEON-NOSVE-NEXT:    strb w8, [sp, #30]
1645; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1646; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1647; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
1648; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
1649; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1650; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1651; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
1652; NONEON-NOSVE-NEXT:    strb w8, [sp, #28]
1653; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1654; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1655; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1656; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
1657; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1658; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1659; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1660; NONEON-NOSVE-NEXT:    strb w8, [sp, #26]
1661; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1662; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1663; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1664; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
1665; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1666; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1667; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
1668; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1669; NONEON-NOSVE-NEXT:    add sp, sp, #32
1670; NONEON-NOSVE-NEXT:    ret
1671  %res = shl <8 x i8> %op1, %op2
1672  ret <8 x i8> %res
1673}
1674
1675define <16 x i8> @shl_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
1676; CHECK-LABEL: shl_v16i8:
1677; CHECK:       // %bb.0:
1678; CHECK-NEXT:    ptrue p0.b, vl16
1679; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1680; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1681; CHECK-NEXT:    lsl z0.b, p0/m, z0.b, z1.b
1682; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1683; CHECK-NEXT:    ret
1684;
1685; NONEON-NOSVE-LABEL: shl_v16i8:
1686; NONEON-NOSVE:       // %bb.0:
1687; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1688; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1689; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
1690; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
1691; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1692; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
1693; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
1694; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
1695; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1696; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
1697; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
1698; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
1699; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1700; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
1701; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
1702; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
1703; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1704; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
1705; NONEON-NOSVE-NEXT:    strb w8, [sp, #44]
1706; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
1707; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1708; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1709; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
1710; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
1711; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1712; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1713; NONEON-NOSVE-NEXT:    strb w8, [sp, #42]
1714; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
1715; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1716; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1717; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
1718; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
1719; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1720; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
1721; NONEON-NOSVE-NEXT:    strb w8, [sp, #40]
1722; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1723; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1724; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
1725; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
1726; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1727; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1728; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
1729; NONEON-NOSVE-NEXT:    strb w8, [sp, #38]
1730; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1731; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1732; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
1733; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
1734; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1735; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1736; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
1737; NONEON-NOSVE-NEXT:    strb w8, [sp, #36]
1738; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1739; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1740; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
1741; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
1742; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1743; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1744; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
1745; NONEON-NOSVE-NEXT:    strb w8, [sp, #34]
1746; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1747; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1748; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
1749; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
1750; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1751; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1752; NONEON-NOSVE-NEXT:    strb w8, [sp, #32]
1753; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1754; NONEON-NOSVE-NEXT:    add sp, sp, #48
1755; NONEON-NOSVE-NEXT:    ret
1756  %res = shl <16 x i8> %op1, %op2
1757  ret <16 x i8> %res
1758}
1759
1760define void @shl_v32i8(ptr %a, ptr %b) {
1761; CHECK-LABEL: shl_v32i8:
1762; CHECK:       // %bb.0:
1763; CHECK-NEXT:    ldp q0, q3, [x1]
1764; CHECK-NEXT:    ptrue p0.b, vl16
1765; CHECK-NEXT:    ldp q1, q2, [x0]
1766; CHECK-NEXT:    lslr z0.b, p0/m, z0.b, z1.b
1767; CHECK-NEXT:    movprfx z1, z2
1768; CHECK-NEXT:    lsl z1.b, p0/m, z1.b, z3.b
1769; CHECK-NEXT:    stp q0, q1, [x0]
1770; CHECK-NEXT:    ret
1771;
1772; NONEON-NOSVE-LABEL: shl_v32i8:
1773; NONEON-NOSVE:       // %bb.0:
1774; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1775; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1776; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
1777; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
1778; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
1779; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
1780; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #63]
1781; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #47]
1782; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1783; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #46]
1784; NONEON-NOSVE-NEXT:    strb w8, [sp, #95]
1785; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #62]
1786; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1787; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #45]
1788; NONEON-NOSVE-NEXT:    strb w8, [sp, #94]
1789; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #61]
1790; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1791; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #44]
1792; NONEON-NOSVE-NEXT:    strb w8, [sp, #93]
1793; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #60]
1794; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1795; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #43]
1796; NONEON-NOSVE-NEXT:    strb w8, [sp, #92]
1797; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #59]
1798; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1799; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #42]
1800; NONEON-NOSVE-NEXT:    strb w8, [sp, #91]
1801; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #58]
1802; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1803; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #41]
1804; NONEON-NOSVE-NEXT:    strb w8, [sp, #90]
1805; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #57]
1806; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1807; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #40]
1808; NONEON-NOSVE-NEXT:    strb w8, [sp, #89]
1809; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #56]
1810; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1811; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #39]
1812; NONEON-NOSVE-NEXT:    strb w8, [sp, #88]
1813; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #55]
1814; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1815; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #38]
1816; NONEON-NOSVE-NEXT:    strb w8, [sp, #87]
1817; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #54]
1818; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1819; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #37]
1820; NONEON-NOSVE-NEXT:    strb w8, [sp, #86]
1821; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #53]
1822; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1823; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #36]
1824; NONEON-NOSVE-NEXT:    strb w8, [sp, #85]
1825; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #52]
1826; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1827; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #35]
1828; NONEON-NOSVE-NEXT:    strb w8, [sp, #84]
1829; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #51]
1830; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1831; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #34]
1832; NONEON-NOSVE-NEXT:    strb w8, [sp, #83]
1833; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #50]
1834; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1835; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #33]
1836; NONEON-NOSVE-NEXT:    strb w8, [sp, #82]
1837; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #49]
1838; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1839; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #32]
1840; NONEON-NOSVE-NEXT:    strb w8, [sp, #81]
1841; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #48]
1842; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1843; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #15]
1844; NONEON-NOSVE-NEXT:    strb w8, [sp, #80]
1845; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
1846; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1847; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #14]
1848; NONEON-NOSVE-NEXT:    strb w8, [sp, #79]
1849; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #30]
1850; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1851; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #13]
1852; NONEON-NOSVE-NEXT:    strb w8, [sp, #78]
1853; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
1854; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1855; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #12]
1856; NONEON-NOSVE-NEXT:    strb w8, [sp, #77]
1857; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #28]
1858; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1859; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #11]
1860; NONEON-NOSVE-NEXT:    strb w8, [sp, #76]
1861; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
1862; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1863; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #10]
1864; NONEON-NOSVE-NEXT:    strb w8, [sp, #75]
1865; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #26]
1866; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1867; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #9]
1868; NONEON-NOSVE-NEXT:    strb w8, [sp, #74]
1869; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
1870; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1871; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #8]
1872; NONEON-NOSVE-NEXT:    strb w8, [sp, #73]
1873; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #24]
1874; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1875; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #7]
1876; NONEON-NOSVE-NEXT:    strb w8, [sp, #72]
1877; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
1878; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1879; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #6]
1880; NONEON-NOSVE-NEXT:    strb w8, [sp, #71]
1881; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #22]
1882; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1883; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #5]
1884; NONEON-NOSVE-NEXT:    strb w8, [sp, #70]
1885; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
1886; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1887; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #4]
1888; NONEON-NOSVE-NEXT:    strb w8, [sp, #69]
1889; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #20]
1890; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1891; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #3]
1892; NONEON-NOSVE-NEXT:    strb w8, [sp, #68]
1893; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
1894; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1895; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #2]
1896; NONEON-NOSVE-NEXT:    strb w8, [sp, #67]
1897; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #18]
1898; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1899; NONEON-NOSVE-NEXT:    ldrb w9, [sp, #1]
1900; NONEON-NOSVE-NEXT:    strb w8, [sp, #66]
1901; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
1902; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1903; NONEON-NOSVE-NEXT:    ldrb w9, [sp]
1904; NONEON-NOSVE-NEXT:    strb w8, [sp, #65]
1905; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
1906; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1907; NONEON-NOSVE-NEXT:    strb w8, [sp, #64]
1908; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
1909; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
1910; NONEON-NOSVE-NEXT:    add sp, sp, #96
1911; NONEON-NOSVE-NEXT:    ret
1912  %op1 = load <32 x i8>, ptr %a
1913  %op2 = load <32 x i8>, ptr %b
1914  %res = shl <32 x i8> %op1, %op2
1915  store <32 x i8> %res, ptr %a
1916  ret void
1917}
1918
1919define <4 x i16> @shl_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
1920; CHECK-LABEL: shl_v4i16:
1921; CHECK:       // %bb.0:
1922; CHECK-NEXT:    ptrue p0.h, vl4
1923; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1924; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
1925; CHECK-NEXT:    lsl z0.h, p0/m, z0.h, z1.h
1926; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1927; CHECK-NEXT:    ret
1928;
1929; NONEON-NOSVE-LABEL: shl_v4i16:
1930; NONEON-NOSVE:       // %bb.0:
1931; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1932; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1933; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
1934; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1935; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1936; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1937; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1938; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
1939; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1940; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1941; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1942; NONEON-NOSVE-NEXT:    strh w8, [sp, #28]
1943; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1944; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1945; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1946; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
1947; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
1948; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1949; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
1950; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1951; NONEON-NOSVE-NEXT:    add sp, sp, #32
1952; NONEON-NOSVE-NEXT:    ret
1953  %res = shl <4 x i16> %op1, %op2
1954  ret <4 x i16> %res
1955}
1956
1957define <8 x i16> @shl_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
1958; CHECK-LABEL: shl_v8i16:
1959; CHECK:       // %bb.0:
1960; CHECK-NEXT:    ptrue p0.h, vl8
1961; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1962; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
1963; CHECK-NEXT:    lsl z0.h, p0/m, z0.h, z1.h
1964; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1965; CHECK-NEXT:    ret
1966;
1967; NONEON-NOSVE-LABEL: shl_v8i16:
1968; NONEON-NOSVE:       // %bb.0:
1969; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
1970; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1971; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
1972; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
1973; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1974; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
1975; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
1976; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
1977; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1978; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
1979; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
1980; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
1981; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1982; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
1983; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
1984; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
1985; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1986; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
1987; NONEON-NOSVE-NEXT:    strh w8, [sp, #40]
1988; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
1989; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1990; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
1991; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
1992; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
1993; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1994; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
1995; NONEON-NOSVE-NEXT:    strh w8, [sp, #36]
1996; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
1997; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
1998; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
1999; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
2000; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
2001; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2002; NONEON-NOSVE-NEXT:    strh w8, [sp, #32]
2003; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
2004; NONEON-NOSVE-NEXT:    add sp, sp, #48
2005; NONEON-NOSVE-NEXT:    ret
2006  %res = shl <8 x i16> %op1, %op2
2007  ret <8 x i16> %res
2008}
2009
2010define void @shl_v16i16(ptr %a, ptr %b) {
2011; CHECK-LABEL: shl_v16i16:
2012; CHECK:       // %bb.0:
2013; CHECK-NEXT:    ldp q0, q3, [x1]
2014; CHECK-NEXT:    ptrue p0.h, vl8
2015; CHECK-NEXT:    ldp q1, q2, [x0]
2016; CHECK-NEXT:    lslr z0.h, p0/m, z0.h, z1.h
2017; CHECK-NEXT:    movprfx z1, z2
2018; CHECK-NEXT:    lsl z1.h, p0/m, z1.h, z3.h
2019; CHECK-NEXT:    stp q0, q1, [x0]
2020; CHECK-NEXT:    ret
2021;
2022; NONEON-NOSVE-LABEL: shl_v16i16:
2023; NONEON-NOSVE:       // %bb.0:
2024; NONEON-NOSVE-NEXT:    sub sp, sp, #96
2025; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
2026; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
2027; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
2028; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
2029; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
2030; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #62]
2031; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #46]
2032; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2033; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #44]
2034; NONEON-NOSVE-NEXT:    strh w8, [sp, #94]
2035; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]
2036; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2037; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #42]
2038; NONEON-NOSVE-NEXT:    strh w8, [sp, #92]
2039; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #58]
2040; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2041; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #40]
2042; NONEON-NOSVE-NEXT:    strh w8, [sp, #90]
2043; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]
2044; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2045; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #38]
2046; NONEON-NOSVE-NEXT:    strh w8, [sp, #88]
2047; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #54]
2048; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2049; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #36]
2050; NONEON-NOSVE-NEXT:    strh w8, [sp, #86]
2051; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]
2052; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2053; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #34]
2054; NONEON-NOSVE-NEXT:    strh w8, [sp, #84]
2055; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #50]
2056; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2057; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #32]
2058; NONEON-NOSVE-NEXT:    strh w8, [sp, #82]
2059; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]
2060; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2061; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
2062; NONEON-NOSVE-NEXT:    strh w8, [sp, #80]
2063; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
2064; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2065; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #12]
2066; NONEON-NOSVE-NEXT:    strh w8, [sp, #78]
2067; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
2068; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2069; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
2070; NONEON-NOSVE-NEXT:    strh w8, [sp, #76]
2071; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
2072; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2073; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
2074; NONEON-NOSVE-NEXT:    strh w8, [sp, #74]
2075; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
2076; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2077; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #6]
2078; NONEON-NOSVE-NEXT:    strh w8, [sp, #72]
2079; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
2080; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2081; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #4]
2082; NONEON-NOSVE-NEXT:    strh w8, [sp, #70]
2083; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
2084; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2085; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #2]
2086; NONEON-NOSVE-NEXT:    strh w8, [sp, #68]
2087; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
2088; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2089; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
2090; NONEON-NOSVE-NEXT:    strh w8, [sp, #66]
2091; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
2092; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2093; NONEON-NOSVE-NEXT:    strh w8, [sp, #64]
2094; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
2095; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2096; NONEON-NOSVE-NEXT:    add sp, sp, #96
2097; NONEON-NOSVE-NEXT:    ret
2098  %op1 = load <16 x i16>, ptr %a
2099  %op2 = load <16 x i16>, ptr %b
2100  %res = shl <16 x i16> %op1, %op2
2101  store <16 x i16> %res, ptr %a
2102  ret void
2103}
2104
2105define <2 x i32> @shl_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
2106; CHECK-LABEL: shl_v2i32:
2107; CHECK:       // %bb.0:
2108; CHECK-NEXT:    ptrue p0.s, vl2
2109; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2110; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
2111; CHECK-NEXT:    lsl z0.s, p0/m, z0.s, z1.s
2112; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2113; CHECK-NEXT:    ret
2114;
2115; NONEON-NOSVE-LABEL: shl_v2i32:
2116; NONEON-NOSVE:       // %bb.0:
2117; NONEON-NOSVE-NEXT:    sub sp, sp, #32
2118; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
2119; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #8]
2120; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
2121; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
2122; NONEON-NOSVE-NEXT:    lsl w11, w10, w8
2123; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
2124; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2125; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #24]
2126; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
2127; NONEON-NOSVE-NEXT:    add sp, sp, #32
2128; NONEON-NOSVE-NEXT:    ret
2129  %res = shl <2 x i32> %op1, %op2
2130  ret <2 x i32> %res
2131}
2132
2133define <4 x i32> @shl_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
2134; CHECK-LABEL: shl_v4i32:
2135; CHECK:       // %bb.0:
2136; CHECK-NEXT:    ptrue p0.s, vl4
2137; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2138; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
2139; CHECK-NEXT:    lsl z0.s, p0/m, z0.s, z1.s
2140; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2141; CHECK-NEXT:    ret
2142;
2143; NONEON-NOSVE-LABEL: shl_v4i32:
2144; NONEON-NOSVE:       // %bb.0:
2145; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
2146; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
2147; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
2148; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
2149; NONEON-NOSVE-NEXT:    lsl w11, w10, w8
2150; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
2151; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2152; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
2153; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #40]
2154; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
2155; NONEON-NOSVE-NEXT:    lsl w11, w10, w8
2156; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
2157; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2158; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #32]
2159; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
2160; NONEON-NOSVE-NEXT:    add sp, sp, #48
2161; NONEON-NOSVE-NEXT:    ret
2162  %res = shl <4 x i32> %op1, %op2
2163  ret <4 x i32> %res
2164}
2165
2166define void @shl_v8i32(ptr %a, ptr %b) {
2167; CHECK-LABEL: shl_v8i32:
2168; CHECK:       // %bb.0:
2169; CHECK-NEXT:    ldp q0, q3, [x1]
2170; CHECK-NEXT:    ptrue p0.s, vl4
2171; CHECK-NEXT:    ldp q1, q2, [x0]
2172; CHECK-NEXT:    lslr z0.s, p0/m, z0.s, z1.s
2173; CHECK-NEXT:    movprfx z1, z2
2174; CHECK-NEXT:    lsl z1.s, p0/m, z1.s, z3.s
2175; CHECK-NEXT:    stp q0, q1, [x0]
2176; CHECK-NEXT:    ret
2177;
2178; NONEON-NOSVE-LABEL: shl_v8i32:
2179; NONEON-NOSVE:       // %bb.0:
2180; NONEON-NOSVE-NEXT:    sub sp, sp, #96
2181; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
2182; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
2183; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
2184; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
2185; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
2186; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #40]
2187; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]
2188; NONEON-NOSVE-NEXT:    lsl w11, w10, w8
2189; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]
2190; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2191; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #32]
2192; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #88]
2193; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]
2194; NONEON-NOSVE-NEXT:    lsl w11, w10, w8
2195; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]
2196; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2197; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp, #8]
2198; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #80]
2199; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
2200; NONEON-NOSVE-NEXT:    lsl w11, w10, w8
2201; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
2202; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2203; NONEON-NOSVE-NEXT:    ldp w9, w10, [sp]
2204; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #72]
2205; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
2206; NONEON-NOSVE-NEXT:    lsl w11, w10, w8
2207; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
2208; NONEON-NOSVE-NEXT:    lsl w8, w9, w8
2209; NONEON-NOSVE-NEXT:    stp w8, w11, [sp, #64]
2210; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
2211; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2212; NONEON-NOSVE-NEXT:    add sp, sp, #96
2213; NONEON-NOSVE-NEXT:    ret
2214  %op1 = load <8 x i32>, ptr %a
2215  %op2 = load <8 x i32>, ptr %b
2216  %res = shl <8 x i32> %op1, %op2
2217  store <8 x i32> %res, ptr %a
2218  ret void
2219}
2220
2221define <1 x i64> @shl_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
2222; CHECK-LABEL: shl_v1i64:
2223; CHECK:       // %bb.0:
2224; CHECK-NEXT:    ptrue p0.d, vl1
2225; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2226; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
2227; CHECK-NEXT:    lsl z0.d, p0/m, z0.d, z1.d
2228; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2229; CHECK-NEXT:    ret
2230;
2231; NONEON-NOSVE-LABEL: shl_v1i64:
2232; NONEON-NOSVE:       // %bb.0:
2233; NONEON-NOSVE-NEXT:    sub sp, sp, #16
2234; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
2235; NONEON-NOSVE-NEXT:    fmov x8, d1
2236; NONEON-NOSVE-NEXT:    fmov x9, d0
2237; NONEON-NOSVE-NEXT:    lsl x8, x9, x8
2238; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
2239; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
2240; NONEON-NOSVE-NEXT:    add sp, sp, #16
2241; NONEON-NOSVE-NEXT:    ret
2242  %res = shl <1 x i64> %op1, %op2
2243  ret <1 x i64> %res
2244}
2245
2246define <2 x i64> @shl_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
2247; CHECK-LABEL: shl_v2i64:
2248; CHECK:       // %bb.0:
2249; CHECK-NEXT:    ptrue p0.d, vl2
2250; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2251; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
2252; CHECK-NEXT:    lsl z0.d, p0/m, z0.d, z1.d
2253; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2254; CHECK-NEXT:    ret
2255;
2256; NONEON-NOSVE-LABEL: shl_v2i64:
2257; NONEON-NOSVE:       // %bb.0:
2258; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-48]!
2259; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
2260; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
2261; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
2262; NONEON-NOSVE-NEXT:    lsl x11, x10, x8
2263; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
2264; NONEON-NOSVE-NEXT:    lsl x8, x9, x8
2265; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #32]
2266; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
2267; NONEON-NOSVE-NEXT:    add sp, sp, #48
2268; NONEON-NOSVE-NEXT:    ret
2269  %res = shl <2 x i64> %op1, %op2
2270  ret <2 x i64> %res
2271}
2272
2273define void @shl_v4i64(ptr %a, ptr %b) {
2274; CHECK-LABEL: shl_v4i64:
2275; CHECK:       // %bb.0:
2276; CHECK-NEXT:    ldp q0, q3, [x1]
2277; CHECK-NEXT:    ptrue p0.d, vl2
2278; CHECK-NEXT:    ldp q1, q2, [x0]
2279; CHECK-NEXT:    lslr z0.d, p0/m, z0.d, z1.d
2280; CHECK-NEXT:    movprfx z1, z2
2281; CHECK-NEXT:    lsl z1.d, p0/m, z1.d, z3.d
2282; CHECK-NEXT:    stp q0, q1, [x0]
2283; CHECK-NEXT:    ret
2284;
2285; NONEON-NOSVE-LABEL: shl_v4i64:
2286; NONEON-NOSVE:       // %bb.0:
2287; NONEON-NOSVE-NEXT:    sub sp, sp, #96
2288; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
2289; NONEON-NOSVE-NEXT:    ldp q3, q0, [x1]
2290; NONEON-NOSVE-NEXT:    ldp q2, q1, [x0]
2291; NONEON-NOSVE-NEXT:    stp q2, q3, [sp]
2292; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #32]
2293; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp, #32]
2294; NONEON-NOSVE-NEXT:    ldr x8, [sp, #56]
2295; NONEON-NOSVE-NEXT:    lsl x11, x10, x8
2296; NONEON-NOSVE-NEXT:    ldr x8, [sp, #48]
2297; NONEON-NOSVE-NEXT:    lsl x8, x9, x8
2298; NONEON-NOSVE-NEXT:    ldp x9, x10, [sp]
2299; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #80]
2300; NONEON-NOSVE-NEXT:    ldr x8, [sp, #24]
2301; NONEON-NOSVE-NEXT:    lsl x11, x10, x8
2302; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
2303; NONEON-NOSVE-NEXT:    lsl x8, x9, x8
2304; NONEON-NOSVE-NEXT:    stp x8, x11, [sp, #64]
2305; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #64]
2306; NONEON-NOSVE-NEXT:    stp q0, q1, [x0]
2307; NONEON-NOSVE-NEXT:    add sp, sp, #96
2308; NONEON-NOSVE-NEXT:    ret
2309  %op1 = load <4 x i64>, ptr %a
2310  %op2 = load <4 x i64>, ptr %b
2311  %res = shl <4 x i64> %op1, %op2
2312  store <4 x i64> %res, ptr %a
2313  ret void
2314}
2315