[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-int-shifts.ll
blobd0f99211e80fce140c4b377a6197b95d154124ef
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
6 target triple = "aarch64-unknown-linux-gnu"
9 ; ASHR
12 define <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
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
52 define <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
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
106 define <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
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
191 define 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
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
350 define <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
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
381 define <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
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
419 define <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
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
472 define 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
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
567 define <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
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
595 define <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
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
628 define 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
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
683 define <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
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
708 define <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
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
735 define 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
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
779 ; LSHR
782 define <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
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
822 define <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
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
876 define <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
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
961 define 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
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
1120 define <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
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
1151 define <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
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
1189 define <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
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
1242 define 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
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
1337 define <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
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
1365 define <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
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
1398 define 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
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
1453 define <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
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
1478 define <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
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
1505 define 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
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
1549 ; SHL
1552 define <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
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
1582 define <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
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
1621 define <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
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
1675 define <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
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
1760 define 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
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
1919 define <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
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
1957 define <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
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
2010 define 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
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
2105 define <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
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
2133 define <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
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
2166 define 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
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
2221 define <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
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
2246 define <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
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
2273 define 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
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