github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libffi/src/powerpc/ffi_darwin.c (about)

     1  /* -----------------------------------------------------------------------
     2     ffi_darwin.c
     3  
     4     Copyright (C) 1998 Geoffrey Keating
     5     Copyright (C) 2001 John Hornkvist
     6     Copyright (C) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
     7  
     8     FFI support for Darwin and AIX.
     9     
    10     Permission is hereby granted, free of charge, to any person obtaining
    11     a copy of this software and associated documentation files (the
    12     ``Software''), to deal in the Software without restriction, including
    13     without limitation the rights to use, copy, modify, merge, publish,
    14     distribute, sublicense, and/or sell copies of the Software, and to
    15     permit persons to whom the Software is furnished to do so, subject to
    16     the following conditions:
    17  
    18     The above copyright notice and this permission notice shall be included
    19     in all copies or substantial portions of the Software.
    20  
    21     THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
    22     OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    23     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    24     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
    25     OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
    26     ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    27     OTHER DEALINGS IN THE SOFTWARE.
    28     ----------------------------------------------------------------------- */
    29  
    30  #include <ffi.h>
    31  #include <ffi_common.h>
    32  
    33  #include <stdlib.h>
    34  
    35  extern void ffi_closure_ASM (void);
    36  
    37  enum {
    38    /* The assembly depends on these exact flags.  
    39       For Darwin64 (when FLAG_RETURNS_STRUCT is set):
    40         FLAG_RETURNS_FP indicates that the structure embeds FP data.
    41         FLAG_RETURNS_128BITS signals a special struct size that is not
    42         expanded for float content.  */
    43    FLAG_RETURNS_128BITS	= 1 << (31-31), /* These go in cr7  */
    44    FLAG_RETURNS_NOTHING	= 1 << (31-30),
    45    FLAG_RETURNS_FP	= 1 << (31-29),
    46    FLAG_RETURNS_64BITS	= 1 << (31-28),
    47  
    48    FLAG_RETURNS_STRUCT	= 1 << (31-27), /* This goes in cr6  */
    49  
    50    FLAG_ARG_NEEDS_COPY   = 1 << (31- 7),
    51    FLAG_FP_ARGUMENTS     = 1 << (31- 6), /* cr1.eq; specified by ABI  */
    52    FLAG_4_GPR_ARGUMENTS  = 1 << (31- 5),
    53    FLAG_RETVAL_REFERENCE = 1 << (31- 4)
    54  };
    55  
    56  /* About the DARWIN ABI.  */
    57  enum {
    58    NUM_GPR_ARG_REGISTERS = 8,
    59    NUM_FPR_ARG_REGISTERS = 13,
    60    LINKAGE_AREA_GPRS = 6
    61  };
    62  
    63  enum { ASM_NEEDS_REGISTERS = 4 }; /* r28-r31 */
    64  
    65  /* ffi_prep_args is called by the assembly routine once stack space
    66     has been allocated for the function's arguments.
    67     
    68     m32/m64
    69  
    70     The stack layout we want looks like this:
    71  
    72     |   Return address from ffi_call_DARWIN      |	higher addresses
    73     |--------------------------------------------|
    74     |   Previous backchain pointer	4/8	|	stack pointer here
    75     |--------------------------------------------|<+ <<<	on entry to
    76     |   ASM_NEEDS_REGISTERS=r28-r31   4*(4/8)	| |	ffi_call_DARWIN
    77     |--------------------------------------------| |
    78     |   When we have any FP activity... the	| |
    79     |   FPRs occupy NUM_FPR_ARG_REGISTERS slots	| |
    80     |   here fp13 .. fp1 from high to low addr.	| |
    81     ~						~ ~
    82     |   Parameters      (at least 8*4/8=32/64)	| | NUM_GPR_ARG_REGISTERS
    83     |--------------------------------------------| |
    84     |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
    85     |--------------------------------------------| |	stack	|
    86     |   Reserved                       2*4/8	| |	grows	|
    87     |--------------------------------------------| |	down	V
    88     |   Space for callee's LR		4/8	| |
    89     |--------------------------------------------| |	lower addresses
    90     |   Saved CR [low word for m64]      4/8	| |
    91     |--------------------------------------------| |     stack pointer here
    92     |   Current backchain pointer	4/8	|-/	during
    93     |--------------------------------------------|   <<<	ffi_call_DARWIN
    94  
    95     */
    96  
    97  #if defined(POWERPC_DARWIN64)
    98  static void
    99  darwin64_pass_struct_by_value 
   100    (ffi_type *, char *, unsigned, unsigned *, double **, unsigned long **);
   101  #endif
   102  
   103  /* This depends on GPR_SIZE = sizeof (unsigned long) */
   104  
   105  void
   106  ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
   107  {
   108    const unsigned bytes = ecif->cif->bytes;
   109    const unsigned flags = ecif->cif->flags;
   110    const unsigned nargs = ecif->cif->nargs;
   111  #if !defined(POWERPC_DARWIN64) 
   112    const ffi_abi abi = ecif->cif->abi;
   113  #endif
   114  
   115    /* 'stacktop' points at the previous backchain pointer.  */
   116    unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long));
   117  
   118    /* 'fpr_base' points at the space for fpr1, and grows upwards as
   119       we use FPR registers.  */
   120    double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS;
   121    int gp_count = 0, fparg_count = 0;
   122  
   123    /* 'next_arg' grows up as we put parameters in it.  */
   124    unsigned long *next_arg = stack + LINKAGE_AREA_GPRS; /* 6 reserved positions.  */
   125  
   126    int i;
   127    double double_tmp;
   128    void **p_argv = ecif->avalue;
   129    unsigned long gprvalue;
   130    ffi_type** ptr = ecif->cif->arg_types;
   131  #if !defined(POWERPC_DARWIN64) 
   132    char *dest_cpy;
   133  #endif
   134    unsigned size_al = 0;
   135  
   136    /* Check that everything starts aligned properly.  */
   137    FFI_ASSERT(((unsigned) (char *) stack & 0xF) == 0);
   138    FFI_ASSERT(((unsigned) (char *) stacktop & 0xF) == 0);
   139    FFI_ASSERT((bytes & 0xF) == 0);
   140  
   141    /* Deal with return values that are actually pass-by-reference.
   142       Rule:
   143       Return values are referenced by r3, so r4 is the first parameter.  */
   144  
   145    if (flags & FLAG_RETVAL_REFERENCE)
   146      *next_arg++ = (unsigned long) (char *) ecif->rvalue;
   147  
   148    /* Now for the arguments.  */
   149    for (i = nargs; i > 0; i--, ptr++, p_argv++)
   150      {
   151        switch ((*ptr)->type)
   152  	{
   153  	/* If a floating-point parameter appears before all of the general-
   154  	   purpose registers are filled, the corresponding GPRs that match
   155  	   the size of the floating-point parameter are skipped.  */
   156  	case FFI_TYPE_FLOAT:
   157  	  double_tmp = *(float *) *p_argv;
   158  	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
   159  	    *fpr_base++ = double_tmp;
   160  #if defined(POWERPC_DARWIN)
   161  	  *(float *)next_arg = *(float *) *p_argv;
   162  #else
   163  	  *(double *)next_arg = double_tmp;
   164  #endif
   165  	  next_arg++;
   166  	  gp_count++;
   167  	  fparg_count++;
   168  	  FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
   169  	  break;
   170  
   171  	case FFI_TYPE_DOUBLE:
   172  	  double_tmp = *(double *) *p_argv;
   173  	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
   174  	    *fpr_base++ = double_tmp;
   175  	  *(double *)next_arg = double_tmp;
   176  #ifdef POWERPC64
   177  	  next_arg++;
   178  	  gp_count++;
   179  #else
   180  	  next_arg += 2;
   181  	  gp_count += 2;
   182  #endif
   183  	  fparg_count++;
   184  	  FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
   185  	  break;
   186  
   187  #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
   188  
   189  	case FFI_TYPE_LONGDOUBLE:
   190  #  if defined(POWERPC64) && !defined(POWERPC_DARWIN64)
   191  	  /* ??? This will exceed the regs count when the value starts at fp13
   192  	     and it will not put the extra bit on the stack.  */
   193  	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
   194  	    *(long double *) fpr_base++ = *(long double *) *p_argv;
   195  	  else
   196  	    *(long double *) next_arg = *(long double *) *p_argv;
   197  	  next_arg += 2;
   198  	  fparg_count += 2;
   199  #  else
   200  	  double_tmp = ((double *) *p_argv)[0];
   201  	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
   202  	    *fpr_base++ = double_tmp;
   203  	  *(double *) next_arg = double_tmp;
   204  #    if defined(POWERPC_DARWIN64)
   205  	  next_arg++;
   206  	  gp_count++;
   207  #    else
   208  	  next_arg += 2;
   209  	  gp_count += 2;
   210  #    endif
   211  	  fparg_count++;
   212  	  double_tmp = ((double *) *p_argv)[1];
   213  	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
   214  	    *fpr_base++ = double_tmp;
   215  	  *(double *) next_arg = double_tmp;
   216  #    if defined(POWERPC_DARWIN64)
   217  	  next_arg++;
   218  	  gp_count++;
   219  #    else
   220  	  next_arg += 2;
   221  	  gp_count += 2;
   222  #    endif
   223  	  fparg_count++;
   224  #  endif
   225  	  FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
   226  	  break;
   227  #endif
   228  	case FFI_TYPE_UINT64:
   229  	case FFI_TYPE_SINT64:
   230  #ifdef POWERPC64
   231  	  gprvalue = *(long long *) *p_argv;
   232  	  goto putgpr;
   233  #else
   234  	  *(long long *) next_arg = *(long long *) *p_argv;
   235  	  next_arg += 2;
   236  	  gp_count += 2;
   237  #endif
   238  	  break;
   239  	case FFI_TYPE_POINTER:
   240  	  gprvalue = *(unsigned long *) *p_argv;
   241  	  goto putgpr;
   242  	case FFI_TYPE_UINT8:
   243  	  gprvalue = *(unsigned char *) *p_argv;
   244  	  goto putgpr;
   245  	case FFI_TYPE_SINT8:
   246  	  gprvalue = *(signed char *) *p_argv;
   247  	  goto putgpr;
   248  	case FFI_TYPE_UINT16:
   249  	  gprvalue = *(unsigned short *) *p_argv;
   250  	  goto putgpr;
   251  	case FFI_TYPE_SINT16:
   252  	  gprvalue = *(signed short *) *p_argv;
   253  	  goto putgpr;
   254  
   255  	case FFI_TYPE_STRUCT:
   256  	  size_al = (*ptr)->size;
   257  #if defined(POWERPC_DARWIN64)
   258  	  next_arg = (unsigned long *)ALIGN((char *)next_arg, (*ptr)->alignment);
   259  	  darwin64_pass_struct_by_value (*ptr, (char *) *p_argv, 
   260  					 (unsigned) size_al,
   261  					 (unsigned int *) &fparg_count,
   262  					 &fpr_base, &next_arg);
   263  #else
   264  	  dest_cpy = (char *) next_arg;
   265  
   266  	  /* If the first member of the struct is a double, then include enough
   267  	     padding in the struct size to align it to double-word.  */
   268  	  if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
   269  	    size_al = ALIGN((*ptr)->size, 8);
   270  
   271  #  if defined(POWERPC64) 
   272  	  FFI_ASSERT (abi != FFI_DARWIN);
   273  	  memcpy ((char *) dest_cpy, (char *) *p_argv, size_al);
   274  	  next_arg += (size_al + 7) / 8;
   275  #  else
   276  	  /* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
   277  	     SI 4 bytes) are aligned as if they were those modes.
   278  	     Structures with 3 byte in size are padded upwards.  */
   279  	  if (size_al < 3 && abi == FFI_DARWIN)
   280  	    dest_cpy += 4 - size_al;
   281  
   282  	  memcpy((char *) dest_cpy, (char *) *p_argv, size_al);
   283  	  next_arg += (size_al + 3) / 4;
   284  #  endif
   285  #endif
   286  	  break;
   287  
   288  	case FFI_TYPE_INT:
   289  	case FFI_TYPE_SINT32:
   290  	  gprvalue = *(signed int *) *p_argv;
   291  	  goto putgpr;
   292  
   293  	case FFI_TYPE_UINT32:
   294  	  gprvalue = *(unsigned int *) *p_argv;
   295  	putgpr:
   296  	  *next_arg++ = gprvalue;
   297  	  gp_count++;
   298  	  break;
   299  	default:
   300  	  break;
   301  	}
   302      }
   303  
   304    /* Check that we didn't overrun the stack...  */
   305    /* FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS);
   306       FFI_ASSERT((unsigned *)fpr_base
   307       	     <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS);
   308       FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4);  */
   309  }
   310  
   311  #if defined(POWERPC_DARWIN64)
   312  
   313  /* See if we can put some of the struct into fprs.
   314     This should not be called for structures of size 16 bytes, since these are not
   315     broken out this way.  */
   316  static void
   317  darwin64_scan_struct_for_floats (ffi_type *s, unsigned *nfpr)
   318  {
   319    int i;
   320  
   321    FFI_ASSERT (s->type == FFI_TYPE_STRUCT)
   322  
   323    for (i = 0; s->elements[i] != NULL; i++)
   324      {
   325        ffi_type *p = s->elements[i];
   326        switch (p->type)
   327  	{
   328  	  case FFI_TYPE_STRUCT:
   329  	    darwin64_scan_struct_for_floats (p, nfpr);
   330  	    break;
   331  	  case FFI_TYPE_LONGDOUBLE:
   332  	    (*nfpr) += 2;
   333  	    break;
   334  	  case FFI_TYPE_DOUBLE:
   335  	  case FFI_TYPE_FLOAT:
   336  	    (*nfpr) += 1;
   337  	    break;
   338  	  default:
   339  	    break;    
   340  	}
   341      }
   342  }
   343  
   344  static int
   345  darwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr)
   346  {
   347    unsigned struct_offset=0, i;
   348  
   349    for (i = 0; s->elements[i] != NULL; i++)
   350      {
   351        char *item_base;
   352        ffi_type *p = s->elements[i];
   353        /* Find the start of this item (0 for the first one).  */
   354        if (i > 0)
   355          struct_offset = ALIGN(struct_offset, p->alignment);
   356  
   357        item_base = src + struct_offset;
   358  
   359        switch (p->type)
   360  	{
   361  	  case FFI_TYPE_STRUCT:
   362  	    if (darwin64_struct_size_exceeds_gprs_p (p, item_base, nfpr))
   363  	      return 1;
   364  	    break;
   365  	  case FFI_TYPE_LONGDOUBLE:
   366  	    if (*nfpr >= NUM_FPR_ARG_REGISTERS)
   367  	      return 1;
   368  	    (*nfpr) += 1;
   369  	    item_base += 8;
   370  	  /* FALL THROUGH */
   371  	  case FFI_TYPE_DOUBLE:
   372  	    if (*nfpr >= NUM_FPR_ARG_REGISTERS)
   373  	      return 1;
   374  	    (*nfpr) += 1;
   375  	    break;
   376  	  case FFI_TYPE_FLOAT:
   377  	    if (*nfpr >= NUM_FPR_ARG_REGISTERS)
   378  	      return 1;
   379  	    (*nfpr) += 1;
   380  	    break;
   381  	  default:
   382  	    /* If we try and place any item, that is non-float, once we've
   383  	       exceeded the 8 GPR mark, then we can't fit the struct.  */
   384  	    if ((unsigned long)item_base >= 8*8) 
   385  	      return 1;
   386  	    break;    
   387  	}
   388        /* now count the size of what we just used.  */
   389        struct_offset += p->size;
   390      }
   391    return 0;
   392  }
   393  
   394  /* Can this struct be returned by value?  */
   395  int 
   396  darwin64_struct_ret_by_value_p (ffi_type *s)
   397  {
   398    unsigned nfp = 0;
   399  
   400    FFI_ASSERT (s && s->type == FFI_TYPE_STRUCT);
   401    
   402    /* The largest structure we can return is 8long + 13 doubles.  */
   403    if (s->size > 168)
   404      return 0;
   405    
   406    /* We can't pass more than 13 floats.  */
   407    darwin64_scan_struct_for_floats (s, &nfp);
   408    if (nfp > 13)
   409      return 0;
   410    
   411    /* If there are not too many floats, and the struct is
   412       small enough to accommodate in the GPRs, then it must be OK.  */
   413    if (s->size <= 64)
   414      return 1;
   415    
   416    /* Well, we have to look harder.  */
   417    nfp = 0;
   418    if (darwin64_struct_size_exceeds_gprs_p (s, NULL, &nfp))
   419      return 0;
   420    
   421    return 1;
   422  }
   423  
   424  void
   425  darwin64_pass_struct_floats (ffi_type *s, char *src, 
   426  			     unsigned *nfpr, double **fprs)
   427  {
   428    int i;
   429    double *fpr_base = *fprs;
   430    unsigned struct_offset = 0;
   431  
   432    /* We don't assume anything about the alignment of the source.  */
   433    for (i = 0; s->elements[i] != NULL; i++)
   434      {
   435        char *item_base;
   436        ffi_type *p = s->elements[i];
   437        /* Find the start of this item (0 for the first one).  */
   438        if (i > 0)
   439          struct_offset = ALIGN(struct_offset, p->alignment);
   440        item_base = src + struct_offset;
   441  
   442        switch (p->type)
   443  	{
   444  	  case FFI_TYPE_STRUCT:
   445  	    darwin64_pass_struct_floats (p, item_base, nfpr,
   446  					   &fpr_base);
   447  	    break;
   448  	  case FFI_TYPE_LONGDOUBLE:
   449  	    if (*nfpr < NUM_FPR_ARG_REGISTERS)
   450  	      *fpr_base++ = *(double *)item_base;
   451  	    (*nfpr) += 1;
   452  	    item_base += 8;
   453  	  /* FALL THROUGH */
   454  	  case FFI_TYPE_DOUBLE:
   455  	    if (*nfpr < NUM_FPR_ARG_REGISTERS)
   456  	      *fpr_base++ = *(double *)item_base;
   457  	    (*nfpr) += 1;
   458  	    break;
   459  	  case FFI_TYPE_FLOAT:
   460  	    if (*nfpr < NUM_FPR_ARG_REGISTERS)
   461  	      *fpr_base++ = (double) *(float *)item_base;
   462  	    (*nfpr) += 1;
   463  	    break;
   464  	  default:
   465  	    break;    
   466  	}
   467        /* now count the size of what we just used.  */
   468        struct_offset += p->size;
   469      }
   470    /* Update the scores.  */
   471    *fprs = fpr_base;
   472  }
   473  
   474  /* Darwin64 special rules.
   475     Break out a struct into params and float registers.  */
   476  static void
   477  darwin64_pass_struct_by_value (ffi_type *s, char *src, unsigned size,
   478  			       unsigned *nfpr, double **fprs, unsigned long **arg)
   479  {
   480    unsigned long *next_arg = *arg;
   481    char *dest_cpy = (char *)next_arg;
   482  
   483    FFI_ASSERT (s->type == FFI_TYPE_STRUCT)
   484  
   485    if (!size)
   486      return;
   487  
   488    /* First... special cases.  */
   489    if (size < 3
   490        || (size == 4 
   491  	  && s->elements[0] 
   492  	  && s->elements[0]->type != FFI_TYPE_FLOAT))
   493      {
   494        /* Must be at least one GPR, padding is unspecified in value, 
   495  	 let's make it zero.  */
   496        *next_arg = 0UL; 
   497        dest_cpy += 8 - size;
   498        memcpy ((char *) dest_cpy, src, size);
   499        next_arg++;
   500      }
   501    else if (size == 16)
   502      {
   503        memcpy ((char *) dest_cpy, src, size);
   504        next_arg += 2;
   505      }
   506    else
   507      {
   508        /* now the general case, we consider embedded floats.  */
   509        memcpy ((char *) dest_cpy, src, size);
   510        darwin64_pass_struct_floats (s, src, nfpr, fprs);
   511        next_arg += (size+7)/8;
   512      }
   513      
   514    *arg = next_arg;
   515  }
   516  
   517  double *
   518  darwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *nf)
   519  {
   520    int i;
   521    unsigned struct_offset = 0;
   522  
   523    /* We don't assume anything about the alignment of the source.  */
   524    for (i = 0; s->elements[i] != NULL; i++)
   525      {
   526        char *item_base;
   527        ffi_type *p = s->elements[i];
   528        /* Find the start of this item (0 for the first one).  */
   529        if (i > 0)
   530          struct_offset = ALIGN(struct_offset, p->alignment);
   531        item_base = dest + struct_offset;
   532  
   533        switch (p->type)
   534  	{
   535  	  case FFI_TYPE_STRUCT:
   536  	    fprs = darwin64_struct_floats_to_mem (p, item_base, fprs, nf);
   537  	    break;
   538  	  case FFI_TYPE_LONGDOUBLE:
   539  	    if (*nf < NUM_FPR_ARG_REGISTERS)
   540  	      {
   541  		*(double *)item_base = *fprs++ ;
   542  		(*nf) += 1;
   543  	      }
   544  	    item_base += 8;
   545  	  /* FALL THROUGH */
   546  	  case FFI_TYPE_DOUBLE:
   547  	    if (*nf < NUM_FPR_ARG_REGISTERS)
   548  	      {
   549  		*(double *)item_base = *fprs++ ;
   550  		(*nf) += 1;
   551  	      }
   552  	    break;
   553  	  case FFI_TYPE_FLOAT:
   554  	    if (*nf < NUM_FPR_ARG_REGISTERS)
   555  	      {
   556  		*(float *)item_base = (float) *fprs++ ;
   557  		(*nf) += 1;
   558  	      }
   559  	    break;
   560  	  default:
   561  	    break;    
   562  	}
   563        /* now count the size of what we just used.  */
   564        struct_offset += p->size;
   565      }
   566    return fprs;
   567  }
   568  
   569  #endif
   570  
   571  /* Adjust the size of S to be correct for Darwin.
   572     On Darwin m32, the first field of a structure has natural alignment.  
   573     On Darwin m64, all fields have natural alignment.  */
   574  
   575  static void
   576  darwin_adjust_aggregate_sizes (ffi_type *s)
   577  {
   578    int i;
   579  
   580    if (s->type != FFI_TYPE_STRUCT)
   581      return;
   582  
   583    s->size = 0;
   584    for (i = 0; s->elements[i] != NULL; i++)
   585      {
   586        ffi_type *p;
   587        int align;
   588        
   589        p = s->elements[i];
   590        if (p->type == FFI_TYPE_STRUCT)
   591  	darwin_adjust_aggregate_sizes (p);
   592  #if defined(POWERPC_DARWIN64)
   593        /* Natural alignment for all items.  */
   594        align = p->alignment;
   595  #else
   596        /* Natural alignment for the first item... */
   597        if (i == 0)
   598  	align = p->alignment;
   599        else if (p->alignment == 16 || p->alignment < 4)
   600  	/* .. subsequent items with vector or align < 4 have natural align.  */
   601  	align = p->alignment;
   602        else
   603  	/* .. or align is 4.  */
   604  	align = 4;
   605  #endif
   606        /* Pad, if necessary, before adding the current item.  */
   607        s->size = ALIGN(s->size, align) + p->size;
   608      }
   609    
   610    s->size = ALIGN(s->size, s->alignment);
   611    
   612    /* This should not be necessary on m64, but harmless.  */
   613    if (s->elements[0]->type == FFI_TYPE_UINT64
   614        || s->elements[0]->type == FFI_TYPE_SINT64
   615        || s->elements[0]->type == FFI_TYPE_DOUBLE
   616        || s->elements[0]->alignment == 8)
   617      s->alignment = s->alignment > 8 ? s->alignment : 8;
   618    /* Do not add additional tail padding.  */
   619  }
   620  
   621  /* Adjust the size of S to be correct for AIX.
   622     Word-align double unless it is the first member of a structure.  */
   623  
   624  static void
   625  aix_adjust_aggregate_sizes (ffi_type *s)
   626  {
   627    int i;
   628  
   629    if (s->type != FFI_TYPE_STRUCT)
   630      return;
   631  
   632    s->size = 0;
   633    for (i = 0; s->elements[i] != NULL; i++)
   634      {
   635        ffi_type *p;
   636        int align;
   637        
   638        p = s->elements[i];
   639        aix_adjust_aggregate_sizes (p);
   640        align = p->alignment;
   641        if (i != 0 && p->type == FFI_TYPE_DOUBLE)
   642  	align = 4;
   643        s->size = ALIGN(s->size, align) + p->size;
   644      }
   645    
   646    s->size = ALIGN(s->size, s->alignment);
   647    
   648    if (s->elements[0]->type == FFI_TYPE_UINT64
   649        || s->elements[0]->type == FFI_TYPE_SINT64
   650        || s->elements[0]->type == FFI_TYPE_DOUBLE
   651        || s->elements[0]->alignment == 8)
   652      s->alignment = s->alignment > 8 ? s->alignment : 8;
   653    /* Do not add additional tail padding.  */
   654  }
   655  
   656  /* Perform machine dependent cif processing.  */
   657  ffi_status
   658  ffi_prep_cif_machdep (ffi_cif *cif)
   659  {
   660    /* All this is for the DARWIN ABI.  */
   661    unsigned i;
   662    ffi_type **ptr;
   663    unsigned bytes;
   664    unsigned fparg_count = 0, intarg_count = 0;
   665    unsigned flags = 0;
   666    unsigned size_al = 0;
   667  
   668    /* All the machine-independent calculation of cif->bytes will be wrong.
   669       All the calculation of structure sizes will also be wrong.
   670       Redo the calculation for DARWIN.  */
   671  
   672    if (cif->abi == FFI_DARWIN)
   673      {
   674        darwin_adjust_aggregate_sizes (cif->rtype);
   675        for (i = 0; i < cif->nargs; i++)
   676  	darwin_adjust_aggregate_sizes (cif->arg_types[i]);
   677      }
   678  
   679    if (cif->abi == FFI_AIX)
   680      {
   681        aix_adjust_aggregate_sizes (cif->rtype);
   682        for (i = 0; i < cif->nargs; i++)
   683  	aix_adjust_aggregate_sizes (cif->arg_types[i]);
   684      }
   685  
   686    /* Space for the frame pointer, callee's LR, CR, etc, and for
   687       the asm's temp regs.  */
   688  
   689    bytes = (LINKAGE_AREA_GPRS + ASM_NEEDS_REGISTERS) * sizeof(unsigned long);
   690  
   691    /* Return value handling.  
   692      The rules m32 are as follows:
   693       - 32-bit (or less) integer values are returned in gpr3;
   694       - structures of size <= 4 bytes also returned in gpr3;
   695       - 64-bit integer values [??? and structures between 5 and 8 bytes] are
   696         returned in gpr3 and gpr4;
   697       - Single/double FP values are returned in fpr1;
   698       - Long double FP (if not equivalent to double) values are returned in
   699         fpr1 and fpr2;
   700       m64:
   701       - 64-bit or smaller integral values are returned in GPR3
   702       - Single/double FP values are returned in fpr1;
   703       - Long double FP values are returned in fpr1 and fpr2;
   704       m64 Structures:
   705       - If the structure could be accommodated in registers were it to be the
   706         first argument to a routine, then it is returned in those registers.
   707       m32/m64 structures otherwise:
   708       - Larger structures values are allocated space and a pointer is passed
   709         as the first argument.  */
   710    switch (cif->rtype->type)
   711      {
   712  
   713  #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
   714      case FFI_TYPE_LONGDOUBLE:
   715        flags |= FLAG_RETURNS_128BITS;
   716        flags |= FLAG_RETURNS_FP;
   717        break;
   718  #endif
   719  
   720      case FFI_TYPE_DOUBLE:
   721        flags |= FLAG_RETURNS_64BITS;
   722        /* Fall through.  */
   723      case FFI_TYPE_FLOAT:
   724        flags |= FLAG_RETURNS_FP;
   725        break;
   726  
   727      case FFI_TYPE_UINT64:
   728      case FFI_TYPE_SINT64:
   729  #ifdef POWERPC64
   730      case FFI_TYPE_POINTER:
   731  #endif
   732        flags |= FLAG_RETURNS_64BITS;
   733        break;
   734  
   735      case FFI_TYPE_STRUCT:
   736  #if defined(POWERPC_DARWIN64)
   737        {
   738  	/* Can we fit the struct into regs?  */
   739  	if (darwin64_struct_ret_by_value_p (cif->rtype))
   740  	  {
   741  	    unsigned nfpr = 0;
   742  	    flags |= FLAG_RETURNS_STRUCT;
   743  	    if (cif->rtype->size != 16)
   744  	      darwin64_scan_struct_for_floats (cif->rtype, &nfpr) ;
   745  	    else
   746  	      flags |= FLAG_RETURNS_128BITS;
   747  	    /* Will be 0 for 16byte struct.  */
   748  	    if (nfpr)
   749  	      flags |= FLAG_RETURNS_FP;
   750  	  }
   751  	else /* By ref. */
   752  	  {
   753  	    flags |= FLAG_RETVAL_REFERENCE;
   754  	    flags |= FLAG_RETURNS_NOTHING;
   755  	    intarg_count++;
   756  	  }
   757        }
   758  #elif defined(DARWIN_PPC)
   759        if (cif->rtype->size <= 4)
   760  	flags |= FLAG_RETURNS_STRUCT;
   761        else /* else by reference.  */
   762  	{
   763  	  flags |= FLAG_RETVAL_REFERENCE;
   764  	  flags |= FLAG_RETURNS_NOTHING;
   765  	  intarg_count++;
   766  	}
   767  #else /* assume we pass by ref.  */
   768        flags |= FLAG_RETVAL_REFERENCE;
   769        flags |= FLAG_RETURNS_NOTHING;
   770        intarg_count++;
   771  #endif
   772        break;
   773      case FFI_TYPE_VOID:
   774        flags |= FLAG_RETURNS_NOTHING;
   775        break;
   776  
   777      default:
   778        /* Returns 32-bit integer, or similar.  Nothing to do here.  */
   779        break;
   780      }
   781  
   782    /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the
   783       first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest
   784       goes on the stack.  
   785       ??? Structures are passed as a pointer to a copy of the structure. 
   786       Stuff on the stack needs to keep proper alignment.  
   787       For m64 the count is effectively of half-GPRs.  */
   788    for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
   789      {
   790        unsigned align_words;
   791        switch ((*ptr)->type)
   792  	{
   793  	case FFI_TYPE_FLOAT:
   794  	case FFI_TYPE_DOUBLE:
   795  	  fparg_count++;
   796  #if !defined(POWERPC_DARWIN64)
   797  	  /* If this FP arg is going on the stack, it must be
   798  	     8-byte-aligned.  */
   799  	  if (fparg_count > NUM_FPR_ARG_REGISTERS
   800  	      && (intarg_count & 0x01) != 0)
   801  	    intarg_count++;
   802  #endif
   803  	  break;
   804  
   805  #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
   806  	case FFI_TYPE_LONGDOUBLE:
   807  	  fparg_count += 2;
   808  	  /* If this FP arg is going on the stack, it must be
   809  	     16-byte-aligned.  */
   810  	  if (fparg_count >= NUM_FPR_ARG_REGISTERS)
   811  #if defined (POWERPC64)
   812  	    intarg_count = ALIGN(intarg_count, 2);
   813  #else
   814  	    intarg_count = ALIGN(intarg_count, 4);
   815  #endif
   816  	  break;
   817  #endif
   818  
   819  	case FFI_TYPE_UINT64:
   820  	case FFI_TYPE_SINT64:
   821  #if defined(POWERPC64)
   822  	  intarg_count++;
   823  #else
   824  	  /* 'long long' arguments are passed as two words, but
   825  	     either both words must fit in registers or both go
   826  	     on the stack.  If they go on the stack, they must
   827  	     be 8-byte-aligned.  */
   828  	  if (intarg_count == NUM_GPR_ARG_REGISTERS-1
   829  	      || (intarg_count >= NUM_GPR_ARG_REGISTERS 
   830  	          && (intarg_count & 0x01) != 0))
   831  	    intarg_count++;
   832  	  intarg_count += 2;
   833  #endif
   834  	  break;
   835  
   836  	case FFI_TYPE_STRUCT:
   837  	  size_al = (*ptr)->size;
   838  #if defined(POWERPC_DARWIN64)
   839  	  align_words = (*ptr)->alignment >> 3;
   840  	  if (align_words)
   841  	    intarg_count = ALIGN(intarg_count, align_words);
   842  	  /* Base size of the struct.  */
   843  	  intarg_count += (size_al + 7) / 8;
   844  	  /* If 16 bytes then don't worry about floats.  */
   845  	  if (size_al != 16)
   846  	    /* Scan through for floats to be placed in regs.  */
   847  	    darwin64_scan_struct_for_floats (*ptr, &fparg_count) ;
   848  #else
   849  	  align_words = (*ptr)->alignment >> 2;
   850  	  if (align_words)
   851  	    intarg_count = ALIGN(intarg_count, align_words);
   852  	  /* If the first member of the struct is a double, then align
   853  	     the struct to double-word. 
   854  	  if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
   855  	    size_al = ALIGN((*ptr)->size, 8); */
   856  #  ifdef POWERPC64
   857  	  intarg_count += (size_al + 7) / 8;
   858  #  else
   859  	  intarg_count += (size_al + 3) / 4;
   860  #  endif
   861  #endif
   862  	  break;
   863  
   864  	default:
   865  	  /* Everything else is passed as a 4-byte word in a GPR, either
   866  	     the object itself or a pointer to it.  */
   867  	  intarg_count++;
   868  	  break;
   869  	}
   870      }
   871  
   872    if (fparg_count != 0)
   873      flags |= FLAG_FP_ARGUMENTS;
   874  
   875  #if defined(POWERPC_DARWIN64)
   876    /* Space to image the FPR registers, if needed - which includes when they might be
   877       used in a struct return.  */
   878    if (fparg_count != 0 
   879        || ((flags & FLAG_RETURNS_STRUCT)
   880  	   && (flags & FLAG_RETURNS_FP)))
   881      bytes += NUM_FPR_ARG_REGISTERS * sizeof(double);
   882  #else
   883    /* Space for the FPR registers, if needed.  */
   884    if (fparg_count != 0)
   885      bytes += NUM_FPR_ARG_REGISTERS * sizeof(double);
   886  #endif
   887  
   888    /* Stack space.  */
   889  #ifdef POWERPC64
   890    if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS)
   891      bytes += (intarg_count + fparg_count) * sizeof(long);
   892  #else
   893    if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS)
   894      bytes += (intarg_count + 2 * fparg_count) * sizeof(long);
   895  #endif
   896    else
   897      bytes += NUM_GPR_ARG_REGISTERS * sizeof(long);
   898  
   899    /* The stack space allocated needs to be a multiple of 16 bytes.  */
   900    bytes = ALIGN(bytes, 16) ;
   901  
   902    cif->flags = flags;
   903    cif->bytes = bytes;
   904  
   905    return FFI_OK;
   906  }
   907  
   908  extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *,
   909  			 void (*fn)(void), void (*fn2)(void));
   910  
   911  extern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *,
   912  			    void (*fn)(void), void (*fn2)(void), ffi_type*);
   913  
   914  void
   915  ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
   916  {
   917    extended_cif ecif;
   918  
   919    ecif.cif = cif;
   920    ecif.avalue = avalue;
   921  
   922    /* If the return value is a struct and we don't have a return
   923       value address then we need to make one.  */
   924  
   925    if ((rvalue == NULL) &&
   926        (cif->rtype->type == FFI_TYPE_STRUCT))
   927      {
   928        ecif.rvalue = alloca (cif->rtype->size);
   929      }
   930    else
   931      ecif.rvalue = rvalue;
   932  
   933    switch (cif->abi)
   934      {
   935      case FFI_AIX:
   936        ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
   937  		   FFI_FN(ffi_prep_args));
   938        break;
   939      case FFI_DARWIN:
   940        ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
   941  		      FFI_FN(ffi_prep_args), cif->rtype);
   942        break;
   943      default:
   944        FFI_ASSERT(0);
   945        break;
   946      }
   947  }
   948  
   949  static void flush_icache(char *);
   950  static void flush_range(char *, int);
   951  
   952  /* The layout of a function descriptor.  A C function pointer really
   953     points to one of these.  */
   954  
   955  typedef struct aix_fd_struct {
   956    void *code_pointer;
   957    void *toc;
   958  } aix_fd;
   959  
   960  /* here I'd like to add the stack frame layout we use in darwin_closure.S
   961     and aix_closure.S
   962  
   963     m32/m64
   964  
   965     The stack layout looks like this:
   966  
   967     |   Additional params...			| |     Higher address
   968     ~						~ ~
   969     |   Parameters      (at least 8*4/8=32/64)	| | NUM_GPR_ARG_REGISTERS
   970     |--------------------------------------------| |
   971     |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
   972     |--------------------------------------------| |
   973     |   Reserved                       2*4/8	| |
   974     |--------------------------------------------| |
   975     |   Space for callee's LR		4/8	| |
   976     |--------------------------------------------| |
   977     |   Saved CR [low word for m64]      4/8	| |
   978     |--------------------------------------------| |
   979     |   Current backchain pointer	4/8	|-/ Parent's frame.
   980     |--------------------------------------------| <+ <<< on entry to ffi_closure_ASM
   981     |   Result Bytes			16	| |
   982     |--------------------------------------------| |
   983     ~   padding to 16-byte alignment		~ ~
   984     |--------------------------------------------| |
   985     |   NUM_FPR_ARG_REGISTERS slots		| |
   986     |   here fp13 .. fp1		       13*8	| |
   987     |--------------------------------------------| |
   988     |   R3..R10			  8*4/8=32/64	| | NUM_GPR_ARG_REGISTERS
   989     |--------------------------------------------| |
   990     |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
   991     |--------------------------------------------| |	stack	|
   992     |   Reserved [compiler,binder]     2*4/8	| |	grows	|
   993     |--------------------------------------------| |	down	V
   994     |   Space for callee's LR		4/8	| |
   995     |--------------------------------------------| |	lower addresses
   996     |   Saved CR [low word for m64]      4/8	| |
   997     |--------------------------------------------| |     stack pointer here
   998     |   Current backchain pointer	4/8	|-/	during
   999     |--------------------------------------------|   <<<	ffi_closure_ASM.
  1000  
  1001  */
  1002  
  1003  ffi_status
  1004  ffi_prep_closure_loc (ffi_closure* closure,
  1005  		      ffi_cif* cif,
  1006  		      void (*fun)(ffi_cif*, void*, void**, void*),
  1007  		      void *user_data,
  1008  		      void *codeloc)
  1009  {
  1010    unsigned int *tramp;
  1011    struct ffi_aix_trampoline_struct *tramp_aix;
  1012    aix_fd *fd;
  1013  
  1014    switch (cif->abi)
  1015      {
  1016        case FFI_DARWIN:
  1017  
  1018  	FFI_ASSERT (cif->abi == FFI_DARWIN);
  1019  
  1020  	tramp = (unsigned int *) &closure->tramp[0];
  1021  #if defined(POWERPC_DARWIN64)
  1022  	tramp[0] = 0x7c0802a6;  /*   mflr    r0  */
  1023  	tramp[1] = 0x429f0015;  /*   bcl-    20,4*cr7+so,  +0x18 (L1)  */
  1024  	/* We put the addresses here.  */
  1025  	tramp[6] = 0x7d6802a6;  /*L1:   mflr    r11  */
  1026  	tramp[7] = 0xe98b0000;  /*   ld     r12,0(r11) function address  */
  1027  	tramp[8] = 0x7c0803a6;  /*   mtlr    r0   */
  1028  	tramp[9] = 0x7d8903a6;  /*   mtctr   r12  */
  1029  	tramp[10] = 0xe96b0008;  /*   lwz     r11,8(r11) static chain  */
  1030  	tramp[11] = 0x4e800420;  /*   bctr  */
  1031  
  1032  	*((unsigned long *)&tramp[2]) = (unsigned long) ffi_closure_ASM; /* function  */
  1033  	*((unsigned long *)&tramp[4]) = (unsigned long) codeloc; /* context  */
  1034  #else
  1035  	tramp[0] = 0x7c0802a6;  /*   mflr    r0  */
  1036  	tramp[1] = 0x429f000d;  /*   bcl-    20,4*cr7+so,0x10  */
  1037  	tramp[4] = 0x7d6802a6;  /*   mflr    r11  */
  1038  	tramp[5] = 0x818b0000;  /*   lwz     r12,0(r11) function address  */
  1039  	tramp[6] = 0x7c0803a6;  /*   mtlr    r0   */
  1040  	tramp[7] = 0x7d8903a6;  /*   mtctr   r12  */
  1041  	tramp[8] = 0x816b0004;  /*   lwz     r11,4(r11) static chain  */
  1042  	tramp[9] = 0x4e800420;  /*   bctr  */
  1043  	tramp[2] = (unsigned long) ffi_closure_ASM; /* function  */
  1044  	tramp[3] = (unsigned long) codeloc; /* context  */
  1045  #endif
  1046  	closure->cif = cif;
  1047  	closure->fun = fun;
  1048  	closure->user_data = user_data;
  1049  
  1050  	/* Flush the icache. Only necessary on Darwin.  */
  1051  	flush_range(codeloc, FFI_TRAMPOLINE_SIZE);
  1052  
  1053  	break;
  1054  
  1055      case FFI_AIX:
  1056  
  1057        tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp);
  1058        fd = (aix_fd *)(void *)ffi_closure_ASM;
  1059  
  1060        FFI_ASSERT (cif->abi == FFI_AIX);
  1061  
  1062        tramp_aix->code_pointer = fd->code_pointer;
  1063        tramp_aix->toc = fd->toc;
  1064        tramp_aix->static_chain = codeloc;
  1065        closure->cif = cif;
  1066        closure->fun = fun;
  1067        closure->user_data = user_data;
  1068        break;
  1069  
  1070      default:
  1071        return FFI_BAD_ABI;
  1072        break;
  1073      }
  1074    return FFI_OK;
  1075  }
  1076  
  1077  static void
  1078  flush_icache(char *addr)
  1079  {
  1080  #ifndef _AIX
  1081    __asm__ volatile (
  1082  		"dcbf 0,%0\n"
  1083  		"\tsync\n"
  1084  		"\ticbi 0,%0\n"
  1085  		"\tsync\n"
  1086  		"\tisync"
  1087  		: : "r"(addr) : "memory");
  1088  #endif
  1089  }
  1090  
  1091  static void
  1092  flush_range(char * addr1, int size)
  1093  {
  1094  #define MIN_LINE_SIZE 32
  1095    int i;
  1096    for (i = 0; i < size; i += MIN_LINE_SIZE)
  1097      flush_icache(addr1+i);
  1098    flush_icache(addr1+size-1);
  1099  }
  1100  
  1101  typedef union
  1102  {
  1103    float f;
  1104    double d;
  1105  } ffi_dblfl;
  1106  
  1107  ffi_type *
  1108  ffi_closure_helper_DARWIN (ffi_closure *, void *,
  1109  			   unsigned long *, ffi_dblfl *);
  1110  
  1111  /* Basically the trampoline invokes ffi_closure_ASM, and on
  1112     entry, r11 holds the address of the closure.
  1113     After storing the registers that could possibly contain
  1114     parameters to be passed into the stack frame and setting
  1115     up space for a return value, ffi_closure_ASM invokes the
  1116     following helper function to do most of the work.  */
  1117  
  1118  ffi_type *
  1119  ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
  1120  			   unsigned long *pgr, ffi_dblfl *pfr)
  1121  {
  1122    /* rvalue is the pointer to space for return value in closure assembly
  1123       pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM
  1124       pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM.  */
  1125  
  1126    typedef double ldbits[2];
  1127  
  1128    union ldu
  1129    {
  1130      ldbits lb;
  1131      long double ld;
  1132    };
  1133  
  1134    void **          avalue;
  1135    ffi_type **      arg_types;
  1136    long             i, avn;
  1137    ffi_cif *        cif;
  1138    ffi_dblfl *      end_pfr = pfr + NUM_FPR_ARG_REGISTERS;
  1139    unsigned         size_al;
  1140  #if defined(POWERPC_DARWIN64)
  1141    unsigned 	   fpsused = 0;
  1142  #endif
  1143  
  1144    cif = closure->cif;
  1145    avalue = alloca (cif->nargs * sizeof(void *));
  1146  
  1147    if (cif->rtype->type == FFI_TYPE_STRUCT)
  1148      {
  1149  #if defined(POWERPC_DARWIN64)
  1150        if (!darwin64_struct_ret_by_value_p (cif->rtype))
  1151  	{
  1152      	  /* Won't fit into the regs - return by ref.  */
  1153  	  rvalue = (void *) *pgr;
  1154  	  pgr++;
  1155  	}
  1156  #elif defined(DARWIN_PPC)
  1157        if (cif->rtype->size > 4)
  1158  	{
  1159  	  rvalue = (void *) *pgr;
  1160  	  pgr++;
  1161  	}
  1162  #else /* assume we return by ref.  */
  1163        rvalue = (void *) *pgr;
  1164        pgr++;
  1165  #endif
  1166      }
  1167  
  1168    i = 0;
  1169    avn = cif->nargs;
  1170    arg_types = cif->arg_types;
  1171  
  1172    /* Grab the addresses of the arguments from the stack frame.  */
  1173    while (i < avn)
  1174      {
  1175        switch (arg_types[i]->type)
  1176  	{
  1177  	case FFI_TYPE_SINT8:
  1178  	case FFI_TYPE_UINT8:
  1179  #if  defined(POWERPC64)
  1180  	  avalue[i] = (char *) pgr + 7;
  1181  #else
  1182  	  avalue[i] = (char *) pgr + 3;
  1183  #endif
  1184  	  pgr++;
  1185  	  break;
  1186  
  1187  	case FFI_TYPE_SINT16:
  1188  	case FFI_TYPE_UINT16:
  1189  #if  defined(POWERPC64)
  1190  	  avalue[i] = (char *) pgr + 6;
  1191  #else
  1192  	  avalue[i] = (char *) pgr + 2;
  1193  #endif
  1194  	  pgr++;
  1195  	  break;
  1196  
  1197  	case FFI_TYPE_SINT32:
  1198  	case FFI_TYPE_UINT32:
  1199  #if  defined(POWERPC64)
  1200  	  avalue[i] = (char *) pgr + 4;
  1201  #else
  1202  	case FFI_TYPE_POINTER:
  1203  	  avalue[i] = pgr;
  1204  #endif
  1205  	  pgr++;
  1206  	  break;
  1207  
  1208  	case FFI_TYPE_STRUCT:
  1209  	  size_al = arg_types[i]->size;
  1210  #if defined(POWERPC_DARWIN64)
  1211  	  pgr = (unsigned long *)ALIGN((char *)pgr, arg_types[i]->alignment);
  1212  	  if (size_al < 3 || size_al == 4)
  1213  	    {
  1214  	      avalue[i] = ((char *)pgr)+8-size_al;
  1215  	      if (arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT
  1216  		  && fpsused < NUM_FPR_ARG_REGISTERS)
  1217  		{
  1218  		  *(float *)pgr = (float) *(double *)pfr;
  1219  		  pfr++;
  1220  		  fpsused++;
  1221  		}
  1222  	    }
  1223  	  else 
  1224  	    {
  1225  	      if (size_al != 16)
  1226  		pfr = (ffi_dblfl *) 
  1227  		    darwin64_struct_floats_to_mem (arg_types[i], (char *)pgr,
  1228  						   (double *)pfr, &fpsused);
  1229  	      avalue[i] = pgr;
  1230  	    }
  1231  	  pgr += (size_al + 7) / 8;
  1232  #else
  1233  	  /* If the first member of the struct is a double, then align
  1234  	     the struct to double-word.  */
  1235  	  if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
  1236  	    size_al = ALIGN(arg_types[i]->size, 8);
  1237  #  if defined(POWERPC64)
  1238  	  FFI_ASSERT (cif->abi != FFI_DARWIN);
  1239  	  avalue[i] = pgr;
  1240  	  pgr += (size_al + 7) / 8;
  1241  #  else
  1242  	  /* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
  1243  	     SI 4 bytes) are aligned as if they were those modes.  */
  1244  	  if (size_al < 3 && cif->abi == FFI_DARWIN)
  1245  	    avalue[i] = (char*) pgr + 4 - size_al;
  1246  	  else
  1247  	    avalue[i] = pgr;
  1248  	  pgr += (size_al + 3) / 4;
  1249  #  endif
  1250  #endif
  1251  	  break;
  1252  
  1253  	case FFI_TYPE_SINT64:
  1254  	case FFI_TYPE_UINT64:
  1255  #if  defined(POWERPC64)
  1256  	case FFI_TYPE_POINTER:
  1257  	  avalue[i] = pgr;
  1258  	  pgr++;
  1259  	  break;
  1260  #else
  1261  	  /* Long long ints are passed in two gpr's.  */
  1262  	  avalue[i] = pgr;
  1263  	  pgr += 2;
  1264  	  break;
  1265  #endif
  1266  
  1267  	case FFI_TYPE_FLOAT:
  1268  	  /* A float value consumes a GPR.
  1269  	     There are 13 64bit floating point registers.  */
  1270  	  if (pfr < end_pfr)
  1271  	    {
  1272  	      double temp = pfr->d;
  1273  	      pfr->f = (float) temp;
  1274  	      avalue[i] = pfr;
  1275  	      pfr++;
  1276  	    }
  1277  	  else
  1278  	    {
  1279  	      avalue[i] = pgr;
  1280  	    }
  1281  	  pgr++;
  1282  	  break;
  1283  
  1284  	case FFI_TYPE_DOUBLE:
  1285  	  /* A double value consumes two GPRs.
  1286  	     There are 13 64bit floating point registers.  */
  1287  	  if (pfr < end_pfr)
  1288  	    {
  1289  	      avalue[i] = pfr;
  1290  	      pfr++;
  1291  	    }
  1292  	  else
  1293  	    {
  1294  	      avalue[i] = pgr;
  1295  	    }
  1296  #ifdef POWERPC64
  1297  	  pgr++;
  1298  #else
  1299  	  pgr += 2;
  1300  #endif
  1301  	  break;
  1302  
  1303  #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
  1304  
  1305  	case FFI_TYPE_LONGDOUBLE:
  1306  #ifdef POWERPC64
  1307  	  if (pfr + 1 < end_pfr)
  1308  	    {
  1309  	      avalue[i] = pfr;
  1310  	      pfr += 2;
  1311  	    }
  1312  	  else
  1313  	    {
  1314  	      if (pfr < end_pfr)
  1315  		{
  1316  		  *pgr = *(unsigned long *) pfr;
  1317  		  pfr++;
  1318  		}
  1319  	      avalue[i] = pgr;
  1320  	    }
  1321  	  pgr += 2;
  1322  #else  /* POWERPC64 */
  1323  	  /* A long double value consumes four GPRs and two FPRs.
  1324  	     There are 13 64bit floating point registers.  */
  1325  	  if (pfr + 1 < end_pfr)
  1326  	    {
  1327  	      avalue[i] = pfr;
  1328  	      pfr += 2;
  1329  	    }
  1330  	  /* Here we have the situation where one part of the long double
  1331  	     is stored in fpr13 and the other part is already on the stack.
  1332  	     We use a union to pass the long double to avalue[i].  */
  1333  	  else if (pfr + 1 == end_pfr)
  1334  	    {
  1335  	      union ldu temp_ld;
  1336  	      memcpy (&temp_ld.lb[0], pfr, sizeof(ldbits));
  1337  	      memcpy (&temp_ld.lb[1], pgr + 2, sizeof(ldbits));
  1338  	      avalue[i] = &temp_ld.ld;
  1339  	      pfr++;
  1340  	    }
  1341  	  else
  1342  	    {
  1343  	      avalue[i] = pgr;
  1344  	    }
  1345  	  pgr += 4;
  1346  #endif  /* POWERPC64 */
  1347  	  break;
  1348  #endif
  1349  	default:
  1350  	  FFI_ASSERT(0);
  1351  	}
  1352        i++;
  1353      }
  1354  
  1355    (closure->fun) (cif, rvalue, avalue, closure->user_data);
  1356  
  1357    /* Tell ffi_closure_ASM to perform return type promotions.  */
  1358    return cif->rtype;
  1359  }