blob: fafb910bdfe56cb73ca549d1aae7943032ccea40 [file] [log] [blame]
Akira Hatanaka02de0e42012-07-31 21:28:49 +00001; reenable when the correct value for TransientStackAlignment is set.
2; DISABLED: llc -march=mipsel -pre-RA-sched=source < %s | FileCheck %s
3; RUN: false
4; XFAIL: *
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +00005
6; All test functions do the same thing - they return the first variable
7; argument.
8
Andrew Trickb53a00d2011-04-13 00:38:32 +00009; All CHECK's do the same thing - they check whether variable arguments from
10; registers are placed on correct stack locations, and whether the first
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +000011; variable argument is returned from the correct stack location.
12
13
14declare void @llvm.va_start(i8*) nounwind
15declare void @llvm.va_end(i8*) nounwind
16
17; return int
18define i32 @va1(i32 %a, ...) nounwind {
19entry:
20 %a.addr = alloca i32, align 4
21 %ap = alloca i8*, align 4
22 %b = alloca i32, align 4
23 store i32 %a, i32* %a.addr, align 4
24 %ap1 = bitcast i8** %ap to i8*
25 call void @llvm.va_start(i8* %ap1)
26 %0 = va_arg i8** %ap, i32
27 store i32 %0, i32* %b, align 4
28 %ap2 = bitcast i8** %ap to i8*
29 call void @llvm.va_end(i8* %ap2)
30 %tmp = load i32* %b, align 4
31 ret i32 %tmp
32
33; CHECK: va1:
Akira Hatanaka5a69c232012-07-25 03:16:47 +000034; CHECK: addiu $sp, $sp, -16
35; CHECK: sw $7, 28($sp)
36; CHECK: sw $6, 24($sp)
37; CHECK: sw $5, 20($sp)
38; CHECK: lw $2, 20($sp)
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +000039}
40
Andrew Trickb53a00d2011-04-13 00:38:32 +000041; check whether the variable double argument will be accessed from the 8-byte
42; aligned location (i.e. whether the address is computed by adding 7 and
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +000043; clearing lower 3 bits)
44define double @va2(i32 %a, ...) nounwind {
45entry:
46 %a.addr = alloca i32, align 4
47 %ap = alloca i8*, align 4
48 %b = alloca double, align 8
49 store i32 %a, i32* %a.addr, align 4
50 %ap1 = bitcast i8** %ap to i8*
51 call void @llvm.va_start(i8* %ap1)
52 %0 = va_arg i8** %ap, double
53 store double %0, double* %b, align 8
54 %ap2 = bitcast i8** %ap to i8*
55 call void @llvm.va_end(i8* %ap2)
56 %tmp = load double* %b, align 8
57 ret double %tmp
58
59; CHECK: va2:
Akira Hatanaka5a69c232012-07-25 03:16:47 +000060; CHECK: addiu $sp, $sp, -16
61; CHECK: sw $7, 28($sp)
62; CHECK: sw $6, 24($sp)
63; CHECK: sw $5, 20($sp)
64; CHECK: addiu $[[R0:[0-9]+]], $sp, 20
Jakob Stoklund Olesenf4c97542011-03-31 18:42:43 +000065; CHECK: addiu $[[R1:[0-9]+]], $[[R0]], 7
66; CHECK: addiu $[[R2:[0-9]+]], $zero, -8
67; CHECK: and $[[R3:[0-9]+]], $[[R1]], $[[R2]]
68; CHECK: ldc1 $f0, 0($[[R3]])
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +000069}
70
71; int
72define i32 @va3(double %a, ...) nounwind {
73entry:
74 %a.addr = alloca double, align 8
75 %ap = alloca i8*, align 4
76 %b = alloca i32, align 4
77 store double %a, double* %a.addr, align 8
78 %ap1 = bitcast i8** %ap to i8*
79 call void @llvm.va_start(i8* %ap1)
80 %0 = va_arg i8** %ap, i32
81 store i32 %0, i32* %b, align 4
82 %ap2 = bitcast i8** %ap to i8*
83 call void @llvm.va_end(i8* %ap2)
84 %tmp = load i32* %b, align 4
85 ret i32 %tmp
86
87; CHECK: va3:
Akira Hatanaka5a69c232012-07-25 03:16:47 +000088; CHECK: addiu $sp, $sp, -16
89; CHECK: sw $7, 28($sp)
90; CHECK: sw $6, 24($sp)
91; CHECK: lw $2, 24($sp)
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +000092}
93
94; double
95define double @va4(double %a, ...) nounwind {
96entry:
97 %a.addr = alloca double, align 8
98 %ap = alloca i8*, align 4
99 %b = alloca double, align 8
100 store double %a, double* %a.addr, align 8
101 %ap1 = bitcast i8** %ap to i8*
102 call void @llvm.va_start(i8* %ap1)
103 %0 = va_arg i8** %ap, double
104 store double %0, double* %b, align 8
105 %ap2 = bitcast i8** %ap to i8*
106 call void @llvm.va_end(i8* %ap2)
107 %tmp = load double* %b, align 8
108 ret double %tmp
109
110; CHECK: va4:
Akira Hatanaka5a69c232012-07-25 03:16:47 +0000111; CHECK: addiu $sp, $sp, -24
112; CHECK: sw $7, 36($sp)
113; CHECK: sw $6, 32($sp)
114; CHECK: addiu ${{[0-9]+}}, $sp, 32
115; CHECK: ldc1 $f0, 32($sp)
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +0000116}
117
118; int
119define i32 @va5(i32 %a, i32 %b, i32 %c, ...) nounwind {
120entry:
121 %a.addr = alloca i32, align 4
122 %b.addr = alloca i32, align 4
123 %c.addr = alloca i32, align 4
124 %ap = alloca i8*, align 4
125 %d = alloca i32, align 4
126 store i32 %a, i32* %a.addr, align 4
127 store i32 %b, i32* %b.addr, align 4
128 store i32 %c, i32* %c.addr, align 4
129 %ap1 = bitcast i8** %ap to i8*
130 call void @llvm.va_start(i8* %ap1)
131 %0 = va_arg i8** %ap, i32
132 store i32 %0, i32* %d, align 4
133 %ap2 = bitcast i8** %ap to i8*
134 call void @llvm.va_end(i8* %ap2)
135 %tmp = load i32* %d, align 4
136 ret i32 %tmp
137
138; CHECK: va5:
Akira Hatanaka5a69c232012-07-25 03:16:47 +0000139; CHECK: addiu $sp, $sp, -24
140; CHECK: sw $7, 36($sp)
141; CHECK: lw $2, 36($sp)
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +0000142}
143
144; double
145define double @va6(i32 %a, i32 %b, i32 %c, ...) nounwind {
146entry:
147 %a.addr = alloca i32, align 4
148 %b.addr = alloca i32, align 4
149 %c.addr = alloca i32, align 4
150 %ap = alloca i8*, align 4
151 %d = alloca double, align 8
152 store i32 %a, i32* %a.addr, align 4
153 store i32 %b, i32* %b.addr, align 4
154 store i32 %c, i32* %c.addr, align 4
155 %ap1 = bitcast i8** %ap to i8*
156 call void @llvm.va_start(i8* %ap1)
157 %0 = va_arg i8** %ap, double
158 store double %0, double* %d, align 8
159 %ap2 = bitcast i8** %ap to i8*
160 call void @llvm.va_end(i8* %ap2)
161 %tmp = load double* %d, align 8
162 ret double %tmp
163
164; CHECK: va6:
Akira Hatanaka5a69c232012-07-25 03:16:47 +0000165; CHECK: addiu $sp, $sp, -24
166; CHECK: sw $7, 36($sp)
167; CHECK: addiu $[[R0:[0-9]+]], $sp, 36
Jakob Stoklund Olesenf4c97542011-03-31 18:42:43 +0000168; CHECK: addiu $[[R1:[0-9]+]], $[[R0]], 7
169; CHECK: addiu $[[R2:[0-9]+]], $zero, -8
170; CHECK: and $[[R3:[0-9]+]], $[[R1]], $[[R2]]
171; CHECK: ldc1 $f0, 0($[[R3]])
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +0000172}
173
174; int
175define i32 @va7(i32 %a, double %b, ...) nounwind {
176entry:
177 %a.addr = alloca i32, align 4
178 %b.addr = alloca double, align 8
179 %ap = alloca i8*, align 4
180 %c = alloca i32, align 4
181 store i32 %a, i32* %a.addr, align 4
182 store double %b, double* %b.addr, align 8
183 %ap1 = bitcast i8** %ap to i8*
184 call void @llvm.va_start(i8* %ap1)
185 %0 = va_arg i8** %ap, i32
186 store i32 %0, i32* %c, align 4
187 %ap2 = bitcast i8** %ap to i8*
188 call void @llvm.va_end(i8* %ap2)
189 %tmp = load i32* %c, align 4
190 ret i32 %tmp
191
192; CHECK: va7:
Akira Hatanaka5a69c232012-07-25 03:16:47 +0000193; CHECK: addiu $sp, $sp, -24
194; CHECK: lw $2, 40($sp)
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +0000195}
196
197; double
198define double @va8(i32 %a, double %b, ...) nounwind {
199entry:
200 %a.addr = alloca i32, align 4
201 %b.addr = alloca double, align 8
202 %ap = alloca i8*, align 4
203 %c = alloca double, align 8
204 store i32 %a, i32* %a.addr, align 4
205 store double %b, double* %b.addr, align 8
206 %ap1 = bitcast i8** %ap to i8*
207 call void @llvm.va_start(i8* %ap1)
208 %0 = va_arg i8** %ap, double
209 store double %0, double* %c, align 8
210 %ap2 = bitcast i8** %ap to i8*
211 call void @llvm.va_end(i8* %ap2)
212 %tmp = load double* %c, align 8
213 ret double %tmp
214
215; CHECK: va8:
Akira Hatanaka5a69c232012-07-25 03:16:47 +0000216; CHECK: addiu $sp, $sp, -32
217; CHECK: addiu ${{[0-9]+}}, $sp, 48
218; CHECK: ldc1 $f0, 48($sp)
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +0000219}
220
221; int
222define i32 @va9(double %a, double %b, i32 %c, ...) nounwind {
223entry:
224 %a.addr = alloca double, align 8
225 %b.addr = alloca double, align 8
226 %c.addr = alloca i32, align 4
227 %ap = alloca i8*, align 4
228 %d = alloca i32, align 4
229 store double %a, double* %a.addr, align 8
230 store double %b, double* %b.addr, align 8
231 store i32 %c, i32* %c.addr, align 4
232 %ap1 = bitcast i8** %ap to i8*
233 call void @llvm.va_start(i8* %ap1)
234 %0 = va_arg i8** %ap, i32
235 store i32 %0, i32* %d, align 4
236 %ap2 = bitcast i8** %ap to i8*
237 call void @llvm.va_end(i8* %ap2)
238 %tmp = load i32* %d, align 4
239 ret i32 %tmp
240
241; CHECK: va9:
Akira Hatanaka5a69c232012-07-25 03:16:47 +0000242; CHECK: addiu $sp, $sp, -32
243; CHECK: lw $2, 52($sp)
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +0000244}
245
246; double
247define double @va10(double %a, double %b, i32 %c, ...) nounwind {
248entry:
249 %a.addr = alloca double, align 8
250 %b.addr = alloca double, align 8
251 %c.addr = alloca i32, align 4
252 %ap = alloca i8*, align 4
253 %d = alloca double, align 8
254 store double %a, double* %a.addr, align 8
255 store double %b, double* %b.addr, align 8
256 store i32 %c, i32* %c.addr, align 4
257 %ap1 = bitcast i8** %ap to i8*
258 call void @llvm.va_start(i8* %ap1)
259 %0 = va_arg i8** %ap, double
260 store double %0, double* %d, align 8
261 %ap2 = bitcast i8** %ap to i8*
262 call void @llvm.va_end(i8* %ap2)
263 %tmp = load double* %d, align 8
264 ret double %tmp
265
266; CHECK: va10:
Akira Hatanaka5a69c232012-07-25 03:16:47 +0000267; CHECK: addiu $sp, $sp, -32
268; CHECK: addiu $[[R0:[0-9]+]], $sp, 52
Jakob Stoklund Olesenf4c97542011-03-31 18:42:43 +0000269; CHECK: addiu $[[R1:[0-9]+]], $[[R0]], 7
270; CHECK: addiu $[[R2:[0-9]+]], $zero, -8
271; CHECK: and $[[R3:[0-9]+]], $[[R1]], $[[R2]]
272; CHECK: ldc1 $f0, 0($[[R3]])
Bruno Cardoso Lopes048ffab2011-03-09 19:22:22 +0000273}