1 ; Test spilling of vector registers.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
5 ; We need to allocate a 16-byte spill slot and save the 8 call-saved FPRs.
6 ; The frame size should be exactly 160 + 16 + 8 * 8 = 240.
7 define void @f1(ptr %ptr) {
9 ; CHECK: aghi %r15, -240
12 ; CHECK-DAG: std %f10,
13 ; CHECK-DAG: std %f11,
14 ; CHECK-DAG: std %f12,
15 ; CHECK-DAG: std %f13,
16 ; CHECK-DAG: std %f14,
17 ; CHECK-DAG: std %f15,
18 ; CHECK: vst {{%v[0-9]+}}, 160(%r15), 3
19 ; CHECK: vl {{%v[0-9]+}}, 160(%r15), 3
28 ; CHECK: aghi %r15, 240
30 %v0 = load volatile <16 x i8>, ptr %ptr
31 %v1 = load volatile <16 x i8>, ptr %ptr
32 %v2 = load volatile <16 x i8>, ptr %ptr
33 %v3 = load volatile <16 x i8>, ptr %ptr
34 %v4 = load volatile <16 x i8>, ptr %ptr
35 %v5 = load volatile <16 x i8>, ptr %ptr
36 %v6 = load volatile <16 x i8>, ptr %ptr
37 %v7 = load volatile <16 x i8>, ptr %ptr
38 %v8 = load volatile <16 x i8>, ptr %ptr
39 %v9 = load volatile <16 x i8>, ptr %ptr
40 %v10 = load volatile <16 x i8>, ptr %ptr
41 %v11 = load volatile <16 x i8>, ptr %ptr
42 %v12 = load volatile <16 x i8>, ptr %ptr
43 %v13 = load volatile <16 x i8>, ptr %ptr
44 %v14 = load volatile <16 x i8>, ptr %ptr
45 %v15 = load volatile <16 x i8>, ptr %ptr
46 %v16 = load volatile <16 x i8>, ptr %ptr
47 %v17 = load volatile <16 x i8>, ptr %ptr
48 %v18 = load volatile <16 x i8>, ptr %ptr
49 %v19 = load volatile <16 x i8>, ptr %ptr
50 %v20 = load volatile <16 x i8>, ptr %ptr
51 %v21 = load volatile <16 x i8>, ptr %ptr
52 %v22 = load volatile <16 x i8>, ptr %ptr
53 %v23 = load volatile <16 x i8>, ptr %ptr
54 %v24 = load volatile <16 x i8>, ptr %ptr
55 %v25 = load volatile <16 x i8>, ptr %ptr
56 %v26 = load volatile <16 x i8>, ptr %ptr
57 %v27 = load volatile <16 x i8>, ptr %ptr
58 %v28 = load volatile <16 x i8>, ptr %ptr
59 %v29 = load volatile <16 x i8>, ptr %ptr
60 %v30 = load volatile <16 x i8>, ptr %ptr
61 %v31 = load volatile <16 x i8>, ptr %ptr
62 %vx = load volatile <16 x i8>, ptr %ptr
63 store volatile <16 x i8> %vx, ptr %ptr
64 store volatile <16 x i8> %v31, ptr %ptr
65 store volatile <16 x i8> %v30, ptr %ptr
66 store volatile <16 x i8> %v29, ptr %ptr
67 store volatile <16 x i8> %v28, ptr %ptr
68 store volatile <16 x i8> %v27, ptr %ptr
69 store volatile <16 x i8> %v26, ptr %ptr
70 store volatile <16 x i8> %v25, ptr %ptr
71 store volatile <16 x i8> %v24, ptr %ptr
72 store volatile <16 x i8> %v23, ptr %ptr
73 store volatile <16 x i8> %v22, ptr %ptr
74 store volatile <16 x i8> %v21, ptr %ptr
75 store volatile <16 x i8> %v20, ptr %ptr
76 store volatile <16 x i8> %v19, ptr %ptr
77 store volatile <16 x i8> %v18, ptr %ptr
78 store volatile <16 x i8> %v17, ptr %ptr
79 store volatile <16 x i8> %v16, ptr %ptr
80 store volatile <16 x i8> %v15, ptr %ptr
81 store volatile <16 x i8> %v14, ptr %ptr
82 store volatile <16 x i8> %v13, ptr %ptr
83 store volatile <16 x i8> %v12, ptr %ptr
84 store volatile <16 x i8> %v11, ptr %ptr
85 store volatile <16 x i8> %v10, ptr %ptr
86 store volatile <16 x i8> %v9, ptr %ptr
87 store volatile <16 x i8> %v8, ptr %ptr
88 store volatile <16 x i8> %v7, ptr %ptr
89 store volatile <16 x i8> %v6, ptr %ptr
90 store volatile <16 x i8> %v5, ptr %ptr
91 store volatile <16 x i8> %v4, ptr %ptr
92 store volatile <16 x i8> %v3, ptr %ptr
93 store volatile <16 x i8> %v2, ptr %ptr
94 store volatile <16 x i8> %v1, ptr %ptr
95 store volatile <16 x i8> %v0, ptr %ptr
99 ; Like f1, but no 16-byte slot should be needed, and no outgoing reg save
101 define void @f2(ptr %ptr) {
103 ; CHECK: aghi %r15, -64
104 ; CHECK-DAG: std %f8,
105 ; CHECK-DAG: std %f9,
106 ; CHECK-DAG: std %f10,
107 ; CHECK-DAG: std %f11,
108 ; CHECK-DAG: std %f12,
109 ; CHECK-DAG: std %f13,
110 ; CHECK-DAG: std %f14,
111 ; CHECK-DAG: std %f15,
112 ; CHECK-NOT: vst {{.*}}(%r15)
113 ; CHECK-NOT: vl {{.*}}(%r15)
116 ; CHECK-DAG: ld %f10,
117 ; CHECK-DAG: ld %f11,
118 ; CHECK-DAG: ld %f12,
119 ; CHECK-DAG: ld %f13,
120 ; CHECK-DAG: ld %f14,
121 ; CHECK-DAG: ld %f15,
122 ; CHECK: aghi %r15, 64
124 %v0 = load volatile <16 x i8>, ptr %ptr
125 %v1 = load volatile <16 x i8>, ptr %ptr
126 %v2 = load volatile <16 x i8>, ptr %ptr
127 %v3 = load volatile <16 x i8>, ptr %ptr
128 %v4 = load volatile <16 x i8>, ptr %ptr
129 %v5 = load volatile <16 x i8>, ptr %ptr
130 %v6 = load volatile <16 x i8>, ptr %ptr
131 %v7 = load volatile <16 x i8>, ptr %ptr
132 %v8 = load volatile <16 x i8>, ptr %ptr
133 %v9 = load volatile <16 x i8>, ptr %ptr
134 %v10 = load volatile <16 x i8>, ptr %ptr
135 %v11 = load volatile <16 x i8>, ptr %ptr
136 %v12 = load volatile <16 x i8>, ptr %ptr
137 %v13 = load volatile <16 x i8>, ptr %ptr
138 %v14 = load volatile <16 x i8>, ptr %ptr
139 %v15 = load volatile <16 x i8>, ptr %ptr
140 %v16 = load volatile <16 x i8>, ptr %ptr
141 %v17 = load volatile <16 x i8>, ptr %ptr
142 %v18 = load volatile <16 x i8>, ptr %ptr
143 %v19 = load volatile <16 x i8>, ptr %ptr
144 %v20 = load volatile <16 x i8>, ptr %ptr
145 %v21 = load volatile <16 x i8>, ptr %ptr
146 %v22 = load volatile <16 x i8>, ptr %ptr
147 %v23 = load volatile <16 x i8>, ptr %ptr
148 %v24 = load volatile <16 x i8>, ptr %ptr
149 %v25 = load volatile <16 x i8>, ptr %ptr
150 %v26 = load volatile <16 x i8>, ptr %ptr
151 %v27 = load volatile <16 x i8>, ptr %ptr
152 %v28 = load volatile <16 x i8>, ptr %ptr
153 %v29 = load volatile <16 x i8>, ptr %ptr
154 %v30 = load volatile <16 x i8>, ptr %ptr
155 %v31 = load volatile <16 x i8>, ptr %ptr
156 store volatile <16 x i8> %v31, ptr %ptr
157 store volatile <16 x i8> %v30, ptr %ptr
158 store volatile <16 x i8> %v29, ptr %ptr
159 store volatile <16 x i8> %v28, ptr %ptr
160 store volatile <16 x i8> %v27, ptr %ptr
161 store volatile <16 x i8> %v26, ptr %ptr
162 store volatile <16 x i8> %v25, ptr %ptr
163 store volatile <16 x i8> %v24, ptr %ptr
164 store volatile <16 x i8> %v23, ptr %ptr
165 store volatile <16 x i8> %v22, ptr %ptr
166 store volatile <16 x i8> %v21, ptr %ptr
167 store volatile <16 x i8> %v20, ptr %ptr
168 store volatile <16 x i8> %v19, ptr %ptr
169 store volatile <16 x i8> %v18, ptr %ptr
170 store volatile <16 x i8> %v17, ptr %ptr
171 store volatile <16 x i8> %v16, ptr %ptr
172 store volatile <16 x i8> %v15, ptr %ptr
173 store volatile <16 x i8> %v14, ptr %ptr
174 store volatile <16 x i8> %v13, ptr %ptr
175 store volatile <16 x i8> %v12, ptr %ptr
176 store volatile <16 x i8> %v11, ptr %ptr
177 store volatile <16 x i8> %v10, ptr %ptr
178 store volatile <16 x i8> %v9, ptr %ptr
179 store volatile <16 x i8> %v8, ptr %ptr
180 store volatile <16 x i8> %v7, ptr %ptr
181 store volatile <16 x i8> %v6, ptr %ptr
182 store volatile <16 x i8> %v5, ptr %ptr
183 store volatile <16 x i8> %v4, ptr %ptr
184 store volatile <16 x i8> %v3, ptr %ptr
185 store volatile <16 x i8> %v2, ptr %ptr
186 store volatile <16 x i8> %v1, ptr %ptr
187 store volatile <16 x i8> %v0, ptr %ptr
191 ; Like f2, but only %f8 should be saved.
192 define void @f3(ptr %ptr) {
194 ; CHECK: aghi %r15, -8
195 ; CHECK-DAG: std %f8,
196 ; CHECK-NOT: vst {{.*}}(%r15)
197 ; CHECK-NOT: vl {{.*}}(%r15)
206 ; CHECK: aghi %r15, 8
208 %v0 = load volatile <16 x i8>, ptr %ptr
209 %v1 = load volatile <16 x i8>, ptr %ptr
210 %v2 = load volatile <16 x i8>, ptr %ptr
211 %v3 = load volatile <16 x i8>, ptr %ptr
212 %v4 = load volatile <16 x i8>, ptr %ptr
213 %v5 = load volatile <16 x i8>, ptr %ptr
214 %v6 = load volatile <16 x i8>, ptr %ptr
215 %v7 = load volatile <16 x i8>, ptr %ptr
216 %v8 = load volatile <16 x i8>, ptr %ptr
217 %v16 = load volatile <16 x i8>, ptr %ptr
218 %v17 = load volatile <16 x i8>, ptr %ptr
219 %v18 = load volatile <16 x i8>, ptr %ptr
220 %v19 = load volatile <16 x i8>, ptr %ptr
221 %v20 = load volatile <16 x i8>, ptr %ptr
222 %v21 = load volatile <16 x i8>, ptr %ptr
223 %v22 = load volatile <16 x i8>, ptr %ptr
224 %v23 = load volatile <16 x i8>, ptr %ptr
225 %v24 = load volatile <16 x i8>, ptr %ptr
226 %v25 = load volatile <16 x i8>, ptr %ptr
227 %v26 = load volatile <16 x i8>, ptr %ptr
228 %v27 = load volatile <16 x i8>, ptr %ptr
229 %v28 = load volatile <16 x i8>, ptr %ptr
230 %v29 = load volatile <16 x i8>, ptr %ptr
231 %v30 = load volatile <16 x i8>, ptr %ptr
232 %v31 = load volatile <16 x i8>, ptr %ptr
233 store volatile <16 x i8> %v31, ptr %ptr
234 store volatile <16 x i8> %v30, ptr %ptr
235 store volatile <16 x i8> %v29, ptr %ptr
236 store volatile <16 x i8> %v28, ptr %ptr
237 store volatile <16 x i8> %v27, ptr %ptr
238 store volatile <16 x i8> %v26, ptr %ptr
239 store volatile <16 x i8> %v25, ptr %ptr
240 store volatile <16 x i8> %v24, ptr %ptr
241 store volatile <16 x i8> %v23, ptr %ptr
242 store volatile <16 x i8> %v22, ptr %ptr
243 store volatile <16 x i8> %v21, ptr %ptr
244 store volatile <16 x i8> %v20, ptr %ptr
245 store volatile <16 x i8> %v19, ptr %ptr
246 store volatile <16 x i8> %v18, ptr %ptr
247 store volatile <16 x i8> %v17, ptr %ptr
248 store volatile <16 x i8> %v16, ptr %ptr
249 store volatile <16 x i8> %v8, ptr %ptr
250 store volatile <16 x i8> %v7, ptr %ptr
251 store volatile <16 x i8> %v6, ptr %ptr
252 store volatile <16 x i8> %v5, ptr %ptr
253 store volatile <16 x i8> %v4, ptr %ptr
254 store volatile <16 x i8> %v3, ptr %ptr
255 store volatile <16 x i8> %v2, ptr %ptr
256 store volatile <16 x i8> %v1, ptr %ptr
257 store volatile <16 x i8> %v0, ptr %ptr
261 ; Like f2, but no registers should be saved.
262 define void @f4(ptr %ptr) {
266 %v0 = load volatile <16 x i8>, ptr %ptr
267 %v1 = load volatile <16 x i8>, ptr %ptr
268 %v2 = load volatile <16 x i8>, ptr %ptr
269 %v3 = load volatile <16 x i8>, ptr %ptr
270 %v4 = load volatile <16 x i8>, ptr %ptr
271 %v5 = load volatile <16 x i8>, ptr %ptr
272 %v6 = load volatile <16 x i8>, ptr %ptr
273 %v7 = load volatile <16 x i8>, ptr %ptr
274 %v16 = load volatile <16 x i8>, ptr %ptr
275 %v17 = load volatile <16 x i8>, ptr %ptr
276 %v18 = load volatile <16 x i8>, ptr %ptr
277 %v19 = load volatile <16 x i8>, ptr %ptr
278 %v20 = load volatile <16 x i8>, ptr %ptr
279 %v21 = load volatile <16 x i8>, ptr %ptr
280 %v22 = load volatile <16 x i8>, ptr %ptr
281 %v23 = load volatile <16 x i8>, ptr %ptr
282 %v24 = load volatile <16 x i8>, ptr %ptr
283 %v25 = load volatile <16 x i8>, ptr %ptr
284 %v26 = load volatile <16 x i8>, ptr %ptr
285 %v27 = load volatile <16 x i8>, ptr %ptr
286 %v28 = load volatile <16 x i8>, ptr %ptr
287 %v29 = load volatile <16 x i8>, ptr %ptr
288 %v30 = load volatile <16 x i8>, ptr %ptr
289 %v31 = load volatile <16 x i8>, ptr %ptr
290 store volatile <16 x i8> %v31, ptr %ptr
291 store volatile <16 x i8> %v30, ptr %ptr
292 store volatile <16 x i8> %v29, ptr %ptr
293 store volatile <16 x i8> %v28, ptr %ptr
294 store volatile <16 x i8> %v27, ptr %ptr
295 store volatile <16 x i8> %v26, ptr %ptr
296 store volatile <16 x i8> %v25, ptr %ptr
297 store volatile <16 x i8> %v24, ptr %ptr
298 store volatile <16 x i8> %v23, ptr %ptr
299 store volatile <16 x i8> %v22, ptr %ptr
300 store volatile <16 x i8> %v21, ptr %ptr
301 store volatile <16 x i8> %v20, ptr %ptr
302 store volatile <16 x i8> %v19, ptr %ptr
303 store volatile <16 x i8> %v18, ptr %ptr
304 store volatile <16 x i8> %v17, ptr %ptr
305 store volatile <16 x i8> %v16, ptr %ptr
306 store volatile <16 x i8> %v7, ptr %ptr
307 store volatile <16 x i8> %v6, ptr %ptr
308 store volatile <16 x i8> %v5, ptr %ptr
309 store volatile <16 x i8> %v4, ptr %ptr
310 store volatile <16 x i8> %v3, ptr %ptr
311 store volatile <16 x i8> %v2, ptr %ptr
312 store volatile <16 x i8> %v1, ptr %ptr
313 store volatile <16 x i8> %v0, ptr %ptr