[X86] combineTargetShuffle - commute VPERMV3 shuffles so any load is on the RHS
[llvm-project.git] / llvm / test / CodeGen / SystemZ / frame-03.ll
blob37db5f88f23a28b8351ae89d4fc61462b74b70e3
1 ; Like frame-02.ll, but with doubles rather than floats.  Internally this
2 ; uses a different register class, but the set of saved and restored
3 ; registers should be the same.
5 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
7 ; This function should require all FPRs, but no other spill slots.
8 ; We need to save and restore 8 of the 16 FPRs, so the frame size
9 ; should be exactly 8 * 8 = 64.  The CFA offset is 160
10 ; (the caller-allocated part of the frame) + 64.
11 define void @f1(ptr %ptr) {
12 ; CHECK-LABEL: f1:
13 ; CHECK: aghi %r15, -64
14 ; CHECK: .cfi_def_cfa_offset 224
15 ; CHECK: std %f8, 56(%r15)
16 ; CHECK: std %f9, 48(%r15)
17 ; CHECK: std %f10, 40(%r15)
18 ; CHECK: std %f11, 32(%r15)
19 ; CHECK: std %f12, 24(%r15)
20 ; CHECK: std %f13, 16(%r15)
21 ; CHECK: std %f14, 8(%r15)
22 ; CHECK: std %f15, 0(%r15)
23 ; CHECK: .cfi_offset %f8, -168
24 ; CHECK: .cfi_offset %f9, -176
25 ; CHECK: .cfi_offset %f10, -184
26 ; CHECK: .cfi_offset %f11, -192
27 ; CHECK: .cfi_offset %f12, -200
28 ; CHECK: .cfi_offset %f13, -208
29 ; CHECK: .cfi_offset %f14, -216
30 ; CHECK: .cfi_offset %f15, -224
31 ; ...main function body...
32 ; CHECK: ld %f8, 56(%r15)
33 ; CHECK: ld %f9, 48(%r15)
34 ; CHECK: ld %f10, 40(%r15)
35 ; CHECK: ld %f11, 32(%r15)
36 ; CHECK: ld %f12, 24(%r15)
37 ; CHECK: ld %f13, 16(%r15)
38 ; CHECK: ld %f14, 8(%r15)
39 ; CHECK: ld %f15, 0(%r15)
40 ; CHECK: aghi %r15, 64
41 ; CHECK: br %r14
42   %l0 = load volatile double, ptr %ptr
43   %l1 = load volatile double, ptr %ptr
44   %l2 = load volatile double, ptr %ptr
45   %l3 = load volatile double, ptr %ptr
46   %l4 = load volatile double, ptr %ptr
47   %l5 = load volatile double, ptr %ptr
48   %l6 = load volatile double, ptr %ptr
49   %l7 = load volatile double, ptr %ptr
50   %l8 = load volatile double, ptr %ptr
51   %l9 = load volatile double, ptr %ptr
52   %l10 = load volatile double, ptr %ptr
53   %l11 = load volatile double, ptr %ptr
54   %l12 = load volatile double, ptr %ptr
55   %l13 = load volatile double, ptr %ptr
56   %l14 = load volatile double, ptr %ptr
57   %l15 = load volatile double, ptr %ptr
58   %add0 = fadd double %l0, %l0
59   %add1 = fadd double %l1, %add0
60   %add2 = fadd double %l2, %add1
61   %add3 = fadd double %l3, %add2
62   %add4 = fadd double %l4, %add3
63   %add5 = fadd double %l5, %add4
64   %add6 = fadd double %l6, %add5
65   %add7 = fadd double %l7, %add6
66   %add8 = fadd double %l8, %add7
67   %add9 = fadd double %l9, %add8
68   %add10 = fadd double %l10, %add9
69   %add11 = fadd double %l11, %add10
70   %add12 = fadd double %l12, %add11
71   %add13 = fadd double %l13, %add12
72   %add14 = fadd double %l14, %add13
73   %add15 = fadd double %l15, %add14
74   store volatile double %add0, ptr %ptr
75   store volatile double %add1, ptr %ptr
76   store volatile double %add2, ptr %ptr
77   store volatile double %add3, ptr %ptr
78   store volatile double %add4, ptr %ptr
79   store volatile double %add5, ptr %ptr
80   store volatile double %add6, ptr %ptr
81   store volatile double %add7, ptr %ptr
82   store volatile double %add8, ptr %ptr
83   store volatile double %add9, ptr %ptr
84   store volatile double %add10, ptr %ptr
85   store volatile double %add11, ptr %ptr
86   store volatile double %add12, ptr %ptr
87   store volatile double %add13, ptr %ptr
88   store volatile double %add14, ptr %ptr
89   store volatile double %add15, ptr %ptr
90   ret void
93 ; Like f1, but requires one fewer FPR.  We allocate in numerical order,
94 ; so %f15 is the one that gets dropped.
95 define void @f2(ptr %ptr) {
96 ; CHECK-LABEL: f2:
97 ; CHECK: aghi %r15, -56
98 ; CHECK: .cfi_def_cfa_offset 216
99 ; CHECK: std %f8, 48(%r15)
100 ; CHECK: std %f9, 40(%r15)
101 ; CHECK: std %f10, 32(%r15)
102 ; CHECK: std %f11, 24(%r15)
103 ; CHECK: std %f12, 16(%r15)
104 ; CHECK: std %f13, 8(%r15)
105 ; CHECK: std %f14, 0(%r15)
106 ; CHECK: .cfi_offset %f8, -168
107 ; CHECK: .cfi_offset %f9, -176
108 ; CHECK: .cfi_offset %f10, -184
109 ; CHECK: .cfi_offset %f11, -192
110 ; CHECK: .cfi_offset %f12, -200
111 ; CHECK: .cfi_offset %f13, -208
112 ; CHECK: .cfi_offset %f14, -216
113 ; CHECK-NOT: %f15
114 ; ...main function body...
115 ; CHECK: ld %f8, 48(%r15)
116 ; CHECK: ld %f9, 40(%r15)
117 ; CHECK: ld %f10, 32(%r15)
118 ; CHECK: ld %f11, 24(%r15)
119 ; CHECK: ld %f12, 16(%r15)
120 ; CHECK: ld %f13, 8(%r15)
121 ; CHECK: ld %f14, 0(%r15)
122 ; CHECK: aghi %r15, 56
123 ; CHECK: br %r14
124   %l0 = load volatile double, ptr %ptr
125   %l1 = load volatile double, ptr %ptr
126   %l2 = load volatile double, ptr %ptr
127   %l3 = load volatile double, ptr %ptr
128   %l4 = load volatile double, ptr %ptr
129   %l5 = load volatile double, ptr %ptr
130   %l6 = load volatile double, ptr %ptr
131   %l7 = load volatile double, ptr %ptr
132   %l8 = load volatile double, ptr %ptr
133   %l9 = load volatile double, ptr %ptr
134   %l10 = load volatile double, ptr %ptr
135   %l11 = load volatile double, ptr %ptr
136   %l12 = load volatile double, ptr %ptr
137   %l13 = load volatile double, ptr %ptr
138   %l14 = load volatile double, ptr %ptr
139   %add0 = fadd double %l0, %l0
140   %add1 = fadd double %l1, %add0
141   %add2 = fadd double %l2, %add1
142   %add3 = fadd double %l3, %add2
143   %add4 = fadd double %l4, %add3
144   %add5 = fadd double %l5, %add4
145   %add6 = fadd double %l6, %add5
146   %add7 = fadd double %l7, %add6
147   %add8 = fadd double %l8, %add7
148   %add9 = fadd double %l9, %add8
149   %add10 = fadd double %l10, %add9
150   %add11 = fadd double %l11, %add10
151   %add12 = fadd double %l12, %add11
152   %add13 = fadd double %l13, %add12
153   %add14 = fadd double %l14, %add13
154   store volatile double %add0, ptr %ptr
155   store volatile double %add1, ptr %ptr
156   store volatile double %add2, ptr %ptr
157   store volatile double %add3, ptr %ptr
158   store volatile double %add4, ptr %ptr
159   store volatile double %add5, ptr %ptr
160   store volatile double %add6, ptr %ptr
161   store volatile double %add7, ptr %ptr
162   store volatile double %add8, ptr %ptr
163   store volatile double %add9, ptr %ptr
164   store volatile double %add10, ptr %ptr
165   store volatile double %add11, ptr %ptr
166   store volatile double %add12, ptr %ptr
167   store volatile double %add13, ptr %ptr
168   store volatile double %add14, ptr %ptr
169   ret void
172 ; Like f1, but should require only one call-saved FPR.
173 define void @f3(ptr %ptr) {
174 ; CHECK-LABEL: f3:
175 ; CHECK: aghi %r15, -8
176 ; CHECK: .cfi_def_cfa_offset 168
177 ; CHECK: std %f8, 0(%r15)
178 ; CHECK: .cfi_offset %f8, -168
179 ; CHECK-NOT: %f9
180 ; CHECK-NOT: %f10
181 ; CHECK-NOT: %f11
182 ; CHECK-NOT: %f12
183 ; CHECK-NOT: %f13
184 ; CHECK-NOT: %f14
185 ; CHECK-NOT: %f15
186 ; ...main function body...
187 ; CHECK: ld %f8, 0(%r15)
188 ; CHECK: aghi %r15, 8
189 ; CHECK: br %r14
190   %l0 = load volatile double, ptr %ptr
191   %l1 = load volatile double, ptr %ptr
192   %l2 = load volatile double, ptr %ptr
193   %l3 = load volatile double, ptr %ptr
194   %l4 = load volatile double, ptr %ptr
195   %l5 = load volatile double, ptr %ptr
196   %l6 = load volatile double, ptr %ptr
197   %l7 = load volatile double, ptr %ptr
198   %l8 = load volatile double, ptr %ptr
199   %add0 = fadd double %l0, %l0
200   %add1 = fadd double %l1, %add0
201   %add2 = fadd double %l2, %add1
202   %add3 = fadd double %l3, %add2
203   %add4 = fadd double %l4, %add3
204   %add5 = fadd double %l5, %add4
205   %add6 = fadd double %l6, %add5
206   %add7 = fadd double %l7, %add6
207   %add8 = fadd double %l8, %add7
208   store volatile double %add0, ptr %ptr
209   store volatile double %add1, ptr %ptr
210   store volatile double %add2, ptr %ptr
211   store volatile double %add3, ptr %ptr
212   store volatile double %add4, ptr %ptr
213   store volatile double %add5, ptr %ptr
214   store volatile double %add6, ptr %ptr
215   store volatile double %add7, ptr %ptr
216   store volatile double %add8, ptr %ptr
217   ret void
220 ; This function should use all call-clobbered FPRs but no call-saved ones.
221 ; It shouldn't need to create a frame.
222 define void @f4(ptr %ptr) {
223 ; CHECK-LABEL: f4:
224 ; CHECK-NOT: %r15
225 ; CHECK-NOT: %f8
226 ; CHECK-NOT: %f9
227 ; CHECK-NOT: %f10
228 ; CHECK-NOT: %f11
229 ; CHECK-NOT: %f12
230 ; CHECK-NOT: %f13
231 ; CHECK-NOT: %f14
232 ; CHECK-NOT: %f15
233 ; CHECK: br %r14
234   %l0 = load volatile double, ptr %ptr
235   %l1 = load volatile double, ptr %ptr
236   %l2 = load volatile double, ptr %ptr
237   %l3 = load volatile double, ptr %ptr
238   %l4 = load volatile double, ptr %ptr
239   %l5 = load volatile double, ptr %ptr
240   %l6 = load volatile double, ptr %ptr
241   %l7 = load volatile double, ptr %ptr
242   %add0 = fadd double %l0, %l0
243   %add1 = fadd double %l1, %add0
244   %add2 = fadd double %l2, %add1
245   %add3 = fadd double %l3, %add2
246   %add4 = fadd double %l4, %add3
247   %add5 = fadd double %l5, %add4
248   %add6 = fadd double %l6, %add5
249   %add7 = fadd double %l7, %add6
250   store volatile double %add0, ptr %ptr
251   store volatile double %add1, ptr %ptr
252   store volatile double %add2, ptr %ptr
253   store volatile double %add3, ptr %ptr
254   store volatile double %add4, ptr %ptr
255   store volatile double %add5, ptr %ptr
256   store volatile double %add6, ptr %ptr
257   store volatile double %add7, ptr %ptr
258   ret void