blob: ae9c53a7ddcfac5abfbfa8d59aaa2648b60ecdc9 [file] [log] [blame]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00001; Like frame-02.ll, but with long doubles rather than floats. Some of the
2; cases are slightly different because we need to allocate pairs of FPRs.
3;
4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5
6; This function should require all FPRs, but no other spill slots.
7; We need to save and restore 8 of the 16 FPRs, so the frame size
Jonas Paulsson61f5ba52019-11-27 17:22:43 +01008; should be exactly 8 * 8 = 64. The CFA offset is 160
9; (the caller-allocated part of the frame) + 64.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000010define void @f1(fp128 *%ptr) {
Stephen Lind24ab202013-07-14 06:24:09 +000011; CHECK-LABEL: f1:
Jonas Paulsson61f5ba52019-11-27 17:22:43 +010012; CHECK: aghi %r15, -64
13; CHECK: .cfi_def_cfa_offset 224
14; CHECK: std %f8, 56(%r15)
15; CHECK: std %f9, 48(%r15)
16; CHECK: std %f10, 40(%r15)
17; CHECK: std %f11, 32(%r15)
18; CHECK: std %f12, 24(%r15)
19; CHECK: std %f13, 16(%r15)
20; CHECK: std %f14, 8(%r15)
21; CHECK: std %f15, 0(%r15)
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000022; CHECK: .cfi_offset %f8, -168
23; CHECK: .cfi_offset %f9, -176
24; CHECK: .cfi_offset %f10, -184
25; CHECK: .cfi_offset %f11, -192
26; CHECK: .cfi_offset %f12, -200
27; CHECK: .cfi_offset %f13, -208
28; CHECK: .cfi_offset %f14, -216
29; CHECK: .cfi_offset %f15, -224
30; ...main function body...
Jonas Paulsson61f5ba52019-11-27 17:22:43 +010031; CHECK: ld %f8, 56(%r15)
32; CHECK: ld %f9, 48(%r15)
33; CHECK: ld %f10, 40(%r15)
34; CHECK: ld %f11, 32(%r15)
35; CHECK: ld %f12, 24(%r15)
36; CHECK: ld %f13, 16(%r15)
37; CHECK: ld %f14, 8(%r15)
38; CHECK: ld %f15, 0(%r15)
39; CHECK: aghi %r15, 64
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000040; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000041 %l0 = load volatile fp128, fp128 *%ptr
42 %l1 = load volatile fp128, fp128 *%ptr
43 %l4 = load volatile fp128, fp128 *%ptr
44 %l5 = load volatile fp128, fp128 *%ptr
45 %l8 = load volatile fp128, fp128 *%ptr
46 %l9 = load volatile fp128, fp128 *%ptr
47 %l12 = load volatile fp128, fp128 *%ptr
48 %l13 = load volatile fp128, fp128 *%ptr
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000049 %add0 = fadd fp128 %l0, %l0
50 %add1 = fadd fp128 %l1, %add0
51 %add4 = fadd fp128 %l4, %add1
52 %add5 = fadd fp128 %l5, %add4
53 %add8 = fadd fp128 %l8, %add5
54 %add9 = fadd fp128 %l9, %add8
55 %add12 = fadd fp128 %l12, %add9
56 %add13 = fadd fp128 %l13, %add12
57 store volatile fp128 %add0, fp128 *%ptr
58 store volatile fp128 %add1, fp128 *%ptr
59 store volatile fp128 %add4, fp128 *%ptr
60 store volatile fp128 %add5, fp128 *%ptr
61 store volatile fp128 %add8, fp128 *%ptr
62 store volatile fp128 %add9, fp128 *%ptr
63 store volatile fp128 %add12, fp128 *%ptr
64 store volatile fp128 %add13, fp128 *%ptr
65 ret void
66}
67
68; Like f1, but requires one fewer FPR pair. We allocate in numerical order,
69; so %f13+%f15 is the pair that gets dropped.
70define void @f2(fp128 *%ptr) {
Stephen Lind24ab202013-07-14 06:24:09 +000071; CHECK-LABEL: f2:
Jonas Paulsson61f5ba52019-11-27 17:22:43 +010072; CHECK: aghi %r15, -48
73; CHECK: .cfi_def_cfa_offset 208
74; CHECK: std %f8, 40(%r15)
75; CHECK: std %f9, 32(%r15)
76; CHECK: std %f10, 24(%r15)
77; CHECK: std %f11, 16(%r15)
78; CHECK: std %f12, 8(%r15)
79; CHECK: std %f14, 0(%r15)
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000080; CHECK: .cfi_offset %f8, -168
81; CHECK: .cfi_offset %f9, -176
82; CHECK: .cfi_offset %f10, -184
83; CHECK: .cfi_offset %f11, -192
84; CHECK: .cfi_offset %f12, -200
85; CHECK: .cfi_offset %f14, -208
86; CHECK-NOT: %f13
87; CHECK-NOT: %f15
88; ...main function body...
Jonas Paulsson61f5ba52019-11-27 17:22:43 +010089; CHECK: ld %f8, 40(%r15)
90; CHECK: ld %f9, 32(%r15)
91; CHECK: ld %f10, 24(%r15)
92; CHECK: ld %f11, 16(%r15)
93; CHECK: ld %f12, 8(%r15)
94; CHECK: ld %f14, 0(%r15)
95; CHECK: aghi %r15, 48
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000096; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000097 %l0 = load volatile fp128, fp128 *%ptr
98 %l1 = load volatile fp128, fp128 *%ptr
99 %l4 = load volatile fp128, fp128 *%ptr
100 %l5 = load volatile fp128, fp128 *%ptr
101 %l8 = load volatile fp128, fp128 *%ptr
102 %l9 = load volatile fp128, fp128 *%ptr
103 %l12 = load volatile fp128, fp128 *%ptr
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000104 %add0 = fadd fp128 %l0, %l0
105 %add1 = fadd fp128 %l1, %add0
106 %add4 = fadd fp128 %l4, %add1
107 %add5 = fadd fp128 %l5, %add4
108 %add8 = fadd fp128 %l8, %add5
109 %add9 = fadd fp128 %l9, %add8
110 %add12 = fadd fp128 %l12, %add9
111 store volatile fp128 %add0, fp128 *%ptr
112 store volatile fp128 %add1, fp128 *%ptr
113 store volatile fp128 %add4, fp128 *%ptr
114 store volatile fp128 %add5, fp128 *%ptr
115 store volatile fp128 %add8, fp128 *%ptr
116 store volatile fp128 %add9, fp128 *%ptr
117 store volatile fp128 %add12, fp128 *%ptr
118 ret void
119}
120
121; Like f1, but requires only one call-saved FPR pair. We allocate in
122; numerical order so the pair should be %f8+%f10.
123define void @f3(fp128 *%ptr) {
Stephen Lind24ab202013-07-14 06:24:09 +0000124; CHECK-LABEL: f3:
Jonas Paulsson61f5ba52019-11-27 17:22:43 +0100125; CHECK: aghi %r15, -16
126; CHECK: .cfi_def_cfa_offset 176
127; CHECK: std %f8, 8(%r15)
128; CHECK: std %f10, 0(%r15)
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000129; CHECK: .cfi_offset %f8, -168
130; CHECK: .cfi_offset %f10, -176
131; CHECK-NOT: %f9
132; CHECK-NOT: %f11
133; CHECK-NOT: %f12
134; CHECK-NOT: %f13
135; CHECK-NOT: %f14
136; CHECK-NOT: %f15
137; ...main function body...
Jonas Paulsson61f5ba52019-11-27 17:22:43 +0100138; CHECK: ld %f8, 8(%r15)
139; CHECK: ld %f10, 0(%r15)
140; CHECK: aghi %r15, 16
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000141; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000142 %l0 = load volatile fp128, fp128 *%ptr
143 %l1 = load volatile fp128, fp128 *%ptr
144 %l4 = load volatile fp128, fp128 *%ptr
145 %l5 = load volatile fp128, fp128 *%ptr
146 %l8 = load volatile fp128, fp128 *%ptr
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000147 %add0 = fadd fp128 %l0, %l0
148 %add1 = fadd fp128 %l1, %add0
149 %add4 = fadd fp128 %l4, %add1
150 %add5 = fadd fp128 %l5, %add4
151 %add8 = fadd fp128 %l8, %add5
152 store volatile fp128 %add0, fp128 *%ptr
153 store volatile fp128 %add1, fp128 *%ptr
154 store volatile fp128 %add4, fp128 *%ptr
155 store volatile fp128 %add5, fp128 *%ptr
156 store volatile fp128 %add8, fp128 *%ptr
157 ret void
158}
159
160; This function should use all call-clobbered FPRs but no call-saved ones.
161; It shouldn't need to create a frame.
162define void @f4(fp128 *%ptr) {
Stephen Lind24ab202013-07-14 06:24:09 +0000163; CHECK-LABEL: f4:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000164; CHECK-NOT: %r15
165; CHECK-NOT: %f8
166; CHECK-NOT: %f9
167; CHECK-NOT: %f10
168; CHECK-NOT: %f11
169; CHECK-NOT: %f12
170; CHECK-NOT: %f13
171; CHECK-NOT: %f14
172; CHECK-NOT: %f15
173; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000174 %l0 = load volatile fp128, fp128 *%ptr
175 %l1 = load volatile fp128, fp128 *%ptr
176 %l4 = load volatile fp128, fp128 *%ptr
177 %l5 = load volatile fp128, fp128 *%ptr
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000178 %add0 = fadd fp128 %l0, %l0
179 %add1 = fadd fp128 %l1, %add0
180 %add4 = fadd fp128 %l4, %add1
181 %add5 = fadd fp128 %l5, %add4
182 store volatile fp128 %add0, fp128 *%ptr
183 store volatile fp128 %add1, fp128 *%ptr
184 store volatile fp128 %add4, fp128 *%ptr
185 store volatile fp128 %add5, fp128 *%ptr
186 ret void
187}