From 0e9f8e8295d450416a652bb0d0d49eee62960683 Mon Sep 17 00:00:00 2001
From: Jim Wilson <wilson@redhat.com>
Date: Tue, 10 Dec 2002 19:24:38 +0000
Subject: [PATCH] Fix PPC32 SVR4 ABI bug with 128-bit long double.

	* rs6000.h (RETURN_IN_MEMORY): If ABI_V4, then TFmode is returned in
	memory.

From-SVN: r60006
---
 gcc/ChangeLog              |  5 +++++
 gcc/config/rs6000/rs6000.h | 10 +++++++---
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d3ed606e61d2..3b506ef19b7f 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 ab38f5693eb7..e5e9e27cce9f 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
-- 
GitLab