xref: /llvm-project/llvm/test/CodeGen/SystemZ/frame-19.ll (revision a1710eb3cd5823c5d14899112ca3086acbdbe9cb)
1; Test spilling of vector registers.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
4
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.
7define void @f1(ptr %ptr) {
8; CHECK-LABEL: f1:
9; CHECK: aghi %r15, -240
10; CHECK-DAG: std %f8,
11; CHECK-DAG: std %f9,
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
20; CHECK-DAG: ld %f8,
21; CHECK-DAG: ld %f9,
22; CHECK-DAG: ld %f10,
23; CHECK-DAG: ld %f11,
24; CHECK-DAG: ld %f12,
25; CHECK-DAG: ld %f13,
26; CHECK-DAG: ld %f14,
27; CHECK-DAG: ld %f15,
28; CHECK: aghi %r15, 240
29; CHECK: br %r14
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
96  ret void
97}
98
99; Like f1, but no 16-byte slot should be needed, and no outgoing reg save
100; area of 160 bytes.
101define void @f2(ptr %ptr) {
102; CHECK-LABEL: f2:
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)
114; CHECK-DAG: ld %f8,
115; CHECK-DAG: ld %f9,
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
123; CHECK: br %r14
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
188  ret void
189}
190
191; Like f2, but only %f8 should be saved.
192define void @f3(ptr %ptr) {
193; CHECK-LABEL: f3:
194; CHECK: aghi %r15, -8
195; CHECK-DAG: std %f8,
196; CHECK-NOT: vst {{.*}}(%r15)
197; CHECK-NOT: vl {{.*}}(%r15)
198; CHECK-NOT: %v9
199; CHECK-NOT: %v10
200; CHECK-NOT: %v11
201; CHECK-NOT: %v12
202; CHECK-NOT: %v13
203; CHECK-NOT: %v14
204; CHECK-NOT: %v15
205; CHECK-DAG: ld %f8,
206; CHECK: aghi %r15, 8
207; CHECK: br %r14
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
258  ret void
259}
260
261; Like f2, but no registers should be saved.
262define void @f4(ptr %ptr) {
263; CHECK-LABEL: f4:
264; CHECK-NOT: %r15
265; CHECK: br %r14
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
314  ret void
315}
316