From e1aeeae90eceed7dff8fb37292df258456f6fdd7 Mon Sep 17 00:00:00 2001
From: Richard Sandiford <rsandifo@redhat.com>
Date: Wed, 22 Sep 2004 07:27:51 +0000
Subject: [PATCH] mips.c (mips_function_value): For o32, o64, n32 and n64, use
 FPRs for scalar, complex and vector types only.

	* config/mips/mips.c (mips_function_value): For o32, o64, n32 and n64,
	use FPRs for scalar, complex and vector types only.

From-SVN: r87848
---
 gcc/ChangeLog          | 5 +++++
 gcc/config/mips/mips.c | 7 +++++++
 2 files changed, 12 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0902a1dff3ba..dce40399ab27 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-09-22  Richard Sandiford  <rsandifo@redhat.com>
+
+	* config/mips/mips.c (mips_function_value): For o32, o64, n32 and n64,
+	use FPRs for scalar, complex and vector types only.
+
 2004-09-21 Jeff Law  <law@redhat.com>
 
 	* tree-ssa-dom.c (opt_stats): Move so that it lives just after
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index c564f4e7f186..a1de622dbbf6 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -6764,6 +6764,13 @@ mips_function_value (tree valtype, tree func ATTRIBUTE_UNUSED,
 	      mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
 	    }
 	}
+
+      /* For EABI, the class of return register depends entirely on MODE.
+	 For example, "struct { some_type x; }" and "union { some_type x; }"
+	 are returned in the same way as a bare "some_type" would be.
+	 Other ABIs only use FPRs for scalar, complex or vector types.  */
+      if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
+	return gen_rtx_REG (mode, GP_RETURN);
     }
 
   if ((GET_MODE_CLASS (mode) == MODE_FLOAT
-- 
GitLab