FORM  
ÐPTCHVERS   $   SAS Institute, Inc. Patch V6.55 INPF     r”  ‰:stdarg.h OUTF    ÚÎ  /stdarg.h PSEQ  
duºsÆiifdef __PPC__‚Ç/* for I
Evarargs funcs, 4 callie saved registers are reserved */
/* and allocated by the compiler as follows:                */
/*   r31 - current offset to next stack parm                */
/*   r30 - Stack offset where regs are stored at entry,     */
/*         r3-r10, followed by fr1-fr8                      */
/*   r29 - current offset to next general reg parm. Switch  */
/*         to stack based parm when it's larger than        */
/*         (r10-r3)*4                                       */
/*   r28 - current offset to next floating point reg parm   */
/*         switch to stack offset when it's larger than     */
/*         (r10-r3)*4+(fr8-fr1)*8                           */
/*                                                          */
/* __optype  is a SAS/C compiler internal function that     */
/*           that evaluates to:                             */
/*               0  =  if the type is int type or a pointer */
/*               1  =  if the type is a floating point type */
/*               2  =  if the type is a structure           */
/*                                                          */
/* Note - Receiving a struct by value in a varargs func is  */
/*        not yet supported                                 */



void __builtin_msg(char *, ...);
long __builtin_getreg(int);
void __builtin_putreg(int, long);

#define va_start(a,b) (a.__va_r31 = __builtin_getreg(31), \
                       a.__va_r30 = __builtin_getreg(30), \
                       a.__va_r29 = __builtin_getreg(29), \
                       a.__va_r28 = __builtin_getreg(28))

#define va_arg(a,b) \
           (b)    ((__optype(b) == 0 ) ? \
 /* pull an int type */((a).__va_r29 < (11-3)*4 ?     \
 /*   from reg area */   (((a).__va_r29 = (a).__va_r29+4), \
             *(long *)    ((a).__va_r29 + (a).__va_r30 - 4)) : \
 /*   or stack area */   (((a).__va_r31 = (a).__va_r31+4), \
             *(long *)    ((a).__va_r31 - 4))) : \
                       ((__optype(b) == 2) ? \
          /* structs by value not yet supported */      0L : \
 /* pull an fp type */ ((a).__va_r28 <= (11-3)*4+(8-1)*8+4 ?     \
 /*   from reg area */   (((a).__va_r28 = (a).__va_r28+8), \
             *(double *)  ((a).__va_r28 + (a).__va_r30 - 8)) : \
 /*   or stack area */   (((a).__va_r31 = (a).__va_r31+8), \
             *(double *)  ((a).__va_r31 - 8)))))
                         
#define va_end(a)

#else
#define va_start(a,b) a=(char *)(&b+1)
#define va_arg(a,b)  (*((b *) ((a +=  ((sizeof(b)+sizeof(int)-1) & ~(sizeof(int)-1))   ) -  ((sizeof(b)+sizeof(int)-1) & ~(sizeof(int)-1)) )))
#define va_end(a)
#endif

#endif
