diff options
author | Jim Wilson <wilson@gcc.gnu.org> | 1996-03-07 15:10:54 -0800 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 1996-03-07 15:10:54 -0800 |
commit | 9bad074fa55f03f99348ed5132d6d439571f5e51 (patch) | |
tree | 65e8ebb2832f732b5dcb823a1fc3fe0824389ca7 /gcc | |
parent | ddaf4c9114124df0305df1eeb8e1452b42c3c771 (diff) | |
download | gcc-9bad074fa55f03f99348ed5132d6d439571f5e51.zip gcc-9bad074fa55f03f99348ed5132d6d439571f5e51.tar.gz gcc-9bad074fa55f03f99348ed5132d6d439571f5e51.tar.bz2 |
(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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ginclude/va-sh.h | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/gcc/ginclude/va-sh.h b/gcc/ginclude/va-sh.h index 6e72814..5c873cb 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__ |