Home | History | Annotate | Download | only in powerpc
      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 }
   1360