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