aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2004-01-27 15:42:36 +0100
committerEric Botcazou <ebotcazou@gcc.gnu.org>2004-01-27 14:42:36 +0000
commitbe446dfc6bb52f0aecbc0c7fc71b7a8fbb35be4b (patch)
tree0c3946439f6563c3412bf9d01dddc4fb80a2aca6
parent04b1f9b877999485989fdb5265a0c48db49d2722 (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/config/sparc/sparc.c7
-rw-r--r--gcc/config/sparc/sparc.h7
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) \