Commit d560b0aa by Eric Botcazou Committed by Eric Botcazou

sparc.c (function_arg_slotno): Align TImode arguments on a 16-byte boundary in…

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
parent 6f626d1b
2004-02-02 Eric Botcazou <ebotcazou@libertysurf.fr>
* 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 <bonzini@gnu.org> 2004-02-02 Paolo Bonzini <bonzini@gnu.org>
* rtlanal.c (reg_overlap_mentioned_p) [!ENABLE_CHECKING]: * rtlanal.c (reg_overlap_mentioned_p) [!ENABLE_CHECKING]:
......
...@@ -4979,19 +4979,27 @@ function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode, ...@@ -4979,19 +4979,27 @@ function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode,
See emit_call_1. */ See emit_call_1. */
return -1; return -1;
case TImode : case CTImode :
if (TARGET_ARCH64 && (slotno & 1) != 0)
slotno++, *ppadding = 1;
/* fallthrough */
case QImode : case CQImode : case QImode : case CQImode :
case HImode : case CHImode : case HImode : case CHImode :
case SImode : case CSImode : case SImode : case CSImode :
case DImode : case CDImode : case DImode : case CDImode :
case TImode : case CTImode :
if (slotno >= SPARC_INT_ARG_MAX) if (slotno >= SPARC_INT_ARG_MAX)
return -1; return -1;
regno = regbase + slotno; regno = regbase + slotno;
break; break;
case TFmode : case TCmode :
if (TARGET_ARCH64 && (slotno & 1) != 0)
slotno++, *ppadding = 1;
/* fallthrough */
case SFmode : case SCmode : case SFmode : case SCmode :
case DFmode : case DCmode : case DFmode : case DCmode :
case TFmode : case TCmode :
if (TARGET_ARCH32) if (TARGET_ARCH32)
{ {
if (slotno >= SPARC_INT_ARG_MAX) if (slotno >= SPARC_INT_ARG_MAX)
...@@ -5000,9 +5008,6 @@ function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode, ...@@ -5000,9 +5008,6 @@ function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode,
} }
else else
{ {
if ((mode == TFmode || mode == TCmode)
&& (slotno & 1) != 0)
slotno++, *ppadding = 1;
if (TARGET_FPU && named) if (TARGET_FPU && named)
{ {
if (slotno >= SPARC_FP_ARG_MAX) if (slotno >= SPARC_FP_ARG_MAX)
......
2004-02-02 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/titype-1.c: New test.
2004-02-01 Giovanni Bajo <giovannibajo@gcc.gnu.org> 2004-02-01 Giovanni Bajo <giovannibajo@gcc.gnu.org>
PR c++/13957 PR c++/13957
......
/* { 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 <stdarg.h>
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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment