aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1996-03-07 15:10:54 -0800
committerJim Wilson <wilson@gcc.gnu.org>1996-03-07 15:10:54 -0800
commit9bad074fa55f03f99348ed5132d6d439571f5e51 (patch)
tree65e8ebb2832f732b5dcb823a1fc3fe0824389ca7 /gcc
parentddaf4c9114124df0305df1eeb8e1452b42c3c771 (diff)
downloadgcc-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.h55
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__