aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@redhat.com>2002-12-10 19:24:38 +0000
committerJim Wilson <wilson@redhat.com>2002-12-10 19:24:38 +0000
commita2e0878cd6c880e1fe62f3f593438d05d0c3160b (patch)
tree607859e5590da62c38c6eff7a686a4ef66fb60e1
parentc0521cc6fe5de3e38ffdc522c1b4d2f9ef82290b (diff)
Fix PPC32 SVR4 ABI bug with 128-bit long double.
* rs6000.h (RETURN_IN_MEMORY): If ABI_V4, then TFmode is returned in memory. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@60006 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/rs6000/rs6000.h10
2 files changed, 12 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d3ed606e61d..3b506ef19b7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2002-12-10 Jim Wilson <wilson@redhat.com>
+
+ * rs6000.h (RETURN_IN_MEMORY): If ABI_V4, then TFmode is returned in
+ memory.
+
2002-12-10 Andrew Haley <aph@redhat.com>
* cse.c (cse_insn): Don't cse past a basic block boundary.
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index ab38f5693eb..e5e9e27cce9 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -1550,13 +1550,17 @@ typedef struct rs6000_stack {
default, and -m switches get the final word. See
rs6000_override_options for more details.
+ The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
+ long double support is enabled. These values are returned in memory.
+
int_size_in_bytes returns -1 for variable size objects, which go in
memory always. The cast to unsigned makes -1 > 8. */
#define RETURN_IN_MEMORY(TYPE) \
- (AGGREGATE_TYPE_P (TYPE) && \
- (TARGET_AIX_STRUCT_RET || \
- (unsigned HOST_WIDE_INT) int_size_in_bytes (TYPE) > 8))
+ ((AGGREGATE_TYPE_P (TYPE) \
+ && (TARGET_AIX_STRUCT_RET \
+ || (unsigned HOST_WIDE_INT) int_size_in_bytes (TYPE) > 8)) \
+ || (DEFAULT_ABI == ABI_V4 && TYPE_MODE (TYPE) == TFmode))
/* DRAFT_V4_STRUCT_RET defaults off. */
#define DRAFT_V4_STRUCT_RET 0