[X86] combineTargetShuffle - commute VPERMV3 shuffles so any load is on the RHS
[llvm-project.git] / llvm / test / CodeGen / SystemZ / frame-19.ll
blobf0c55aa4a2f31d7c2e642de5efa8dc3bfe24b6cd
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) {
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
99 ; Like f1, but no 16-byte slot should be needed, and no outgoing reg save
100 ; area of 160 bytes.
101 define 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
191 ; Like f2, but only %f8 should be saved.
192 define 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
261 ; Like f2, but no registers should be saved.
262 define 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