diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2004-01-27 15:42:36 +0100 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2004-01-27 14:42:36 +0000 |
commit | be446dfc6bb52f0aecbc0c7fc71b7a8fbb35be4b (patch) | |
tree | 0c3946439f6563c3412bf9d01dddc4fb80a2aca6 | |
parent | 04b1f9b877999485989fdb5265a0c48db49d2722 (diff) | |
download | gcc-be446dfc6bb52f0aecbc0c7fc71b7a8fbb35be4b.zip gcc-be446dfc6bb52f0aecbc0c7fc71b7a8fbb35be4b.tar.gz gcc-be446dfc6bb52f0aecbc0c7fc71b7a8fbb35be4b.tar.bz2 |
sparc.c (function_arg_pass_by_reference): Return 1 for SCmode and DCmode if ARCH32.
* config/sparc/sparc.c (function_arg_pass_by_reference): Return 1
for SCmode and DCmode if ARCH32.
(sparc_va_arg): Handle SCmode and DCmode by reference if ARCH32.
* config/sparc/sparc.h (RETURN_IN_MEMORY): Return 0 for TCmode
if ARCH32.
(BASE_RETURN_VALUE_REG): Return 32 for all FP modes except TFmode
if ARCH32.
(BASE_OUTGOING_VALUE_REG): Likewise.
From-SVN: r76708
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.c | 7 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.h | 7 |
3 files changed, 20 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 60d2990..58a742c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,16 @@ 2004-01-27 Eric Botcazou <ebotcazou@libertysurf.fr> + * config/sparc/sparc.c (function_arg_pass_by_reference): Return 1 + for SCmode and DCmode if ARCH32. + (sparc_va_arg): Handle SCmode and DCmode by reference if ARCH32. + * config/sparc/sparc.h (RETURN_IN_MEMORY): Return 0 for TCmode + if ARCH32. + (BASE_RETURN_VALUE_REG): Return 32 for all FP modes except TFmode + if ARCH32. + (BASE_OUTGOING_VALUE_REG): Likewise. + +2004-01-27 Eric Botcazou <ebotcazou@libertysurf.fr> + PR target/10904 PR target/13058 * config/sparc/sparc.h (CANNOT_CHANGE_MODE_CLASS): New. diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index b732e7a..e1e37ee 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -5591,7 +5591,10 @@ function_arg_pass_by_reference (const struct sparc_args *cum ATTRIBUTE_UNUSED, if (TARGET_ARCH32) { return ((type && AGGREGATE_TYPE_P (type)) - || mode == TFmode || mode == TCmode); + || mode == TFmode + || mode == SCmode + || mode == DCmode + || mode == TCmode); } else { @@ -5803,6 +5806,8 @@ sparc_va_arg (tree valist, tree type) { if (AGGREGATE_TYPE_P (type) || TYPE_MODE (type) == TFmode + || TYPE_MODE (type) == SCmode + || TYPE_MODE (type) == DCmode || TYPE_MODE (type) == TCmode) { indirect = 1; diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index eeab3c6..364bea0 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -1157,8 +1157,7 @@ extern int sparc_mode_class[]; #define RETURN_IN_MEMORY(TYPE) \ (TARGET_ARCH32 \ ? (TYPE_MODE (TYPE) == BLKmode \ - || TYPE_MODE (TYPE) == TFmode \ - || TYPE_MODE (TYPE) == TCmode) \ + || TYPE_MODE (TYPE) == TFmode) \ : (TYPE_MODE (TYPE) == BLKmode \ && (unsigned HOST_WIDE_INT) int_size_in_bytes (TYPE) > 32)) @@ -1671,13 +1670,13 @@ extern char leaf_reg_remap[]; #define BASE_RETURN_VALUE_REG(MODE) \ (TARGET_ARCH64 \ ? (TARGET_FPU && FLOAT_MODE_P (MODE) ? 32 : 8) \ - : (((MODE) == SFmode || (MODE) == DFmode) && TARGET_FPU ? 32 : 8)) + : (TARGET_FPU && FLOAT_MODE_P (MODE) && (MODE) != TFmode ? 32 : 8)) #define BASE_OUTGOING_VALUE_REG(MODE) \ (TARGET_ARCH64 \ ? (TARGET_FPU && FLOAT_MODE_P (MODE) ? 32 \ : TARGET_FLAT ? 8 : 24) \ - : (((MODE) == SFmode || (MODE) == DFmode) && TARGET_FPU ? 32 \ + : (TARGET_FPU && FLOAT_MODE_P (MODE) && (MODE) != TFmode ? 32\ : (TARGET_FLAT ? 8 : 24))) #define BASE_PASSING_ARG_REG(MODE) \ |