1 /*
2 * Copyright 1993 Bill Triggs <Bill.Triggs@inrialpes.fr>
3 * Copyright 1995-2017 Bruno Haible <bruno@clisp.org>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 /* This file defines test functions of selected signatures, that exercise
20 dark corners of the various ABIs. */
21
22 #include <stdio.h>
23
24 FILE* out;
25
26 #define uchar unsigned char
27 #define ushort unsigned short
28 #define uint unsigned int
29 #define ulong unsigned long
30
31 typedef struct { char x; } Char;
32 typedef struct { short x; } Short;
33 typedef struct { int x; } Int;
34 typedef struct { long x; } Long;
35 typedef struct { float x; } Float;
36 typedef struct { double x; } Double;
37 typedef struct { char c; float f; } A;
38 typedef struct { double d; int i[3]; } B;
39 typedef struct { long l1; long l2; } J;
40 typedef struct { long l1; long l2; long l3; long l4; } K;
41 typedef struct { long l1; long l2; long l3; long l4; long l5; long l6; } L;
42 typedef struct { char x1; } Size1;
43 typedef struct { char x1; char x2; } Size2;
44 typedef struct { char x1; char x2; char x3; } Size3;
45 typedef struct { char x1; char x2; char x3; char x4; } Size4;
46 typedef struct {
47 char x1; char x2; char x3; char x4; char x5; char x6; char x7;
48 } Size7;
49 typedef struct {
50 char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8;
51 } Size8;
52 typedef struct {
53 char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8;
54 char x9; char x10; char x11; char x12;
55 } Size12;
56 typedef struct {
57 char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8;
58 char x9; char x10; char x11; char x12; char x13; char x14; char x15;
59 } Size15;
60 typedef struct {
61 char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8;
62 char x9; char x10; char x11; char x12; char x13; char x14; char x15; char x16;
63 } Size16;
64 typedef struct { char c[3]; } T;
65 typedef struct { char c[33],c1; } X;
66
67 char c1='a', c2=127, c3=(char)128, c4=(char)255, c5=-1;
68 short s1=32767, s2=(short)32768, s3=3, s4=4, s5=5, s6=6, s7=7, s8=8, s9=9;
69 int i1=1, i2=2, i3=3, i4=4, i5=5, i6=6, i7=7, i8=8, i9=9,
70 i10=11, i11=12, i12=13, i13=14, i14=15, i15=16, i16=17;
71 long l1=1, l2=2, l3=3, l4=4, l5=5, l6=6, l7=7, l8=8, l9=9;
72 long long ll1 = 3875056143130689530LL;
73 float f1=0.1f, f2=0.2f, f3=0.3f, f4=0.4f, f5=0.5f, f6=0.6f, f7=0.7f, f8=0.8f, f9=0.9f,
74 f10=1.1f, f11=1.2f, f12=1.3f, f13=1.4f, f14=1.5f, f15=1.6f, f16=1.7f, f17=1.8f,
75 f18=1.9f, f19=2.1f, f20=2.2f, f21=2.3f, f22=2.4f, f23=2.5f, f24=2.6f;
76 double d1=0.1, d2=0.2, d3=0.3, d4=0.4, d5=0.5, d6=0.6, d7=0.7, d8=0.8, d9=0.9,
77 d10=1.1, d11=1.2, d12=1.3, d13=1.4, d14=1.5, d15=1.6, d16=1.7, d17=1.8;
78
79 uchar uc1='a', uc2=127, uc3=128, uc4=255, uc5=(uchar)-1;
80 ushort us1=1, us2=2, us3=3, us4=4, us5=5, us6=6, us7=7, us8=8, us9=9;
81 uint ui1=1, ui2=2, ui3=3, ui4=4, ui5=5, ui6=6, ui7=7, ui8=8, ui9=9;
82 ulong ul1=1, ul2=2, ul3=3, ul4=4, ul5=5, ul6=6, ul7=7, ul8=8, ul9=9;
83
84 char *str1="hello",str2[]="goodbye",*str3="still here?";
85 Char C1={'A'}, C2={'B'}, C3={'C'}, C4={'\377'}, C5={(char)(-1)};
86 Short S1={1}, S2={2}, S3={3}, S4={4}, S5={5}, S6={6}, S7={7}, S8={8}, S9={9};
87 Int I1={1}, I2={2}, I3={3}, I4={4}, I5={5}, I6={6}, I7={7}, I8={8}, I9={9};
88 Float F1={0.1f}, F2={0.2f}, F3={0.3f}, F4={0.4f}, F5={0.5f}, F6={0.6f}, F7={0.7f}, F8={0.8f}, F9={0.9f};
89 Double D1={0.1}, D2={0.2}, D3={0.3}, D4={0.4}, D5={0.5}, D6={0.6}, D7={0.7}, D8={0.8}, D9={0.9};
90
91 A A1={'a',0.1f},A2={'b',0.2f},A3={'\377',0.3f};
92 B B1={0.1,{1,2,3}},B2={0.2,{5,4,3}};
93 J J1={47,11},J2={73,55};
94 K K1={19,69,12,28};
95 L L1={561,1105,1729,2465,2821,6601}; /* A002997 */
96 Size1 Size1_1={'a'};
97 Size2 Size2_1={'a','b'};
98 Size3 Size3_1={'a','b','c'};
99 Size4 Size4_1={'a','b','c','d'};
100 Size7 Size7_1={'a','b','c','d','e','f','g'};
101 Size8 Size8_1={'a','b','c','d','e','f','g','h'};
102 Size12 Size12_1={'a','b','c','d','e','f','g','h','i','j','k','l'};
103 Size15 Size15_1={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'};
104 Size16 Size16_1={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'};
105 T T1={{'t','h','e'}},T2={{'f','o','x'}};
106 X X1={"abcdefghijklmnopqrstuvwxyzABCDEF",'G'}, X2={"123",'9'}, X3={"return-return-return",'R'};
107
108 #if defined(__GNUC__)
109 #define __STDCALL__ __attribute__((stdcall))
110 #define __THISCALL__ __attribute__((thiscall))
111 #define __FASTCALL__ __attribute__((fastcall))
112 #define __MSABI__ __attribute__((ms_abi))
113 #else
114 #define __STDCALL__ __stdcall
115 #define __THISCALL__ __thiscall
116 #define __FASTCALL__ __fastcall
117 #endif
118
119 #ifndef ABI_ATTR
120 #define ABI_ATTR
121 #endif
122
123 /* void tests */
v_v(void)124 void ABI_ATTR v_v (void)
125 {
126 fprintf(out,"void f(void):\n");
127 fflush(out);
128 }
129
130 /* int tests */
i_v(void)131 int ABI_ATTR i_v (void)
132 {
133 int r=99;
134 fprintf(out,"int f(void):");
135 fflush(out);
136 return r;
137 }
i_i(int a)138 int ABI_ATTR i_i (int a)
139 {
140 int r=a+1;
141 fprintf(out,"int f(int):(%d)",a);
142 fflush(out);
143 return r;
144 }
i_i2(int a,int b)145 int ABI_ATTR i_i2 (int a, int b)
146 {
147 int r=a+b;
148 fprintf(out,"int f(2*int):(%d,%d)",a,b);
149 fflush(out);
150 return r;
151 }
i_i4(int a,int b,int c,int d)152 int ABI_ATTR i_i4 (int a, int b, int c, int d)
153 {
154 int r=a+b+c+d;
155 fprintf(out,"int f(4*int):(%d,%d,%d,%d)",a,b,c,d);
156 fflush(out);
157 return r;
158 }
i_i8(int a,int b,int c,int d,int e,int f,int g,int h)159 int ABI_ATTR i_i8 (int a, int b, int c, int d, int e, int f, int g, int h)
160 {
161 int r=a+b+c+d+e+f+g+h;
162 fprintf(out,"int f(8*int):(%d,%d,%d,%d,%d,%d,%d,%d)",a,b,c,d,e,f,g,h);
163 fflush(out);
164 return r;
165 }
i_i16(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,int n,int o,int p)166 int ABI_ATTR i_i16 (int a, int b, int c, int d, int e, int f, int g, int h,
167 int i, int j, int k, int l, int m, int n, int o, int p)
168 {
169 int r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p;
170 fprintf(out,"int f(16*int):(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)",
171 a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
172 fflush(out);
173 return r;
174 }
175
176 /* float tests */
f_f(float a)177 float ABI_ATTR f_f (float a)
178 {
179 float r=a+1.0f;
180 fprintf(out,"float f(float):(%g)",a);
181 fflush(out);
182 return r;
183 }
f_f2(float a,float b)184 float ABI_ATTR f_f2 (float a, float b)
185 {
186 float r=a+b;
187 fprintf(out,"float f(2*float):(%g,%g)",a,b);
188 fflush(out);
189 return r;
190 }
f_f4(float a,float b,float c,float d)191 float ABI_ATTR f_f4 (float a, float b, float c, float d)
192 {
193 float r=a+b+c+d;
194 fprintf(out,"float f(4*float):(%g,%g,%g,%g)",a,b,c,d);
195 fflush(out);
196 return r;
197 }
f_f8(float a,float b,float c,float d,float e,float f,float g,float h)198 float ABI_ATTR f_f8 (float a, float b, float c, float d, float e, float f,
199 float g, float h)
200 {
201 float r=a+b+c+d+e+f+g+h;
202 fprintf(out,"float f(8*float):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h);
203 fflush(out);
204 return r;
205 }
f_f16(float a,float b,float c,float d,float e,float f,float g,float h,float i,float j,float k,float l,float m,float n,float o,float p)206 float ABI_ATTR f_f16 (float a, float b, float c, float d, float e, float f, float g, float h,
207 float i, float j, float k, float l, float m, float n, float o, float p)
208 {
209 float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p;
210 fprintf(out,"float f(16*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
211 fflush(out);
212 return r;
213 }
f_f24(float a,float b,float c,float d,float e,float f,float g,float h,float i,float j,float k,float l,float m,float n,float o,float p,float q,float s,float t,float u,float v,float w,float x,float y)214 float ABI_ATTR f_f24 (float a, float b, float c, float d, float e, float f, float g, float h,
215 float i, float j, float k, float l, float m, float n, float o, float p,
216 float q, float s, float t, float u, float v, float w, float x, float y)
217 {
218 float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+v+w+x+y;
219 fprintf(out,"float f(24*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,v,w,x,y);
220 fflush(out);
221 return r;
222 }
223
224 /* double tests */
d_d(double a)225 double ABI_ATTR d_d (double a)
226 {
227 double r=a+1.0;
228 fprintf(out,"double f(double):(%g)",a);
229 fflush(out);
230 return r;
231 }
d_d2(double a,double b)232 double ABI_ATTR d_d2 (double a, double b)
233 {
234 double r=a+b;
235 fprintf(out,"double f(2*double):(%g,%g)",a,b);
236 fflush(out);
237 return r;
238 }
d_d4(double a,double b,double c,double d)239 double ABI_ATTR d_d4 (double a, double b, double c, double d)
240 {
241 double r=a+b+c+d;
242 fprintf(out,"double f(4*double):(%g,%g,%g,%g)",a,b,c,d);
243 fflush(out);
244 return r;
245 }
d_d8(double a,double b,double c,double d,double e,double f,double g,double h)246 double ABI_ATTR d_d8 (double a, double b, double c, double d, double e, double f,
247 double g, double h)
248 {
249 double r=a+b+c+d+e+f+g+h;
250 fprintf(out,"double f(8*double):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h);
251 fflush(out);
252 return r;
253 }
d_d16(double a,double b,double c,double d,double e,double f,double g,double h,double i,double j,double k,double l,double m,double n,double o,double p)254 double ABI_ATTR d_d16 (double a, double b, double c, double d, double e, double f,
255 double g, double h, double i, double j, double k, double l,
256 double m, double n, double o, double p)
257 {
258 double r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p;
259 fprintf(out,"double f(16*double):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
260 fflush(out);
261 return r;
262 }
263
264 /* pointer tests */
vp_vpdpcpsp(void * a,double * b,char * c,Int * d)265 void* ABI_ATTR vp_vpdpcpsp (void* a, double* b, char* c, Int* d)
266 {
267 void* ret = (char*)b + 1;
268 fprintf(out,"void* f(void*,double*,char*,Int*):(0x%p,0x%p,0x%p,0x%p)",a,b,c,d);
269 fflush(out);
270 return ret;
271 }
272
273 /* mixed number tests */
uc_ucsil(uchar a,ushort b,uint c,ulong d)274 uchar ABI_ATTR uc_ucsil (uchar a, ushort b, uint c, ulong d)
275 {
276 uchar r = (uchar)-1;
277 fprintf(out,"uchar f(uchar,ushort,uint,ulong):(%u,%u,%u,%lu)",a,b,c,d);
278 fflush(out);
279 return r;
280 }
d_iidd(int a,int b,double c,double d)281 double ABI_ATTR d_iidd (int a, int b, double c, double d)
282 {
283 double r = a+b+c+d;
284 fprintf(out,"double f(int,int,double,double):(%d,%d,%g,%g)",a,b,c,d);
285 fflush(out);
286 return r;
287 }
d_iiidi(int a,int b,int c,double d,int e)288 double ABI_ATTR d_iiidi (int a, int b, int c, double d, int e)
289 {
290 double r = a+b+c+d+e;
291 fprintf(out,"double f(int,int,int,double,int):(%d,%d,%d,%g,%d)",a,b,c,d,e);
292 fflush(out);
293 return r;
294 }
d_idid(int a,double b,int c,double d)295 double ABI_ATTR d_idid (int a, double b, int c, double d)
296 {
297 double r = a+b+c+d;
298 fprintf(out,"double f(int,double,int,double):(%d,%g,%d,%g)",a,b,c,d);
299 fflush(out);
300 return r;
301 }
d_fdi(float a,double b,int c)302 double ABI_ATTR d_fdi (float a, double b, int c)
303 {
304 double r = a+b+c;
305 fprintf(out,"double f(float,double,int):(%g,%g,%d)",a,b,c);
306 fflush(out);
307 return r;
308 }
us_cdcd(char a,double b,char c,double d)309 ushort ABI_ATTR us_cdcd (char a, double b, char c, double d)
310 {
311 ushort r = (ushort)(a + b + c + d);
312 fprintf(out,"ushort f(char,double,char,double):('%c',%g,'%c',%g)",a,b,c,d);
313 fflush(out);
314 return r;
315 }
316
ll_iiilli(int a,int b,int c,long long d,int e)317 long long ABI_ATTR ll_iiilli (int a, int b, int c, long long d, int e)
318 {
319 long long r = (long long)(int)a+(long long)(int)b+(long long)(int)c+d+(long long)(int)e;
320 fprintf(out,"long long f(int,int,int,long long,int):(%d,%d,%d,0x%lx%08lx,%d)",a,b,c,(long)(d>>32),(long)(d&0xffffffff),e);
321 fflush(out);
322 return r;
323 }
ll_flli(float a,long long b,int c)324 long long ABI_ATTR ll_flli (float a, long long b, int c)
325 {
326 long long r = (long long)(int)a + b + (long long)c;
327 fprintf(out,"long long f(float,long long,int):(%g,0x%lx%08lx,0x%lx)",a,(long)(b>>32),(long)(b&0xffffffff),(long)c);
328 fflush(out);
329 return r;
330 }
331
f_fi(float a,int z)332 float ABI_ATTR f_fi (float a, int z)
333 {
334 float r = a+z;
335 fprintf(out,"float f(float,int):(%g,%d)",a,z);
336 fflush(out);
337 return r;
338 }
f_f2i(float a,float b,int z)339 float ABI_ATTR f_f2i (float a, float b, int z)
340 {
341 float r = a+b+z;
342 fprintf(out,"float f(2*float,int):(%g,%g,%d)",a,b,z);
343 fflush(out);
344 return r;
345 }
f_f3i(float a,float b,float c,int z)346 float ABI_ATTR f_f3i (float a, float b, float c, int z)
347 {
348 float r = a+b+c+z;
349 fprintf(out,"float f(3*float,int):(%g,%g,%g,%d)",a,b,c,z);
350 fflush(out);
351 return r;
352 }
f_f4i(float a,float b,float c,float d,int z)353 float ABI_ATTR f_f4i (float a, float b, float c, float d, int z)
354 {
355 float r = a+b+c+d+z;
356 fprintf(out,"float f(4*float,int):(%g,%g,%g,%g,%d)",a,b,c,d,z);
357 fflush(out);
358 return r;
359 }
f_f7i(float a,float b,float c,float d,float e,float f,float g,int z)360 float ABI_ATTR f_f7i (float a, float b, float c, float d, float e, float f, float g,
361 int z)
362 {
363 float r = a+b+c+d+e+f+g+z;
364 fprintf(out,"float f(7*float,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z);
365 fflush(out);
366 return r;
367 }
f_f8i(float a,float b,float c,float d,float e,float f,float g,float h,int z)368 float ABI_ATTR f_f8i (float a, float b, float c, float d, float e, float f, float g,
369 float h, int z)
370 {
371 float r = a+b+c+d+e+f+g+h+z;
372 fprintf(out,"float f(8*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z);
373 fflush(out);
374 return r;
375 }
f_f12i(float a,float b,float c,float d,float e,float f,float g,float h,float i,float j,float k,float l,int z)376 float ABI_ATTR f_f12i (float a, float b, float c, float d, float e, float f, float g,
377 float h, float i, float j, float k, float l, int z)
378 {
379 float r = a+b+c+d+e+f+g+h+i+j+k+l+z;
380 fprintf(out,"float f(12*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z);
381 fflush(out);
382 return r;
383 }
f_f13i(float a,float b,float c,float d,float e,float f,float g,float h,float i,float j,float k,float l,float m,int z)384 float ABI_ATTR f_f13i (float a, float b, float c, float d, float e, float f, float g,
385 float h, float i, float j, float k, float l, float m, int z)
386 {
387 float r = a+b+c+d+e+f+g+h+i+j+k+l+m+z;
388 fprintf(out,"float f(13*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z);
389 fflush(out);
390 return r;
391 }
392
d_di(double a,int z)393 double ABI_ATTR d_di (double a, int z)
394 {
395 double r = a+z;
396 fprintf(out,"double f(double,int):(%g,%d)",a,z);
397 fflush(out);
398 return r;
399 }
d_d2i(double a,double b,int z)400 double ABI_ATTR d_d2i (double a, double b, int z)
401 {
402 double r = a+b+z;
403 fprintf(out,"double f(2*double,int):(%g,%g,%d)",a,b,z);
404 fflush(out);
405 return r;
406 }
d_d3i(double a,double b,double c,int z)407 double ABI_ATTR d_d3i (double a, double b, double c, int z)
408 {
409 double r = a+b+c+z;
410 fprintf(out,"double f(3*double,int):(%g,%g,%g,%d)",a,b,c,z);
411 fflush(out);
412 return r;
413 }
d_d4i(double a,double b,double c,double d,int z)414 double ABI_ATTR d_d4i (double a, double b, double c, double d, int z)
415 {
416 double r = a+b+c+d+z;
417 fprintf(out,"double f(4*double,int):(%g,%g,%g,%g,%d)",a,b,c,d,z);
418 fflush(out);
419 return r;
420 }
d_d7i(double a,double b,double c,double d,double e,double f,double g,int z)421 double ABI_ATTR d_d7i (double a, double b, double c, double d, double e, double f,
422 double g, int z)
423 {
424 double r = a+b+c+d+e+f+g+z;
425 fprintf(out,"double f(7*double,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z);
426 fflush(out);
427 return r;
428 }
d_d8i(double a,double b,double c,double d,double e,double f,double g,double h,int z)429 double ABI_ATTR d_d8i (double a, double b, double c, double d, double e, double f,
430 double g, double h, int z)
431 {
432 double r = a+b+c+d+e+f+g+h+z;
433 fprintf(out,"double f(8*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z);
434 fflush(out);
435 return r;
436 }
d_d12i(double a,double b,double c,double d,double e,double f,double g,double h,double i,double j,double k,double l,int z)437 double ABI_ATTR d_d12i (double a, double b, double c, double d, double e, double f,
438 double g, double h, double i, double j, double k, double l,
439 int z)
440 {
441 double r = a+b+c+d+e+f+g+h+i+j+k+l+z;
442 fprintf(out,"double f(12*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z);
443 fflush(out);
444 return r;
445 }
d_d13i(double a,double b,double c,double d,double e,double f,double g,double h,double i,double j,double k,double l,double m,int z)446 double ABI_ATTR d_d13i (double a, double b, double c, double d, double e, double f,
447 double g, double h, double i, double j, double k, double l,
448 double m, int z)
449 {
450 double r = a+b+c+d+e+f+g+h+i+j+k+l+m+z;
451 fprintf(out,"double f(13*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z);
452 fflush(out);
453 return r;
454 }
455
456 /* small structure return tests */
S1_v(void)457 Size1 ABI_ATTR S1_v (void)
458 {
459 fprintf(out,"Size1 f(void):");
460 fflush(out);
461 return Size1_1;
462 }
S2_v(void)463 Size2 ABI_ATTR S2_v (void)
464 {
465 fprintf(out,"Size2 f(void):");
466 fflush(out);
467 return Size2_1;
468 }
S3_v(void)469 Size3 ABI_ATTR S3_v (void)
470 {
471 fprintf(out,"Size3 f(void):");
472 fflush(out);
473 return Size3_1;
474 }
S4_v(void)475 Size4 ABI_ATTR S4_v (void)
476 {
477 fprintf(out,"Size4 f(void):");
478 fflush(out);
479 return Size4_1;
480 }
S7_v(void)481 Size7 ABI_ATTR S7_v (void)
482 {
483 fprintf(out,"Size7 f(void):");
484 fflush(out);
485 return Size7_1;
486 }
S8_v(void)487 Size8 ABI_ATTR S8_v (void)
488 {
489 fprintf(out,"Size8 f(void):");
490 fflush(out);
491 return Size8_1;
492 }
S12_v(void)493 Size12 ABI_ATTR S12_v (void)
494 {
495 fprintf(out,"Size12 f(void):");
496 fflush(out);
497 return Size12_1;
498 }
S15_v(void)499 Size15 ABI_ATTR S15_v (void)
500 {
501 fprintf(out,"Size15 f(void):");
502 fflush(out);
503 return Size15_1;
504 }
S16_v(void)505 Size16 ABI_ATTR S16_v (void)
506 {
507 fprintf(out,"Size16 f(void):");
508 fflush(out);
509 return Size16_1;
510 }
511
512 /* structure tests */
I_III(Int a,Int b,Int c)513 Int ABI_ATTR I_III (Int a, Int b, Int c)
514 {
515 Int r;
516 r.x = a.x + b.x + c.x;
517 fprintf(out,"Int f(Int,Int,Int):({%d},{%d},{%d})",a.x,b.x,c.x);
518 fflush(out);
519 return r;
520 }
C_CdC(Char a,double b,Char c)521 Char ABI_ATTR C_CdC (Char a, double b, Char c)
522 {
523 Char r;
524 r.x = (a.x + c.x)/2;
525 fprintf(out,"Char f(Char,double,Char):({'%c'},%g,{'%c'})",a.x,b,c.x);
526 fflush(out);
527 return r;
528 }
F_Ffd(Float a,float b,double c)529 Float ABI_ATTR F_Ffd (Float a, float b, double c)
530 {
531 Float r;
532 r.x = (float) (a.x + b + c);
533 fprintf(out,"Float f(Float,float,double):({%g},%g,%g)",a.x,b,c);
534 fflush(out);
535 return r;
536 }
D_fDd(float a,Double b,double c)537 Double ABI_ATTR D_fDd (float a, Double b, double c)
538 {
539 Double r;
540 r.x = a + b.x + c;
541 fprintf(out,"Double f(float,Double,double):(%g,{%g},%g)",a,b.x,c);
542 fflush(out);
543 return r;
544 }
D_Dfd(Double a,float b,double c)545 Double ABI_ATTR D_Dfd (Double a, float b, double c)
546 {
547 Double r;
548 r.x = a.x + b + c;
549 fprintf(out,"Double f(Double,float,double):({%g},%g,%g)",a.x,b,c);
550 fflush(out);
551 return r;
552 }
J_JiJ(J a,int b,J c)553 J ABI_ATTR J_JiJ (J a, int b, J c)
554 {
555 J r;
556 r.l1 = a.l1+c.l1; r.l2 = a.l2+b+c.l2;
557 fprintf(out,"J f(J,int,J):({%ld,%ld},%d,{%ld,%ld})",a.l1,a.l2,b,c.l1,c.l2);
558 fflush(out);
559 return r;
560 }
T_TcT(T a,char b,T c)561 T ABI_ATTR T_TcT (T a, char b, T c)
562 {
563 T r;
564 r.c[0]='b'; r.c[1]=c.c[1]; r.c[2]=c.c[2];
565 fprintf(out,"T f(T,char,T):({\"%c%c%c\"},'%c',{\"%c%c%c\"})",a.c[0],a.c[1],a.c[2],b,c.c[0],c.c[1],c.c[2]);
566 fflush(out);
567 return r;
568 }
X_BcdB(B a,char b,double c,B d)569 X ABI_ATTR X_BcdB (B a, char b, double c, B d)
570 {
571 static X xr={"return val",'R'};
572 X r;
573 r = xr;
574 r.c1 = b;
575 fprintf(out,"X f(B,char,double,B):({%g,{%d,%d,%d}},'%c',%g,{%g,{%d,%d,%d}})",
576 a.d,a.i[0],a.i[1],a.i[2],b,c,d.d,d.i[0],d.i[1],d.i[2]);
577 fflush(out);
578 return r;
579 }
580
581 /* Test for cases where some argument (especially structure, 'long long', or
582 'double') may be passed partially in general-purpose argument registers
583 and partially on the stack. Different ABIs pass between 4 and 8 arguments
584 (or none) in general-purpose argument registers. */
585
l_l0K(K b,long c)586 long ABI_ATTR l_l0K (K b, long c)
587 {
588 long r = b.l1 + b.l2 + b.l3 + b.l4 + c;
589 fprintf(out,"long f(K,long):(%ld,%ld,%ld,%ld,%ld)",b.l1,b.l2,b.l3,b.l4,c);
590 fflush(out);
591 return r;
592 }
l_l1K(long a1,K b,long c)593 long ABI_ATTR l_l1K (long a1, K b, long c)
594 {
595 long r = a1 + b.l1 + b.l2 + b.l3 + b.l4 + c;
596 fprintf(out,"long f(long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld)",a1,b.l1,b.l2,b.l3,b.l4,c);
597 fflush(out);
598 return r;
599 }
l_l2K(long a1,long a2,K b,long c)600 long ABI_ATTR l_l2K (long a1, long a2, K b, long c)
601 {
602 long r = a1 + a2 + b.l1 + b.l2 + b.l3 + b.l4 + c;
603 fprintf(out,"long f(2*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,b.l1,b.l2,b.l3,b.l4,c);
604 fflush(out);
605 return r;
606 }
l_l3K(long a1,long a2,long a3,K b,long c)607 long ABI_ATTR l_l3K (long a1, long a2, long a3, K b, long c)
608 {
609 long r = a1 + a2 + a3 + b.l1 + b.l2 + b.l3 + b.l4 + c;
610 fprintf(out,"long f(3*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,b.l1,b.l2,b.l3,b.l4,c);
611 fflush(out);
612 return r;
613 }
l_l4K(long a1,long a2,long a3,long a4,K b,long c)614 long ABI_ATTR l_l4K (long a1, long a2, long a3, long a4, K b, long c)
615 {
616 long r = a1 + a2 + a3 + a4 + b.l1 + b.l2 + b.l3 + b.l4 + c;
617 fprintf(out,"long f(4*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,b.l1,b.l2,b.l3,b.l4,c);
618 fflush(out);
619 return r;
620 }
l_l5K(long a1,long a2,long a3,long a4,long a5,K b,long c)621 long ABI_ATTR l_l5K (long a1, long a2, long a3, long a4, long a5, K b, long c)
622 {
623 long r = a1 + a2 + a3 + a4 + a5 + b.l1 + b.l2 + b.l3 + b.l4 + c;
624 fprintf(out,"long f(5*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,b.l1,b.l2,b.l3,b.l4,c);
625 fflush(out);
626 return r;
627 }
l_l6K(long a1,long a2,long a3,long a4,long a5,long a6,K b,long c)628 long ABI_ATTR l_l6K (long a1, long a2, long a3, long a4, long a5, long a6, K b, long c)
629 {
630 long r = a1 + a2 + a3 + a4 + a5 + a6 + b.l1 + b.l2 + b.l3 + b.l4 + c;
631 fprintf(out,"long f(6*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,a6,b.l1,b.l2,b.l3,b.l4,c);
632 fflush(out);
633 return r;
634 }
635 /* These tests is crafted on the knowledge that for all known ABIs:
636 * 17 > number of floating-point argument registers,
637 * 3 < number of general-purpose argument registers < 3 + 6. */
f_f17l3L(float a,float b,float c,float d,float e,float f,float g,float h,float i,float j,float k,float l,float m,float n,float o,float p,float q,long s,long t,long u,L z)638 float ABI_ATTR f_f17l3L (float a, float b, float c, float d, float e, float f, float g,
639 float h, float i, float j, float k, float l, float m, float n,
640 float o, float p, float q,
641 long s, long t, long u, L z)
642 {
643 float r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6;
644 fprintf(out,"float f(17*float,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6);
645 fflush(out);
646 return r;
647 }
d_d17l3L(double a,double b,double c,double d,double e,double f,double g,double h,double i,double j,double k,double l,double m,double n,double o,double p,double q,long s,long t,long u,L z)648 double ABI_ATTR d_d17l3L (double a, double b, double c, double d, double e, double f,
649 double g, double h, double i, double j, double k, double l,
650 double m, double n, double o, double p, double q,
651 long s, long t, long u, L z)
652 {
653 double r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6;
654 fprintf(out,"double f(17*double,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6);
655 fflush(out);
656 return r;
657 }
658
ll_l2ll(long a1,long a2,long long b,long c)659 long long ABI_ATTR ll_l2ll (long a1, long a2, long long b, long c)
660 {
661 long long r = (long long) (a1 + a2) + b + c;
662 fprintf(out,"long long f(2*long,long long,long):(%ld,%ld,0x%lx%08lx,%ld)",a1,a2,(long)(b>>32),(long)(b&0xffffffff),c);
663 fflush(out);
664 return r;
665 }
ll_l3ll(long a1,long a2,long a3,long long b,long c)666 long long ABI_ATTR ll_l3ll (long a1, long a2, long a3, long long b, long c)
667 {
668 long long r = (long long) (a1 + a2 + a3) + b + c;
669 fprintf(out,"long long f(3*long,long long,long):(%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,(long)(b>>32),(long)(b&0xffffffff),c);
670 fflush(out);
671 return r;
672 }
ll_l4ll(long a1,long a2,long a3,long a4,long long b,long c)673 long long ABI_ATTR ll_l4ll (long a1, long a2, long a3, long a4, long long b, long c)
674 {
675 long long r = (long long) (a1 + a2 + a3 + a4) + b + c;
676 fprintf(out,"long long f(4*long,long long,long):(%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,(long)(b>>32),(long)(b&0xffffffff),c);
677 fflush(out);
678 return r;
679 }
ll_l5ll(long a1,long a2,long a3,long a4,long a5,long long b,long c)680 long long ABI_ATTR ll_l5ll (long a1, long a2, long a3, long a4, long a5, long long b, long c)
681 {
682 long long r = (long long) (a1 + a2 + a3 + a4 + a5) + b + c;
683 fprintf(out,"long long f(5*long,long long,long):(%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,(long)(b>>32),(long)(b&0xffffffff),c);
684 fflush(out);
685 return r;
686 }
ll_l6ll(long a1,long a2,long a3,long a4,long a5,long a6,long long b,long c)687 long long ABI_ATTR ll_l6ll (long a1, long a2, long a3, long a4, long a5, long a6, long long b, long c)
688 {
689 long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6) + b + c;
690 fprintf(out,"long long f(6*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,(long)(b>>32),(long)(b&0xffffffff),c);
691 fflush(out);
692 return r;
693 }
ll_l7ll(long a1,long a2,long a3,long a4,long a5,long a6,long a7,long long b,long c)694 long long ABI_ATTR ll_l7ll (long a1, long a2, long a3, long a4, long a5, long a6, long a7, long long b, long c)
695 {
696 long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c;
697 fprintf(out,"long long f(7*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,a7,(long)(b>>32),(long)(b&0xffffffff),c);
698 fflush(out);
699 return r;
700 }
701
d_l2d(long a1,long a2,double b,long c)702 double ABI_ATTR d_l2d (long a1, long a2, double b, long c)
703 {
704 double r = (double) (a1 + a2) + b + c;
705 fprintf(out,"double f(2*long,double,long):(%ld,%ld,%g,%ld)",a1,a2,b,c);
706 fflush(out);
707 return r;
708 }
d_l3d(long a1,long a2,long a3,double b,long c)709 double ABI_ATTR d_l3d (long a1, long a2, long a3, double b, long c)
710 {
711 double r = (double) (a1 + a2 + a3) + b + c;
712 fprintf(out,"double f(3*long,double,long):(%ld,%ld,%ld,%g,%ld)",a1,a2,a3,b,c);
713 fflush(out);
714 return r;
715 }
d_l4d(long a1,long a2,long a3,long a4,double b,long c)716 double ABI_ATTR d_l4d (long a1, long a2, long a3, long a4, double b, long c)
717 {
718 double r = (double) (a1 + a2 + a3 + a4) + b + c;
719 fprintf(out,"double f(4*long,double,long):(%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,b,c);
720 fflush(out);
721 return r;
722 }
d_l5d(long a1,long a2,long a3,long a4,long a5,double b,long c)723 double ABI_ATTR d_l5d (long a1, long a2, long a3, long a4, long a5, double b, long c)
724 {
725 double r = (double) (a1 + a2 + a3 + a4 + a5) + b + c;
726 fprintf(out,"double f(5*long,double,long):(%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,b,c);
727 fflush(out);
728 return r;
729 }
d_l6d(long a1,long a2,long a3,long a4,long a5,long a6,double b,long c)730 double ABI_ATTR d_l6d (long a1, long a2, long a3, long a4, long a5, long a6, double b, long c)
731 {
732 double r = (double) (a1 + a2 + a3 + a4 + a5 + a6) + b + c;
733 fprintf(out,"double f(6*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,b,c);
734 fflush(out);
735 return r;
736 }
d_l7d(long a1,long a2,long a3,long a4,long a5,long a6,long a7,double b,long c)737 double ABI_ATTR d_l7d (long a1, long a2, long a3, long a4, long a5, long a6, long a7, double b, long c)
738 {
739 double r = (double) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c;
740 fprintf(out,"double f(7*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,a7,b,c);
741 fflush(out);
742 return r;
743 }
744