From: Jim Wilson Date: Thu, 7 Mar 1996 23:10:54 +0000 (-0800) Subject: (va_start): Change __SH3E___ to __SH3E__. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9bad074fa55f03f99348ed5132d6d439571f5e51;p=gcc.git (va_start): Change __SH3E___ to __SH3E__. (va_arg): Add little-endian SH3E support. Fix big-endian version to work for arguments smaller than the word size. From-SVN: r11492 --- diff --git a/gcc/ginclude/va-sh.h b/gcc/ginclude/va-sh.h index 6e72814d126..5c873cbb4d7 100644 --- a/gcc/ginclude/va-sh.h +++ b/gcc/ginclude/va-sh.h @@ -62,7 +62,7 @@ __extension__ \ #define va_alist __builtin_va_alist #define va_dcl int __builtin_va_alist;... -#ifdef __SH3E___ +#ifdef __SH3E__ #define va_start(AP) \ __extension__ \ @@ -124,8 +124,6 @@ enum __va_type_classes { #ifdef __SH3E__ #ifdef __LITTLE_ENDIAN__ -#warning SH3e little endian varargs/stdarg support has not been written yet. -#endif #define va_arg(pvar,TYPE) \ __extension__ \ @@ -143,21 +141,60 @@ __extension__ \ } \ else \ { \ - __va_greg *__r; \ - if (pvar.__va_next_o + ((sizeof (TYPE) + 3) / 4) <= pvar.__va_next_o_limit) \ + __va_greg *_r; \ + if (pvar.__va_next_o + ((sizeof (TYPE) + 3) / 4) \ + <= pvar.__va_next_o_limit) \ { \ - __r = (__va_greg *) pvar.__va_next_o; \ - pvar.__va_next_o += (sizeof (TYPE) + 3) / 4; \ + _r = pvar.__va_next_o; \ + pvar.__va_next_o += (sizeof (TYPE) + 3) / 4; \ } \ else \ { \ - __r = (__va_greg *) pvar.__va_next_stack; \ - pvar.__va_next_stack += (sizeof (TYPE) + 3) / 4; \ + _r = pvar.__va_next_stack; \ + pvar.__va_next_stack += (sizeof (TYPE) + 3) / 4; \ } \ + __result = (char *) _r; \ + } \ + (TYPE *) __result;})) + +#else /* ! __LITTLE_ENDIAN__ */ + +#define va_arg(pvar,TYPE) \ +__extension__ \ +(*({int __type = __builtin_classify_type (* (TYPE *) 0); \ + void * __result; \ + if (__type == __real_type_class && sizeof(TYPE) == 4) \ + /* float? */ \ + { \ + __va_freg *__r; \ + if (pvar.__va_next_fp < pvar.__va_next_fp_limit) \ + __r = (__va_freg *) pvar.__va_next_fp++; \ + else \ + __r = (__va_freg *) pvar.__va_next_stack++; \ __result = (char *) __r; \ + } \ + else \ + { \ + __va_greg *_r; \ + if (pvar.__va_next_o + ((sizeof (TYPE) + 3) / 4) \ + <= pvar.__va_next_o_limit) \ + { \ + pvar.__va_next_o += (sizeof (TYPE) + 3) / 4; \ + _r = pvar.__va_next_o; \ + } \ + else \ + { \ + pvar.__va_next_stack += (sizeof (TYPE) + 3) / 4; \ + _r = pvar.__va_next_stack; \ + } \ + __result = ((char *) _r \ + - (sizeof (TYPE) < 4 ? sizeof (TYPE) \ + : ((sizeof (TYPE) + 3) / 4) * 4)); \ } \ (TYPE *) __result;})) +#endif /* __LITTLE_ENDIAN__ */ + #else /* ! SH3E */ #ifdef __LITTLE_ENDIAN__