From d560b0aa2ab4f07365674f3a7d2e4a4626c363c5 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 2 Feb 2004 13:20:52 +0100 Subject: [PATCH] sparc.c (function_arg_slotno): Align TImode arguments on a 16-byte boundary in the parameter array if ARCH64. * config/sparc/sparc.c (function_arg_slotno): Align TImode arguments on a 16-byte boundary in the parameter array if ARCH64. Split handling of TFmode. From-SVN: r77107 --- gcc/ChangeLog | 6 ++++++ gcc/config/sparc/sparc.c | 15 ++++++++++----- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/titype-1.c | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/titype-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bbd7f72..c750598 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-02-02 Eric Botcazou + + * config/sparc/sparc.c (function_arg_slotno): Align TImode + arguments on a 16-byte boundary in the parameter array if ARCH64. + Split handling of TFmode. + 2004-02-02 Paolo Bonzini * rtlanal.c (reg_overlap_mentioned_p) [!ENABLE_CHECKING]: diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 369f11a..e7dd4fa 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -4979,19 +4979,27 @@ function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode, See emit_call_1. */ return -1; + case TImode : case CTImode : + if (TARGET_ARCH64 && (slotno & 1) != 0) + slotno++, *ppadding = 1; + /* fallthrough */ + case QImode : case CQImode : case HImode : case CHImode : case SImode : case CSImode : case DImode : case CDImode : - case TImode : case CTImode : if (slotno >= SPARC_INT_ARG_MAX) return -1; regno = regbase + slotno; break; + case TFmode : case TCmode : + if (TARGET_ARCH64 && (slotno & 1) != 0) + slotno++, *ppadding = 1; + /* fallthrough */ + case SFmode : case SCmode : case DFmode : case DCmode : - case TFmode : case TCmode : if (TARGET_ARCH32) { if (slotno >= SPARC_INT_ARG_MAX) @@ -5000,9 +5008,6 @@ function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode, } else { - if ((mode == TFmode || mode == TCmode) - && (slotno & 1) != 0) - slotno++, *ppadding = 1; if (TARGET_FPU && named) { if (slotno >= SPARC_FP_ARG_MAX) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 87fe8b7..c748d78 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-02-02 Eric Botcazou + + * gcc.dg/titype-1.c: New test. + 2004-02-01 Giovanni Bajo PR c++/13957 diff --git a/gcc/testsuite/gcc.dg/titype-1.c b/gcc/testsuite/gcc.dg/titype-1.c new file mode 100644 index 0000000..ab38f1f --- /dev/null +++ b/gcc/testsuite/gcc.dg/titype-1.c @@ -0,0 +1,34 @@ +/* { dg-do compile } */ + +/* Not all platforms support TImode integers. */ +#if defined(__LP64__) || defined(__sparc__) +typedef int TItype __attribute__ ((mode (TI))); /* { dg-error "no data type for mode" "TI" { target sparc-sun-solaris2.[0-6]* } } */ +#else +typedef long TItype; +#endif + +#include + +extern void abort(void); + + +void foo(int i, ...) +{ + TItype q; + va_list va; + + va_start(va, i); + q = va_arg(va, TItype); + va_end(va); + + if (q != 5) + abort(); +} + +int main(void) +{ + TItype q = 5; + + foo(1, q); + return 0; +} -- 2.7.4