1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve2 -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
7 target triple = "aarch64-unknown-linux-gnu"
13 define <16 x i8> @trunc_v16i16_v16i8(ptr %in) nounwind {
14 ; CHECK-LABEL: trunc_v16i16_v16i8:
16 ; CHECK-NEXT: ldp q1, q0, [x0]
17 ; CHECK-NEXT: ptrue p0.b, vl8
18 ; CHECK-NEXT: uzp1 z3.b, z0.b, z0.b
19 ; CHECK-NEXT: uzp1 z2.b, z1.b, z1.b
20 ; CHECK-NEXT: splice z0.b, p0, { z2.b, z3.b }
21 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
24 ; NONEON-NOSVE-LABEL: trunc_v16i16_v16i8:
25 ; NONEON-NOSVE: // %bb.0:
26 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]
27 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!
28 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]
29 ; NONEON-NOSVE-NEXT: strb w8, [sp, #47]
30 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]
31 ; NONEON-NOSVE-NEXT: strb w8, [sp, #46]
32 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]
33 ; NONEON-NOSVE-NEXT: strb w8, [sp, #45]
34 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]
35 ; NONEON-NOSVE-NEXT: strb w8, [sp, #44]
36 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]
37 ; NONEON-NOSVE-NEXT: strb w8, [sp, #43]
38 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]
39 ; NONEON-NOSVE-NEXT: strb w8, [sp, #42]
40 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]
41 ; NONEON-NOSVE-NEXT: strb w8, [sp, #41]
42 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]
43 ; NONEON-NOSVE-NEXT: strb w8, [sp, #40]
44 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14]
45 ; NONEON-NOSVE-NEXT: strb w8, [sp, #39]
46 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12]
47 ; NONEON-NOSVE-NEXT: strb w8, [sp, #38]
48 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10]
49 ; NONEON-NOSVE-NEXT: strb w8, [sp, #37]
50 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8]
51 ; NONEON-NOSVE-NEXT: strb w8, [sp, #36]
52 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6]
53 ; NONEON-NOSVE-NEXT: strb w8, [sp, #35]
54 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4]
55 ; NONEON-NOSVE-NEXT: strb w8, [sp, #34]
56 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]
57 ; NONEON-NOSVE-NEXT: strb w8, [sp, #33]
58 ; NONEON-NOSVE-NEXT: ldrh w8, [sp]
59 ; NONEON-NOSVE-NEXT: strb w8, [sp, #32]
60 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
61 ; NONEON-NOSVE-NEXT: add sp, sp, #48
62 ; NONEON-NOSVE-NEXT: ret
63 %a = load <16 x i16>, ptr %in
64 %b = trunc <16 x i16> %a to <16 x i8>
68 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
69 define void @trunc_v32i16_v32i8(ptr %in, ptr %out) nounwind {
70 ; CHECK-LABEL: trunc_v32i16_v32i8:
72 ; CHECK-NEXT: ldp q1, q0, [x0, #32]
73 ; CHECK-NEXT: ptrue p0.b, vl8
74 ; CHECK-NEXT: ldp q3, q2, [x0]
75 ; CHECK-NEXT: uzp1 z5.b, z0.b, z0.b
76 ; CHECK-NEXT: uzp1 z4.b, z1.b, z1.b
77 ; CHECK-NEXT: uzp1 z1.b, z2.b, z2.b
78 ; CHECK-NEXT: uzp1 z0.b, z3.b, z3.b
79 ; CHECK-NEXT: splice z2.b, p0, { z4.b, z5.b }
80 ; CHECK-NEXT: splice z0.b, p0, { z0.b, z1.b }
81 ; CHECK-NEXT: add z1.b, z2.b, z2.b
82 ; CHECK-NEXT: add z0.b, z0.b, z0.b
83 ; CHECK-NEXT: stp q0, q1, [x1]
86 ; NONEON-NOSVE-LABEL: trunc_v32i16_v32i8:
87 ; NONEON-NOSVE: // %bb.0:
88 ; NONEON-NOSVE-NEXT: sub sp, sp, #208
89 ; NONEON-NOSVE-NEXT: ldp q0, q1, [x0, #32]
90 ; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #112] // 16-byte Folded Spill
91 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0]
92 ; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #128] // 16-byte Folded Spill
93 ; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #144] // 16-byte Folded Spill
94 ; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #160] // 16-byte Folded Spill
95 ; NONEON-NOSVE-NEXT: stp q3, q1, [sp, #16]
96 ; NONEON-NOSVE-NEXT: stp q2, q0, [sp, #48]
97 ; NONEON-NOSVE-NEXT: ldrh w25, [sp, #28]
98 ; NONEON-NOSVE-NEXT: ldrh w26, [sp, #30]
99 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #64]
100 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #66]
101 ; NONEON-NOSVE-NEXT: ldrh w29, [sp, #52]
102 ; NONEON-NOSVE-NEXT: ldrh w27, [sp, #48]
103 ; NONEON-NOSVE-NEXT: ldrh w28, [sp, #50]
104 ; NONEON-NOSVE-NEXT: ldrh w23, [sp, #24]
105 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] // 8-byte Folded Spill
106 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56]
107 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #54]
108 ; NONEON-NOSVE-NEXT: ldrh w24, [sp, #26]
109 ; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #176] // 16-byte Folded Spill
110 ; NONEON-NOSVE-NEXT: ldrh w21, [sp, #20]
111 ; NONEON-NOSVE-NEXT: add w8, w8, w8
112 ; NONEON-NOSVE-NEXT: add w9, w9, w9
113 ; NONEON-NOSVE-NEXT: ldrh w22, [sp, #22]
114 ; NONEON-NOSVE-NEXT: strb w8, [sp, #92]
115 ; NONEON-NOSVE-NEXT: add w8, w29, w29
116 ; NONEON-NOSVE-NEXT: ldrh w4, [sp, #44]
117 ; NONEON-NOSVE-NEXT: strb w9, [sp, #91]
118 ; NONEON-NOSVE-NEXT: add w9, w28, w28
119 ; NONEON-NOSVE-NEXT: ldrh w7, [sp, #46]
120 ; NONEON-NOSVE-NEXT: strb w8, [sp, #90]
121 ; NONEON-NOSVE-NEXT: add w8, w27, w27
122 ; NONEON-NOSVE-NEXT: ldrh w2, [sp, #40]
123 ; NONEON-NOSVE-NEXT: strb w9, [sp, #89]
124 ; NONEON-NOSVE-NEXT: add w9, w26, w26
125 ; NONEON-NOSVE-NEXT: ldrh w3, [sp, #42]
126 ; NONEON-NOSVE-NEXT: strb w8, [sp, #88]
127 ; NONEON-NOSVE-NEXT: add w8, w25, w25
128 ; NONEON-NOSVE-NEXT: ldrh w18, [sp, #36]
129 ; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #192] // 16-byte Folded Spill
130 ; NONEON-NOSVE-NEXT: ldrh w19, [sp, #16]
131 ; NONEON-NOSVE-NEXT: ldrh w20, [sp, #18]
132 ; NONEON-NOSVE-NEXT: strb w9, [sp, #87]
133 ; NONEON-NOSVE-NEXT: add w9, w24, w24
134 ; NONEON-NOSVE-NEXT: ldrh w0, [sp, #38]
135 ; NONEON-NOSVE-NEXT: strb w8, [sp, #86]
136 ; NONEON-NOSVE-NEXT: add w8, w23, w23
137 ; NONEON-NOSVE-NEXT: ldrh w12, [sp, #60]
138 ; NONEON-NOSVE-NEXT: strb w9, [sp, #85]
139 ; NONEON-NOSVE-NEXT: add w9, w22, w22
140 ; NONEON-NOSVE-NEXT: ldrh w13, [sp, #62]
141 ; NONEON-NOSVE-NEXT: add w6, w12, w12
142 ; NONEON-NOSVE-NEXT: strb w8, [sp, #84]
143 ; NONEON-NOSVE-NEXT: add w8, w21, w21
144 ; NONEON-NOSVE-NEXT: add w5, w13, w13
145 ; NONEON-NOSVE-NEXT: strb w9, [sp, #83]
146 ; NONEON-NOSVE-NEXT: add w9, w20, w20
147 ; NONEON-NOSVE-NEXT: strb w8, [sp, #82]
148 ; NONEON-NOSVE-NEXT: add w8, w19, w19
149 ; NONEON-NOSVE-NEXT: ldrh w16, [sp, #32]
150 ; NONEON-NOSVE-NEXT: strb w9, [sp, #81]
151 ; NONEON-NOSVE-NEXT: add w9, w7, w7
152 ; NONEON-NOSVE-NEXT: ldrh w17, [sp, #34]
153 ; NONEON-NOSVE-NEXT: strb w8, [sp, #80]
154 ; NONEON-NOSVE-NEXT: add w8, w4, w4
155 ; NONEON-NOSVE-NEXT: ldrh w14, [sp, #76]
156 ; NONEON-NOSVE-NEXT: strb w9, [sp, #111]
157 ; NONEON-NOSVE-NEXT: add w9, w3, w3
158 ; NONEON-NOSVE-NEXT: ldrh w15, [sp, #78]
159 ; NONEON-NOSVE-NEXT: strb w8, [sp, #110]
160 ; NONEON-NOSVE-NEXT: add w8, w2, w2
161 ; NONEON-NOSVE-NEXT: ldrh w12, [sp, #72]
162 ; NONEON-NOSVE-NEXT: strb w9, [sp, #109]
163 ; NONEON-NOSVE-NEXT: add w9, w0, w0
164 ; NONEON-NOSVE-NEXT: ldrh w13, [sp, #74]
165 ; NONEON-NOSVE-NEXT: strb w8, [sp, #108]
166 ; NONEON-NOSVE-NEXT: add w8, w18, w18
167 ; NONEON-NOSVE-NEXT: ldrh w10, [sp, #68]
168 ; NONEON-NOSVE-NEXT: strb w9, [sp, #107]
169 ; NONEON-NOSVE-NEXT: add w9, w17, w17
170 ; NONEON-NOSVE-NEXT: ldrh w11, [sp, #70]
171 ; NONEON-NOSVE-NEXT: strb w8, [sp, #106]
172 ; NONEON-NOSVE-NEXT: add w8, w16, w16
173 ; NONEON-NOSVE-NEXT: ldrh w30, [sp, #58]
174 ; NONEON-NOSVE-NEXT: strb w9, [sp, #105]
175 ; NONEON-NOSVE-NEXT: add w9, w15, w15
176 ; NONEON-NOSVE-NEXT: strb w8, [sp, #104]
177 ; NONEON-NOSVE-NEXT: add w8, w14, w14
178 ; NONEON-NOSVE-NEXT: strb w9, [sp, #103]
179 ; NONEON-NOSVE-NEXT: add w9, w13, w13
180 ; NONEON-NOSVE-NEXT: strb w8, [sp, #102]
181 ; NONEON-NOSVE-NEXT: add w8, w12, w12
182 ; NONEON-NOSVE-NEXT: strb w9, [sp, #101]
183 ; NONEON-NOSVE-NEXT: add w9, w11, w11
184 ; NONEON-NOSVE-NEXT: strb w8, [sp, #100]
185 ; NONEON-NOSVE-NEXT: add w8, w10, w10
186 ; NONEON-NOSVE-NEXT: strb w9, [sp, #99]
187 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #8] // 4-byte Folded Reload
188 ; NONEON-NOSVE-NEXT: strb w8, [sp, #98]
189 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] // 4-byte Folded Reload
190 ; NONEON-NOSVE-NEXT: strb w5, [sp, #95]
191 ; NONEON-NOSVE-NEXT: add w5, w30, w30
192 ; NONEON-NOSVE-NEXT: add w9, w9, w9
193 ; NONEON-NOSVE-NEXT: add w8, w8, w8
194 ; NONEON-NOSVE-NEXT: strb w6, [sp, #94]
195 ; NONEON-NOSVE-NEXT: strb w5, [sp, #93]
196 ; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #192] // 16-byte Folded Reload
197 ; NONEON-NOSVE-NEXT: strb w9, [sp, #97]
198 ; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #176] // 16-byte Folded Reload
199 ; NONEON-NOSVE-NEXT: strb w8, [sp, #96]
200 ; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #160] // 16-byte Folded Reload
201 ; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #80]
202 ; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #144] // 16-byte Folded Reload
203 ; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #128] // 16-byte Folded Reload
204 ; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #112] // 16-byte Folded Reload
205 ; NONEON-NOSVE-NEXT: stp q1, q0, [x1]
206 ; NONEON-NOSVE-NEXT: add sp, sp, #208
207 ; NONEON-NOSVE-NEXT: ret
208 %a = load <32 x i16>, ptr %in
209 %b = trunc <32 x i16> %a to <32 x i8>
210 %c = add <32 x i8> %b, %b
211 store <32 x i8> %c, ptr %out
215 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
216 define void @trunc_v64i16_v64i8(ptr %in, ptr %out) nounwind {
217 ; CHECK-LABEL: trunc_v64i16_v64i8:
219 ; CHECK-NEXT: ldp q1, q0, [x0, #64]
220 ; CHECK-NEXT: ptrue p0.b, vl8
221 ; CHECK-NEXT: ldp q2, q3, [x0, #96]
222 ; CHECK-NEXT: ldp q4, q5, [x0]
223 ; CHECK-NEXT: uzp1 z7.b, z0.b, z0.b
224 ; CHECK-NEXT: uzp1 z6.b, z1.b, z1.b
225 ; CHECK-NEXT: ldp q1, q0, [x0, #32]
226 ; CHECK-NEXT: uzp1 z17.b, z3.b, z3.b
227 ; CHECK-NEXT: uzp1 z16.b, z2.b, z2.b
228 ; CHECK-NEXT: uzp1 z3.b, z5.b, z5.b
229 ; CHECK-NEXT: uzp1 z2.b, z4.b, z4.b
230 ; CHECK-NEXT: uzp1 z5.b, z0.b, z0.b
231 ; CHECK-NEXT: splice z0.b, p0, { z6.b, z7.b }
232 ; CHECK-NEXT: uzp1 z4.b, z1.b, z1.b
233 ; CHECK-NEXT: splice z1.b, p0, { z16.b, z17.b }
234 ; CHECK-NEXT: splice z2.b, p0, { z2.b, z3.b }
235 ; CHECK-NEXT: splice z3.b, p0, { z4.b, z5.b }
236 ; CHECK-NEXT: add z0.b, z0.b, z0.b
237 ; CHECK-NEXT: add z1.b, z1.b, z1.b
238 ; CHECK-NEXT: add z2.b, z2.b, z2.b
239 ; CHECK-NEXT: add z3.b, z3.b, z3.b
240 ; CHECK-NEXT: stp q0, q1, [x1, #32]
241 ; CHECK-NEXT: stp q2, q3, [x1]
244 ; NONEON-NOSVE-LABEL: trunc_v64i16_v64i8:
245 ; NONEON-NOSVE: // %bb.0:
246 ; NONEON-NOSVE-NEXT: sub sp, sp, #448
247 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #32]
248 ; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #416] // 16-byte Folded Spill
249 ; NONEON-NOSVE-NEXT: ldp q5, q4, [x0]
250 ; NONEON-NOSVE-NEXT: str x1, [sp, #152] // 8-byte Folded Spill
251 ; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #432] // 16-byte Folded Spill
252 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #64]
253 ; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #400] // 16-byte Folded Spill
254 ; NONEON-NOSVE-NEXT: ldp q7, q6, [x0, #96]
255 ; NONEON-NOSVE-NEXT: stp q2, q4, [sp, #224]
256 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #238]
257 ; NONEON-NOSVE-NEXT: stp q3, q1, [sp, #256]
258 ; NONEON-NOSVE-NEXT: ldrh w10, [sp, #232]
259 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #272]
260 ; NONEON-NOSVE-NEXT: stp q5, q7, [sp, #160]
261 ; NONEON-NOSVE-NEXT: ldrh w11, [sp, #230]
262 ; NONEON-NOSVE-NEXT: add w21, w8, w8
263 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #274]
264 ; NONEON-NOSVE-NEXT: stp q6, q0, [sp, #192]
265 ; NONEON-NOSVE-NEXT: ldrh w12, [sp, #228]
266 ; NONEON-NOSVE-NEXT: ldrh w13, [sp, #226]
267 ; NONEON-NOSVE-NEXT: ldrh w14, [sp, #224]
268 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] // 8-byte Folded Spill
269 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #276]
270 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #278]
271 ; NONEON-NOSVE-NEXT: ldrh w15, [sp, #270]
272 ; NONEON-NOSVE-NEXT: ldrh w16, [sp, #268]
273 ; NONEON-NOSVE-NEXT: ldrh w17, [sp, #266]
274 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] // 8-byte Folded Spill
275 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #280]
276 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #282]
277 ; NONEON-NOSVE-NEXT: ldrh w18, [sp, #264]
278 ; NONEON-NOSVE-NEXT: ldrh w0, [sp, #262]
279 ; NONEON-NOSVE-NEXT: ldrh w1, [sp, #260]
280 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] // 8-byte Folded Spill
281 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #284]
282 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #286]
283 ; NONEON-NOSVE-NEXT: ldrh w2, [sp, #258]
284 ; NONEON-NOSVE-NEXT: ldrh w3, [sp, #256]
285 ; NONEON-NOSVE-NEXT: ldrh w4, [sp, #254]
286 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] // 8-byte Folded Spill
287 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #208]
288 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #210]
289 ; NONEON-NOSVE-NEXT: ldrh w5, [sp, #252]
290 ; NONEON-NOSVE-NEXT: ldrh w6, [sp, #250]
291 ; NONEON-NOSVE-NEXT: ldrh w7, [sp, #248]
292 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] // 8-byte Folded Spill
293 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #212]
294 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #214]
295 ; NONEON-NOSVE-NEXT: ldrh w19, [sp, #246]
296 ; NONEON-NOSVE-NEXT: ldrh w20, [sp, #244]
297 ; NONEON-NOSVE-NEXT: ldrh w22, [sp, #242]
298 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] // 8-byte Folded Spill
299 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #216]
300 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #218]
301 ; NONEON-NOSVE-NEXT: ldrh w23, [sp, #240]
302 ; NONEON-NOSVE-NEXT: ldrh w24, [sp, #174]
303 ; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #384] // 16-byte Folded Spill
304 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #96] // 8-byte Folded Spill
305 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #220]
306 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #222]
307 ; NONEON-NOSVE-NEXT: ldrh w25, [sp, #172]
308 ; NONEON-NOSVE-NEXT: ldrh w26, [sp, #170]
309 ; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #368] // 16-byte Folded Spill
310 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88] // 8-byte Folded Spill
311 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #176]
312 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #178]
313 ; NONEON-NOSVE-NEXT: ldrh w27, [sp, #168]
314 ; NONEON-NOSVE-NEXT: ldrh w28, [sp, #166]
315 ; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #352] // 16-byte Folded Spill
316 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80] // 8-byte Folded Spill
317 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #180]
318 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #182]
319 ; NONEON-NOSVE-NEXT: ldrh w29, [sp, #164]
320 ; NONEON-NOSVE-NEXT: ldrh w30, [sp, #162]
321 ; NONEON-NOSVE-NEXT: strb w21, [sp, #335]
322 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] // 8-byte Folded Spill
323 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #184]
324 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #186]
325 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] // 8-byte Folded Spill
326 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #188]
327 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #190]
328 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] // 8-byte Folded Spill
329 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #192]
330 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #194]
331 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] // 8-byte Folded Spill
332 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #196]
333 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #198]
334 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] // 8-byte Folded Spill
335 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #200]
336 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #202]
337 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] // 8-byte Folded Spill
338 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #204]
339 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #206]
340 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] // 8-byte Folded Spill
341 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #160]
342 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #236]
343 ; NONEON-NOSVE-NEXT: add w9, w9, w9
344 ; NONEON-NOSVE-NEXT: str w8, [sp, #20] // 4-byte Folded Spill
345 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #234]
346 ; NONEON-NOSVE-NEXT: strb w9, [sp, #334]
347 ; NONEON-NOSVE-NEXT: add w8, w8, w8
348 ; NONEON-NOSVE-NEXT: strb w8, [sp, #333]
349 ; NONEON-NOSVE-NEXT: add w8, w10, w10
350 ; NONEON-NOSVE-NEXT: strb w8, [sp, #332]
351 ; NONEON-NOSVE-NEXT: add w8, w11, w11
352 ; NONEON-NOSVE-NEXT: strb w8, [sp, #331]
353 ; NONEON-NOSVE-NEXT: add w8, w12, w12
354 ; NONEON-NOSVE-NEXT: strb w8, [sp, #330]
355 ; NONEON-NOSVE-NEXT: add w8, w13, w13
356 ; NONEON-NOSVE-NEXT: strb w8, [sp, #329]
357 ; NONEON-NOSVE-NEXT: add w8, w14, w14
358 ; NONEON-NOSVE-NEXT: strb w8, [sp, #328]
359 ; NONEON-NOSVE-NEXT: add w8, w15, w15
360 ; NONEON-NOSVE-NEXT: strb w8, [sp, #327]
361 ; NONEON-NOSVE-NEXT: add w8, w16, w16
362 ; NONEON-NOSVE-NEXT: strb w8, [sp, #326]
363 ; NONEON-NOSVE-NEXT: add w8, w17, w17
364 ; NONEON-NOSVE-NEXT: strb w8, [sp, #325]
365 ; NONEON-NOSVE-NEXT: add w8, w18, w18
366 ; NONEON-NOSVE-NEXT: strb w8, [sp, #324]
367 ; NONEON-NOSVE-NEXT: add w8, w0, w0
368 ; NONEON-NOSVE-NEXT: strb w8, [sp, #323]
369 ; NONEON-NOSVE-NEXT: add w8, w1, w1
370 ; NONEON-NOSVE-NEXT: strb w8, [sp, #322]
371 ; NONEON-NOSVE-NEXT: add w8, w2, w2
372 ; NONEON-NOSVE-NEXT: strb w8, [sp, #321]
373 ; NONEON-NOSVE-NEXT: add w8, w3, w3
374 ; NONEON-NOSVE-NEXT: strb w8, [sp, #320]
375 ; NONEON-NOSVE-NEXT: add w8, w4, w4
376 ; NONEON-NOSVE-NEXT: strb w8, [sp, #319]
377 ; NONEON-NOSVE-NEXT: add w8, w5, w5
378 ; NONEON-NOSVE-NEXT: strb w8, [sp, #318]
379 ; NONEON-NOSVE-NEXT: add w8, w6, w6
380 ; NONEON-NOSVE-NEXT: strb w8, [sp, #317]
381 ; NONEON-NOSVE-NEXT: add w8, w7, w7
382 ; NONEON-NOSVE-NEXT: strb w8, [sp, #316]
383 ; NONEON-NOSVE-NEXT: add w8, w19, w19
384 ; NONEON-NOSVE-NEXT: strb w8, [sp, #315]
385 ; NONEON-NOSVE-NEXT: add w8, w20, w20
386 ; NONEON-NOSVE-NEXT: strb w8, [sp, #314]
387 ; NONEON-NOSVE-NEXT: add w8, w22, w22
388 ; NONEON-NOSVE-NEXT: strb w8, [sp, #313]
389 ; NONEON-NOSVE-NEXT: add w8, w23, w23
390 ; NONEON-NOSVE-NEXT: strb w8, [sp, #312]
391 ; NONEON-NOSVE-NEXT: add w8, w24, w24
392 ; NONEON-NOSVE-NEXT: strb w8, [sp, #311]
393 ; NONEON-NOSVE-NEXT: add w8, w25, w25
394 ; NONEON-NOSVE-NEXT: strb w8, [sp, #310]
395 ; NONEON-NOSVE-NEXT: add w8, w26, w26
396 ; NONEON-NOSVE-NEXT: strb w8, [sp, #309]
397 ; NONEON-NOSVE-NEXT: add w8, w27, w27
398 ; NONEON-NOSVE-NEXT: strb w8, [sp, #308]
399 ; NONEON-NOSVE-NEXT: add w8, w28, w28
400 ; NONEON-NOSVE-NEXT: strb w8, [sp, #307]
401 ; NONEON-NOSVE-NEXT: add w8, w29, w29
402 ; NONEON-NOSVE-NEXT: strb w8, [sp, #306]
403 ; NONEON-NOSVE-NEXT: add w8, w30, w30
404 ; NONEON-NOSVE-NEXT: strb w8, [sp, #305]
405 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] // 4-byte Folded Reload
406 ; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #432] // 16-byte Folded Reload
407 ; NONEON-NOSVE-NEXT: add w8, w8, w8
408 ; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #416] // 16-byte Folded Reload
409 ; NONEON-NOSVE-NEXT: strb w8, [sp, #304]
410 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] // 4-byte Folded Reload
411 ; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #400] // 16-byte Folded Reload
412 ; NONEON-NOSVE-NEXT: add w8, w8, w8
413 ; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #384] // 16-byte Folded Reload
414 ; NONEON-NOSVE-NEXT: strb w8, [sp, #303]
415 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] // 4-byte Folded Reload
416 ; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #368] // 16-byte Folded Reload
417 ; NONEON-NOSVE-NEXT: add w8, w8, w8
418 ; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #352] // 16-byte Folded Reload
419 ; NONEON-NOSVE-NEXT: strb w8, [sp, #302]
420 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #32] // 4-byte Folded Reload
421 ; NONEON-NOSVE-NEXT: add w8, w8, w8
422 ; NONEON-NOSVE-NEXT: strb w8, [sp, #301]
423 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #36] // 4-byte Folded Reload
424 ; NONEON-NOSVE-NEXT: add w8, w8, w8
425 ; NONEON-NOSVE-NEXT: strb w8, [sp, #300]
426 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #40] // 4-byte Folded Reload
427 ; NONEON-NOSVE-NEXT: add w8, w8, w8
428 ; NONEON-NOSVE-NEXT: strb w8, [sp, #299]
429 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #44] // 4-byte Folded Reload
430 ; NONEON-NOSVE-NEXT: add w8, w8, w8
431 ; NONEON-NOSVE-NEXT: strb w8, [sp, #298]
432 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] // 4-byte Folded Reload
433 ; NONEON-NOSVE-NEXT: add w8, w8, w8
434 ; NONEON-NOSVE-NEXT: strb w8, [sp, #297]
435 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] // 4-byte Folded Reload
436 ; NONEON-NOSVE-NEXT: add w8, w8, w8
437 ; NONEON-NOSVE-NEXT: strb w8, [sp, #296]
438 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] // 4-byte Folded Reload
439 ; NONEON-NOSVE-NEXT: add w8, w8, w8
440 ; NONEON-NOSVE-NEXT: strb w8, [sp, #295]
441 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] // 4-byte Folded Reload
442 ; NONEON-NOSVE-NEXT: add w8, w8, w8
443 ; NONEON-NOSVE-NEXT: strb w8, [sp, #294]
444 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #64] // 4-byte Folded Reload
445 ; NONEON-NOSVE-NEXT: add w8, w8, w8
446 ; NONEON-NOSVE-NEXT: strb w8, [sp, #293]
447 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #68] // 4-byte Folded Reload
448 ; NONEON-NOSVE-NEXT: add w8, w8, w8
449 ; NONEON-NOSVE-NEXT: strb w8, [sp, #292]
450 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #72] // 4-byte Folded Reload
451 ; NONEON-NOSVE-NEXT: add w8, w8, w8
452 ; NONEON-NOSVE-NEXT: strb w8, [sp, #291]
453 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #76] // 4-byte Folded Reload
454 ; NONEON-NOSVE-NEXT: add w8, w8, w8
455 ; NONEON-NOSVE-NEXT: strb w8, [sp, #290]
456 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #80] // 4-byte Folded Reload
457 ; NONEON-NOSVE-NEXT: add w8, w8, w8
458 ; NONEON-NOSVE-NEXT: strb w8, [sp, #289]
459 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #84] // 4-byte Folded Reload
460 ; NONEON-NOSVE-NEXT: add w8, w8, w8
461 ; NONEON-NOSVE-NEXT: strb w8, [sp, #288]
462 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #88] // 4-byte Folded Reload
463 ; NONEON-NOSVE-NEXT: ldp q1, q3, [sp, #288]
464 ; NONEON-NOSVE-NEXT: add w8, w8, w8
465 ; NONEON-NOSVE-NEXT: strb w8, [sp, #351]
466 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #92] // 4-byte Folded Reload
467 ; NONEON-NOSVE-NEXT: add w8, w8, w8
468 ; NONEON-NOSVE-NEXT: strb w8, [sp, #350]
469 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #96] // 4-byte Folded Reload
470 ; NONEON-NOSVE-NEXT: add w8, w8, w8
471 ; NONEON-NOSVE-NEXT: strb w8, [sp, #349]
472 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #100] // 4-byte Folded Reload
473 ; NONEON-NOSVE-NEXT: add w8, w8, w8
474 ; NONEON-NOSVE-NEXT: strb w8, [sp, #348]
475 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #104] // 4-byte Folded Reload
476 ; NONEON-NOSVE-NEXT: add w8, w8, w8
477 ; NONEON-NOSVE-NEXT: strb w8, [sp, #347]
478 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #108] // 4-byte Folded Reload
479 ; NONEON-NOSVE-NEXT: add w8, w8, w8
480 ; NONEON-NOSVE-NEXT: strb w8, [sp, #346]
481 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #112] // 4-byte Folded Reload
482 ; NONEON-NOSVE-NEXT: add w8, w8, w8
483 ; NONEON-NOSVE-NEXT: strb w8, [sp, #345]
484 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #116] // 4-byte Folded Reload
485 ; NONEON-NOSVE-NEXT: add w8, w8, w8
486 ; NONEON-NOSVE-NEXT: strb w8, [sp, #344]
487 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #120] // 4-byte Folded Reload
488 ; NONEON-NOSVE-NEXT: add w8, w8, w8
489 ; NONEON-NOSVE-NEXT: strb w8, [sp, #343]
490 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #124] // 4-byte Folded Reload
491 ; NONEON-NOSVE-NEXT: add w8, w8, w8
492 ; NONEON-NOSVE-NEXT: strb w8, [sp, #342]
493 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #128] // 4-byte Folded Reload
494 ; NONEON-NOSVE-NEXT: add w8, w8, w8
495 ; NONEON-NOSVE-NEXT: strb w8, [sp, #341]
496 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #132] // 4-byte Folded Reload
497 ; NONEON-NOSVE-NEXT: add w8, w8, w8
498 ; NONEON-NOSVE-NEXT: strb w8, [sp, #340]
499 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #136] // 4-byte Folded Reload
500 ; NONEON-NOSVE-NEXT: add w8, w8, w8
501 ; NONEON-NOSVE-NEXT: strb w8, [sp, #339]
502 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #140] // 4-byte Folded Reload
503 ; NONEON-NOSVE-NEXT: add w8, w8, w8
504 ; NONEON-NOSVE-NEXT: strb w8, [sp, #338]
505 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #144] // 4-byte Folded Reload
506 ; NONEON-NOSVE-NEXT: add w8, w8, w8
507 ; NONEON-NOSVE-NEXT: strb w8, [sp, #337]
508 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #148] // 4-byte Folded Reload
509 ; NONEON-NOSVE-NEXT: add w8, w8, w8
510 ; NONEON-NOSVE-NEXT: strb w8, [sp, #336]
511 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #152] // 8-byte Folded Reload
512 ; NONEON-NOSVE-NEXT: ldp q2, q0, [sp, #320]
513 ; NONEON-NOSVE-NEXT: stp q3, q2, [x8]
514 ; NONEON-NOSVE-NEXT: stp q0, q1, [x8, #32]
515 ; NONEON-NOSVE-NEXT: add sp, sp, #448
516 ; NONEON-NOSVE-NEXT: ret
517 %a = load <64 x i16>, ptr %in
518 %b = trunc <64 x i16> %a to <64 x i8>
519 %c = add <64 x i8> %b, %b
520 store <64 x i8> %c, ptr %out
524 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
525 define void @trunc_v128i16_v128i8(ptr %in, ptr %out) nounwind {
526 ; CHECK-LABEL: trunc_v128i16_v128i8:
528 ; CHECK-NEXT: ldp q2, q3, [x0, #192]
529 ; CHECK-NEXT: ptrue p0.b, vl8
530 ; CHECK-NEXT: ldp q4, q5, [x0]
531 ; CHECK-NEXT: ldp q6, q7, [x0, #64]
532 ; CHECK-NEXT: uzp1 z17.b, z3.b, z3.b
533 ; CHECK-NEXT: ldp q3, q18, [x0, #224]
534 ; CHECK-NEXT: uzp1 z16.b, z2.b, z2.b
535 ; CHECK-NEXT: ldp q2, q19, [x0, #128]
536 ; CHECK-NEXT: ldp q0, q1, [x0, #32]
537 ; CHECK-NEXT: uzp1 z21.b, z18.b, z18.b
538 ; CHECK-NEXT: ldp q18, q22, [x0, #160]
539 ; CHECK-NEXT: uzp1 z20.b, z3.b, z3.b
540 ; CHECK-NEXT: uzp1 z24.b, z19.b, z19.b
541 ; CHECK-NEXT: ldp q3, q19, [x0, #96]
542 ; CHECK-NEXT: uzp1 z23.b, z2.b, z2.b
543 ; CHECK-NEXT: uzp1 z26.b, z22.b, z22.b
544 ; CHECK-NEXT: splice z2.b, p0, { z16.b, z17.b }
545 ; CHECK-NEXT: uzp1 z17.b, z7.b, z7.b
546 ; CHECK-NEXT: uzp1 z25.b, z18.b, z18.b
547 ; CHECK-NEXT: splice z7.b, p0, { z20.b, z21.b }
548 ; CHECK-NEXT: uzp1 z21.b, z5.b, z5.b
549 ; CHECK-NEXT: uzp1 z19.b, z19.b, z19.b
550 ; CHECK-NEXT: uzp1 z20.b, z4.b, z4.b
551 ; CHECK-NEXT: uzp1 z5.b, z1.b, z1.b
552 ; CHECK-NEXT: uzp1 z16.b, z6.b, z6.b
553 ; CHECK-NEXT: splice z6.b, p0, { z23.b, z24.b }
554 ; CHECK-NEXT: uzp1 z18.b, z3.b, z3.b
555 ; CHECK-NEXT: splice z3.b, p0, { z25.b, z26.b }
556 ; CHECK-NEXT: uzp1 z4.b, z0.b, z0.b
557 ; CHECK-NEXT: add z0.b, z2.b, z2.b
558 ; CHECK-NEXT: add z7.b, z7.b, z7.b
559 ; CHECK-NEXT: splice z1.b, p0, { z16.b, z17.b }
560 ; CHECK-NEXT: splice z2.b, p0, { z18.b, z19.b }
561 ; CHECK-NEXT: splice z16.b, p0, { z20.b, z21.b }
562 ; CHECK-NEXT: splice z4.b, p0, { z4.b, z5.b }
563 ; CHECK-NEXT: add z6.b, z6.b, z6.b
564 ; CHECK-NEXT: add z3.b, z3.b, z3.b
565 ; CHECK-NEXT: stp q0, q7, [x1, #96]
566 ; CHECK-NEXT: add z0.b, z1.b, z1.b
567 ; CHECK-NEXT: add z1.b, z2.b, z2.b
568 ; CHECK-NEXT: add z2.b, z16.b, z16.b
569 ; CHECK-NEXT: stp q6, q3, [x1, #64]
570 ; CHECK-NEXT: add z3.b, z4.b, z4.b
571 ; CHECK-NEXT: stp q0, q1, [x1, #32]
572 ; CHECK-NEXT: stp q2, q3, [x1]
575 ; NONEON-NOSVE-LABEL: trunc_v128i16_v128i8:
576 ; NONEON-NOSVE: // %bb.0:
577 ; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #-96]! // 16-byte Folded Spill
578 ; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #16] // 16-byte Folded Spill
579 ; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #32] // 16-byte Folded Spill
580 ; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #48] // 16-byte Folded Spill
581 ; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #64] // 16-byte Folded Spill
582 ; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill
583 ; NONEON-NOSVE-NEXT: sub sp, sp, #800
584 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32]
585 ; NONEON-NOSVE-NEXT: str x1, [sp, #408] // 8-byte Folded Spill
586 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0]
587 ; NONEON-NOSVE-NEXT: ldp q5, q4, [x0, #96]
588 ; NONEON-NOSVE-NEXT: ldp q7, q6, [x0, #64]
589 ; NONEON-NOSVE-NEXT: ldp q17, q16, [x0, #192]
590 ; NONEON-NOSVE-NEXT: ldp q19, q18, [x0, #160]
591 ; NONEON-NOSVE-NEXT: ldp q21, q20, [x0, #128]
592 ; NONEON-NOSVE-NEXT: ldp q23, q22, [x0, #224]
593 ; NONEON-NOSVE-NEXT: str q0, [sp, #592]
594 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #606]
595 ; NONEON-NOSVE-NEXT: str q19, [sp, #496]
596 ; NONEON-NOSVE-NEXT: ldrh w10, [sp, #600]
597 ; NONEON-NOSVE-NEXT: stp q18, q20, [sp, #512]
598 ; NONEON-NOSVE-NEXT: ldrh w11, [sp, #598]
599 ; NONEON-NOSVE-NEXT: ldrh w12, [sp, #596]
600 ; NONEON-NOSVE-NEXT: add w8, w8, w8
601 ; NONEON-NOSVE-NEXT: stp q17, q23, [sp, #432]
602 ; NONEON-NOSVE-NEXT: ldrh w13, [sp, #594]
603 ; NONEON-NOSVE-NEXT: str w8, [sp, #64] // 4-byte Folded Spill
604 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #432]
605 ; NONEON-NOSVE-NEXT: ldrh w14, [sp, #592]
606 ; NONEON-NOSVE-NEXT: stp q22, q16, [sp, #464]
607 ; NONEON-NOSVE-NEXT: ldr w30, [sp, #64] // 4-byte Folded Reload
608 ; NONEON-NOSVE-NEXT: str w8, [sp, #404] // 4-byte Folded Spill
609 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #434]
610 ; NONEON-NOSVE-NEXT: stp q4, q6, [sp, #560]
611 ; NONEON-NOSVE-NEXT: str w8, [sp, #400] // 4-byte Folded Spill
612 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #436]
613 ; NONEON-NOSVE-NEXT: str q5, [sp, #544]
614 ; NONEON-NOSVE-NEXT: str w8, [sp, #396] // 4-byte Folded Spill
615 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #438]
616 ; NONEON-NOSVE-NEXT: stp q2, q1, [sp, #608]
617 ; NONEON-NOSVE-NEXT: str w8, [sp, #392] // 4-byte Folded Spill
618 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #440]
619 ; NONEON-NOSVE-NEXT: ldrh w15, [sp, #638]
620 ; NONEON-NOSVE-NEXT: stp q7, q21, [sp, #640]
621 ; NONEON-NOSVE-NEXT: ldrh w16, [sp, #636]
622 ; NONEON-NOSVE-NEXT: ldrh w17, [sp, #634]
623 ; NONEON-NOSVE-NEXT: str w8, [sp, #388] // 4-byte Folded Spill
624 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #442]
625 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #666]
626 ; NONEON-NOSVE-NEXT: str q3, [sp, #416]
627 ; NONEON-NOSVE-NEXT: ldrh w18, [sp, #632]
628 ; NONEON-NOSVE-NEXT: ldrh w0, [sp, #630]
629 ; NONEON-NOSVE-NEXT: str w8, [sp, #384] // 4-byte Folded Spill
630 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #444]
631 ; NONEON-NOSVE-NEXT: ldrh w1, [sp, #628]
632 ; NONEON-NOSVE-NEXT: ldrh w2, [sp, #626]
633 ; NONEON-NOSVE-NEXT: ldrh w3, [sp, #624]
634 ; NONEON-NOSVE-NEXT: ldrh w4, [sp, #622]
635 ; NONEON-NOSVE-NEXT: str w8, [sp, #380] // 4-byte Folded Spill
636 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #446]
637 ; NONEON-NOSVE-NEXT: ldrh w5, [sp, #620]
638 ; NONEON-NOSVE-NEXT: ldrh w6, [sp, #618]
639 ; NONEON-NOSVE-NEXT: ldrh w7, [sp, #616]
640 ; NONEON-NOSVE-NEXT: ldrh w19, [sp, #614]
641 ; NONEON-NOSVE-NEXT: str w8, [sp, #376] // 4-byte Folded Spill
642 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #480]
643 ; NONEON-NOSVE-NEXT: ldrh w20, [sp, #612]
644 ; NONEON-NOSVE-NEXT: ldrh w21, [sp, #610]
645 ; NONEON-NOSVE-NEXT: ldrh w22, [sp, #608]
646 ; NONEON-NOSVE-NEXT: ldrh w23, [sp, #430]
647 ; NONEON-NOSVE-NEXT: str w8, [sp, #372] // 4-byte Folded Spill
648 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #482]
649 ; NONEON-NOSVE-NEXT: ldrh w24, [sp, #428]
650 ; NONEON-NOSVE-NEXT: ldrh w25, [sp, #426]
651 ; NONEON-NOSVE-NEXT: ldrh w26, [sp, #424]
652 ; NONEON-NOSVE-NEXT: ldrh w27, [sp, #422]
653 ; NONEON-NOSVE-NEXT: str w8, [sp, #368] // 4-byte Folded Spill
654 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #484]
655 ; NONEON-NOSVE-NEXT: ldrh w28, [sp, #420]
656 ; NONEON-NOSVE-NEXT: ldrh w29, [sp, #418]
657 ; NONEON-NOSVE-NEXT: strb w30, [sp, #767]
658 ; NONEON-NOSVE-NEXT: str w8, [sp, #364] // 4-byte Folded Spill
659 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #486]
660 ; NONEON-NOSVE-NEXT: str w8, [sp, #360] // 4-byte Folded Spill
661 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #488]
662 ; NONEON-NOSVE-NEXT: str w8, [sp, #356] // 4-byte Folded Spill
663 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #490]
664 ; NONEON-NOSVE-NEXT: str w8, [sp, #352] // 4-byte Folded Spill
665 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #492]
666 ; NONEON-NOSVE-NEXT: str w8, [sp, #348] // 4-byte Folded Spill
667 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #494]
668 ; NONEON-NOSVE-NEXT: str w8, [sp, #344] // 4-byte Folded Spill
669 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #448]
670 ; NONEON-NOSVE-NEXT: str w8, [sp, #340] // 4-byte Folded Spill
671 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #450]
672 ; NONEON-NOSVE-NEXT: str w8, [sp, #336] // 4-byte Folded Spill
673 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #452]
674 ; NONEON-NOSVE-NEXT: str w8, [sp, #332] // 4-byte Folded Spill
675 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #454]
676 ; NONEON-NOSVE-NEXT: str w8, [sp, #328] // 4-byte Folded Spill
677 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #456]
678 ; NONEON-NOSVE-NEXT: str w8, [sp, #324] // 4-byte Folded Spill
679 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #458]
680 ; NONEON-NOSVE-NEXT: str w8, [sp, #320] // 4-byte Folded Spill
681 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #460]
682 ; NONEON-NOSVE-NEXT: str w8, [sp, #316] // 4-byte Folded Spill
683 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #462]
684 ; NONEON-NOSVE-NEXT: str w8, [sp, #312] // 4-byte Folded Spill
685 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #464]
686 ; NONEON-NOSVE-NEXT: str w8, [sp, #308] // 4-byte Folded Spill
687 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #466]
688 ; NONEON-NOSVE-NEXT: str w8, [sp, #304] // 4-byte Folded Spill
689 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #468]
690 ; NONEON-NOSVE-NEXT: str w8, [sp, #300] // 4-byte Folded Spill
691 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #470]
692 ; NONEON-NOSVE-NEXT: str w8, [sp, #296] // 4-byte Folded Spill
693 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #472]
694 ; NONEON-NOSVE-NEXT: str w8, [sp, #292] // 4-byte Folded Spill
695 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #474]
696 ; NONEON-NOSVE-NEXT: str w8, [sp, #288] // 4-byte Folded Spill
697 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #476]
698 ; NONEON-NOSVE-NEXT: str w8, [sp, #284] // 4-byte Folded Spill
699 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #478]
700 ; NONEON-NOSVE-NEXT: str w8, [sp, #280] // 4-byte Folded Spill
701 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #656]
702 ; NONEON-NOSVE-NEXT: str w8, [sp, #276] // 4-byte Folded Spill
703 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #658]
704 ; NONEON-NOSVE-NEXT: str w8, [sp, #272] // 4-byte Folded Spill
705 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #660]
706 ; NONEON-NOSVE-NEXT: str w8, [sp, #268] // 4-byte Folded Spill
707 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #662]
708 ; NONEON-NOSVE-NEXT: str w8, [sp, #264] // 4-byte Folded Spill
709 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #664]
710 ; NONEON-NOSVE-NEXT: str w8, [sp, #260] // 4-byte Folded Spill
711 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #668]
712 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #252] // 8-byte Folded Spill
713 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #670]
714 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #528]
715 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #244] // 8-byte Folded Spill
716 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #530]
717 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #532]
718 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #236] // 8-byte Folded Spill
719 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #534]
720 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #536]
721 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #228] // 8-byte Folded Spill
722 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #538]
723 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #540]
724 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #220] // 8-byte Folded Spill
725 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #542]
726 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #496]
727 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #212] // 8-byte Folded Spill
728 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #498]
729 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #500]
730 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #204] // 8-byte Folded Spill
731 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #502]
732 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #504]
733 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #196] // 8-byte Folded Spill
734 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #506]
735 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #508]
736 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #188] // 8-byte Folded Spill
737 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #510]
738 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #512]
739 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #180] // 8-byte Folded Spill
740 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #514]
741 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #516]
742 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #172] // 8-byte Folded Spill
743 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #518]
744 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #520]
745 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #164] // 8-byte Folded Spill
746 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #522]
747 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #524]
748 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #156] // 8-byte Folded Spill
749 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #526]
750 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #640]
751 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #148] // 8-byte Folded Spill
752 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #642]
753 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #644]
754 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #140] // 8-byte Folded Spill
755 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #646]
756 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #648]
757 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #132] // 8-byte Folded Spill
758 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #650]
759 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #652]
760 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #124] // 8-byte Folded Spill
761 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #654]
762 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #576]
763 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #116] // 8-byte Folded Spill
764 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #578]
765 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #580]
766 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #108] // 8-byte Folded Spill
767 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #582]
768 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #584]
769 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #100] // 8-byte Folded Spill
770 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #586]
771 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #588]
772 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #92] // 8-byte Folded Spill
773 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #590]
774 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #544]
775 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #84] // 8-byte Folded Spill
776 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #546]
777 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #548]
778 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #76] // 8-byte Folded Spill
779 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #550]
780 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #552]
781 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #68] // 8-byte Folded Spill
782 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #554]
783 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #556]
784 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] // 8-byte Folded Spill
785 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #558]
786 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #560]
787 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] // 8-byte Folded Spill
788 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #562]
789 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #564]
790 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] // 8-byte Folded Spill
791 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #566]
792 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #568]
793 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] // 8-byte Folded Spill
794 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #570]
795 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #572]
796 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] // 8-byte Folded Spill
797 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #574]
798 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #416]
799 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] // 8-byte Folded Spill
800 ; NONEON-NOSVE-NEXT: ldrh w8, [sp, #602]
801 ; NONEON-NOSVE-NEXT: ldrh w9, [sp, #604]
802 ; NONEON-NOSVE-NEXT: add w8, w8, w8
803 ; NONEON-NOSVE-NEXT: add w9, w9, w9
804 ; NONEON-NOSVE-NEXT: strb w8, [sp, #765]
805 ; NONEON-NOSVE-NEXT: add w8, w10, w10
806 ; NONEON-NOSVE-NEXT: strb w8, [sp, #764]
807 ; NONEON-NOSVE-NEXT: add w8, w11, w11
808 ; NONEON-NOSVE-NEXT: strb w8, [sp, #763]
809 ; NONEON-NOSVE-NEXT: add w8, w12, w12
810 ; NONEON-NOSVE-NEXT: strb w8, [sp, #762]
811 ; NONEON-NOSVE-NEXT: add w8, w13, w13
812 ; NONEON-NOSVE-NEXT: strb w8, [sp, #761]
813 ; NONEON-NOSVE-NEXT: add w8, w14, w14
814 ; NONEON-NOSVE-NEXT: strb w8, [sp, #760]
815 ; NONEON-NOSVE-NEXT: add w8, w15, w15
816 ; NONEON-NOSVE-NEXT: strb w8, [sp, #759]
817 ; NONEON-NOSVE-NEXT: add w8, w16, w16
818 ; NONEON-NOSVE-NEXT: strb w8, [sp, #758]
819 ; NONEON-NOSVE-NEXT: add w8, w17, w17
820 ; NONEON-NOSVE-NEXT: strb w8, [sp, #757]
821 ; NONEON-NOSVE-NEXT: add w8, w18, w18
822 ; NONEON-NOSVE-NEXT: strb w8, [sp, #756]
823 ; NONEON-NOSVE-NEXT: add w8, w0, w0
824 ; NONEON-NOSVE-NEXT: strb w8, [sp, #755]
825 ; NONEON-NOSVE-NEXT: add w8, w1, w1
826 ; NONEON-NOSVE-NEXT: strb w8, [sp, #754]
827 ; NONEON-NOSVE-NEXT: add w8, w2, w2
828 ; NONEON-NOSVE-NEXT: strb w8, [sp, #753]
829 ; NONEON-NOSVE-NEXT: add w8, w3, w3
830 ; NONEON-NOSVE-NEXT: strb w8, [sp, #752]
831 ; NONEON-NOSVE-NEXT: add w8, w4, w4
832 ; NONEON-NOSVE-NEXT: strb w8, [sp, #751]
833 ; NONEON-NOSVE-NEXT: add w8, w5, w5
834 ; NONEON-NOSVE-NEXT: strb w8, [sp, #750]
835 ; NONEON-NOSVE-NEXT: add w8, w6, w6
836 ; NONEON-NOSVE-NEXT: strb w8, [sp, #749]
837 ; NONEON-NOSVE-NEXT: add w8, w7, w7
838 ; NONEON-NOSVE-NEXT: strb w8, [sp, #748]
839 ; NONEON-NOSVE-NEXT: add w8, w19, w19
840 ; NONEON-NOSVE-NEXT: strb w8, [sp, #747]
841 ; NONEON-NOSVE-NEXT: add w8, w20, w20
842 ; NONEON-NOSVE-NEXT: strb w8, [sp, #746]
843 ; NONEON-NOSVE-NEXT: add w8, w21, w21
844 ; NONEON-NOSVE-NEXT: strb w8, [sp, #745]
845 ; NONEON-NOSVE-NEXT: add w8, w22, w22
846 ; NONEON-NOSVE-NEXT: strb w8, [sp, #744]
847 ; NONEON-NOSVE-NEXT: add w8, w23, w23
848 ; NONEON-NOSVE-NEXT: strb w8, [sp, #743]
849 ; NONEON-NOSVE-NEXT: add w8, w24, w24
850 ; NONEON-NOSVE-NEXT: strb w8, [sp, #742]
851 ; NONEON-NOSVE-NEXT: add w8, w25, w25
852 ; NONEON-NOSVE-NEXT: strb w8, [sp, #741]
853 ; NONEON-NOSVE-NEXT: add w8, w26, w26
854 ; NONEON-NOSVE-NEXT: strb w8, [sp, #740]
855 ; NONEON-NOSVE-NEXT: add w8, w27, w27
856 ; NONEON-NOSVE-NEXT: strb w8, [sp, #739]
857 ; NONEON-NOSVE-NEXT: add w8, w28, w28
858 ; NONEON-NOSVE-NEXT: strb w8, [sp, #738]
859 ; NONEON-NOSVE-NEXT: add w8, w29, w29
860 ; NONEON-NOSVE-NEXT: strb w8, [sp, #737]
861 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] // 4-byte Folded Reload
862 ; NONEON-NOSVE-NEXT: strb w9, [sp, #766]
863 ; NONEON-NOSVE-NEXT: add w8, w8, w8
864 ; NONEON-NOSVE-NEXT: strb w8, [sp, #736]
865 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] // 4-byte Folded Reload
866 ; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #736]
867 ; NONEON-NOSVE-NEXT: add w8, w8, w8
868 ; NONEON-NOSVE-NEXT: strb w8, [sp, #735]
869 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] // 4-byte Folded Reload
870 ; NONEON-NOSVE-NEXT: add w8, w8, w8
871 ; NONEON-NOSVE-NEXT: strb w8, [sp, #734]
872 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] // 4-byte Folded Reload
873 ; NONEON-NOSVE-NEXT: add w8, w8, w8
874 ; NONEON-NOSVE-NEXT: strb w8, [sp, #733]
875 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #32] // 4-byte Folded Reload
876 ; NONEON-NOSVE-NEXT: add w8, w8, w8
877 ; NONEON-NOSVE-NEXT: strb w8, [sp, #732]
878 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #36] // 4-byte Folded Reload
879 ; NONEON-NOSVE-NEXT: add w8, w8, w8
880 ; NONEON-NOSVE-NEXT: strb w8, [sp, #731]
881 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #40] // 4-byte Folded Reload
882 ; NONEON-NOSVE-NEXT: add w8, w8, w8
883 ; NONEON-NOSVE-NEXT: strb w8, [sp, #730]
884 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #44] // 4-byte Folded Reload
885 ; NONEON-NOSVE-NEXT: add w8, w8, w8
886 ; NONEON-NOSVE-NEXT: strb w8, [sp, #729]
887 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] // 4-byte Folded Reload
888 ; NONEON-NOSVE-NEXT: add w8, w8, w8
889 ; NONEON-NOSVE-NEXT: strb w8, [sp, #728]
890 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] // 4-byte Folded Reload
891 ; NONEON-NOSVE-NEXT: add w8, w8, w8
892 ; NONEON-NOSVE-NEXT: strb w8, [sp, #727]
893 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] // 4-byte Folded Reload
894 ; NONEON-NOSVE-NEXT: add w8, w8, w8
895 ; NONEON-NOSVE-NEXT: strb w8, [sp, #726]
896 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] // 4-byte Folded Reload
897 ; NONEON-NOSVE-NEXT: add w8, w8, w8
898 ; NONEON-NOSVE-NEXT: strb w8, [sp, #725]
899 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #68] // 4-byte Folded Reload
900 ; NONEON-NOSVE-NEXT: add w8, w8, w8
901 ; NONEON-NOSVE-NEXT: strb w8, [sp, #724]
902 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #72] // 4-byte Folded Reload
903 ; NONEON-NOSVE-NEXT: add w8, w8, w8
904 ; NONEON-NOSVE-NEXT: strb w8, [sp, #723]
905 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #76] // 4-byte Folded Reload
906 ; NONEON-NOSVE-NEXT: add w8, w8, w8
907 ; NONEON-NOSVE-NEXT: strb w8, [sp, #722]
908 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #80] // 4-byte Folded Reload
909 ; NONEON-NOSVE-NEXT: add w8, w8, w8
910 ; NONEON-NOSVE-NEXT: strb w8, [sp, #721]
911 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #84] // 4-byte Folded Reload
912 ; NONEON-NOSVE-NEXT: add w8, w8, w8
913 ; NONEON-NOSVE-NEXT: strb w8, [sp, #720]
914 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #88] // 4-byte Folded Reload
915 ; NONEON-NOSVE-NEXT: add w8, w8, w8
916 ; NONEON-NOSVE-NEXT: strb w8, [sp, #783]
917 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #92] // 4-byte Folded Reload
918 ; NONEON-NOSVE-NEXT: add w8, w8, w8
919 ; NONEON-NOSVE-NEXT: strb w8, [sp, #782]
920 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #96] // 4-byte Folded Reload
921 ; NONEON-NOSVE-NEXT: add w8, w8, w8
922 ; NONEON-NOSVE-NEXT: strb w8, [sp, #781]
923 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #100] // 4-byte Folded Reload
924 ; NONEON-NOSVE-NEXT: add w8, w8, w8
925 ; NONEON-NOSVE-NEXT: strb w8, [sp, #780]
926 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #104] // 4-byte Folded Reload
927 ; NONEON-NOSVE-NEXT: add w8, w8, w8
928 ; NONEON-NOSVE-NEXT: strb w8, [sp, #779]
929 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #108] // 4-byte Folded Reload
930 ; NONEON-NOSVE-NEXT: add w8, w8, w8
931 ; NONEON-NOSVE-NEXT: strb w8, [sp, #778]
932 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #112] // 4-byte Folded Reload
933 ; NONEON-NOSVE-NEXT: add w8, w8, w8
934 ; NONEON-NOSVE-NEXT: strb w8, [sp, #777]
935 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #116] // 4-byte Folded Reload
936 ; NONEON-NOSVE-NEXT: add w8, w8, w8
937 ; NONEON-NOSVE-NEXT: strb w8, [sp, #776]
938 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #120] // 4-byte Folded Reload
939 ; NONEON-NOSVE-NEXT: add w8, w8, w8
940 ; NONEON-NOSVE-NEXT: strb w8, [sp, #775]
941 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #124] // 4-byte Folded Reload
942 ; NONEON-NOSVE-NEXT: add w8, w8, w8
943 ; NONEON-NOSVE-NEXT: strb w8, [sp, #774]
944 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #128] // 4-byte Folded Reload
945 ; NONEON-NOSVE-NEXT: add w8, w8, w8
946 ; NONEON-NOSVE-NEXT: strb w8, [sp, #773]
947 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #132] // 4-byte Folded Reload
948 ; NONEON-NOSVE-NEXT: add w8, w8, w8
949 ; NONEON-NOSVE-NEXT: strb w8, [sp, #772]
950 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #136] // 4-byte Folded Reload
951 ; NONEON-NOSVE-NEXT: add w8, w8, w8
952 ; NONEON-NOSVE-NEXT: strb w8, [sp, #771]
953 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #140] // 4-byte Folded Reload
954 ; NONEON-NOSVE-NEXT: add w8, w8, w8
955 ; NONEON-NOSVE-NEXT: strb w8, [sp, #770]
956 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #144] // 4-byte Folded Reload
957 ; NONEON-NOSVE-NEXT: add w8, w8, w8
958 ; NONEON-NOSVE-NEXT: strb w8, [sp, #769]
959 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #148] // 4-byte Folded Reload
960 ; NONEON-NOSVE-NEXT: add w8, w8, w8
961 ; NONEON-NOSVE-NEXT: strb w8, [sp, #768]
962 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #152] // 4-byte Folded Reload
963 ; NONEON-NOSVE-NEXT: add w8, w8, w8
964 ; NONEON-NOSVE-NEXT: strb w8, [sp, #719]
965 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #156] // 4-byte Folded Reload
966 ; NONEON-NOSVE-NEXT: add w8, w8, w8
967 ; NONEON-NOSVE-NEXT: strb w8, [sp, #718]
968 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #160] // 4-byte Folded Reload
969 ; NONEON-NOSVE-NEXT: add w8, w8, w8
970 ; NONEON-NOSVE-NEXT: strb w8, [sp, #717]
971 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #164] // 4-byte Folded Reload
972 ; NONEON-NOSVE-NEXT: add w8, w8, w8
973 ; NONEON-NOSVE-NEXT: strb w8, [sp, #716]
974 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #168] // 4-byte Folded Reload
975 ; NONEON-NOSVE-NEXT: add w8, w8, w8
976 ; NONEON-NOSVE-NEXT: strb w8, [sp, #715]
977 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #172] // 4-byte Folded Reload
978 ; NONEON-NOSVE-NEXT: add w8, w8, w8
979 ; NONEON-NOSVE-NEXT: strb w8, [sp, #714]
980 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #176] // 4-byte Folded Reload
981 ; NONEON-NOSVE-NEXT: add w8, w8, w8
982 ; NONEON-NOSVE-NEXT: strb w8, [sp, #713]
983 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #180] // 4-byte Folded Reload
984 ; NONEON-NOSVE-NEXT: add w8, w8, w8
985 ; NONEON-NOSVE-NEXT: strb w8, [sp, #712]
986 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #184] // 4-byte Folded Reload
987 ; NONEON-NOSVE-NEXT: add w8, w8, w8
988 ; NONEON-NOSVE-NEXT: strb w8, [sp, #711]
989 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #188] // 4-byte Folded Reload
990 ; NONEON-NOSVE-NEXT: add w8, w8, w8
991 ; NONEON-NOSVE-NEXT: strb w8, [sp, #710]
992 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #192] // 4-byte Folded Reload
993 ; NONEON-NOSVE-NEXT: add w8, w8, w8
994 ; NONEON-NOSVE-NEXT: strb w8, [sp, #709]
995 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #196] // 4-byte Folded Reload
996 ; NONEON-NOSVE-NEXT: add w8, w8, w8
997 ; NONEON-NOSVE-NEXT: strb w8, [sp, #708]
998 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #200] // 4-byte Folded Reload
999 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1000 ; NONEON-NOSVE-NEXT: strb w8, [sp, #707]
1001 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #204] // 4-byte Folded Reload
1002 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1003 ; NONEON-NOSVE-NEXT: strb w8, [sp, #706]
1004 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #208] // 4-byte Folded Reload
1005 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1006 ; NONEON-NOSVE-NEXT: strb w8, [sp, #705]
1007 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #212] // 4-byte Folded Reload
1008 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1009 ; NONEON-NOSVE-NEXT: strb w8, [sp, #704]
1010 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #216] // 4-byte Folded Reload
1011 ; NONEON-NOSVE-NEXT: ldp q6, q3, [sp, #704]
1012 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1013 ; NONEON-NOSVE-NEXT: strb w8, [sp, #799]
1014 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #220] // 4-byte Folded Reload
1015 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1016 ; NONEON-NOSVE-NEXT: strb w8, [sp, #798]
1017 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #224] // 4-byte Folded Reload
1018 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1019 ; NONEON-NOSVE-NEXT: strb w8, [sp, #797]
1020 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #228] // 4-byte Folded Reload
1021 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1022 ; NONEON-NOSVE-NEXT: strb w8, [sp, #796]
1023 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #232] // 4-byte Folded Reload
1024 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1025 ; NONEON-NOSVE-NEXT: strb w8, [sp, #795]
1026 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #236] // 4-byte Folded Reload
1027 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1028 ; NONEON-NOSVE-NEXT: strb w8, [sp, #794]
1029 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #240] // 4-byte Folded Reload
1030 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1031 ; NONEON-NOSVE-NEXT: strb w8, [sp, #793]
1032 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #244] // 4-byte Folded Reload
1033 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1034 ; NONEON-NOSVE-NEXT: strb w8, [sp, #792]
1035 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #248] // 4-byte Folded Reload
1036 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1037 ; NONEON-NOSVE-NEXT: strb w8, [sp, #791]
1038 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #252] // 4-byte Folded Reload
1039 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1040 ; NONEON-NOSVE-NEXT: strb w8, [sp, #790]
1041 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #256] // 4-byte Folded Reload
1042 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1043 ; NONEON-NOSVE-NEXT: strb w8, [sp, #789]
1044 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #260] // 4-byte Folded Reload
1045 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1046 ; NONEON-NOSVE-NEXT: strb w8, [sp, #788]
1047 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #264] // 4-byte Folded Reload
1048 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1049 ; NONEON-NOSVE-NEXT: strb w8, [sp, #787]
1050 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #268] // 4-byte Folded Reload
1051 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1052 ; NONEON-NOSVE-NEXT: strb w8, [sp, #786]
1053 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #272] // 4-byte Folded Reload
1054 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1055 ; NONEON-NOSVE-NEXT: strb w8, [sp, #785]
1056 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #276] // 4-byte Folded Reload
1057 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1058 ; NONEON-NOSVE-NEXT: strb w8, [sp, #784]
1059 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #280] // 4-byte Folded Reload
1060 ; NONEON-NOSVE-NEXT: ldp q4, q7, [sp, #768]
1061 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1062 ; NONEON-NOSVE-NEXT: strb w8, [sp, #687]
1063 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #284] // 4-byte Folded Reload
1064 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1065 ; NONEON-NOSVE-NEXT: strb w8, [sp, #686]
1066 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #288] // 4-byte Folded Reload
1067 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1068 ; NONEON-NOSVE-NEXT: strb w8, [sp, #685]
1069 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #292] // 4-byte Folded Reload
1070 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1071 ; NONEON-NOSVE-NEXT: strb w8, [sp, #684]
1072 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #296] // 4-byte Folded Reload
1073 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1074 ; NONEON-NOSVE-NEXT: strb w8, [sp, #683]
1075 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #300] // 4-byte Folded Reload
1076 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1077 ; NONEON-NOSVE-NEXT: strb w8, [sp, #682]
1078 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #304] // 4-byte Folded Reload
1079 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1080 ; NONEON-NOSVE-NEXT: strb w8, [sp, #681]
1081 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #308] // 4-byte Folded Reload
1082 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1083 ; NONEON-NOSVE-NEXT: strb w8, [sp, #680]
1084 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #312] // 4-byte Folded Reload
1085 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1086 ; NONEON-NOSVE-NEXT: strb w8, [sp, #679]
1087 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #316] // 4-byte Folded Reload
1088 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1089 ; NONEON-NOSVE-NEXT: strb w8, [sp, #678]
1090 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #320] // 4-byte Folded Reload
1091 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1092 ; NONEON-NOSVE-NEXT: strb w8, [sp, #677]
1093 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #324] // 4-byte Folded Reload
1094 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1095 ; NONEON-NOSVE-NEXT: strb w8, [sp, #676]
1096 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #328] // 4-byte Folded Reload
1097 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1098 ; NONEON-NOSVE-NEXT: strb w8, [sp, #675]
1099 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #332] // 4-byte Folded Reload
1100 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1101 ; NONEON-NOSVE-NEXT: strb w8, [sp, #674]
1102 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #336] // 4-byte Folded Reload
1103 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1104 ; NONEON-NOSVE-NEXT: strb w8, [sp, #673]
1105 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #340] // 4-byte Folded Reload
1106 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1107 ; NONEON-NOSVE-NEXT: strb w8, [sp, #672]
1108 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #344] // 4-byte Folded Reload
1109 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1110 ; NONEON-NOSVE-NEXT: strb w8, [sp, #703]
1111 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #348] // 4-byte Folded Reload
1112 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1113 ; NONEON-NOSVE-NEXT: strb w8, [sp, #702]
1114 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #352] // 4-byte Folded Reload
1115 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1116 ; NONEON-NOSVE-NEXT: strb w8, [sp, #701]
1117 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #356] // 4-byte Folded Reload
1118 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1119 ; NONEON-NOSVE-NEXT: strb w8, [sp, #700]
1120 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #360] // 4-byte Folded Reload
1121 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1122 ; NONEON-NOSVE-NEXT: strb w8, [sp, #699]
1123 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #364] // 4-byte Folded Reload
1124 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1125 ; NONEON-NOSVE-NEXT: strb w8, [sp, #698]
1126 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #368] // 4-byte Folded Reload
1127 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1128 ; NONEON-NOSVE-NEXT: strb w8, [sp, #697]
1129 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #372] // 4-byte Folded Reload
1130 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1131 ; NONEON-NOSVE-NEXT: strb w8, [sp, #696]
1132 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #376] // 4-byte Folded Reload
1133 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1134 ; NONEON-NOSVE-NEXT: strb w8, [sp, #695]
1135 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #380] // 4-byte Folded Reload
1136 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1137 ; NONEON-NOSVE-NEXT: strb w8, [sp, #694]
1138 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #384] // 4-byte Folded Reload
1139 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1140 ; NONEON-NOSVE-NEXT: strb w8, [sp, #693]
1141 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #388] // 4-byte Folded Reload
1142 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1143 ; NONEON-NOSVE-NEXT: strb w8, [sp, #692]
1144 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #392] // 4-byte Folded Reload
1145 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1146 ; NONEON-NOSVE-NEXT: strb w8, [sp, #691]
1147 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #396] // 4-byte Folded Reload
1148 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1149 ; NONEON-NOSVE-NEXT: strb w8, [sp, #690]
1150 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #400] // 4-byte Folded Reload
1151 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1152 ; NONEON-NOSVE-NEXT: strb w8, [sp, #689]
1153 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #404] // 4-byte Folded Reload
1154 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1155 ; NONEON-NOSVE-NEXT: strb w8, [sp, #688]
1156 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #408] // 8-byte Folded Reload
1157 ; NONEON-NOSVE-NEXT: ldp q5, q2, [sp, #672]
1158 ; NONEON-NOSVE-NEXT: stp q1, q0, [x8]
1159 ; NONEON-NOSVE-NEXT: stp q4, q3, [x8, #32]
1160 ; NONEON-NOSVE-NEXT: stp q7, q6, [x8, #64]
1161 ; NONEON-NOSVE-NEXT: stp q2, q5, [x8, #96]
1162 ; NONEON-NOSVE-NEXT: add sp, sp, #800
1163 ; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload
1164 ; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #64] // 16-byte Folded Reload
1165 ; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #48] // 16-byte Folded Reload
1166 ; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #32] // 16-byte Folded Reload
1167 ; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #16] // 16-byte Folded Reload
1168 ; NONEON-NOSVE-NEXT: ldp x29, x30, [sp], #96 // 16-byte Folded Reload
1169 ; NONEON-NOSVE-NEXT: ret
1170 %a = load <128 x i16>, ptr %in
1171 %b = trunc <128 x i16> %a to <128 x i8>
1172 %c = add <128 x i8> %b, %b
1173 store <128 x i8> %c, ptr %out
1178 ; truncate i32 -> i8
1181 define <8 x i8> @trunc_v8i32_v8i8(ptr %in) nounwind {
1182 ; CHECK-LABEL: trunc_v8i32_v8i8:
1184 ; CHECK-NEXT: ldp q1, q0, [x0]
1185 ; CHECK-NEXT: ptrue p0.h, vl4
1186 ; CHECK-NEXT: uzp1 z3.h, z0.h, z0.h
1187 ; CHECK-NEXT: uzp1 z2.h, z1.h, z1.h
1188 ; CHECK-NEXT: splice z0.h, p0, { z2.h, z3.h }
1189 ; CHECK-NEXT: uzp1 z0.b, z0.b, z0.b
1190 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
1193 ; NONEON-NOSVE-LABEL: trunc_v8i32_v8i8:
1194 ; NONEON-NOSVE: // %bb.0:
1195 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]
1196 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!
1197 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24]
1198 ; NONEON-NOSVE-NEXT: strb w9, [sp, #47]
1199 ; NONEON-NOSVE-NEXT: strb w8, [sp, #46]
1200 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16]
1201 ; NONEON-NOSVE-NEXT: strb w9, [sp, #45]
1202 ; NONEON-NOSVE-NEXT: strb w8, [sp, #44]
1203 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]
1204 ; NONEON-NOSVE-NEXT: strb w9, [sp, #43]
1205 ; NONEON-NOSVE-NEXT: strb w8, [sp, #42]
1206 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]
1207 ; NONEON-NOSVE-NEXT: strb w9, [sp, #41]
1208 ; NONEON-NOSVE-NEXT: strb w8, [sp, #40]
1209 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #40]
1210 ; NONEON-NOSVE-NEXT: add sp, sp, #48
1211 ; NONEON-NOSVE-NEXT: ret
1212 %a = load <8 x i32>, ptr %in
1213 %b = trunc <8 x i32> %a to <8 x i8>
1217 define <16 x i8> @trunc_v16i32_v16i8(ptr %in) nounwind {
1218 ; CHECK-LABEL: trunc_v16i32_v16i8:
1220 ; CHECK-NEXT: ldp q1, q0, [x0, #32]
1221 ; CHECK-NEXT: ptrue p0.h, vl4
1222 ; CHECK-NEXT: ldp q3, q2, [x0]
1223 ; CHECK-NEXT: uzp1 z5.h, z0.h, z0.h
1224 ; CHECK-NEXT: uzp1 z4.h, z1.h, z1.h
1225 ; CHECK-NEXT: uzp1 z1.h, z2.h, z2.h
1226 ; CHECK-NEXT: uzp1 z0.h, z3.h, z3.h
1227 ; CHECK-NEXT: splice z2.h, p0, { z4.h, z5.h }
1228 ; CHECK-NEXT: splice z0.h, p0, { z0.h, z1.h }
1229 ; CHECK-NEXT: ptrue p0.b, vl8
1230 ; CHECK-NEXT: uzp1 z2.b, z2.b, z2.b
1231 ; CHECK-NEXT: uzp1 z1.b, z0.b, z0.b
1232 ; CHECK-NEXT: splice z0.b, p0, { z1.b, z2.b }
1233 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
1236 ; NONEON-NOSVE-LABEL: trunc_v16i32_v16i8:
1237 ; NONEON-NOSVE: // %bb.0:
1238 ; NONEON-NOSVE-NEXT: sub sp, sp, #80
1239 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32]
1240 ; NONEON-NOSVE-NEXT: ldp q2, q3, [x0]
1241 ; NONEON-NOSVE-NEXT: str q1, [sp, #48]
1242 ; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #16]
1243 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24]
1244 ; NONEON-NOSVE-NEXT: str q2, [sp]
1245 ; NONEON-NOSVE-NEXT: strb w9, [sp, #79]
1246 ; NONEON-NOSVE-NEXT: strb w8, [sp, #78]
1247 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16]
1248 ; NONEON-NOSVE-NEXT: strb w9, [sp, #77]
1249 ; NONEON-NOSVE-NEXT: strb w8, [sp, #76]
1250 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #56]
1251 ; NONEON-NOSVE-NEXT: strb w9, [sp, #75]
1252 ; NONEON-NOSVE-NEXT: strb w8, [sp, #74]
1253 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #48]
1254 ; NONEON-NOSVE-NEXT: strb w9, [sp, #73]
1255 ; NONEON-NOSVE-NEXT: strb w8, [sp, #72]
1256 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #40]
1257 ; NONEON-NOSVE-NEXT: strb w9, [sp, #71]
1258 ; NONEON-NOSVE-NEXT: strb w8, [sp, #70]
1259 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #32]
1260 ; NONEON-NOSVE-NEXT: strb w9, [sp, #69]
1261 ; NONEON-NOSVE-NEXT: strb w8, [sp, #68]
1262 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]
1263 ; NONEON-NOSVE-NEXT: strb w9, [sp, #67]
1264 ; NONEON-NOSVE-NEXT: strb w8, [sp, #66]
1265 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]
1266 ; NONEON-NOSVE-NEXT: strb w9, [sp, #65]
1267 ; NONEON-NOSVE-NEXT: strb w8, [sp, #64]
1268 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #64]
1269 ; NONEON-NOSVE-NEXT: add sp, sp, #80
1270 ; NONEON-NOSVE-NEXT: ret
1271 %a = load <16 x i32>, ptr %in
1272 %b = trunc <16 x i32> %a to <16 x i8>
1276 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
1277 define void @trunc_v32i32_v32i8(ptr %in, ptr %out) nounwind {
1278 ; CHECK-LABEL: trunc_v32i32_v32i8:
1280 ; CHECK-NEXT: ldp q0, q1, [x0, #96]
1281 ; CHECK-NEXT: ptrue p0.h, vl4
1282 ; CHECK-NEXT: ldp q2, q3, [x0, #32]
1283 ; CHECK-NEXT: ldp q4, q5, [x0, #64]
1284 ; CHECK-NEXT: ldp q6, q7, [x0]
1285 ; CHECK-NEXT: uzp1 z17.h, z1.h, z1.h
1286 ; CHECK-NEXT: uzp1 z16.h, z0.h, z0.h
1287 ; CHECK-NEXT: uzp1 z1.h, z3.h, z3.h
1288 ; CHECK-NEXT: uzp1 z19.h, z5.h, z5.h
1289 ; CHECK-NEXT: uzp1 z0.h, z2.h, z2.h
1290 ; CHECK-NEXT: uzp1 z3.h, z7.h, z7.h
1291 ; CHECK-NEXT: uzp1 z18.h, z4.h, z4.h
1292 ; CHECK-NEXT: uzp1 z2.h, z6.h, z6.h
1293 ; CHECK-NEXT: splice z4.h, p0, { z16.h, z17.h }
1294 ; CHECK-NEXT: splice z0.h, p0, { z0.h, z1.h }
1295 ; CHECK-NEXT: splice z5.h, p0, { z18.h, z19.h }
1296 ; CHECK-NEXT: splice z1.h, p0, { z2.h, z3.h }
1297 ; CHECK-NEXT: ptrue p0.b, vl8
1298 ; CHECK-NEXT: uzp1 z3.b, z4.b, z4.b
1299 ; CHECK-NEXT: uzp1 z7.b, z0.b, z0.b
1300 ; CHECK-NEXT: uzp1 z2.b, z5.b, z5.b
1301 ; CHECK-NEXT: uzp1 z6.b, z1.b, z1.b
1302 ; CHECK-NEXT: splice z0.b, p0, { z2.b, z3.b }
1303 ; CHECK-NEXT: splice z1.b, p0, { z6.b, z7.b }
1304 ; CHECK-NEXT: add z0.b, z0.b, z0.b
1305 ; CHECK-NEXT: add z1.b, z1.b, z1.b
1306 ; CHECK-NEXT: stp q1, q0, [x1]
1309 ; NONEON-NOSVE-LABEL: trunc_v32i32_v32i8:
1310 ; NONEON-NOSVE: // %bb.0:
1311 ; NONEON-NOSVE-NEXT: sub sp, sp, #272
1312 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #32]
1313 ; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #192] // 16-byte Folded Spill
1314 ; NONEON-NOSVE-NEXT: ldp q5, q4, [x0]
1315 ; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #208] // 16-byte Folded Spill
1316 ; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #224] // 16-byte Folded Spill
1317 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #64]
1318 ; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #240] // 16-byte Folded Spill
1319 ; NONEON-NOSVE-NEXT: ldp q7, q6, [x0, #96]
1320 ; NONEON-NOSVE-NEXT: stp q2, q4, [sp, #80]
1321 ; NONEON-NOSVE-NEXT: stp q3, q1, [sp, #112]
1322 ; NONEON-NOSVE-NEXT: stp q5, q7, [sp, #16]
1323 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #88]
1324 ; NONEON-NOSVE-NEXT: ldp w27, w28, [sp, #112]
1325 ; NONEON-NOSVE-NEXT: ldp w25, w26, [sp, #104]
1326 ; NONEON-NOSVE-NEXT: add w6, w8, w8
1327 ; NONEON-NOSVE-NEXT: add w5, w9, w9
1328 ; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #256] // 16-byte Folded Spill
1329 ; NONEON-NOSVE-NEXT: ldp w10, w8, [sp, #128]
1330 ; NONEON-NOSVE-NEXT: ldp w23, w24, [sp, #96]
1331 ; NONEON-NOSVE-NEXT: ldp w21, w22, [sp, #24]
1332 ; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #8] // 8-byte Folded Spill
1333 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #120]
1334 ; NONEON-NOSVE-NEXT: stp q6, q0, [sp, #48]
1335 ; NONEON-NOSVE-NEXT: ldp w19, w20, [sp, #16]
1336 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1337 ; NONEON-NOSVE-NEXT: add w9, w9, w9
1338 ; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #176] // 16-byte Folded Spill
1339 ; NONEON-NOSVE-NEXT: strb w8, [sp, #155]
1340 ; NONEON-NOSVE-NEXT: add w8, w28, w28
1341 ; NONEON-NOSVE-NEXT: strb w9, [sp, #154]
1342 ; NONEON-NOSVE-NEXT: add w9, w27, w27
1343 ; NONEON-NOSVE-NEXT: strb w8, [sp, #153]
1344 ; NONEON-NOSVE-NEXT: add w8, w26, w26
1345 ; NONEON-NOSVE-NEXT: strb w9, [sp, #152]
1346 ; NONEON-NOSVE-NEXT: add w9, w25, w25
1347 ; NONEON-NOSVE-NEXT: ldp w4, w7, [sp, #56]
1348 ; NONEON-NOSVE-NEXT: strb w8, [sp, #151]
1349 ; NONEON-NOSVE-NEXT: add w8, w24, w24
1350 ; NONEON-NOSVE-NEXT: strb w9, [sp, #150]
1351 ; NONEON-NOSVE-NEXT: add w9, w23, w23
1352 ; NONEON-NOSVE-NEXT: ldp w2, w3, [sp, #48]
1353 ; NONEON-NOSVE-NEXT: strb w8, [sp, #149]
1354 ; NONEON-NOSVE-NEXT: add w8, w22, w22
1355 ; NONEON-NOSVE-NEXT: strb w9, [sp, #148]
1356 ; NONEON-NOSVE-NEXT: add w9, w21, w21
1357 ; NONEON-NOSVE-NEXT: ldp w18, w0, [sp, #40]
1358 ; NONEON-NOSVE-NEXT: strb w8, [sp, #147]
1359 ; NONEON-NOSVE-NEXT: add w8, w20, w20
1360 ; NONEON-NOSVE-NEXT: strb w9, [sp, #146]
1361 ; NONEON-NOSVE-NEXT: add w9, w19, w19
1362 ; NONEON-NOSVE-NEXT: ldp w16, w17, [sp, #32]
1363 ; NONEON-NOSVE-NEXT: strb w8, [sp, #145]
1364 ; NONEON-NOSVE-NEXT: add w8, w7, w7
1365 ; NONEON-NOSVE-NEXT: strb w9, [sp, #144]
1366 ; NONEON-NOSVE-NEXT: add w9, w4, w4
1367 ; NONEON-NOSVE-NEXT: ldp w14, w15, [sp, #72]
1368 ; NONEON-NOSVE-NEXT: strb w8, [sp, #175]
1369 ; NONEON-NOSVE-NEXT: add w8, w3, w3
1370 ; NONEON-NOSVE-NEXT: strb w9, [sp, #174]
1371 ; NONEON-NOSVE-NEXT: add w9, w2, w2
1372 ; NONEON-NOSVE-NEXT: ldp w12, w13, [sp, #64]
1373 ; NONEON-NOSVE-NEXT: strb w8, [sp, #173]
1374 ; NONEON-NOSVE-NEXT: add w8, w0, w0
1375 ; NONEON-NOSVE-NEXT: strb w9, [sp, #172]
1376 ; NONEON-NOSVE-NEXT: add w9, w18, w18
1377 ; NONEON-NOSVE-NEXT: ldp w10, w11, [sp, #136]
1378 ; NONEON-NOSVE-NEXT: strb w8, [sp, #171]
1379 ; NONEON-NOSVE-NEXT: add w8, w17, w17
1380 ; NONEON-NOSVE-NEXT: strb w9, [sp, #170]
1381 ; NONEON-NOSVE-NEXT: add w9, w16, w16
1382 ; NONEON-NOSVE-NEXT: strb w8, [sp, #169]
1383 ; NONEON-NOSVE-NEXT: add w8, w15, w15
1384 ; NONEON-NOSVE-NEXT: strb w9, [sp, #168]
1385 ; NONEON-NOSVE-NEXT: add w9, w14, w14
1386 ; NONEON-NOSVE-NEXT: strb w8, [sp, #167]
1387 ; NONEON-NOSVE-NEXT: add w8, w13, w13
1388 ; NONEON-NOSVE-NEXT: strb w9, [sp, #166]
1389 ; NONEON-NOSVE-NEXT: add w9, w12, w12
1390 ; NONEON-NOSVE-NEXT: ldp w29, w30, [sp, #80]
1391 ; NONEON-NOSVE-NEXT: strb w8, [sp, #165]
1392 ; NONEON-NOSVE-NEXT: add w8, w11, w11
1393 ; NONEON-NOSVE-NEXT: strb w9, [sp, #164]
1394 ; NONEON-NOSVE-NEXT: add w9, w10, w10
1395 ; NONEON-NOSVE-NEXT: strb w8, [sp, #163]
1396 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] // 4-byte Folded Reload
1397 ; NONEON-NOSVE-NEXT: strb w9, [sp, #162]
1398 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #12] // 4-byte Folded Reload
1399 ; NONEON-NOSVE-NEXT: strb w5, [sp, #159]
1400 ; NONEON-NOSVE-NEXT: add w5, w30, w30
1401 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1402 ; NONEON-NOSVE-NEXT: strb w6, [sp, #158]
1403 ; NONEON-NOSVE-NEXT: add w6, w29, w29
1404 ; NONEON-NOSVE-NEXT: add w9, w9, w9
1405 ; NONEON-NOSVE-NEXT: strb w5, [sp, #157]
1406 ; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #256] // 16-byte Folded Reload
1407 ; NONEON-NOSVE-NEXT: strb w6, [sp, #156]
1408 ; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #240] // 16-byte Folded Reload
1409 ; NONEON-NOSVE-NEXT: strb w8, [sp, #161]
1410 ; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #224] // 16-byte Folded Reload
1411 ; NONEON-NOSVE-NEXT: strb w9, [sp, #160]
1412 ; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #208] // 16-byte Folded Reload
1413 ; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #144]
1414 ; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #192] // 16-byte Folded Reload
1415 ; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #176] // 16-byte Folded Reload
1416 ; NONEON-NOSVE-NEXT: stp q1, q0, [x1]
1417 ; NONEON-NOSVE-NEXT: add sp, sp, #272
1418 ; NONEON-NOSVE-NEXT: ret
1419 %a = load <32 x i32>, ptr %in
1420 %b = trunc <32 x i32> %a to <32 x i8>
1421 %c = add <32 x i8> %b, %b
1422 store <32 x i8> %c, ptr %out
1426 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
1427 define void @trunc_v64i32_v64i8(ptr %in, ptr %out) nounwind {
1428 ; CHECK-LABEL: trunc_v64i32_v64i8:
1430 ; CHECK-NEXT: ldp q2, q3, [x0, #160]
1431 ; CHECK-NEXT: ptrue p0.h, vl4
1432 ; CHECK-NEXT: ldp q4, q5, [x0, #96]
1433 ; CHECK-NEXT: ldp q6, q7, [x0]
1434 ; CHECK-NEXT: uzp1 z17.h, z3.h, z3.h
1435 ; CHECK-NEXT: ldp q3, q18, [x0, #128]
1436 ; CHECK-NEXT: uzp1 z16.h, z2.h, z2.h
1437 ; CHECK-NEXT: ldp q2, q19, [x0, #192]
1438 ; CHECK-NEXT: ldp q0, q1, [x0, #64]
1439 ; CHECK-NEXT: uzp1 z21.h, z18.h, z18.h
1440 ; CHECK-NEXT: ldp q18, q22, [x0, #224]
1441 ; CHECK-NEXT: uzp1 z20.h, z3.h, z3.h
1442 ; CHECK-NEXT: ldp q3, q23, [x0, #32]
1443 ; CHECK-NEXT: splice z16.h, p0, { z16.h, z17.h }
1444 ; CHECK-NEXT: uzp1 z27.h, z19.h, z19.h
1445 ; CHECK-NEXT: uzp1 z25.h, z22.h, z22.h
1446 ; CHECK-NEXT: uzp1 z26.h, z2.h, z2.h
1447 ; CHECK-NEXT: uzp1 z24.h, z18.h, z18.h
1448 ; CHECK-NEXT: uzp1 z18.h, z23.h, z23.h
1449 ; CHECK-NEXT: uzp1 z23.h, z5.h, z5.h
1450 ; CHECK-NEXT: uzp1 z17.h, z3.h, z3.h
1451 ; CHECK-NEXT: uzp1 z3.h, z7.h, z7.h
1452 ; CHECK-NEXT: uzp1 z22.h, z4.h, z4.h
1453 ; CHECK-NEXT: uzp1 z2.h, z6.h, z6.h
1454 ; CHECK-NEXT: uzp1 z5.h, z1.h, z1.h
1455 ; CHECK-NEXT: splice z1.h, p0, { z20.h, z21.h }
1456 ; CHECK-NEXT: splice z6.h, p0, { z24.h, z25.h }
1457 ; CHECK-NEXT: uzp1 z4.h, z0.h, z0.h
1458 ; CHECK-NEXT: splice z0.h, p0, { z26.h, z27.h }
1459 ; CHECK-NEXT: splice z7.h, p0, { z17.h, z18.h }
1460 ; CHECK-NEXT: uzp1 z17.b, z16.b, z16.b
1461 ; CHECK-NEXT: splice z2.h, p0, { z2.h, z3.h }
1462 ; CHECK-NEXT: splice z3.h, p0, { z22.h, z23.h }
1463 ; CHECK-NEXT: splice z4.h, p0, { z4.h, z5.h }
1464 ; CHECK-NEXT: uzp1 z16.b, z1.b, z1.b
1465 ; CHECK-NEXT: ptrue p0.b, vl8
1466 ; CHECK-NEXT: uzp1 z6.b, z6.b, z6.b
1467 ; CHECK-NEXT: uzp1 z5.b, z0.b, z0.b
1468 ; CHECK-NEXT: uzp1 z1.b, z7.b, z7.b
1469 ; CHECK-NEXT: uzp1 z0.b, z2.b, z2.b
1470 ; CHECK-NEXT: uzp1 z3.b, z3.b, z3.b
1471 ; CHECK-NEXT: splice z7.b, p0, { z16.b, z17.b }
1472 ; CHECK-NEXT: uzp1 z2.b, z4.b, z4.b
1473 ; CHECK-NEXT: splice z4.b, p0, { z5.b, z6.b }
1474 ; CHECK-NEXT: splice z0.b, p0, { z0.b, z1.b }
1475 ; CHECK-NEXT: splice z1.b, p0, { z2.b, z3.b }
1476 ; CHECK-NEXT: add z2.b, z7.b, z7.b
1477 ; CHECK-NEXT: add z3.b, z4.b, z4.b
1478 ; CHECK-NEXT: add z0.b, z0.b, z0.b
1479 ; CHECK-NEXT: add z1.b, z1.b, z1.b
1480 ; CHECK-NEXT: stp q2, q3, [x1, #32]
1481 ; CHECK-NEXT: stp q0, q1, [x1]
1484 ; NONEON-NOSVE-LABEL: trunc_v64i32_v64i8:
1485 ; NONEON-NOSVE: // %bb.0:
1486 ; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #-96]! // 16-byte Folded Spill
1487 ; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #16] // 16-byte Folded Spill
1488 ; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #32] // 16-byte Folded Spill
1489 ; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #48] // 16-byte Folded Spill
1490 ; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #64] // 16-byte Folded Spill
1491 ; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill
1492 ; NONEON-NOSVE-NEXT: sub sp, sp, #480
1493 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #96]
1494 ; NONEON-NOSVE-NEXT: str x1, [sp, #152] // 8-byte Folded Spill
1495 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #64]
1496 ; NONEON-NOSVE-NEXT: ldp q17, q16, [x0, #128]
1497 ; NONEON-NOSVE-NEXT: ldp q5, q4, [x0, #32]
1498 ; NONEON-NOSVE-NEXT: ldp q7, q6, [x0]
1499 ; NONEON-NOSVE-NEXT: ldp q19, q18, [x0, #224]
1500 ; NONEON-NOSVE-NEXT: ldp q21, q20, [x0, #192]
1501 ; NONEON-NOSVE-NEXT: ldp q23, q22, [x0, #160]
1502 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #288]
1503 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #316]
1504 ; NONEON-NOSVE-NEXT: str q18, [sp, #208]
1505 ; NONEON-NOSVE-NEXT: ldr w10, [sp, #304]
1506 ; NONEON-NOSVE-NEXT: stp q21, q19, [sp, #176]
1507 ; NONEON-NOSVE-NEXT: ldr w11, [sp, #296]
1508 ; NONEON-NOSVE-NEXT: ldr w12, [sp, #292]
1509 ; NONEON-NOSVE-NEXT: add w20, w8, w8
1510 ; NONEON-NOSVE-NEXT: stp q20, q23, [sp, #224]
1511 ; NONEON-NOSVE-NEXT: ldr w13, [sp, #288]
1512 ; NONEON-NOSVE-NEXT: stp q22, q16, [sp, #256]
1513 ; NONEON-NOSVE-NEXT: ldr w22, [sp, #312]
1514 ; NONEON-NOSVE-NEXT: stp q3, q17, [sp, #384]
1515 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #400]
1516 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #404]
1517 ; NONEON-NOSVE-NEXT: str q7, [sp, #160]
1518 ; NONEON-NOSVE-NEXT: stp q2, q4, [sp, #320]
1519 ; NONEON-NOSVE-NEXT: ldr w18, [sp, #396]
1520 ; NONEON-NOSVE-NEXT: ldr w0, [sp, #392]
1521 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] // 8-byte Folded Spill
1522 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #408]
1523 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #412]
1524 ; NONEON-NOSVE-NEXT: ldr w14, [sp, #332]
1525 ; NONEON-NOSVE-NEXT: ldr w15, [sp, #328]
1526 ; NONEON-NOSVE-NEXT: ldr w16, [sp, #324]
1527 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] // 8-byte Folded Spill
1528 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #272]
1529 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #276]
1530 ; NONEON-NOSVE-NEXT: ldr w17, [sp, #320]
1531 ; NONEON-NOSVE-NEXT: ldr w1, [sp, #388]
1532 ; NONEON-NOSVE-NEXT: ldr w2, [sp, #384]
1533 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] // 8-byte Folded Spill
1534 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #280]
1535 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #284]
1536 ; NONEON-NOSVE-NEXT: ldr w3, [sp, #348]
1537 ; NONEON-NOSVE-NEXT: ldr w4, [sp, #344]
1538 ; NONEON-NOSVE-NEXT: ldr w5, [sp, #340]
1539 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] // 8-byte Folded Spill
1540 ; NONEON-NOSVE-NEXT: ldr w6, [sp, #336]
1541 ; NONEON-NOSVE-NEXT: stp q6, q5, [sp, #352]
1542 ; NONEON-NOSVE-NEXT: ldr w7, [sp, #380]
1543 ; NONEON-NOSVE-NEXT: ldr w19, [sp, #376]
1544 ; NONEON-NOSVE-NEXT: ldr w21, [sp, #372]
1545 ; NONEON-NOSVE-NEXT: ldr w23, [sp, #368]
1546 ; NONEON-NOSVE-NEXT: ldr w24, [sp, #364]
1547 ; NONEON-NOSVE-NEXT: ldr w25, [sp, #360]
1548 ; NONEON-NOSVE-NEXT: ldr w26, [sp, #356]
1549 ; NONEON-NOSVE-NEXT: ldr w27, [sp, #352]
1550 ; NONEON-NOSVE-NEXT: strb w20, [sp, #463]
1551 ; NONEON-NOSVE-NEXT: add w20, w22, w22
1552 ; NONEON-NOSVE-NEXT: strb w20, [sp, #462]
1553 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #240]
1554 ; NONEON-NOSVE-NEXT: ldp w29, w28, [sp, #168]
1555 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] // 8-byte Folded Spill
1556 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #248]
1557 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] // 8-byte Folded Spill
1558 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #256]
1559 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #260]
1560 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #96] // 8-byte Folded Spill
1561 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #264]
1562 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #268]
1563 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88] // 8-byte Folded Spill
1564 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #176]
1565 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80] // 8-byte Folded Spill
1566 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #184]
1567 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] // 8-byte Folded Spill
1568 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #224]
1569 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] // 8-byte Folded Spill
1570 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #232]
1571 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] // 8-byte Folded Spill
1572 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #192]
1573 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] // 8-byte Folded Spill
1574 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #200]
1575 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] // 8-byte Folded Spill
1576 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #208]
1577 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] // 8-byte Folded Spill
1578 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #216]
1579 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] // 8-byte Folded Spill
1580 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #300]
1581 ; NONEON-NOSVE-NEXT: ldp w8, w30, [sp, #160]
1582 ; NONEON-NOSVE-NEXT: str w8, [sp, #20] // 4-byte Folded Spill
1583 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #308]
1584 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1585 ; NONEON-NOSVE-NEXT: strb w8, [sp, #461]
1586 ; NONEON-NOSVE-NEXT: add w8, w10, w10
1587 ; NONEON-NOSVE-NEXT: strb w8, [sp, #460]
1588 ; NONEON-NOSVE-NEXT: add w8, w9, w9
1589 ; NONEON-NOSVE-NEXT: strb w8, [sp, #459]
1590 ; NONEON-NOSVE-NEXT: add w8, w11, w11
1591 ; NONEON-NOSVE-NEXT: strb w8, [sp, #458]
1592 ; NONEON-NOSVE-NEXT: add w8, w12, w12
1593 ; NONEON-NOSVE-NEXT: strb w8, [sp, #457]
1594 ; NONEON-NOSVE-NEXT: add w8, w13, w13
1595 ; NONEON-NOSVE-NEXT: strb w8, [sp, #456]
1596 ; NONEON-NOSVE-NEXT: add w8, w14, w14
1597 ; NONEON-NOSVE-NEXT: strb w8, [sp, #455]
1598 ; NONEON-NOSVE-NEXT: add w8, w15, w15
1599 ; NONEON-NOSVE-NEXT: strb w8, [sp, #454]
1600 ; NONEON-NOSVE-NEXT: add w8, w16, w16
1601 ; NONEON-NOSVE-NEXT: strb w8, [sp, #453]
1602 ; NONEON-NOSVE-NEXT: add w8, w17, w17
1603 ; NONEON-NOSVE-NEXT: strb w8, [sp, #452]
1604 ; NONEON-NOSVE-NEXT: add w8, w18, w18
1605 ; NONEON-NOSVE-NEXT: strb w8, [sp, #451]
1606 ; NONEON-NOSVE-NEXT: add w8, w0, w0
1607 ; NONEON-NOSVE-NEXT: strb w8, [sp, #450]
1608 ; NONEON-NOSVE-NEXT: add w8, w1, w1
1609 ; NONEON-NOSVE-NEXT: strb w8, [sp, #449]
1610 ; NONEON-NOSVE-NEXT: add w8, w2, w2
1611 ; NONEON-NOSVE-NEXT: strb w8, [sp, #448]
1612 ; NONEON-NOSVE-NEXT: add w8, w3, w3
1613 ; NONEON-NOSVE-NEXT: strb w8, [sp, #447]
1614 ; NONEON-NOSVE-NEXT: add w8, w4, w4
1615 ; NONEON-NOSVE-NEXT: strb w8, [sp, #446]
1616 ; NONEON-NOSVE-NEXT: add w8, w5, w5
1617 ; NONEON-NOSVE-NEXT: strb w8, [sp, #445]
1618 ; NONEON-NOSVE-NEXT: add w8, w6, w6
1619 ; NONEON-NOSVE-NEXT: strb w8, [sp, #444]
1620 ; NONEON-NOSVE-NEXT: add w8, w7, w7
1621 ; NONEON-NOSVE-NEXT: strb w8, [sp, #443]
1622 ; NONEON-NOSVE-NEXT: add w8, w19, w19
1623 ; NONEON-NOSVE-NEXT: strb w8, [sp, #442]
1624 ; NONEON-NOSVE-NEXT: add w8, w21, w21
1625 ; NONEON-NOSVE-NEXT: strb w8, [sp, #441]
1626 ; NONEON-NOSVE-NEXT: add w8, w23, w23
1627 ; NONEON-NOSVE-NEXT: strb w8, [sp, #440]
1628 ; NONEON-NOSVE-NEXT: add w8, w24, w24
1629 ; NONEON-NOSVE-NEXT: strb w8, [sp, #439]
1630 ; NONEON-NOSVE-NEXT: add w8, w25, w25
1631 ; NONEON-NOSVE-NEXT: strb w8, [sp, #438]
1632 ; NONEON-NOSVE-NEXT: add w8, w26, w26
1633 ; NONEON-NOSVE-NEXT: strb w8, [sp, #437]
1634 ; NONEON-NOSVE-NEXT: add w8, w27, w27
1635 ; NONEON-NOSVE-NEXT: strb w8, [sp, #436]
1636 ; NONEON-NOSVE-NEXT: add w8, w28, w28
1637 ; NONEON-NOSVE-NEXT: strb w8, [sp, #435]
1638 ; NONEON-NOSVE-NEXT: add w8, w29, w29
1639 ; NONEON-NOSVE-NEXT: strb w8, [sp, #434]
1640 ; NONEON-NOSVE-NEXT: add w8, w30, w30
1641 ; NONEON-NOSVE-NEXT: strb w8, [sp, #433]
1642 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] // 4-byte Folded Reload
1643 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1644 ; NONEON-NOSVE-NEXT: strb w8, [sp, #432]
1645 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] // 4-byte Folded Reload
1646 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1647 ; NONEON-NOSVE-NEXT: strb w8, [sp, #431]
1648 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] // 4-byte Folded Reload
1649 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1650 ; NONEON-NOSVE-NEXT: strb w8, [sp, #430]
1651 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #32] // 4-byte Folded Reload
1652 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1653 ; NONEON-NOSVE-NEXT: strb w8, [sp, #429]
1654 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #36] // 4-byte Folded Reload
1655 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1656 ; NONEON-NOSVE-NEXT: strb w8, [sp, #428]
1657 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #40] // 4-byte Folded Reload
1658 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1659 ; NONEON-NOSVE-NEXT: strb w8, [sp, #427]
1660 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #44] // 4-byte Folded Reload
1661 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1662 ; NONEON-NOSVE-NEXT: strb w8, [sp, #426]
1663 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] // 4-byte Folded Reload
1664 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1665 ; NONEON-NOSVE-NEXT: strb w8, [sp, #425]
1666 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] // 4-byte Folded Reload
1667 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1668 ; NONEON-NOSVE-NEXT: strb w8, [sp, #424]
1669 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] // 4-byte Folded Reload
1670 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1671 ; NONEON-NOSVE-NEXT: strb w8, [sp, #423]
1672 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] // 4-byte Folded Reload
1673 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1674 ; NONEON-NOSVE-NEXT: strb w8, [sp, #422]
1675 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #64] // 4-byte Folded Reload
1676 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1677 ; NONEON-NOSVE-NEXT: strb w8, [sp, #421]
1678 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #68] // 4-byte Folded Reload
1679 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1680 ; NONEON-NOSVE-NEXT: strb w8, [sp, #420]
1681 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #72] // 4-byte Folded Reload
1682 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1683 ; NONEON-NOSVE-NEXT: strb w8, [sp, #419]
1684 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #76] // 4-byte Folded Reload
1685 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1686 ; NONEON-NOSVE-NEXT: strb w8, [sp, #418]
1687 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #80] // 4-byte Folded Reload
1688 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1689 ; NONEON-NOSVE-NEXT: strb w8, [sp, #417]
1690 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #84] // 4-byte Folded Reload
1691 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1692 ; NONEON-NOSVE-NEXT: strb w8, [sp, #416]
1693 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #88] // 4-byte Folded Reload
1694 ; NONEON-NOSVE-NEXT: ldp q1, q3, [sp, #416]
1695 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1696 ; NONEON-NOSVE-NEXT: strb w8, [sp, #479]
1697 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #92] // 4-byte Folded Reload
1698 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1699 ; NONEON-NOSVE-NEXT: strb w8, [sp, #478]
1700 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #96] // 4-byte Folded Reload
1701 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1702 ; NONEON-NOSVE-NEXT: strb w8, [sp, #477]
1703 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #100] // 4-byte Folded Reload
1704 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1705 ; NONEON-NOSVE-NEXT: strb w8, [sp, #476]
1706 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #104] // 4-byte Folded Reload
1707 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1708 ; NONEON-NOSVE-NEXT: strb w8, [sp, #475]
1709 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #108] // 4-byte Folded Reload
1710 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1711 ; NONEON-NOSVE-NEXT: strb w8, [sp, #474]
1712 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #112] // 4-byte Folded Reload
1713 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1714 ; NONEON-NOSVE-NEXT: strb w8, [sp, #473]
1715 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #116] // 4-byte Folded Reload
1716 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1717 ; NONEON-NOSVE-NEXT: strb w8, [sp, #472]
1718 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #120] // 4-byte Folded Reload
1719 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1720 ; NONEON-NOSVE-NEXT: strb w8, [sp, #471]
1721 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #124] // 4-byte Folded Reload
1722 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1723 ; NONEON-NOSVE-NEXT: strb w8, [sp, #470]
1724 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #128] // 4-byte Folded Reload
1725 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1726 ; NONEON-NOSVE-NEXT: strb w8, [sp, #469]
1727 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #132] // 4-byte Folded Reload
1728 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1729 ; NONEON-NOSVE-NEXT: strb w8, [sp, #468]
1730 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #136] // 4-byte Folded Reload
1731 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1732 ; NONEON-NOSVE-NEXT: strb w8, [sp, #467]
1733 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #140] // 4-byte Folded Reload
1734 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1735 ; NONEON-NOSVE-NEXT: strb w8, [sp, #466]
1736 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #144] // 4-byte Folded Reload
1737 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1738 ; NONEON-NOSVE-NEXT: strb w8, [sp, #465]
1739 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #148] // 4-byte Folded Reload
1740 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1741 ; NONEON-NOSVE-NEXT: strb w8, [sp, #464]
1742 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #152] // 8-byte Folded Reload
1743 ; NONEON-NOSVE-NEXT: ldp q2, q0, [sp, #448]
1744 ; NONEON-NOSVE-NEXT: stp q3, q2, [x8]
1745 ; NONEON-NOSVE-NEXT: stp q0, q1, [x8, #32]
1746 ; NONEON-NOSVE-NEXT: add sp, sp, #480
1747 ; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload
1748 ; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #64] // 16-byte Folded Reload
1749 ; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #48] // 16-byte Folded Reload
1750 ; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #32] // 16-byte Folded Reload
1751 ; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #16] // 16-byte Folded Reload
1752 ; NONEON-NOSVE-NEXT: ldp x29, x30, [sp], #96 // 16-byte Folded Reload
1753 ; NONEON-NOSVE-NEXT: ret
1754 %a = load <64 x i32>, ptr %in
1755 %b = trunc <64 x i32> %a to <64 x i8>
1756 %c = add <64 x i8> %b, %b
1757 store <64 x i8> %c, ptr %out
1762 ; truncate i32 -> i16
1765 define <8 x i16> @trunc_v8i32_v8i16(ptr %in) nounwind {
1766 ; CHECK-LABEL: trunc_v8i32_v8i16:
1768 ; CHECK-NEXT: ldp q1, q0, [x0]
1769 ; CHECK-NEXT: ptrue p0.h, vl4
1770 ; CHECK-NEXT: uzp1 z3.h, z0.h, z0.h
1771 ; CHECK-NEXT: uzp1 z2.h, z1.h, z1.h
1772 ; CHECK-NEXT: splice z0.h, p0, { z2.h, z3.h }
1773 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
1776 ; NONEON-NOSVE-LABEL: trunc_v8i32_v8i16:
1777 ; NONEON-NOSVE: // %bb.0:
1778 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]
1779 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!
1780 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24]
1781 ; NONEON-NOSVE-NEXT: strh w9, [sp, #46]
1782 ; NONEON-NOSVE-NEXT: strh w8, [sp, #44]
1783 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16]
1784 ; NONEON-NOSVE-NEXT: strh w9, [sp, #42]
1785 ; NONEON-NOSVE-NEXT: strh w8, [sp, #40]
1786 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]
1787 ; NONEON-NOSVE-NEXT: strh w9, [sp, #38]
1788 ; NONEON-NOSVE-NEXT: strh w8, [sp, #36]
1789 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]
1790 ; NONEON-NOSVE-NEXT: strh w9, [sp, #34]
1791 ; NONEON-NOSVE-NEXT: strh w8, [sp, #32]
1792 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
1793 ; NONEON-NOSVE-NEXT: add sp, sp, #48
1794 ; NONEON-NOSVE-NEXT: ret
1795 %a = load <8 x i32>, ptr %in
1796 %b = trunc <8 x i32> %a to <8 x i16>
1800 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
1801 define void @trunc_v16i32_v16i16(ptr %in, ptr %out) nounwind {
1802 ; CHECK-LABEL: trunc_v16i32_v16i16:
1804 ; CHECK-NEXT: ldp q1, q0, [x0, #32]
1805 ; CHECK-NEXT: ptrue p0.h, vl4
1806 ; CHECK-NEXT: ldp q3, q2, [x0]
1807 ; CHECK-NEXT: uzp1 z5.h, z0.h, z0.h
1808 ; CHECK-NEXT: uzp1 z4.h, z1.h, z1.h
1809 ; CHECK-NEXT: uzp1 z1.h, z2.h, z2.h
1810 ; CHECK-NEXT: uzp1 z0.h, z3.h, z3.h
1811 ; CHECK-NEXT: splice z2.h, p0, { z4.h, z5.h }
1812 ; CHECK-NEXT: splice z0.h, p0, { z0.h, z1.h }
1813 ; CHECK-NEXT: add z1.h, z2.h, z2.h
1814 ; CHECK-NEXT: add z0.h, z0.h, z0.h
1815 ; CHECK-NEXT: stp q0, q1, [x1]
1818 ; NONEON-NOSVE-LABEL: trunc_v16i32_v16i16:
1819 ; NONEON-NOSVE: // %bb.0:
1820 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
1821 ; NONEON-NOSVE-NEXT: ldp q0, q1, [x0, #32]
1822 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0]
1823 ; NONEON-NOSVE-NEXT: stp q3, q1, [sp]
1824 ; NONEON-NOSVE-NEXT: stp q2, q0, [sp, #32]
1825 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #40]
1826 ; NONEON-NOSVE-NEXT: ldp w2, w3, [sp, #32]
1827 ; NONEON-NOSVE-NEXT: ldp w4, w5, [sp, #8]
1828 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1829 ; NONEON-NOSVE-NEXT: add w9, w9, w9
1830 ; NONEON-NOSVE-NEXT: ldp w18, w0, [sp]
1831 ; NONEON-NOSVE-NEXT: ldp w16, w17, [sp, #24]
1832 ; NONEON-NOSVE-NEXT: strh w8, [sp, #78]
1833 ; NONEON-NOSVE-NEXT: add w8, w3, w3
1834 ; NONEON-NOSVE-NEXT: strh w9, [sp, #76]
1835 ; NONEON-NOSVE-NEXT: add w9, w2, w2
1836 ; NONEON-NOSVE-NEXT: ldp w14, w15, [sp, #16]
1837 ; NONEON-NOSVE-NEXT: strh w8, [sp, #74]
1838 ; NONEON-NOSVE-NEXT: add w8, w5, w5
1839 ; NONEON-NOSVE-NEXT: strh w9, [sp, #72]
1840 ; NONEON-NOSVE-NEXT: add w9, w4, w4
1841 ; NONEON-NOSVE-NEXT: ldp w12, w13, [sp, #56]
1842 ; NONEON-NOSVE-NEXT: strh w8, [sp, #70]
1843 ; NONEON-NOSVE-NEXT: add w8, w0, w0
1844 ; NONEON-NOSVE-NEXT: strh w9, [sp, #68]
1845 ; NONEON-NOSVE-NEXT: add w9, w18, w18
1846 ; NONEON-NOSVE-NEXT: ldp w10, w11, [sp, #48]
1847 ; NONEON-NOSVE-NEXT: strh w8, [sp, #66]
1848 ; NONEON-NOSVE-NEXT: add w8, w17, w17
1849 ; NONEON-NOSVE-NEXT: strh w9, [sp, #64]
1850 ; NONEON-NOSVE-NEXT: add w9, w16, w16
1851 ; NONEON-NOSVE-NEXT: strh w8, [sp, #94]
1852 ; NONEON-NOSVE-NEXT: add w8, w15, w15
1853 ; NONEON-NOSVE-NEXT: strh w9, [sp, #92]
1854 ; NONEON-NOSVE-NEXT: add w9, w14, w14
1855 ; NONEON-NOSVE-NEXT: strh w8, [sp, #90]
1856 ; NONEON-NOSVE-NEXT: add w8, w13, w13
1857 ; NONEON-NOSVE-NEXT: strh w9, [sp, #88]
1858 ; NONEON-NOSVE-NEXT: add w9, w12, w12
1859 ; NONEON-NOSVE-NEXT: strh w8, [sp, #86]
1860 ; NONEON-NOSVE-NEXT: add w8, w11, w11
1861 ; NONEON-NOSVE-NEXT: strh w9, [sp, #84]
1862 ; NONEON-NOSVE-NEXT: add w9, w10, w10
1863 ; NONEON-NOSVE-NEXT: strh w8, [sp, #82]
1864 ; NONEON-NOSVE-NEXT: strh w9, [sp, #80]
1865 ; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64]
1866 ; NONEON-NOSVE-NEXT: stp q1, q0, [x1]
1867 ; NONEON-NOSVE-NEXT: add sp, sp, #96
1868 ; NONEON-NOSVE-NEXT: ret
1869 %a = load <16 x i32>, ptr %in
1870 %b = trunc <16 x i32> %a to <16 x i16>
1871 %c = add <16 x i16> %b, %b
1872 store <16 x i16> %c, ptr %out
1876 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
1877 define void @trunc_v32i32_v32i16(ptr %in, ptr %out) nounwind {
1878 ; CHECK-LABEL: trunc_v32i32_v32i16:
1880 ; CHECK-NEXT: ldp q1, q0, [x0, #64]
1881 ; CHECK-NEXT: ptrue p0.h, vl4
1882 ; CHECK-NEXT: ldp q2, q3, [x0, #96]
1883 ; CHECK-NEXT: ldp q4, q5, [x0]
1884 ; CHECK-NEXT: uzp1 z7.h, z0.h, z0.h
1885 ; CHECK-NEXT: uzp1 z6.h, z1.h, z1.h
1886 ; CHECK-NEXT: ldp q1, q0, [x0, #32]
1887 ; CHECK-NEXT: uzp1 z17.h, z3.h, z3.h
1888 ; CHECK-NEXT: uzp1 z16.h, z2.h, z2.h
1889 ; CHECK-NEXT: uzp1 z3.h, z5.h, z5.h
1890 ; CHECK-NEXT: uzp1 z2.h, z4.h, z4.h
1891 ; CHECK-NEXT: uzp1 z5.h, z0.h, z0.h
1892 ; CHECK-NEXT: splice z0.h, p0, { z6.h, z7.h }
1893 ; CHECK-NEXT: uzp1 z4.h, z1.h, z1.h
1894 ; CHECK-NEXT: splice z1.h, p0, { z16.h, z17.h }
1895 ; CHECK-NEXT: splice z2.h, p0, { z2.h, z3.h }
1896 ; CHECK-NEXT: splice z3.h, p0, { z4.h, z5.h }
1897 ; CHECK-NEXT: add z0.h, z0.h, z0.h
1898 ; CHECK-NEXT: add z1.h, z1.h, z1.h
1899 ; CHECK-NEXT: add z2.h, z2.h, z2.h
1900 ; CHECK-NEXT: add z3.h, z3.h, z3.h
1901 ; CHECK-NEXT: stp q0, q1, [x1, #32]
1902 ; CHECK-NEXT: stp q2, q3, [x1]
1905 ; NONEON-NOSVE-LABEL: trunc_v32i32_v32i16:
1906 ; NONEON-NOSVE: // %bb.0:
1907 ; NONEON-NOSVE-NEXT: sub sp, sp, #304
1908 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #32]
1909 ; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #224] // 16-byte Folded Spill
1910 ; NONEON-NOSVE-NEXT: ldp q5, q4, [x0]
1911 ; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #240] // 16-byte Folded Spill
1912 ; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #256] // 16-byte Folded Spill
1913 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #64]
1914 ; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #272] // 16-byte Folded Spill
1915 ; NONEON-NOSVE-NEXT: ldp q7, q6, [x0, #96]
1916 ; NONEON-NOSVE-NEXT: stp q2, q4, [sp, #80]
1917 ; NONEON-NOSVE-NEXT: stp q3, q1, [sp, #112]
1918 ; NONEON-NOSVE-NEXT: stp q5, q7, [sp, #16]
1919 ; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #88]
1920 ; NONEON-NOSVE-NEXT: ldp w27, w28, [sp, #112]
1921 ; NONEON-NOSVE-NEXT: ldp w25, w26, [sp, #104]
1922 ; NONEON-NOSVE-NEXT: add w6, w8, w8
1923 ; NONEON-NOSVE-NEXT: add w5, w9, w9
1924 ; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #288] // 16-byte Folded Spill
1925 ; NONEON-NOSVE-NEXT: ldp w10, w8, [sp, #128]
1926 ; NONEON-NOSVE-NEXT: ldp w23, w24, [sp, #96]
1927 ; NONEON-NOSVE-NEXT: ldp w21, w22, [sp, #24]
1928 ; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #8] // 8-byte Folded Spill
1929 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #120]
1930 ; NONEON-NOSVE-NEXT: stp q6, q0, [sp, #48]
1931 ; NONEON-NOSVE-NEXT: ldp w19, w20, [sp, #16]
1932 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1933 ; NONEON-NOSVE-NEXT: add w9, w9, w9
1934 ; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #208] // 16-byte Folded Spill
1935 ; NONEON-NOSVE-NEXT: strh w8, [sp, #182]
1936 ; NONEON-NOSVE-NEXT: add w8, w28, w28
1937 ; NONEON-NOSVE-NEXT: strh w9, [sp, #180]
1938 ; NONEON-NOSVE-NEXT: add w9, w27, w27
1939 ; NONEON-NOSVE-NEXT: strh w8, [sp, #178]
1940 ; NONEON-NOSVE-NEXT: add w8, w26, w26
1941 ; NONEON-NOSVE-NEXT: strh w9, [sp, #176]
1942 ; NONEON-NOSVE-NEXT: add w9, w25, w25
1943 ; NONEON-NOSVE-NEXT: ldp w4, w7, [sp, #56]
1944 ; NONEON-NOSVE-NEXT: strh w8, [sp, #174]
1945 ; NONEON-NOSVE-NEXT: add w8, w24, w24
1946 ; NONEON-NOSVE-NEXT: strh w9, [sp, #172]
1947 ; NONEON-NOSVE-NEXT: add w9, w23, w23
1948 ; NONEON-NOSVE-NEXT: ldp w2, w3, [sp, #48]
1949 ; NONEON-NOSVE-NEXT: strh w8, [sp, #170]
1950 ; NONEON-NOSVE-NEXT: add w8, w22, w22
1951 ; NONEON-NOSVE-NEXT: strh w9, [sp, #168]
1952 ; NONEON-NOSVE-NEXT: add w9, w21, w21
1953 ; NONEON-NOSVE-NEXT: ldp w18, w0, [sp, #40]
1954 ; NONEON-NOSVE-NEXT: strh w8, [sp, #166]
1955 ; NONEON-NOSVE-NEXT: add w8, w20, w20
1956 ; NONEON-NOSVE-NEXT: strh w9, [sp, #164]
1957 ; NONEON-NOSVE-NEXT: add w9, w19, w19
1958 ; NONEON-NOSVE-NEXT: ldp w16, w17, [sp, #32]
1959 ; NONEON-NOSVE-NEXT: strh w8, [sp, #162]
1960 ; NONEON-NOSVE-NEXT: add w8, w7, w7
1961 ; NONEON-NOSVE-NEXT: strh w9, [sp, #160]
1962 ; NONEON-NOSVE-NEXT: add w9, w4, w4
1963 ; NONEON-NOSVE-NEXT: ldp w14, w15, [sp, #72]
1964 ; NONEON-NOSVE-NEXT: strh w8, [sp, #158]
1965 ; NONEON-NOSVE-NEXT: add w8, w3, w3
1966 ; NONEON-NOSVE-NEXT: strh w9, [sp, #156]
1967 ; NONEON-NOSVE-NEXT: add w9, w2, w2
1968 ; NONEON-NOSVE-NEXT: ldp w12, w13, [sp, #64]
1969 ; NONEON-NOSVE-NEXT: strh w8, [sp, #154]
1970 ; NONEON-NOSVE-NEXT: add w8, w0, w0
1971 ; NONEON-NOSVE-NEXT: strh w9, [sp, #152]
1972 ; NONEON-NOSVE-NEXT: add w9, w18, w18
1973 ; NONEON-NOSVE-NEXT: ldp w10, w11, [sp, #136]
1974 ; NONEON-NOSVE-NEXT: strh w8, [sp, #150]
1975 ; NONEON-NOSVE-NEXT: add w8, w17, w17
1976 ; NONEON-NOSVE-NEXT: strh w9, [sp, #148]
1977 ; NONEON-NOSVE-NEXT: add w9, w16, w16
1978 ; NONEON-NOSVE-NEXT: strh w8, [sp, #146]
1979 ; NONEON-NOSVE-NEXT: add w8, w15, w15
1980 ; NONEON-NOSVE-NEXT: strh w9, [sp, #144]
1981 ; NONEON-NOSVE-NEXT: add w9, w14, w14
1982 ; NONEON-NOSVE-NEXT: strh w8, [sp, #206]
1983 ; NONEON-NOSVE-NEXT: add w8, w13, w13
1984 ; NONEON-NOSVE-NEXT: strh w9, [sp, #204]
1985 ; NONEON-NOSVE-NEXT: add w9, w12, w12
1986 ; NONEON-NOSVE-NEXT: ldp w29, w30, [sp, #80]
1987 ; NONEON-NOSVE-NEXT: strh w8, [sp, #202]
1988 ; NONEON-NOSVE-NEXT: add w8, w11, w11
1989 ; NONEON-NOSVE-NEXT: strh w9, [sp, #200]
1990 ; NONEON-NOSVE-NEXT: add w9, w10, w10
1991 ; NONEON-NOSVE-NEXT: strh w8, [sp, #198]
1992 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] // 4-byte Folded Reload
1993 ; NONEON-NOSVE-NEXT: strh w9, [sp, #196]
1994 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #12] // 4-byte Folded Reload
1995 ; NONEON-NOSVE-NEXT: strh w5, [sp, #190]
1996 ; NONEON-NOSVE-NEXT: add w5, w30, w30
1997 ; NONEON-NOSVE-NEXT: add w8, w8, w8
1998 ; NONEON-NOSVE-NEXT: strh w6, [sp, #188]
1999 ; NONEON-NOSVE-NEXT: add w6, w29, w29
2000 ; NONEON-NOSVE-NEXT: add w9, w9, w9
2001 ; NONEON-NOSVE-NEXT: strh w5, [sp, #186]
2002 ; NONEON-NOSVE-NEXT: ldp q1, q3, [sp, #144]
2003 ; NONEON-NOSVE-NEXT: strh w6, [sp, #184]
2004 ; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #288] // 16-byte Folded Reload
2005 ; NONEON-NOSVE-NEXT: strh w8, [sp, #194]
2006 ; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #272] // 16-byte Folded Reload
2007 ; NONEON-NOSVE-NEXT: strh w9, [sp, #192]
2008 ; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #256] // 16-byte Folded Reload
2009 ; NONEON-NOSVE-NEXT: ldp q2, q0, [sp, #176]
2010 ; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #240] // 16-byte Folded Reload
2011 ; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #224] // 16-byte Folded Reload
2012 ; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #208] // 16-byte Folded Reload
2013 ; NONEON-NOSVE-NEXT: stp q3, q2, [x1]
2014 ; NONEON-NOSVE-NEXT: stp q0, q1, [x1, #32]
2015 ; NONEON-NOSVE-NEXT: add sp, sp, #304
2016 ; NONEON-NOSVE-NEXT: ret
2017 %a = load <32 x i32>, ptr %in
2018 %b = trunc <32 x i32> %a to <32 x i16>
2019 %c = add <32 x i16> %b, %b
2020 store <32 x i16> %c, ptr %out
2024 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
2025 define void @trunc_v64i32_v64i16(ptr %in, ptr %out) nounwind {
2026 ; CHECK-LABEL: trunc_v64i32_v64i16:
2028 ; CHECK-NEXT: ldp q2, q3, [x0, #192]
2029 ; CHECK-NEXT: ptrue p0.h, vl4
2030 ; CHECK-NEXT: ldp q4, q5, [x0]
2031 ; CHECK-NEXT: ldp q6, q7, [x0, #64]
2032 ; CHECK-NEXT: uzp1 z17.h, z3.h, z3.h
2033 ; CHECK-NEXT: ldp q3, q18, [x0, #224]
2034 ; CHECK-NEXT: uzp1 z16.h, z2.h, z2.h
2035 ; CHECK-NEXT: ldp q2, q19, [x0, #128]
2036 ; CHECK-NEXT: ldp q0, q1, [x0, #32]
2037 ; CHECK-NEXT: uzp1 z21.h, z18.h, z18.h
2038 ; CHECK-NEXT: ldp q18, q22, [x0, #160]
2039 ; CHECK-NEXT: uzp1 z20.h, z3.h, z3.h
2040 ; CHECK-NEXT: uzp1 z24.h, z19.h, z19.h
2041 ; CHECK-NEXT: ldp q3, q19, [x0, #96]
2042 ; CHECK-NEXT: uzp1 z23.h, z2.h, z2.h
2043 ; CHECK-NEXT: uzp1 z26.h, z22.h, z22.h
2044 ; CHECK-NEXT: splice z2.h, p0, { z16.h, z17.h }
2045 ; CHECK-NEXT: uzp1 z17.h, z7.h, z7.h
2046 ; CHECK-NEXT: uzp1 z25.h, z18.h, z18.h
2047 ; CHECK-NEXT: splice z7.h, p0, { z20.h, z21.h }
2048 ; CHECK-NEXT: uzp1 z21.h, z5.h, z5.h
2049 ; CHECK-NEXT: uzp1 z19.h, z19.h, z19.h
2050 ; CHECK-NEXT: uzp1 z20.h, z4.h, z4.h
2051 ; CHECK-NEXT: uzp1 z5.h, z1.h, z1.h
2052 ; CHECK-NEXT: uzp1 z16.h, z6.h, z6.h
2053 ; CHECK-NEXT: splice z6.h, p0, { z23.h, z24.h }
2054 ; CHECK-NEXT: uzp1 z18.h, z3.h, z3.h
2055 ; CHECK-NEXT: splice z3.h, p0, { z25.h, z26.h }
2056 ; CHECK-NEXT: uzp1 z4.h, z0.h, z0.h
2057 ; CHECK-NEXT: add z0.h, z2.h, z2.h
2058 ; CHECK-NEXT: add z7.h, z7.h, z7.h
2059 ; CHECK-NEXT: splice z1.h, p0, { z16.h, z17.h }
2060 ; CHECK-NEXT: splice z2.h, p0, { z18.h, z19.h }
2061 ; CHECK-NEXT: splice z16.h, p0, { z20.h, z21.h }
2062 ; CHECK-NEXT: splice z4.h, p0, { z4.h, z5.h }
2063 ; CHECK-NEXT: add z6.h, z6.h, z6.h
2064 ; CHECK-NEXT: add z3.h, z3.h, z3.h
2065 ; CHECK-NEXT: stp q0, q7, [x1, #96]
2066 ; CHECK-NEXT: add z0.h, z1.h, z1.h
2067 ; CHECK-NEXT: add z1.h, z2.h, z2.h
2068 ; CHECK-NEXT: add z2.h, z16.h, z16.h
2069 ; CHECK-NEXT: stp q6, q3, [x1, #64]
2070 ; CHECK-NEXT: add z3.h, z4.h, z4.h
2071 ; CHECK-NEXT: stp q0, q1, [x1, #32]
2072 ; CHECK-NEXT: stp q2, q3, [x1]
2075 ; NONEON-NOSVE-LABEL: trunc_v64i32_v64i16:
2076 ; NONEON-NOSVE: // %bb.0:
2077 ; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #-96]! // 16-byte Folded Spill
2078 ; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #16] // 16-byte Folded Spill
2079 ; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #32] // 16-byte Folded Spill
2080 ; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #48] // 16-byte Folded Spill
2081 ; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #64] // 16-byte Folded Spill
2082 ; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill
2083 ; NONEON-NOSVE-NEXT: sub sp, sp, #528
2084 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32]
2085 ; NONEON-NOSVE-NEXT: mov x5, x1
2086 ; NONEON-NOSVE-NEXT: ldp q17, q16, [x0, #192]
2087 ; NONEON-NOSVE-NEXT: ldp q23, q22, [x0, #224]
2088 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0]
2089 ; NONEON-NOSVE-NEXT: ldp q5, q4, [x0, #96]
2090 ; NONEON-NOSVE-NEXT: ldp q7, q6, [x0, #64]
2091 ; NONEON-NOSVE-NEXT: ldp q19, q18, [x0, #160]
2092 ; NONEON-NOSVE-NEXT: ldp q21, q20, [x0, #128]
2093 ; NONEON-NOSVE-NEXT: str q0, [sp, #320]
2094 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #332]
2095 ; NONEON-NOSVE-NEXT: stp q17, q23, [sp, #160]
2096 ; NONEON-NOSVE-NEXT: ldr w10, [sp, #320]
2097 ; NONEON-NOSVE-NEXT: stp q22, q16, [sp, #192]
2098 ; NONEON-NOSVE-NEXT: ldr w23, [sp, #328]
2099 ; NONEON-NOSVE-NEXT: add w21, w8, w8
2100 ; NONEON-NOSVE-NEXT: stp q18, q20, [sp, #240]
2101 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #160]
2102 ; NONEON-NOSVE-NEXT: stp q7, q21, [sp, #368]
2103 ; NONEON-NOSVE-NEXT: str q19, [sp, #224]
2104 ; NONEON-NOSVE-NEXT: ldr w29, [sp, #380]
2105 ; NONEON-NOSVE-NEXT: ldr w30, [sp, #376]
2106 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] // 8-byte Folded Spill
2107 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #168]
2108 ; NONEON-NOSVE-NEXT: stp q4, q6, [sp, #288]
2109 ; NONEON-NOSVE-NEXT: stp q2, q1, [sp, #336]
2110 ; NONEON-NOSVE-NEXT: ldr w3, [sp, #300]
2111 ; NONEON-NOSVE-NEXT: ldr w4, [sp, #296]
2112 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] // 8-byte Folded Spill
2113 ; NONEON-NOSVE-NEXT: ldr w11, [sp, #360]
2114 ; NONEON-NOSVE-NEXT: ldr w12, [sp, #356]
2115 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #208]
2116 ; NONEON-NOSVE-NEXT: ldr w13, [sp, #352]
2117 ; NONEON-NOSVE-NEXT: ldr w14, [sp, #348]
2118 ; NONEON-NOSVE-NEXT: ldr w15, [sp, #344]
2119 ; NONEON-NOSVE-NEXT: str q3, [sp, #144]
2120 ; NONEON-NOSVE-NEXT: ldr w16, [sp, #340]
2121 ; NONEON-NOSVE-NEXT: ldr w17, [sp, #336]
2122 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] // 8-byte Folded Spill
2123 ; NONEON-NOSVE-NEXT: ldr w6, [sp, #292]
2124 ; NONEON-NOSVE-NEXT: ldr w7, [sp, #288]
2125 ; NONEON-NOSVE-NEXT: str q5, [sp, #272]
2126 ; NONEON-NOSVE-NEXT: ldr w25, [sp, #316]
2127 ; NONEON-NOSVE-NEXT: ldr w26, [sp, #312]
2128 ; NONEON-NOSVE-NEXT: ldr w19, [sp, #284]
2129 ; NONEON-NOSVE-NEXT: ldr w20, [sp, #280]
2130 ; NONEON-NOSVE-NEXT: ldr w22, [sp, #276]
2131 ; NONEON-NOSVE-NEXT: ldr w24, [sp, #272]
2132 ; NONEON-NOSVE-NEXT: ldr w27, [sp, #308]
2133 ; NONEON-NOSVE-NEXT: ldr w28, [sp, #304]
2134 ; NONEON-NOSVE-NEXT: strh w21, [sp, #494]
2135 ; NONEON-NOSVE-NEXT: add w21, w23, w23
2136 ; NONEON-NOSVE-NEXT: strh w21, [sp, #492]
2137 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #216]
2138 ; NONEON-NOSVE-NEXT: ldp w0, w18, [sp, #152]
2139 ; NONEON-NOSVE-NEXT: ldp w2, w1, [sp, #144]
2140 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] // 8-byte Folded Spill
2141 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #176]
2142 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] // 8-byte Folded Spill
2143 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #184]
2144 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #96] // 8-byte Folded Spill
2145 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #192]
2146 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88] // 8-byte Folded Spill
2147 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #200]
2148 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80] // 8-byte Folded Spill
2149 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #384]
2150 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #388]
2151 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] // 8-byte Folded Spill
2152 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #392]
2153 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #396]
2154 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] // 8-byte Folded Spill
2155 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #256]
2156 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #260]
2157 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] // 8-byte Folded Spill
2158 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #264]
2159 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #268]
2160 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] // 8-byte Folded Spill
2161 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #224]
2162 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] // 8-byte Folded Spill
2163 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #232]
2164 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] // 8-byte Folded Spill
2165 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #240]
2166 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] // 8-byte Folded Spill
2167 ; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #248]
2168 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] // 8-byte Folded Spill
2169 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #368]
2170 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #372]
2171 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] // 8-byte Folded Spill
2172 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #324]
2173 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #364]
2174 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2175 ; NONEON-NOSVE-NEXT: strh w8, [sp, #490]
2176 ; NONEON-NOSVE-NEXT: add w8, w10, w10
2177 ; NONEON-NOSVE-NEXT: strh w8, [sp, #488]
2178 ; NONEON-NOSVE-NEXT: add w8, w9, w9
2179 ; NONEON-NOSVE-NEXT: strh w8, [sp, #486]
2180 ; NONEON-NOSVE-NEXT: add w8, w11, w11
2181 ; NONEON-NOSVE-NEXT: strh w8, [sp, #484]
2182 ; NONEON-NOSVE-NEXT: add w8, w12, w12
2183 ; NONEON-NOSVE-NEXT: strh w8, [sp, #482]
2184 ; NONEON-NOSVE-NEXT: add w8, w13, w13
2185 ; NONEON-NOSVE-NEXT: strh w8, [sp, #480]
2186 ; NONEON-NOSVE-NEXT: add w8, w14, w14
2187 ; NONEON-NOSVE-NEXT: strh w8, [sp, #478]
2188 ; NONEON-NOSVE-NEXT: add w8, w15, w15
2189 ; NONEON-NOSVE-NEXT: strh w8, [sp, #476]
2190 ; NONEON-NOSVE-NEXT: add w8, w16, w16
2191 ; NONEON-NOSVE-NEXT: strh w8, [sp, #474]
2192 ; NONEON-NOSVE-NEXT: add w8, w17, w17
2193 ; NONEON-NOSVE-NEXT: strh w8, [sp, #472]
2194 ; NONEON-NOSVE-NEXT: add w8, w18, w18
2195 ; NONEON-NOSVE-NEXT: strh w8, [sp, #470]
2196 ; NONEON-NOSVE-NEXT: add w8, w0, w0
2197 ; NONEON-NOSVE-NEXT: strh w8, [sp, #468]
2198 ; NONEON-NOSVE-NEXT: add w8, w1, w1
2199 ; NONEON-NOSVE-NEXT: strh w8, [sp, #466]
2200 ; NONEON-NOSVE-NEXT: add w8, w2, w2
2201 ; NONEON-NOSVE-NEXT: strh w8, [sp, #464]
2202 ; NONEON-NOSVE-NEXT: add w8, w3, w3
2203 ; NONEON-NOSVE-NEXT: strh w8, [sp, #462]
2204 ; NONEON-NOSVE-NEXT: add w8, w4, w4
2205 ; NONEON-NOSVE-NEXT: strh w8, [sp, #460]
2206 ; NONEON-NOSVE-NEXT: add w8, w6, w6
2207 ; NONEON-NOSVE-NEXT: strh w8, [sp, #458]
2208 ; NONEON-NOSVE-NEXT: add w8, w7, w7
2209 ; NONEON-NOSVE-NEXT: strh w8, [sp, #456]
2210 ; NONEON-NOSVE-NEXT: add w8, w19, w19
2211 ; NONEON-NOSVE-NEXT: strh w8, [sp, #454]
2212 ; NONEON-NOSVE-NEXT: add w8, w20, w20
2213 ; NONEON-NOSVE-NEXT: strh w8, [sp, #452]
2214 ; NONEON-NOSVE-NEXT: add w8, w22, w22
2215 ; NONEON-NOSVE-NEXT: strh w8, [sp, #450]
2216 ; NONEON-NOSVE-NEXT: add w8, w24, w24
2217 ; NONEON-NOSVE-NEXT: strh w8, [sp, #448]
2218 ; NONEON-NOSVE-NEXT: add w8, w25, w25
2219 ; NONEON-NOSVE-NEXT: strh w8, [sp, #510]
2220 ; NONEON-NOSVE-NEXT: add w8, w26, w26
2221 ; NONEON-NOSVE-NEXT: strh w8, [sp, #508]
2222 ; NONEON-NOSVE-NEXT: add w8, w27, w27
2223 ; NONEON-NOSVE-NEXT: strh w8, [sp, #506]
2224 ; NONEON-NOSVE-NEXT: add w8, w28, w28
2225 ; NONEON-NOSVE-NEXT: strh w8, [sp, #504]
2226 ; NONEON-NOSVE-NEXT: add w8, w29, w29
2227 ; NONEON-NOSVE-NEXT: strh w8, [sp, #502]
2228 ; NONEON-NOSVE-NEXT: add w8, w30, w30
2229 ; NONEON-NOSVE-NEXT: strh w8, [sp, #500]
2230 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] // 4-byte Folded Reload
2231 ; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #464]
2232 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2233 ; NONEON-NOSVE-NEXT: strh w8, [sp, #498]
2234 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] // 4-byte Folded Reload
2235 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2236 ; NONEON-NOSVE-NEXT: strh w8, [sp, #496]
2237 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] // 4-byte Folded Reload
2238 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2239 ; NONEON-NOSVE-NEXT: strh w8, [sp, #446]
2240 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] // 4-byte Folded Reload
2241 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2242 ; NONEON-NOSVE-NEXT: strh w8, [sp, #444]
2243 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] // 4-byte Folded Reload
2244 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2245 ; NONEON-NOSVE-NEXT: strh w8, [sp, #442]
2246 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] // 4-byte Folded Reload
2247 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2248 ; NONEON-NOSVE-NEXT: strh w8, [sp, #440]
2249 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #32] // 4-byte Folded Reload
2250 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2251 ; NONEON-NOSVE-NEXT: strh w8, [sp, #438]
2252 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #36] // 4-byte Folded Reload
2253 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2254 ; NONEON-NOSVE-NEXT: strh w8, [sp, #436]
2255 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #40] // 4-byte Folded Reload
2256 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2257 ; NONEON-NOSVE-NEXT: strh w8, [sp, #434]
2258 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #44] // 4-byte Folded Reload
2259 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2260 ; NONEON-NOSVE-NEXT: strh w8, [sp, #432]
2261 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] // 4-byte Folded Reload
2262 ; NONEON-NOSVE-NEXT: ldp q6, q3, [sp, #432]
2263 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2264 ; NONEON-NOSVE-NEXT: strh w8, [sp, #526]
2265 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] // 4-byte Folded Reload
2266 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2267 ; NONEON-NOSVE-NEXT: strh w8, [sp, #524]
2268 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] // 4-byte Folded Reload
2269 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2270 ; NONEON-NOSVE-NEXT: strh w8, [sp, #522]
2271 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] // 4-byte Folded Reload
2272 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2273 ; NONEON-NOSVE-NEXT: strh w8, [sp, #520]
2274 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #64] // 4-byte Folded Reload
2275 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2276 ; NONEON-NOSVE-NEXT: strh w8, [sp, #518]
2277 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #68] // 4-byte Folded Reload
2278 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2279 ; NONEON-NOSVE-NEXT: strh w8, [sp, #516]
2280 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #72] // 4-byte Folded Reload
2281 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2282 ; NONEON-NOSVE-NEXT: strh w8, [sp, #514]
2283 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #76] // 4-byte Folded Reload
2284 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2285 ; NONEON-NOSVE-NEXT: strh w8, [sp, #512]
2286 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #80] // 4-byte Folded Reload
2287 ; NONEON-NOSVE-NEXT: ldp q4, q7, [sp, #496]
2288 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2289 ; NONEON-NOSVE-NEXT: strh w8, [sp, #414]
2290 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #84] // 4-byte Folded Reload
2291 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2292 ; NONEON-NOSVE-NEXT: strh w8, [sp, #412]
2293 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #88] // 4-byte Folded Reload
2294 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2295 ; NONEON-NOSVE-NEXT: strh w8, [sp, #410]
2296 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #92] // 4-byte Folded Reload
2297 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2298 ; NONEON-NOSVE-NEXT: strh w8, [sp, #408]
2299 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #96] // 4-byte Folded Reload
2300 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2301 ; NONEON-NOSVE-NEXT: strh w8, [sp, #406]
2302 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #100] // 4-byte Folded Reload
2303 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2304 ; NONEON-NOSVE-NEXT: strh w8, [sp, #404]
2305 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #104] // 4-byte Folded Reload
2306 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2307 ; NONEON-NOSVE-NEXT: strh w8, [sp, #402]
2308 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #108] // 4-byte Folded Reload
2309 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2310 ; NONEON-NOSVE-NEXT: strh w8, [sp, #400]
2311 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #112] // 4-byte Folded Reload
2312 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2313 ; NONEON-NOSVE-NEXT: strh w8, [sp, #430]
2314 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #116] // 4-byte Folded Reload
2315 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2316 ; NONEON-NOSVE-NEXT: strh w8, [sp, #428]
2317 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #120] // 4-byte Folded Reload
2318 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2319 ; NONEON-NOSVE-NEXT: strh w8, [sp, #426]
2320 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #124] // 4-byte Folded Reload
2321 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2322 ; NONEON-NOSVE-NEXT: strh w8, [sp, #424]
2323 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #128] // 4-byte Folded Reload
2324 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2325 ; NONEON-NOSVE-NEXT: strh w8, [sp, #422]
2326 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #132] // 4-byte Folded Reload
2327 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2328 ; NONEON-NOSVE-NEXT: strh w8, [sp, #420]
2329 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #136] // 4-byte Folded Reload
2330 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2331 ; NONEON-NOSVE-NEXT: strh w8, [sp, #418]
2332 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #140] // 4-byte Folded Reload
2333 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2334 ; NONEON-NOSVE-NEXT: strh w8, [sp, #416]
2335 ; NONEON-NOSVE-NEXT: ldp q5, q2, [sp, #400]
2336 ; NONEON-NOSVE-NEXT: stp q1, q0, [x5]
2337 ; NONEON-NOSVE-NEXT: stp q4, q3, [x5, #32]
2338 ; NONEON-NOSVE-NEXT: stp q7, q6, [x5, #64]
2339 ; NONEON-NOSVE-NEXT: stp q2, q5, [x5, #96]
2340 ; NONEON-NOSVE-NEXT: add sp, sp, #528
2341 ; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload
2342 ; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #64] // 16-byte Folded Reload
2343 ; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #48] // 16-byte Folded Reload
2344 ; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #32] // 16-byte Folded Reload
2345 ; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #16] // 16-byte Folded Reload
2346 ; NONEON-NOSVE-NEXT: ldp x29, x30, [sp], #96 // 16-byte Folded Reload
2347 ; NONEON-NOSVE-NEXT: ret
2348 %a = load <64 x i32>, ptr %in
2349 %b = trunc <64 x i32> %a to <64 x i16>
2350 %c = add <64 x i16> %b, %b
2351 store <64 x i16> %c, ptr %out
2356 ; truncate i64 -> i8
2359 ; NOTE: v4i8 is not legal so result i8 elements are held within i16 containers.
2360 define <4 x i8> @trunc_v4i64_v4i8(ptr %in) nounwind {
2361 ; CHECK-LABEL: trunc_v4i64_v4i8:
2363 ; CHECK-NEXT: ldp q1, q0, [x0]
2364 ; CHECK-NEXT: ptrue p0.s, vl2
2365 ; CHECK-NEXT: uzp1 z3.s, z0.s, z0.s
2366 ; CHECK-NEXT: uzp1 z2.s, z1.s, z1.s
2367 ; CHECK-NEXT: splice z0.s, p0, { z2.s, z3.s }
2368 ; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h
2369 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
2372 ; NONEON-NOSVE-LABEL: trunc_v4i64_v4i8:
2373 ; NONEON-NOSVE: // %bb.0:
2374 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]
2375 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!
2376 ; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]
2377 ; NONEON-NOSVE-NEXT: strh w8, [sp, #44]
2378 ; NONEON-NOSVE-NEXT: ldp x8, x10, [sp]
2379 ; NONEON-NOSVE-NEXT: strh w9, [sp, #46]
2380 ; NONEON-NOSVE-NEXT: strh w10, [sp, #42]
2381 ; NONEON-NOSVE-NEXT: strh w8, [sp, #40]
2382 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #40]
2383 ; NONEON-NOSVE-NEXT: add sp, sp, #48
2384 ; NONEON-NOSVE-NEXT: ret
2385 %a = load <4 x i64>, ptr %in
2386 %b = trunc <4 x i64> %a to <4 x i8>
2390 define <8 x i8> @trunc_v8i64_v8i8(ptr %in) nounwind {
2391 ; CHECK-LABEL: trunc_v8i64_v8i8:
2393 ; CHECK-NEXT: ldp q1, q0, [x0, #32]
2394 ; CHECK-NEXT: ptrue p0.s, vl2
2395 ; CHECK-NEXT: ldp q3, q2, [x0]
2396 ; CHECK-NEXT: uzp1 z5.s, z0.s, z0.s
2397 ; CHECK-NEXT: uzp1 z4.s, z1.s, z1.s
2398 ; CHECK-NEXT: uzp1 z1.s, z2.s, z2.s
2399 ; CHECK-NEXT: uzp1 z0.s, z3.s, z3.s
2400 ; CHECK-NEXT: splice z2.s, p0, { z4.s, z5.s }
2401 ; CHECK-NEXT: splice z0.s, p0, { z0.s, z1.s }
2402 ; CHECK-NEXT: ptrue p0.h, vl4
2403 ; CHECK-NEXT: uzp1 z2.h, z2.h, z2.h
2404 ; CHECK-NEXT: uzp1 z1.h, z0.h, z0.h
2405 ; CHECK-NEXT: splice z0.h, p0, { z1.h, z2.h }
2406 ; CHECK-NEXT: uzp1 z0.b, z0.b, z0.b
2407 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
2410 ; NONEON-NOSVE-LABEL: trunc_v8i64_v8i8:
2411 ; NONEON-NOSVE: // %bb.0:
2412 ; NONEON-NOSVE-NEXT: sub sp, sp, #80
2413 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32]
2414 ; NONEON-NOSVE-NEXT: ldp q2, q3, [x0]
2415 ; NONEON-NOSVE-NEXT: str q1, [sp, #48]
2416 ; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #16]
2417 ; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]
2418 ; NONEON-NOSVE-NEXT: str q2, [sp]
2419 ; NONEON-NOSVE-NEXT: strb w8, [sp, #78]
2420 ; NONEON-NOSVE-NEXT: ldp x8, x10, [sp, #48]
2421 ; NONEON-NOSVE-NEXT: strb w9, [sp, #79]
2422 ; NONEON-NOSVE-NEXT: strb w8, [sp, #76]
2423 ; NONEON-NOSVE-NEXT: ldp x8, x11, [sp, #32]
2424 ; NONEON-NOSVE-NEXT: strb w10, [sp, #77]
2425 ; NONEON-NOSVE-NEXT: strb w8, [sp, #74]
2426 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #8]
2427 ; NONEON-NOSVE-NEXT: strb w11, [sp, #75]
2428 ; NONEON-NOSVE-NEXT: strb w8, [sp, #73]
2429 ; NONEON-NOSVE-NEXT: ldr x8, [sp]
2430 ; NONEON-NOSVE-NEXT: strb w8, [sp, #72]
2431 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #72]
2432 ; NONEON-NOSVE-NEXT: add sp, sp, #80
2433 ; NONEON-NOSVE-NEXT: ret
2434 %a = load <8 x i64>, ptr %in
2435 %b = trunc <8 x i64> %a to <8 x i8>
2439 define <16 x i8> @trunc_v16i64_v16i8(ptr %in) nounwind {
2440 ; CHECK-LABEL: trunc_v16i64_v16i8:
2442 ; CHECK-NEXT: ldp q0, q1, [x0, #96]
2443 ; CHECK-NEXT: ptrue p0.s, vl2
2444 ; CHECK-NEXT: ldp q2, q3, [x0, #32]
2445 ; CHECK-NEXT: ldp q4, q5, [x0, #64]
2446 ; CHECK-NEXT: ldp q6, q7, [x0]
2447 ; CHECK-NEXT: uzp1 z17.s, z1.s, z1.s
2448 ; CHECK-NEXT: uzp1 z16.s, z0.s, z0.s
2449 ; CHECK-NEXT: uzp1 z19.s, z3.s, z3.s
2450 ; CHECK-NEXT: uzp1 z1.s, z5.s, z5.s
2451 ; CHECK-NEXT: uzp1 z18.s, z2.s, z2.s
2452 ; CHECK-NEXT: uzp1 z0.s, z4.s, z4.s
2453 ; CHECK-NEXT: uzp1 z3.s, z7.s, z7.s
2454 ; CHECK-NEXT: uzp1 z2.s, z6.s, z6.s
2455 ; CHECK-NEXT: splice z4.s, p0, { z16.s, z17.s }
2456 ; CHECK-NEXT: splice z0.s, p0, { z0.s, z1.s }
2457 ; CHECK-NEXT: splice z1.s, p0, { z18.s, z19.s }
2458 ; CHECK-NEXT: splice z2.s, p0, { z2.s, z3.s }
2459 ; CHECK-NEXT: ptrue p0.h, vl4
2460 ; CHECK-NEXT: uzp1 z4.h, z4.h, z4.h
2461 ; CHECK-NEXT: uzp1 z3.h, z0.h, z0.h
2462 ; CHECK-NEXT: uzp1 z1.h, z1.h, z1.h
2463 ; CHECK-NEXT: uzp1 z0.h, z2.h, z2.h
2464 ; CHECK-NEXT: splice z2.h, p0, { z3.h, z4.h }
2465 ; CHECK-NEXT: splice z0.h, p0, { z0.h, z1.h }
2466 ; CHECK-NEXT: ptrue p0.b, vl8
2467 ; CHECK-NEXT: uzp1 z2.b, z2.b, z2.b
2468 ; CHECK-NEXT: uzp1 z1.b, z0.b, z0.b
2469 ; CHECK-NEXT: splice z0.b, p0, { z1.b, z2.b }
2470 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
2473 ; NONEON-NOSVE-LABEL: trunc_v16i64_v16i8:
2474 ; NONEON-NOSVE: // %bb.0:
2475 ; NONEON-NOSVE-NEXT: sub sp, sp, #144
2476 ; NONEON-NOSVE-NEXT: ldp q0, q1, [x0, #96]
2477 ; NONEON-NOSVE-NEXT: ldp q2, q3, [x0]
2478 ; NONEON-NOSVE-NEXT: ldp q4, q5, [x0, #32]
2479 ; NONEON-NOSVE-NEXT: ldp q6, q7, [x0, #64]
2480 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #16]
2481 ; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #32]
2482 ; NONEON-NOSVE-NEXT: str q3, [sp, #80]
2483 ; NONEON-NOSVE-NEXT: str q2, [sp]
2484 ; NONEON-NOSVE-NEXT: stp q7, q5, [sp, #48]
2485 ; NONEON-NOSVE-NEXT: strb w8, [sp, #142]
2486 ; NONEON-NOSVE-NEXT: ldp x8, x10, [sp, #16]
2487 ; NONEON-NOSVE-NEXT: stp q4, q6, [sp, #96]
2488 ; NONEON-NOSVE-NEXT: strb w9, [sp, #143]
2489 ; NONEON-NOSVE-NEXT: strb w8, [sp, #140]
2490 ; NONEON-NOSVE-NEXT: ldp x8, x11, [sp, #48]
2491 ; NONEON-NOSVE-NEXT: strb w10, [sp, #141]
2492 ; NONEON-NOSVE-NEXT: strb w8, [sp, #138]
2493 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #120]
2494 ; NONEON-NOSVE-NEXT: strb w11, [sp, #139]
2495 ; NONEON-NOSVE-NEXT: strb w8, [sp, #137]
2496 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #112]
2497 ; NONEON-NOSVE-NEXT: strb w8, [sp, #136]
2498 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #72]
2499 ; NONEON-NOSVE-NEXT: strb w8, [sp, #135]
2500 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #64]
2501 ; NONEON-NOSVE-NEXT: strb w8, [sp, #134]
2502 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #104]
2503 ; NONEON-NOSVE-NEXT: strb w8, [sp, #133]
2504 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #96]
2505 ; NONEON-NOSVE-NEXT: strb w8, [sp, #132]
2506 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #88]
2507 ; NONEON-NOSVE-NEXT: strb w8, [sp, #131]
2508 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #80]
2509 ; NONEON-NOSVE-NEXT: strb w8, [sp, #130]
2510 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #8]
2511 ; NONEON-NOSVE-NEXT: strb w8, [sp, #129]
2512 ; NONEON-NOSVE-NEXT: ldr x8, [sp]
2513 ; NONEON-NOSVE-NEXT: strb w8, [sp, #128]
2514 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #128]
2515 ; NONEON-NOSVE-NEXT: add sp, sp, #144
2516 ; NONEON-NOSVE-NEXT: ret
2517 %a = load <16 x i64>, ptr %in
2518 %b = trunc <16 x i64> %a to <16 x i8>
2522 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
2523 define void @trunc_v32i64_v32i8(ptr %in, ptr %out) nounwind {
2524 ; CHECK-LABEL: trunc_v32i64_v32i8:
2526 ; CHECK-NEXT: ldp q5, q6, [x0, #224]
2527 ; CHECK-NEXT: ptrue p0.s, vl2
2528 ; CHECK-NEXT: ldp q2, q3, [x0, #32]
2529 ; CHECK-NEXT: ldp q4, q7, [x0, #64]
2530 ; CHECK-NEXT: uzp1 z17.s, z6.s, z6.s
2531 ; CHECK-NEXT: ldp q6, q18, [x0, #192]
2532 ; CHECK-NEXT: uzp1 z16.s, z5.s, z5.s
2533 ; CHECK-NEXT: ldp q5, q19, [x0, #128]
2534 ; CHECK-NEXT: ldp q0, q1, [x0]
2535 ; CHECK-NEXT: uzp1 z21.s, z18.s, z18.s
2536 ; CHECK-NEXT: ldp q18, q22, [x0, #160]
2537 ; CHECK-NEXT: uzp1 z20.s, z6.s, z6.s
2538 ; CHECK-NEXT: ldp q6, q23, [x0, #96]
2539 ; CHECK-NEXT: splice z16.s, p0, { z16.s, z17.s }
2540 ; CHECK-NEXT: uzp1 z27.s, z19.s, z19.s
2541 ; CHECK-NEXT: uzp1 z25.s, z22.s, z22.s
2542 ; CHECK-NEXT: uzp1 z26.s, z5.s, z5.s
2543 ; CHECK-NEXT: uzp1 z24.s, z18.s, z18.s
2544 ; CHECK-NEXT: uzp1 z18.s, z23.s, z23.s
2545 ; CHECK-NEXT: uzp1 z23.s, z3.s, z3.s
2546 ; CHECK-NEXT: uzp1 z17.s, z6.s, z6.s
2547 ; CHECK-NEXT: uzp1 z6.s, z7.s, z7.s
2548 ; CHECK-NEXT: uzp1 z22.s, z2.s, z2.s
2549 ; CHECK-NEXT: uzp1 z5.s, z4.s, z4.s
2550 ; CHECK-NEXT: uzp1 z2.s, z1.s, z1.s
2551 ; CHECK-NEXT: splice z3.s, p0, { z20.s, z21.s }
2552 ; CHECK-NEXT: uzp1 z1.s, z0.s, z0.s
2553 ; CHECK-NEXT: splice z0.s, p0, { z24.s, z25.s }
2554 ; CHECK-NEXT: splice z7.s, p0, { z26.s, z27.s }
2555 ; CHECK-NEXT: splice z4.s, p0, { z17.s, z18.s }
2556 ; CHECK-NEXT: uzp1 z17.h, z16.h, z16.h
2557 ; CHECK-NEXT: splice z5.s, p0, { z5.s, z6.s }
2558 ; CHECK-NEXT: splice z6.s, p0, { z22.s, z23.s }
2559 ; CHECK-NEXT: splice z1.s, p0, { z1.s, z2.s }
2560 ; CHECK-NEXT: uzp1 z16.h, z3.h, z3.h
2561 ; CHECK-NEXT: ptrue p0.h, vl4
2562 ; CHECK-NEXT: uzp1 z3.h, z0.h, z0.h
2563 ; CHECK-NEXT: uzp1 z19.h, z4.h, z4.h
2564 ; CHECK-NEXT: uzp1 z2.h, z7.h, z7.h
2565 ; CHECK-NEXT: uzp1 z18.h, z5.h, z5.h
2566 ; CHECK-NEXT: uzp1 z5.h, z6.h, z6.h
2567 ; CHECK-NEXT: splice z0.h, p0, { z16.h, z17.h }
2568 ; CHECK-NEXT: uzp1 z4.h, z1.h, z1.h
2569 ; CHECK-NEXT: splice z1.h, p0, { z2.h, z3.h }
2570 ; CHECK-NEXT: splice z2.h, p0, { z18.h, z19.h }
2571 ; CHECK-NEXT: splice z3.h, p0, { z4.h, z5.h }
2572 ; CHECK-NEXT: uzp1 z5.b, z0.b, z0.b
2573 ; CHECK-NEXT: ptrue p0.b, vl8
2574 ; CHECK-NEXT: uzp1 z4.b, z1.b, z1.b
2575 ; CHECK-NEXT: uzp1 z7.b, z2.b, z2.b
2576 ; CHECK-NEXT: uzp1 z6.b, z3.b, z3.b
2577 ; CHECK-NEXT: splice z0.b, p0, { z4.b, z5.b }
2578 ; CHECK-NEXT: splice z1.b, p0, { z6.b, z7.b }
2579 ; CHECK-NEXT: add z0.b, z0.b, z0.b
2580 ; CHECK-NEXT: add z1.b, z1.b, z1.b
2581 ; CHECK-NEXT: stp q1, q0, [x1]
2584 ; NONEON-NOSVE-LABEL: trunc_v32i64_v32i8:
2585 ; NONEON-NOSVE: // %bb.0:
2586 ; NONEON-NOSVE-NEXT: sub sp, sp, #416
2587 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #96]
2588 ; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #336] // 16-byte Folded Spill
2589 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #64]
2590 ; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #352] // 16-byte Folded Spill
2591 ; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #368] // 16-byte Folded Spill
2592 ; NONEON-NOSVE-NEXT: ldp q5, q4, [x0, #32]
2593 ; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #384] // 16-byte Folded Spill
2594 ; NONEON-NOSVE-NEXT: ldp q17, q16, [x0, #128]
2595 ; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #400] // 16-byte Folded Spill
2596 ; NONEON-NOSVE-NEXT: ldp q7, q6, [x0]
2597 ; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #320] // 16-byte Folded Spill
2598 ; NONEON-NOSVE-NEXT: ldp q19, q18, [x0, #224]
2599 ; NONEON-NOSVE-NEXT: str x1, [sp, #24] // 8-byte Folded Spill
2600 ; NONEON-NOSVE-NEXT: ldp q21, q20, [x0, #192]
2601 ; NONEON-NOSVE-NEXT: ldp q23, q22, [x0, #160]
2602 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #160]
2603 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #176]
2604 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #184]
2605 ; NONEON-NOSVE-NEXT: stp q2, q4, [sp, #192]
2606 ; NONEON-NOSVE-NEXT: stp q21, q19, [sp, #48]
2607 ; NONEON-NOSVE-NEXT: ldr w25, [sp, #208]
2608 ; NONEON-NOSVE-NEXT: ldr w26, [sp, #216]
2609 ; NONEON-NOSVE-NEXT: add w5, w9, w9
2610 ; NONEON-NOSVE-NEXT: add w6, w8, w8
2611 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #192]
2612 ; NONEON-NOSVE-NEXT: stp q20, q23, [sp, #96]
2613 ; NONEON-NOSVE-NEXT: ldr w2, [sp, #64]
2614 ; NONEON-NOSVE-NEXT: ldr w16, [sp, #48]
2615 ; NONEON-NOSVE-NEXT: add w9, w9, w9
2616 ; NONEON-NOSVE-NEXT: ldr w18, [sp, #96]
2617 ; NONEON-NOSVE-NEXT: stp q22, q16, [sp, #128]
2618 ; NONEON-NOSVE-NEXT: stp q6, q5, [sp, #224]
2619 ; NONEON-NOSVE-NEXT: ldr w3, [sp, #72]
2620 ; NONEON-NOSVE-NEXT: ldr w14, [sp, #128]
2621 ; NONEON-NOSVE-NEXT: stp q3, q17, [sp, #256]
2622 ; NONEON-NOSVE-NEXT: ldr w23, [sp, #240]
2623 ; NONEON-NOSVE-NEXT: ldr w21, [sp, #224]
2624 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #272]
2625 ; NONEON-NOSVE-NEXT: ldr w27, [sp, #256]
2626 ; NONEON-NOSVE-NEXT: ldr w28, [sp, #264]
2627 ; NONEON-NOSVE-NEXT: strb w9, [sp, #298]
2628 ; NONEON-NOSVE-NEXT: ldr w24, [sp, #248]
2629 ; NONEON-NOSVE-NEXT: ldr w22, [sp, #232]
2630 ; NONEON-NOSVE-NEXT: add w9, w27, w27
2631 ; NONEON-NOSVE-NEXT: str w8, [sp, #20] // 4-byte Folded Spill
2632 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #200]
2633 ; NONEON-NOSVE-NEXT: str q7, [sp, #32]
2634 ; NONEON-NOSVE-NEXT: ldr w0, [sp, #104]
2635 ; NONEON-NOSVE-NEXT: ldr w12, [sp, #112]
2636 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2637 ; NONEON-NOSVE-NEXT: strb w9, [sp, #296]
2638 ; NONEON-NOSVE-NEXT: add w9, w25, w25
2639 ; NONEON-NOSVE-NEXT: str q18, [sp, #80]
2640 ; NONEON-NOSVE-NEXT: ldr w19, [sp, #32]
2641 ; NONEON-NOSVE-NEXT: ldr w20, [sp, #40]
2642 ; NONEON-NOSVE-NEXT: strb w8, [sp, #299]
2643 ; NONEON-NOSVE-NEXT: add w8, w28, w28
2644 ; NONEON-NOSVE-NEXT: ldr w4, [sp, #80]
2645 ; NONEON-NOSVE-NEXT: strb w9, [sp, #294]
2646 ; NONEON-NOSVE-NEXT: add w9, w23, w23
2647 ; NONEON-NOSVE-NEXT: ldr w7, [sp, #88]
2648 ; NONEON-NOSVE-NEXT: strb w8, [sp, #297]
2649 ; NONEON-NOSVE-NEXT: add w8, w26, w26
2650 ; NONEON-NOSVE-NEXT: ldr w17, [sp, #56]
2651 ; NONEON-NOSVE-NEXT: strb w9, [sp, #292]
2652 ; NONEON-NOSVE-NEXT: add w9, w21, w21
2653 ; NONEON-NOSVE-NEXT: ldr w10, [sp, #144]
2654 ; NONEON-NOSVE-NEXT: strb w8, [sp, #295]
2655 ; NONEON-NOSVE-NEXT: add w8, w24, w24
2656 ; NONEON-NOSVE-NEXT: ldr w15, [sp, #136]
2657 ; NONEON-NOSVE-NEXT: strb w9, [sp, #290]
2658 ; NONEON-NOSVE-NEXT: add w9, w19, w19
2659 ; NONEON-NOSVE-NEXT: ldr w13, [sp, #120]
2660 ; NONEON-NOSVE-NEXT: strb w8, [sp, #293]
2661 ; NONEON-NOSVE-NEXT: add w8, w22, w22
2662 ; NONEON-NOSVE-NEXT: ldr w11, [sp, #152]
2663 ; NONEON-NOSVE-NEXT: strb w9, [sp, #288]
2664 ; NONEON-NOSVE-NEXT: add w9, w4, w4
2665 ; NONEON-NOSVE-NEXT: ldr w1, [sp, #280]
2666 ; NONEON-NOSVE-NEXT: strb w8, [sp, #291]
2667 ; NONEON-NOSVE-NEXT: add w8, w20, w20
2668 ; NONEON-NOSVE-NEXT: ldr w29, [sp, #160]
2669 ; NONEON-NOSVE-NEXT: strb w9, [sp, #318]
2670 ; NONEON-NOSVE-NEXT: add w9, w2, w2
2671 ; NONEON-NOSVE-NEXT: ldr w30, [sp, #168]
2672 ; NONEON-NOSVE-NEXT: strb w8, [sp, #289]
2673 ; NONEON-NOSVE-NEXT: add w8, w7, w7
2674 ; NONEON-NOSVE-NEXT: strb w9, [sp, #316]
2675 ; NONEON-NOSVE-NEXT: add w9, w18, w18
2676 ; NONEON-NOSVE-NEXT: strb w8, [sp, #319]
2677 ; NONEON-NOSVE-NEXT: add w8, w3, w3
2678 ; NONEON-NOSVE-NEXT: strb w9, [sp, #314]
2679 ; NONEON-NOSVE-NEXT: add w9, w16, w16
2680 ; NONEON-NOSVE-NEXT: strb w8, [sp, #317]
2681 ; NONEON-NOSVE-NEXT: add w8, w0, w0
2682 ; NONEON-NOSVE-NEXT: strb w9, [sp, #312]
2683 ; NONEON-NOSVE-NEXT: add w9, w14, w14
2684 ; NONEON-NOSVE-NEXT: strb w8, [sp, #315]
2685 ; NONEON-NOSVE-NEXT: add w8, w17, w17
2686 ; NONEON-NOSVE-NEXT: strb w9, [sp, #310]
2687 ; NONEON-NOSVE-NEXT: add w9, w12, w12
2688 ; NONEON-NOSVE-NEXT: strb w8, [sp, #313]
2689 ; NONEON-NOSVE-NEXT: add w8, w15, w15
2690 ; NONEON-NOSVE-NEXT: strb w9, [sp, #308]
2691 ; NONEON-NOSVE-NEXT: add w9, w10, w10
2692 ; NONEON-NOSVE-NEXT: strb w8, [sp, #311]
2693 ; NONEON-NOSVE-NEXT: add w8, w13, w13
2694 ; NONEON-NOSVE-NEXT: strb w9, [sp, #306]
2695 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #20] // 4-byte Folded Reload
2696 ; NONEON-NOSVE-NEXT: strb w8, [sp, #309]
2697 ; NONEON-NOSVE-NEXT: add w8, w11, w11
2698 ; NONEON-NOSVE-NEXT: add w9, w9, w9
2699 ; NONEON-NOSVE-NEXT: strb w5, [sp, #303]
2700 ; NONEON-NOSVE-NEXT: add w5, w30, w30
2701 ; NONEON-NOSVE-NEXT: strb w6, [sp, #302]
2702 ; NONEON-NOSVE-NEXT: add w6, w29, w29
2703 ; NONEON-NOSVE-NEXT: strb w8, [sp, #307]
2704 ; NONEON-NOSVE-NEXT: add w8, w1, w1
2705 ; NONEON-NOSVE-NEXT: strb w5, [sp, #301]
2706 ; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #400] // 16-byte Folded Reload
2707 ; NONEON-NOSVE-NEXT: strb w6, [sp, #300]
2708 ; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #384] // 16-byte Folded Reload
2709 ; NONEON-NOSVE-NEXT: strb w8, [sp, #305]
2710 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] // 8-byte Folded Reload
2711 ; NONEON-NOSVE-NEXT: strb w9, [sp, #304]
2712 ; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #368] // 16-byte Folded Reload
2713 ; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #288]
2714 ; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #352] // 16-byte Folded Reload
2715 ; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #336] // 16-byte Folded Reload
2716 ; NONEON-NOSVE-NEXT: stp q1, q0, [x8]
2717 ; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #320] // 16-byte Folded Reload
2718 ; NONEON-NOSVE-NEXT: add sp, sp, #416
2719 ; NONEON-NOSVE-NEXT: ret
2720 %a = load <32 x i64>, ptr %in
2721 %b = trunc <32 x i64> %a to <32 x i8>
2722 %c = add <32 x i8> %b, %b
2723 store <32 x i8> %c, ptr %out
2728 ; truncate i64 -> i16
2731 define <4 x i16> @trunc_v4i64_v4i16(ptr %in) nounwind {
2732 ; CHECK-LABEL: trunc_v4i64_v4i16:
2734 ; CHECK-NEXT: ldp q1, q0, [x0]
2735 ; CHECK-NEXT: ptrue p0.s, vl2
2736 ; CHECK-NEXT: uzp1 z3.s, z0.s, z0.s
2737 ; CHECK-NEXT: uzp1 z2.s, z1.s, z1.s
2738 ; CHECK-NEXT: splice z0.s, p0, { z2.s, z3.s }
2739 ; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h
2740 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
2743 ; NONEON-NOSVE-LABEL: trunc_v4i64_v4i16:
2744 ; NONEON-NOSVE: // %bb.0:
2745 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]
2746 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!
2747 ; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]
2748 ; NONEON-NOSVE-NEXT: strh w8, [sp, #44]
2749 ; NONEON-NOSVE-NEXT: ldp x8, x10, [sp]
2750 ; NONEON-NOSVE-NEXT: strh w9, [sp, #46]
2751 ; NONEON-NOSVE-NEXT: strh w10, [sp, #42]
2752 ; NONEON-NOSVE-NEXT: strh w8, [sp, #40]
2753 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #40]
2754 ; NONEON-NOSVE-NEXT: add sp, sp, #48
2755 ; NONEON-NOSVE-NEXT: ret
2756 %a = load <4 x i64>, ptr %in
2757 %b = trunc <4 x i64> %a to <4 x i16>
2761 define <8 x i16> @trunc_v8i64_v8i16(ptr %in) nounwind {
2762 ; CHECK-LABEL: trunc_v8i64_v8i16:
2764 ; CHECK-NEXT: ldp q1, q0, [x0, #32]
2765 ; CHECK-NEXT: ptrue p0.s, vl2
2766 ; CHECK-NEXT: ldp q3, q2, [x0]
2767 ; CHECK-NEXT: uzp1 z5.s, z0.s, z0.s
2768 ; CHECK-NEXT: uzp1 z4.s, z1.s, z1.s
2769 ; CHECK-NEXT: uzp1 z1.s, z2.s, z2.s
2770 ; CHECK-NEXT: uzp1 z0.s, z3.s, z3.s
2771 ; CHECK-NEXT: splice z2.s, p0, { z4.s, z5.s }
2772 ; CHECK-NEXT: splice z0.s, p0, { z0.s, z1.s }
2773 ; CHECK-NEXT: ptrue p0.h, vl4
2774 ; CHECK-NEXT: uzp1 z2.h, z2.h, z2.h
2775 ; CHECK-NEXT: uzp1 z1.h, z0.h, z0.h
2776 ; CHECK-NEXT: splice z0.h, p0, { z1.h, z2.h }
2777 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
2780 ; NONEON-NOSVE-LABEL: trunc_v8i64_v8i16:
2781 ; NONEON-NOSVE: // %bb.0:
2782 ; NONEON-NOSVE-NEXT: sub sp, sp, #80
2783 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32]
2784 ; NONEON-NOSVE-NEXT: ldp q2, q3, [x0]
2785 ; NONEON-NOSVE-NEXT: str q1, [sp, #48]
2786 ; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #16]
2787 ; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]
2788 ; NONEON-NOSVE-NEXT: str q2, [sp]
2789 ; NONEON-NOSVE-NEXT: strh w8, [sp, #76]
2790 ; NONEON-NOSVE-NEXT: ldp x8, x10, [sp, #48]
2791 ; NONEON-NOSVE-NEXT: strh w9, [sp, #78]
2792 ; NONEON-NOSVE-NEXT: strh w8, [sp, #72]
2793 ; NONEON-NOSVE-NEXT: ldp x8, x11, [sp, #32]
2794 ; NONEON-NOSVE-NEXT: strh w10, [sp, #74]
2795 ; NONEON-NOSVE-NEXT: strh w8, [sp, #68]
2796 ; NONEON-NOSVE-NEXT: ldr x8, [sp, #8]
2797 ; NONEON-NOSVE-NEXT: strh w11, [sp, #70]
2798 ; NONEON-NOSVE-NEXT: strh w8, [sp, #66]
2799 ; NONEON-NOSVE-NEXT: ldr x8, [sp]
2800 ; NONEON-NOSVE-NEXT: strh w8, [sp, #64]
2801 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #64]
2802 ; NONEON-NOSVE-NEXT: add sp, sp, #80
2803 ; NONEON-NOSVE-NEXT: ret
2804 %a = load <8 x i64>, ptr %in
2805 %b = trunc <8 x i64> %a to <8 x i16>
2809 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
2810 define void @trunc_v16i64_v16i16(ptr %in, ptr %out) nounwind {
2811 ; CHECK-LABEL: trunc_v16i64_v16i16:
2813 ; CHECK-NEXT: ldp q0, q1, [x0, #96]
2814 ; CHECK-NEXT: ptrue p0.s, vl2
2815 ; CHECK-NEXT: ldp q2, q3, [x0, #32]
2816 ; CHECK-NEXT: ldp q4, q5, [x0, #64]
2817 ; CHECK-NEXT: ldp q6, q7, [x0]
2818 ; CHECK-NEXT: uzp1 z17.s, z1.s, z1.s
2819 ; CHECK-NEXT: uzp1 z16.s, z0.s, z0.s
2820 ; CHECK-NEXT: uzp1 z1.s, z3.s, z3.s
2821 ; CHECK-NEXT: uzp1 z19.s, z5.s, z5.s
2822 ; CHECK-NEXT: uzp1 z0.s, z2.s, z2.s
2823 ; CHECK-NEXT: uzp1 z3.s, z7.s, z7.s
2824 ; CHECK-NEXT: uzp1 z18.s, z4.s, z4.s
2825 ; CHECK-NEXT: uzp1 z2.s, z6.s, z6.s
2826 ; CHECK-NEXT: splice z4.s, p0, { z16.s, z17.s }
2827 ; CHECK-NEXT: splice z0.s, p0, { z0.s, z1.s }
2828 ; CHECK-NEXT: splice z5.s, p0, { z18.s, z19.s }
2829 ; CHECK-NEXT: splice z1.s, p0, { z2.s, z3.s }
2830 ; CHECK-NEXT: ptrue p0.h, vl4
2831 ; CHECK-NEXT: uzp1 z3.h, z4.h, z4.h
2832 ; CHECK-NEXT: uzp1 z7.h, z0.h, z0.h
2833 ; CHECK-NEXT: uzp1 z2.h, z5.h, z5.h
2834 ; CHECK-NEXT: uzp1 z6.h, z1.h, z1.h
2835 ; CHECK-NEXT: splice z0.h, p0, { z2.h, z3.h }
2836 ; CHECK-NEXT: splice z1.h, p0, { z6.h, z7.h }
2837 ; CHECK-NEXT: add z0.h, z0.h, z0.h
2838 ; CHECK-NEXT: add z1.h, z1.h, z1.h
2839 ; CHECK-NEXT: stp q1, q0, [x1]
2842 ; NONEON-NOSVE-LABEL: trunc_v16i64_v16i16:
2843 ; NONEON-NOSVE: // %bb.0:
2844 ; NONEON-NOSVE-NEXT: sub sp, sp, #160
2845 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #32]
2846 ; NONEON-NOSVE-NEXT: ldp q5, q4, [x0]
2847 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #64]
2848 ; NONEON-NOSVE-NEXT: ldp q7, q6, [x0, #96]
2849 ; NONEON-NOSVE-NEXT: stp q2, q4, [sp, #64]
2850 ; NONEON-NOSVE-NEXT: stp q3, q1, [sp, #96]
2851 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #64]
2852 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #72]
2853 ; NONEON-NOSVE-NEXT: ldr w2, [sp, #96]
2854 ; NONEON-NOSVE-NEXT: ldr w3, [sp, #104]
2855 ; NONEON-NOSVE-NEXT: stp q5, q7, [sp]
2856 ; NONEON-NOSVE-NEXT: add w9, w9, w9
2857 ; NONEON-NOSVE-NEXT: add w8, w8, w8
2858 ; NONEON-NOSVE-NEXT: ldr w4, [sp, #80]
2859 ; NONEON-NOSVE-NEXT: ldr w5, [sp, #88]
2860 ; NONEON-NOSVE-NEXT: stp q6, q0, [sp, #32]
2861 ; NONEON-NOSVE-NEXT: ldr w18, [sp]
2862 ; NONEON-NOSVE-NEXT: ldr w0, [sp, #8]
2863 ; NONEON-NOSVE-NEXT: strh w9, [sp, #142]
2864 ; NONEON-NOSVE-NEXT: add w9, w3, w3
2865 ; NONEON-NOSVE-NEXT: strh w8, [sp, #140]
2866 ; NONEON-NOSVE-NEXT: add w8, w2, w2
2867 ; NONEON-NOSVE-NEXT: ldr w16, [sp, #32]
2868 ; NONEON-NOSVE-NEXT: ldr w17, [sp, #40]
2869 ; NONEON-NOSVE-NEXT: strh w9, [sp, #138]
2870 ; NONEON-NOSVE-NEXT: add w9, w5, w5
2871 ; NONEON-NOSVE-NEXT: strh w8, [sp, #136]
2872 ; NONEON-NOSVE-NEXT: add w8, w4, w4
2873 ; NONEON-NOSVE-NEXT: ldr w14, [sp, #16]
2874 ; NONEON-NOSVE-NEXT: ldr w15, [sp, #24]
2875 ; NONEON-NOSVE-NEXT: strh w9, [sp, #134]
2876 ; NONEON-NOSVE-NEXT: add w9, w0, w0
2877 ; NONEON-NOSVE-NEXT: strh w8, [sp, #132]
2878 ; NONEON-NOSVE-NEXT: add w8, w18, w18
2879 ; NONEON-NOSVE-NEXT: ldr w12, [sp, #48]
2880 ; NONEON-NOSVE-NEXT: ldr w13, [sp, #56]
2881 ; NONEON-NOSVE-NEXT: strh w9, [sp, #130]
2882 ; NONEON-NOSVE-NEXT: add w9, w17, w17
2883 ; NONEON-NOSVE-NEXT: strh w8, [sp, #128]
2884 ; NONEON-NOSVE-NEXT: add w8, w16, w16
2885 ; NONEON-NOSVE-NEXT: ldr w10, [sp, #112]
2886 ; NONEON-NOSVE-NEXT: ldr w11, [sp, #120]
2887 ; NONEON-NOSVE-NEXT: strh w9, [sp, #158]
2888 ; NONEON-NOSVE-NEXT: add w9, w15, w15
2889 ; NONEON-NOSVE-NEXT: strh w8, [sp, #156]
2890 ; NONEON-NOSVE-NEXT: add w8, w14, w14
2891 ; NONEON-NOSVE-NEXT: strh w9, [sp, #154]
2892 ; NONEON-NOSVE-NEXT: add w9, w13, w13
2893 ; NONEON-NOSVE-NEXT: strh w8, [sp, #152]
2894 ; NONEON-NOSVE-NEXT: add w8, w12, w12
2895 ; NONEON-NOSVE-NEXT: strh w9, [sp, #150]
2896 ; NONEON-NOSVE-NEXT: add w9, w11, w11
2897 ; NONEON-NOSVE-NEXT: strh w8, [sp, #148]
2898 ; NONEON-NOSVE-NEXT: add w8, w10, w10
2899 ; NONEON-NOSVE-NEXT: strh w9, [sp, #146]
2900 ; NONEON-NOSVE-NEXT: strh w8, [sp, #144]
2901 ; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #128]
2902 ; NONEON-NOSVE-NEXT: stp q1, q0, [x1]
2903 ; NONEON-NOSVE-NEXT: add sp, sp, #160
2904 ; NONEON-NOSVE-NEXT: ret
2905 %a = load <16 x i64>, ptr %in
2906 %b = trunc <16 x i64> %a to <16 x i16>
2907 %c = add <16 x i16> %b, %b
2908 store <16 x i16> %c, ptr %out
2912 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
2913 define void @trunc_v32i64_v32i16(ptr %in, ptr %out) nounwind {
2914 ; CHECK-LABEL: trunc_v32i64_v32i16:
2916 ; CHECK-NEXT: ldp q2, q3, [x0, #160]
2917 ; CHECK-NEXT: ptrue p0.s, vl2
2918 ; CHECK-NEXT: ldp q4, q5, [x0, #96]
2919 ; CHECK-NEXT: ldp q6, q7, [x0]
2920 ; CHECK-NEXT: uzp1 z17.s, z3.s, z3.s
2921 ; CHECK-NEXT: ldp q3, q18, [x0, #128]
2922 ; CHECK-NEXT: uzp1 z16.s, z2.s, z2.s
2923 ; CHECK-NEXT: ldp q2, q19, [x0, #192]
2924 ; CHECK-NEXT: ldp q0, q1, [x0, #64]
2925 ; CHECK-NEXT: uzp1 z21.s, z18.s, z18.s
2926 ; CHECK-NEXT: ldp q18, q22, [x0, #224]
2927 ; CHECK-NEXT: uzp1 z20.s, z3.s, z3.s
2928 ; CHECK-NEXT: ldp q3, q23, [x0, #32]
2929 ; CHECK-NEXT: splice z16.s, p0, { z16.s, z17.s }
2930 ; CHECK-NEXT: uzp1 z27.s, z19.s, z19.s
2931 ; CHECK-NEXT: uzp1 z25.s, z22.s, z22.s
2932 ; CHECK-NEXT: uzp1 z26.s, z2.s, z2.s
2933 ; CHECK-NEXT: uzp1 z24.s, z18.s, z18.s
2934 ; CHECK-NEXT: uzp1 z18.s, z23.s, z23.s
2935 ; CHECK-NEXT: uzp1 z23.s, z5.s, z5.s
2936 ; CHECK-NEXT: uzp1 z17.s, z3.s, z3.s
2937 ; CHECK-NEXT: uzp1 z3.s, z7.s, z7.s
2938 ; CHECK-NEXT: uzp1 z22.s, z4.s, z4.s
2939 ; CHECK-NEXT: uzp1 z2.s, z6.s, z6.s
2940 ; CHECK-NEXT: uzp1 z5.s, z1.s, z1.s
2941 ; CHECK-NEXT: splice z1.s, p0, { z20.s, z21.s }
2942 ; CHECK-NEXT: splice z6.s, p0, { z24.s, z25.s }
2943 ; CHECK-NEXT: uzp1 z4.s, z0.s, z0.s
2944 ; CHECK-NEXT: splice z0.s, p0, { z26.s, z27.s }
2945 ; CHECK-NEXT: splice z7.s, p0, { z17.s, z18.s }
2946 ; CHECK-NEXT: uzp1 z17.h, z16.h, z16.h
2947 ; CHECK-NEXT: splice z2.s, p0, { z2.s, z3.s }
2948 ; CHECK-NEXT: splice z3.s, p0, { z22.s, z23.s }
2949 ; CHECK-NEXT: splice z4.s, p0, { z4.s, z5.s }
2950 ; CHECK-NEXT: uzp1 z16.h, z1.h, z1.h
2951 ; CHECK-NEXT: ptrue p0.h, vl4
2952 ; CHECK-NEXT: uzp1 z6.h, z6.h, z6.h
2953 ; CHECK-NEXT: uzp1 z5.h, z0.h, z0.h
2954 ; CHECK-NEXT: uzp1 z1.h, z7.h, z7.h
2955 ; CHECK-NEXT: uzp1 z0.h, z2.h, z2.h
2956 ; CHECK-NEXT: uzp1 z3.h, z3.h, z3.h
2957 ; CHECK-NEXT: splice z7.h, p0, { z16.h, z17.h }
2958 ; CHECK-NEXT: uzp1 z2.h, z4.h, z4.h
2959 ; CHECK-NEXT: splice z4.h, p0, { z5.h, z6.h }
2960 ; CHECK-NEXT: splice z0.h, p0, { z0.h, z1.h }
2961 ; CHECK-NEXT: splice z1.h, p0, { z2.h, z3.h }
2962 ; CHECK-NEXT: add z2.h, z7.h, z7.h
2963 ; CHECK-NEXT: add z3.h, z4.h, z4.h
2964 ; CHECK-NEXT: add z0.h, z0.h, z0.h
2965 ; CHECK-NEXT: add z1.h, z1.h, z1.h
2966 ; CHECK-NEXT: stp q2, q3, [x1, #32]
2967 ; CHECK-NEXT: stp q0, q1, [x1]
2970 ; NONEON-NOSVE-LABEL: trunc_v32i64_v32i16:
2971 ; NONEON-NOSVE: // %bb.0:
2972 ; NONEON-NOSVE-NEXT: sub sp, sp, #432
2973 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #96]
2974 ; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #352] // 16-byte Folded Spill
2975 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #64]
2976 ; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #368] // 16-byte Folded Spill
2977 ; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #384] // 16-byte Folded Spill
2978 ; NONEON-NOSVE-NEXT: ldp q17, q16, [x0, #128]
2979 ; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #400] // 16-byte Folded Spill
2980 ; NONEON-NOSVE-NEXT: ldp q5, q4, [x0, #32]
2981 ; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #416] // 16-byte Folded Spill
2982 ; NONEON-NOSVE-NEXT: ldp q7, q6, [x0]
2983 ; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #336] // 16-byte Folded Spill
2984 ; NONEON-NOSVE-NEXT: ldp q19, q18, [x0, #224]
2985 ; NONEON-NOSVE-NEXT: ldp q21, q20, [x0, #192]
2986 ; NONEON-NOSVE-NEXT: ldp q23, q22, [x0, #160]
2987 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #144]
2988 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #160]
2989 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #168]
2990 ; NONEON-NOSVE-NEXT: stp q2, q4, [sp, #176]
2991 ; NONEON-NOSVE-NEXT: stp q21, q19, [sp, #32]
2992 ; NONEON-NOSVE-NEXT: ldr w25, [sp, #192]
2993 ; NONEON-NOSVE-NEXT: ldr w26, [sp, #200]
2994 ; NONEON-NOSVE-NEXT: add w6, w8, w8
2995 ; NONEON-NOSVE-NEXT: add w5, w9, w9
2996 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #176]
2997 ; NONEON-NOSVE-NEXT: stp q20, q23, [sp, #80]
2998 ; NONEON-NOSVE-NEXT: ldr w2, [sp, #48]
2999 ; NONEON-NOSVE-NEXT: ldr w3, [sp, #56]
3000 ; NONEON-NOSVE-NEXT: add w9, w9, w9
3001 ; NONEON-NOSVE-NEXT: ldr w18, [sp, #80]
3002 ; NONEON-NOSVE-NEXT: stp q22, q16, [sp, #112]
3003 ; NONEON-NOSVE-NEXT: stp q6, q5, [sp, #208]
3004 ; NONEON-NOSVE-NEXT: ldr w0, [sp, #88]
3005 ; NONEON-NOSVE-NEXT: ldr w16, [sp, #32]
3006 ; NONEON-NOSVE-NEXT: stp q3, q17, [sp, #240]
3007 ; NONEON-NOSVE-NEXT: ldr w23, [sp, #224]
3008 ; NONEON-NOSVE-NEXT: ldr w24, [sp, #232]
3009 ; NONEON-NOSVE-NEXT: ldr w10, [sp, #256]
3010 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #264]
3011 ; NONEON-NOSVE-NEXT: ldr w27, [sp, #240]
3012 ; NONEON-NOSVE-NEXT: ldr w28, [sp, #248]
3013 ; NONEON-NOSVE-NEXT: strh w9, [sp, #308]
3014 ; NONEON-NOSVE-NEXT: ldr w21, [sp, #208]
3015 ; NONEON-NOSVE-NEXT: add w9, w27, w27
3016 ; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #8] // 8-byte Folded Spill
3017 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #184]
3018 ; NONEON-NOSVE-NEXT: str q7, [sp, #16]
3019 ; NONEON-NOSVE-NEXT: ldr w22, [sp, #216]
3020 ; NONEON-NOSVE-NEXT: ldr w17, [sp, #40]
3021 ; NONEON-NOSVE-NEXT: add w8, w8, w8
3022 ; NONEON-NOSVE-NEXT: strh w9, [sp, #304]
3023 ; NONEON-NOSVE-NEXT: add w9, w25, w25
3024 ; NONEON-NOSVE-NEXT: strh w8, [sp, #310]
3025 ; NONEON-NOSVE-NEXT: add w8, w28, w28
3026 ; NONEON-NOSVE-NEXT: ldr w19, [sp, #16]
3027 ; NONEON-NOSVE-NEXT: strh w8, [sp, #306]
3028 ; NONEON-NOSVE-NEXT: add w8, w26, w26
3029 ; NONEON-NOSVE-NEXT: ldr w20, [sp, #24]
3030 ; NONEON-NOSVE-NEXT: str q18, [sp, #64]
3031 ; NONEON-NOSVE-NEXT: ldr w14, [sp, #112]
3032 ; NONEON-NOSVE-NEXT: ldr w15, [sp, #120]
3033 ; NONEON-NOSVE-NEXT: strh w8, [sp, #302]
3034 ; NONEON-NOSVE-NEXT: add w8, w24, w24
3035 ; NONEON-NOSVE-NEXT: ldr w4, [sp, #64]
3036 ; NONEON-NOSVE-NEXT: strh w9, [sp, #300]
3037 ; NONEON-NOSVE-NEXT: add w9, w23, w23
3038 ; NONEON-NOSVE-NEXT: ldr w7, [sp, #72]
3039 ; NONEON-NOSVE-NEXT: strh w8, [sp, #298]
3040 ; NONEON-NOSVE-NEXT: add w8, w22, w22
3041 ; NONEON-NOSVE-NEXT: ldr w12, [sp, #96]
3042 ; NONEON-NOSVE-NEXT: strh w9, [sp, #296]
3043 ; NONEON-NOSVE-NEXT: add w9, w21, w21
3044 ; NONEON-NOSVE-NEXT: ldr w13, [sp, #104]
3045 ; NONEON-NOSVE-NEXT: strh w8, [sp, #294]
3046 ; NONEON-NOSVE-NEXT: add w8, w20, w20
3047 ; NONEON-NOSVE-NEXT: ldr w10, [sp, #128]
3048 ; NONEON-NOSVE-NEXT: strh w9, [sp, #292]
3049 ; NONEON-NOSVE-NEXT: add w9, w19, w19
3050 ; NONEON-NOSVE-NEXT: ldr w11, [sp, #136]
3051 ; NONEON-NOSVE-NEXT: strh w8, [sp, #290]
3052 ; NONEON-NOSVE-NEXT: add w8, w7, w7
3053 ; NONEON-NOSVE-NEXT: ldr w29, [sp, #144]
3054 ; NONEON-NOSVE-NEXT: strh w9, [sp, #288]
3055 ; NONEON-NOSVE-NEXT: add w9, w4, w4
3056 ; NONEON-NOSVE-NEXT: ldr w30, [sp, #152]
3057 ; NONEON-NOSVE-NEXT: strh w8, [sp, #286]
3058 ; NONEON-NOSVE-NEXT: add w8, w3, w3
3059 ; NONEON-NOSVE-NEXT: strh w9, [sp, #284]
3060 ; NONEON-NOSVE-NEXT: add w9, w2, w2
3061 ; NONEON-NOSVE-NEXT: strh w8, [sp, #282]
3062 ; NONEON-NOSVE-NEXT: add w8, w0, w0
3063 ; NONEON-NOSVE-NEXT: strh w9, [sp, #280]
3064 ; NONEON-NOSVE-NEXT: add w9, w18, w18
3065 ; NONEON-NOSVE-NEXT: strh w8, [sp, #278]
3066 ; NONEON-NOSVE-NEXT: add w8, w17, w17
3067 ; NONEON-NOSVE-NEXT: strh w9, [sp, #276]
3068 ; NONEON-NOSVE-NEXT: add w9, w16, w16
3069 ; NONEON-NOSVE-NEXT: strh w8, [sp, #274]
3070 ; NONEON-NOSVE-NEXT: add w8, w15, w15
3071 ; NONEON-NOSVE-NEXT: strh w9, [sp, #272]
3072 ; NONEON-NOSVE-NEXT: add w9, w14, w14
3073 ; NONEON-NOSVE-NEXT: strh w8, [sp, #334]
3074 ; NONEON-NOSVE-NEXT: add w8, w13, w13
3075 ; NONEON-NOSVE-NEXT: strh w9, [sp, #332]
3076 ; NONEON-NOSVE-NEXT: add w9, w12, w12
3077 ; NONEON-NOSVE-NEXT: strh w8, [sp, #330]
3078 ; NONEON-NOSVE-NEXT: add w8, w11, w11
3079 ; NONEON-NOSVE-NEXT: strh w9, [sp, #328]
3080 ; NONEON-NOSVE-NEXT: add w9, w10, w10
3081 ; NONEON-NOSVE-NEXT: strh w8, [sp, #326]
3082 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] // 4-byte Folded Reload
3083 ; NONEON-NOSVE-NEXT: strh w9, [sp, #324]
3084 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #12] // 4-byte Folded Reload
3085 ; NONEON-NOSVE-NEXT: add w8, w8, w8
3086 ; NONEON-NOSVE-NEXT: strh w5, [sp, #318]
3087 ; NONEON-NOSVE-NEXT: add w5, w30, w30
3088 ; NONEON-NOSVE-NEXT: strh w6, [sp, #316]
3089 ; NONEON-NOSVE-NEXT: add w6, w29, w29
3090 ; NONEON-NOSVE-NEXT: add w9, w9, w9
3091 ; NONEON-NOSVE-NEXT: strh w5, [sp, #314]
3092 ; NONEON-NOSVE-NEXT: ldp q1, q3, [sp, #272]
3093 ; NONEON-NOSVE-NEXT: strh w6, [sp, #312]
3094 ; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #416] // 16-byte Folded Reload
3095 ; NONEON-NOSVE-NEXT: strh w8, [sp, #322]
3096 ; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #400] // 16-byte Folded Reload
3097 ; NONEON-NOSVE-NEXT: strh w9, [sp, #320]
3098 ; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #384] // 16-byte Folded Reload
3099 ; NONEON-NOSVE-NEXT: ldp q2, q0, [sp, #304]
3100 ; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #368] // 16-byte Folded Reload
3101 ; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #352] // 16-byte Folded Reload
3102 ; NONEON-NOSVE-NEXT: stp q3, q2, [x1]
3103 ; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #336] // 16-byte Folded Reload
3104 ; NONEON-NOSVE-NEXT: stp q0, q1, [x1, #32]
3105 ; NONEON-NOSVE-NEXT: add sp, sp, #432
3106 ; NONEON-NOSVE-NEXT: ret
3107 %a = load <32 x i64>, ptr %in
3108 %b = trunc <32 x i64> %a to <32 x i16>
3109 %c = add <32 x i16> %b, %b
3110 store <32 x i16> %c, ptr %out
3115 ; truncate i64 -> i32
3118 define <4 x i32> @trunc_v4i64_v4i32(ptr %in) nounwind {
3119 ; CHECK-LABEL: trunc_v4i64_v4i32:
3121 ; CHECK-NEXT: ldp q1, q0, [x0]
3122 ; CHECK-NEXT: ptrue p0.s, vl2
3123 ; CHECK-NEXT: uzp1 z3.s, z0.s, z0.s
3124 ; CHECK-NEXT: uzp1 z2.s, z1.s, z1.s
3125 ; CHECK-NEXT: splice z0.s, p0, { z2.s, z3.s }
3126 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
3129 ; NONEON-NOSVE-LABEL: trunc_v4i64_v4i32:
3130 ; NONEON-NOSVE: // %bb.0:
3131 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]
3132 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!
3133 ; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]
3134 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40]
3135 ; NONEON-NOSVE-NEXT: ldp x8, x10, [sp]
3136 ; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #32]
3137 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
3138 ; NONEON-NOSVE-NEXT: add sp, sp, #48
3139 ; NONEON-NOSVE-NEXT: ret
3140 %a = load <4 x i64>, ptr %in
3141 %b = trunc <4 x i64> %a to <4 x i32>
3145 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
3146 define void @trunc_v8i64_v8i32(ptr %in, ptr %out) nounwind {
3147 ; CHECK-LABEL: trunc_v8i64_v8i32:
3149 ; CHECK-NEXT: ldp q1, q0, [x0, #32]
3150 ; CHECK-NEXT: ptrue p0.s, vl2
3151 ; CHECK-NEXT: ldp q3, q2, [x0]
3152 ; CHECK-NEXT: uzp1 z5.s, z0.s, z0.s
3153 ; CHECK-NEXT: uzp1 z4.s, z1.s, z1.s
3154 ; CHECK-NEXT: uzp1 z1.s, z2.s, z2.s
3155 ; CHECK-NEXT: uzp1 z0.s, z3.s, z3.s
3156 ; CHECK-NEXT: splice z2.s, p0, { z4.s, z5.s }
3157 ; CHECK-NEXT: splice z0.s, p0, { z0.s, z1.s }
3158 ; CHECK-NEXT: add z1.s, z2.s, z2.s
3159 ; CHECK-NEXT: add z0.s, z0.s, z0.s
3160 ; CHECK-NEXT: stp q0, q1, [x1]
3163 ; NONEON-NOSVE-LABEL: trunc_v8i64_v8i32:
3164 ; NONEON-NOSVE: // %bb.0:
3165 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
3166 ; NONEON-NOSVE-NEXT: ldp q0, q1, [x0, #32]
3167 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0]
3168 ; NONEON-NOSVE-NEXT: stp q3, q1, [sp]
3169 ; NONEON-NOSVE-NEXT: stp q2, q0, [sp, #32]
3170 ; NONEON-NOSVE-NEXT: ldr w12, [sp]
3171 ; NONEON-NOSVE-NEXT: ldr w13, [sp, #8]
3172 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #32]
3173 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #40]
3174 ; NONEON-NOSVE-NEXT: ldr w14, [sp, #16]
3175 ; NONEON-NOSVE-NEXT: ldr w15, [sp, #24]
3176 ; NONEON-NOSVE-NEXT: ldr w10, [sp, #48]
3177 ; NONEON-NOSVE-NEXT: ldr w11, [sp, #56]
3178 ; NONEON-NOSVE-NEXT: add w9, w9, w9
3179 ; NONEON-NOSVE-NEXT: add w8, w8, w8
3180 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72]
3181 ; NONEON-NOSVE-NEXT: add w9, w13, w13
3182 ; NONEON-NOSVE-NEXT: add w8, w12, w12
3183 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64]
3184 ; NONEON-NOSVE-NEXT: add w9, w15, w15
3185 ; NONEON-NOSVE-NEXT: add w8, w14, w14
3186 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88]
3187 ; NONEON-NOSVE-NEXT: add w9, w11, w11
3188 ; NONEON-NOSVE-NEXT: add w8, w10, w10
3189 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80]
3190 ; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64]
3191 ; NONEON-NOSVE-NEXT: stp q1, q0, [x1]
3192 ; NONEON-NOSVE-NEXT: add sp, sp, #96
3193 ; NONEON-NOSVE-NEXT: ret
3194 %a = load <8 x i64>, ptr %in
3195 %b = trunc <8 x i64> %a to <8 x i32>
3196 %c = add <8 x i32> %b, %b
3197 store <8 x i32> %c, ptr %out
3201 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
3202 define void @trunc_v16i64_v16i32(ptr %in, ptr %out) nounwind {
3203 ; CHECK-LABEL: trunc_v16i64_v16i32:
3205 ; CHECK-NEXT: ldp q1, q0, [x0, #64]
3206 ; CHECK-NEXT: ptrue p0.s, vl2
3207 ; CHECK-NEXT: ldp q2, q3, [x0, #96]
3208 ; CHECK-NEXT: ldp q4, q5, [x0]
3209 ; CHECK-NEXT: uzp1 z7.s, z0.s, z0.s
3210 ; CHECK-NEXT: uzp1 z6.s, z1.s, z1.s
3211 ; CHECK-NEXT: ldp q1, q0, [x0, #32]
3212 ; CHECK-NEXT: uzp1 z17.s, z3.s, z3.s
3213 ; CHECK-NEXT: uzp1 z16.s, z2.s, z2.s
3214 ; CHECK-NEXT: uzp1 z3.s, z5.s, z5.s
3215 ; CHECK-NEXT: uzp1 z2.s, z4.s, z4.s
3216 ; CHECK-NEXT: uzp1 z5.s, z0.s, z0.s
3217 ; CHECK-NEXT: splice z0.s, p0, { z6.s, z7.s }
3218 ; CHECK-NEXT: uzp1 z4.s, z1.s, z1.s
3219 ; CHECK-NEXT: splice z1.s, p0, { z16.s, z17.s }
3220 ; CHECK-NEXT: splice z2.s, p0, { z2.s, z3.s }
3221 ; CHECK-NEXT: splice z3.s, p0, { z4.s, z5.s }
3222 ; CHECK-NEXT: add z0.s, z0.s, z0.s
3223 ; CHECK-NEXT: add z1.s, z1.s, z1.s
3224 ; CHECK-NEXT: add z2.s, z2.s, z2.s
3225 ; CHECK-NEXT: add z3.s, z3.s, z3.s
3226 ; CHECK-NEXT: stp q0, q1, [x1, #32]
3227 ; CHECK-NEXT: stp q2, q3, [x1]
3230 ; NONEON-NOSVE-LABEL: trunc_v16i64_v16i32:
3231 ; NONEON-NOSVE: // %bb.0:
3232 ; NONEON-NOSVE-NEXT: sub sp, sp, #192
3233 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #32]
3234 ; NONEON-NOSVE-NEXT: ldp q5, q4, [x0]
3235 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #64]
3236 ; NONEON-NOSVE-NEXT: ldp q7, q6, [x0, #96]
3237 ; NONEON-NOSVE-NEXT: stp q2, q4, [sp, #64]
3238 ; NONEON-NOSVE-NEXT: stp q3, q1, [sp, #96]
3239 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #64]
3240 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #72]
3241 ; NONEON-NOSVE-NEXT: ldr w2, [sp, #96]
3242 ; NONEON-NOSVE-NEXT: ldr w3, [sp, #104]
3243 ; NONEON-NOSVE-NEXT: stp q5, q7, [sp]
3244 ; NONEON-NOSVE-NEXT: add w9, w9, w9
3245 ; NONEON-NOSVE-NEXT: add w8, w8, w8
3246 ; NONEON-NOSVE-NEXT: ldr w4, [sp, #80]
3247 ; NONEON-NOSVE-NEXT: ldr w5, [sp, #88]
3248 ; NONEON-NOSVE-NEXT: stp q6, q0, [sp, #32]
3249 ; NONEON-NOSVE-NEXT: ldr w18, [sp]
3250 ; NONEON-NOSVE-NEXT: ldr w0, [sp, #8]
3251 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #168]
3252 ; NONEON-NOSVE-NEXT: add w9, w3, w3
3253 ; NONEON-NOSVE-NEXT: add w8, w2, w2
3254 ; NONEON-NOSVE-NEXT: ldr w16, [sp, #32]
3255 ; NONEON-NOSVE-NEXT: ldr w17, [sp, #40]
3256 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #160]
3257 ; NONEON-NOSVE-NEXT: add w9, w5, w5
3258 ; NONEON-NOSVE-NEXT: add w8, w4, w4
3259 ; NONEON-NOSVE-NEXT: ldr w14, [sp, #16]
3260 ; NONEON-NOSVE-NEXT: ldr w15, [sp, #24]
3261 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #152]
3262 ; NONEON-NOSVE-NEXT: add w9, w0, w0
3263 ; NONEON-NOSVE-NEXT: add w8, w18, w18
3264 ; NONEON-NOSVE-NEXT: ldr w12, [sp, #48]
3265 ; NONEON-NOSVE-NEXT: ldr w13, [sp, #56]
3266 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144]
3267 ; NONEON-NOSVE-NEXT: add w9, w17, w17
3268 ; NONEON-NOSVE-NEXT: add w8, w16, w16
3269 ; NONEON-NOSVE-NEXT: ldr w10, [sp, #112]
3270 ; NONEON-NOSVE-NEXT: ldr w11, [sp, #120]
3271 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136]
3272 ; NONEON-NOSVE-NEXT: add w9, w15, w15
3273 ; NONEON-NOSVE-NEXT: add w8, w14, w14
3274 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128]
3275 ; NONEON-NOSVE-NEXT: add w9, w13, w13
3276 ; NONEON-NOSVE-NEXT: add w8, w12, w12
3277 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #184]
3278 ; NONEON-NOSVE-NEXT: add w9, w11, w11
3279 ; NONEON-NOSVE-NEXT: add w8, w10, w10
3280 ; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #176]
3281 ; NONEON-NOSVE-NEXT: ldp q1, q3, [sp, #128]
3282 ; NONEON-NOSVE-NEXT: ldp q2, q0, [sp, #160]
3283 ; NONEON-NOSVE-NEXT: stp q3, q2, [x1]
3284 ; NONEON-NOSVE-NEXT: stp q0, q1, [x1, #32]
3285 ; NONEON-NOSVE-NEXT: add sp, sp, #192
3286 ; NONEON-NOSVE-NEXT: ret
3287 %a = load <16 x i64>, ptr %in
3288 %b = trunc <16 x i64> %a to <16 x i32>
3289 %c = add <16 x i32> %b, %b
3290 store <16 x i32> %c, ptr %out
3294 ; NOTE: Extra 'add' is to prevent the truncate being combined with the store.
3295 define void @trunc_v32i64_v32i32(ptr %in, ptr %out) nounwind {
3296 ; CHECK-LABEL: trunc_v32i64_v32i32:
3298 ; CHECK-NEXT: ldp q2, q3, [x0, #192]
3299 ; CHECK-NEXT: ptrue p0.s, vl2
3300 ; CHECK-NEXT: ldp q4, q5, [x0]
3301 ; CHECK-NEXT: ldp q6, q7, [x0, #64]
3302 ; CHECK-NEXT: uzp1 z17.s, z3.s, z3.s
3303 ; CHECK-NEXT: ldp q3, q18, [x0, #224]
3304 ; CHECK-NEXT: uzp1 z16.s, z2.s, z2.s
3305 ; CHECK-NEXT: ldp q2, q19, [x0, #128]
3306 ; CHECK-NEXT: ldp q0, q1, [x0, #32]
3307 ; CHECK-NEXT: uzp1 z21.s, z18.s, z18.s
3308 ; CHECK-NEXT: ldp q18, q22, [x0, #160]
3309 ; CHECK-NEXT: uzp1 z20.s, z3.s, z3.s
3310 ; CHECK-NEXT: uzp1 z24.s, z19.s, z19.s
3311 ; CHECK-NEXT: ldp q3, q19, [x0, #96]
3312 ; CHECK-NEXT: uzp1 z23.s, z2.s, z2.s
3313 ; CHECK-NEXT: uzp1 z26.s, z22.s, z22.s
3314 ; CHECK-NEXT: splice z2.s, p0, { z16.s, z17.s }
3315 ; CHECK-NEXT: uzp1 z17.s, z7.s, z7.s
3316 ; CHECK-NEXT: uzp1 z25.s, z18.s, z18.s
3317 ; CHECK-NEXT: splice z7.s, p0, { z20.s, z21.s }
3318 ; CHECK-NEXT: uzp1 z21.s, z5.s, z5.s
3319 ; CHECK-NEXT: uzp1 z19.s, z19.s, z19.s
3320 ; CHECK-NEXT: uzp1 z20.s, z4.s, z4.s
3321 ; CHECK-NEXT: uzp1 z5.s, z1.s, z1.s
3322 ; CHECK-NEXT: uzp1 z16.s, z6.s, z6.s
3323 ; CHECK-NEXT: splice z6.s, p0, { z23.s, z24.s }
3324 ; CHECK-NEXT: uzp1 z18.s, z3.s, z3.s
3325 ; CHECK-NEXT: splice z3.s, p0, { z25.s, z26.s }
3326 ; CHECK-NEXT: uzp1 z4.s, z0.s, z0.s
3327 ; CHECK-NEXT: add z0.s, z2.s, z2.s
3328 ; CHECK-NEXT: add z7.s, z7.s, z7.s
3329 ; CHECK-NEXT: splice z1.s, p0, { z16.s, z17.s }
3330 ; CHECK-NEXT: splice z2.s, p0, { z18.s, z19.s }
3331 ; CHECK-NEXT: splice z16.s, p0, { z20.s, z21.s }
3332 ; CHECK-NEXT: splice z4.s, p0, { z4.s, z5.s }
3333 ; CHECK-NEXT: add z6.s, z6.s, z6.s
3334 ; CHECK-NEXT: add z3.s, z3.s, z3.s
3335 ; CHECK-NEXT: stp q0, q7, [x1, #96]
3336 ; CHECK-NEXT: add z0.s, z1.s, z1.s
3337 ; CHECK-NEXT: add z1.s, z2.s, z2.s
3338 ; CHECK-NEXT: add z2.s, z16.s, z16.s
3339 ; CHECK-NEXT: stp q6, q3, [x1, #64]
3340 ; CHECK-NEXT: add z3.s, z4.s, z4.s
3341 ; CHECK-NEXT: stp q0, q1, [x1, #32]
3342 ; CHECK-NEXT: stp q2, q3, [x1]
3345 ; NONEON-NOSVE-LABEL: trunc_v32i64_v32i32:
3346 ; NONEON-NOSVE: // %bb.0:
3347 ; NONEON-NOSVE-NEXT: sub sp, sp, #496
3348 ; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32]
3349 ; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #416] // 16-byte Folded Spill
3350 ; NONEON-NOSVE-NEXT: ldp q17, q16, [x0, #192]
3351 ; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #432] // 16-byte Folded Spill
3352 ; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #448] // 16-byte Folded Spill
3353 ; NONEON-NOSVE-NEXT: ldp q23, q22, [x0, #224]
3354 ; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #464] // 16-byte Folded Spill
3355 ; NONEON-NOSVE-NEXT: ldp q3, q2, [x0]
3356 ; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #480] // 16-byte Folded Spill
3357 ; NONEON-NOSVE-NEXT: ldp q5, q4, [x0, #96]
3358 ; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #400] // 16-byte Folded Spill
3359 ; NONEON-NOSVE-NEXT: ldp q7, q6, [x0, #64]
3360 ; NONEON-NOSVE-NEXT: ldp q19, q18, [x0, #160]
3361 ; NONEON-NOSVE-NEXT: ldp q21, q20, [x0, #128]
3362 ; NONEON-NOSVE-NEXT: str q0, [sp, #192]
3363 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #192]
3364 ; NONEON-NOSVE-NEXT: stp q17, q23, [sp, #32]
3365 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #200]
3366 ; NONEON-NOSVE-NEXT: ldr w10, [sp, #32]
3367 ; NONEON-NOSVE-NEXT: stp q4, q6, [sp, #160]
3368 ; NONEON-NOSVE-NEXT: ldr w12, [sp, #48]
3369 ; NONEON-NOSVE-NEXT: add w6, w8, w8
3370 ; NONEON-NOSVE-NEXT: add w5, w9, w9
3371 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #40]
3372 ; NONEON-NOSVE-NEXT: stp q18, q20, [sp, #112]
3373 ; NONEON-NOSVE-NEXT: ldr w25, [sp, #160]
3374 ; NONEON-NOSVE-NEXT: ldr w26, [sp, #168]
3375 ; NONEON-NOSVE-NEXT: str q5, [sp, #144]
3376 ; NONEON-NOSVE-NEXT: ldr w21, [sp, #176]
3377 ; NONEON-NOSVE-NEXT: ldr w22, [sp, #184]
3378 ; NONEON-NOSVE-NEXT: stp q2, q1, [sp, #208]
3379 ; NONEON-NOSVE-NEXT: ldr w23, [sp, #144]
3380 ; NONEON-NOSVE-NEXT: ldr w24, [sp, #152]
3381 ; NONEON-NOSVE-NEXT: str q3, [sp, #16]
3382 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #208]
3383 ; NONEON-NOSVE-NEXT: ldr w4, [sp, #112]
3384 ; NONEON-NOSVE-NEXT: stp w8, w10, [sp, #8] // 8-byte Folded Spill
3385 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #216]
3386 ; NONEON-NOSVE-NEXT: ldr w27, [sp, #16]
3387 ; NONEON-NOSVE-NEXT: add w9, w9, w9
3388 ; NONEON-NOSVE-NEXT: ldr w28, [sp, #24]
3389 ; NONEON-NOSVE-NEXT: stp q22, q16, [sp, #64]
3390 ; NONEON-NOSVE-NEXT: add w8, w8, w8
3391 ; NONEON-NOSVE-NEXT: str w9, [sp, #344]
3392 ; NONEON-NOSVE-NEXT: add w9, w27, w27
3393 ; NONEON-NOSVE-NEXT: str w8, [sp, #348]
3394 ; NONEON-NOSVE-NEXT: add w8, w28, w28
3395 ; NONEON-NOSVE-NEXT: ldr w7, [sp, #120]
3396 ; NONEON-NOSVE-NEXT: stp q7, q21, [sp, #240]
3397 ; NONEON-NOSVE-NEXT: ldr w18, [sp, #128]
3398 ; NONEON-NOSVE-NEXT: ldr w0, [sp, #136]
3399 ; NONEON-NOSVE-NEXT: str w8, [sp, #340]
3400 ; NONEON-NOSVE-NEXT: add w8, w26, w26
3401 ; NONEON-NOSVE-NEXT: ldr w19, [sp, #240]
3402 ; NONEON-NOSVE-NEXT: str w9, [sp, #336]
3403 ; NONEON-NOSVE-NEXT: add w9, w25, w25
3404 ; NONEON-NOSVE-NEXT: ldr w20, [sp, #248]
3405 ; NONEON-NOSVE-NEXT: str w8, [sp, #332]
3406 ; NONEON-NOSVE-NEXT: add w8, w24, w24
3407 ; NONEON-NOSVE-NEXT: ldr w16, [sp, #256]
3408 ; NONEON-NOSVE-NEXT: str w9, [sp, #328]
3409 ; NONEON-NOSVE-NEXT: add w9, w23, w23
3410 ; NONEON-NOSVE-NEXT: ldr w17, [sp, #264]
3411 ; NONEON-NOSVE-NEXT: str q19, [sp, #96]
3412 ; NONEON-NOSVE-NEXT: ldr w14, [sp, #64]
3413 ; NONEON-NOSVE-NEXT: ldr w15, [sp, #72]
3414 ; NONEON-NOSVE-NEXT: str w8, [sp, #324]
3415 ; NONEON-NOSVE-NEXT: add w8, w22, w22
3416 ; NONEON-NOSVE-NEXT: ldr w2, [sp, #96]
3417 ; NONEON-NOSVE-NEXT: str w9, [sp, #320]
3418 ; NONEON-NOSVE-NEXT: add w9, w21, w21
3419 ; NONEON-NOSVE-NEXT: ldr w3, [sp, #104]
3420 ; NONEON-NOSVE-NEXT: str w8, [sp, #380]
3421 ; NONEON-NOSVE-NEXT: add w8, w20, w20
3422 ; NONEON-NOSVE-NEXT: ldr w13, [sp, #56]
3423 ; NONEON-NOSVE-NEXT: str w9, [sp, #376]
3424 ; NONEON-NOSVE-NEXT: add w9, w19, w19
3425 ; NONEON-NOSVE-NEXT: ldr w10, [sp, #80]
3426 ; NONEON-NOSVE-NEXT: str w8, [sp, #372]
3427 ; NONEON-NOSVE-NEXT: add w8, w7, w7
3428 ; NONEON-NOSVE-NEXT: ldr w11, [sp, #88]
3429 ; NONEON-NOSVE-NEXT: str w9, [sp, #368]
3430 ; NONEON-NOSVE-NEXT: add w9, w4, w4
3431 ; NONEON-NOSVE-NEXT: ldr w29, [sp, #224]
3432 ; NONEON-NOSVE-NEXT: str w8, [sp, #316]
3433 ; NONEON-NOSVE-NEXT: add w8, w3, w3
3434 ; NONEON-NOSVE-NEXT: ldr w30, [sp, #232]
3435 ; NONEON-NOSVE-NEXT: str w9, [sp, #312]
3436 ; NONEON-NOSVE-NEXT: add w9, w2, w2
3437 ; NONEON-NOSVE-NEXT: str w8, [sp, #308]
3438 ; NONEON-NOSVE-NEXT: add w8, w0, w0
3439 ; NONEON-NOSVE-NEXT: str w9, [sp, #304]
3440 ; NONEON-NOSVE-NEXT: add w9, w18, w18
3441 ; NONEON-NOSVE-NEXT: str w8, [sp, #396]
3442 ; NONEON-NOSVE-NEXT: add w8, w17, w17
3443 ; NONEON-NOSVE-NEXT: str w9, [sp, #392]
3444 ; NONEON-NOSVE-NEXT: add w9, w16, w16
3445 ; NONEON-NOSVE-NEXT: str w8, [sp, #388]
3446 ; NONEON-NOSVE-NEXT: add w8, w15, w15
3447 ; NONEON-NOSVE-NEXT: str w9, [sp, #384]
3448 ; NONEON-NOSVE-NEXT: add w9, w14, w14
3449 ; NONEON-NOSVE-NEXT: str w8, [sp, #284]
3450 ; NONEON-NOSVE-NEXT: add w8, w13, w13
3451 ; NONEON-NOSVE-NEXT: str w9, [sp, #280]
3452 ; NONEON-NOSVE-NEXT: add w9, w12, w12
3453 ; NONEON-NOSVE-NEXT: str w8, [sp, #276]
3454 ; NONEON-NOSVE-NEXT: add w8, w11, w11
3455 ; NONEON-NOSVE-NEXT: str w9, [sp, #272]
3456 ; NONEON-NOSVE-NEXT: add w9, w10, w10
3457 ; NONEON-NOSVE-NEXT: str w8, [sp, #300]
3458 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] // 4-byte Folded Reload
3459 ; NONEON-NOSVE-NEXT: str w9, [sp, #296]
3460 ; NONEON-NOSVE-NEXT: ldr w9, [sp, #12] // 4-byte Folded Reload
3461 ; NONEON-NOSVE-NEXT: add w8, w8, w8
3462 ; NONEON-NOSVE-NEXT: str w5, [sp, #364]
3463 ; NONEON-NOSVE-NEXT: add w5, w30, w30
3464 ; NONEON-NOSVE-NEXT: add w9, w9, w9
3465 ; NONEON-NOSVE-NEXT: str w6, [sp, #360]
3466 ; NONEON-NOSVE-NEXT: add w6, w29, w29
3467 ; NONEON-NOSVE-NEXT: str w5, [sp, #356]
3468 ; NONEON-NOSVE-NEXT: ldp q6, q3, [sp, #304]
3469 ; NONEON-NOSVE-NEXT: str w6, [sp, #352]
3470 ; NONEON-NOSVE-NEXT: ldp q4, q7, [sp, #368]
3471 ; NONEON-NOSVE-NEXT: str w8, [sp, #292]
3472 ; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #336]
3473 ; NONEON-NOSVE-NEXT: str w9, [sp, #288]
3474 ; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #480] // 16-byte Folded Reload
3475 ; NONEON-NOSVE-NEXT: ldp q5, q2, [sp, #272]
3476 ; NONEON-NOSVE-NEXT: stp q4, q3, [x1, #32]
3477 ; NONEON-NOSVE-NEXT: stp q1, q0, [x1]
3478 ; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #464] // 16-byte Folded Reload
3479 ; NONEON-NOSVE-NEXT: stp q7, q6, [x1, #64]
3480 ; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #448] // 16-byte Folded Reload
3481 ; NONEON-NOSVE-NEXT: stp q2, q5, [x1, #96]
3482 ; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #432] // 16-byte Folded Reload
3483 ; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #416] // 16-byte Folded Reload
3484 ; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #400] // 16-byte Folded Reload
3485 ; NONEON-NOSVE-NEXT: add sp, sp, #496
3486 ; NONEON-NOSVE-NEXT: ret
3487 %a = load <32 x i64>, ptr %in
3488 %b = trunc <32 x i64> %a to <32 x i32>
3489 %c = add <32 x i32> %b, %b
3490 store <32 x i32> %c, ptr %out