Fix MIPS o32 calling convention for MSA and FP vector types
authorSameera Deshpande <sameera.deshpande@imgtec.com>
Wed, 22 Feb 2017 23:09:43 +0000 (23:09 +0000)
committerMatthew Fortune <mpf@gcc.gnu.org>
Wed, 22 Feb 2017 23:09:43 +0000 (23:09 +0000)
gcc/
* config/mips/mips.c (mips_return_in_memory): Force FP
vector types to be returned in memory for o32 ABI.

gcc/testsuite/

* gcc.target/mips/msa-fp-cc.c: New test.

From-SVN: r245666

gcc/ChangeLog
gcc/config/mips/mips.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/msa-fp-cc.c [new file with mode: 0644]

index f6168c93a540a41b47e715a0b8cd2626285d9f07..9654753153eca8366fac5e18cf3538ed03b2a2bd 100644 (file)
@@ -1,3 +1,8 @@
+2017-02-22  Sameera Deshpande  <sameera.deshpande@imgtec.com>
+
+       * config/mips/mips.c (mips_return_in_memory): Force FP
+       vector types to be returned in memory for o32 ABI.
+
 2017-02-22  Jakub Jelinek  <jakub@redhat.com>
 
        * dwarf2out.c (gen_variable_die): For -gdwarf-5, use DW_TAG_variable
index 7974a16541d50261e3a38e73ba299f0feb9201f4..4e13fbe1ec3aec8e5253fa2669488cd93fde81a8 100644 (file)
@@ -6472,9 +6472,13 @@ mips_function_value_regno_p (const unsigned int regno)
 static bool
 mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
 {
-  return (TARGET_OLDABI
-         ? TYPE_MODE (type) == BLKmode
-         : !IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
+  if (TARGET_OLDABI)
+    /* Ensure that any floating point vector types are returned via memory
+       even if they are supported through a vector mode with some ASEs.  */
+    return (VECTOR_FLOAT_TYPE_P (type)
+           || TYPE_MODE (type) == BLKmode);
+
+  return (!IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
 }
 \f
 /* Implement TARGET_SETUP_INCOMING_VARARGS.  */
index 9279d5842dbf6ac06e0215551957303d05e7422e..ea5e2515d8652ef5423dde24b22acb2e7431dfc8 100644 (file)
@@ -1,3 +1,7 @@
+2017-02-22  Sameera Deshpande  <sameera.deshpande@imgtec.com>
+
+       * gcc.target/mips/msa-fp-cc.c: New test.
+
 2017-02-22  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/79664
diff --git a/gcc/testsuite/gcc.target/mips/msa-fp-cc.c b/gcc/testsuite/gcc.target/mips/msa-fp-cc.c
new file mode 100644 (file)
index 0000000..3d293f3
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mabi=32 -mfp64 -mhard-float -mmsa" } */
+typedef float v4f32 __attribute__((vector_size(16)));
+typedef double v2f64 __attribute__((vector_size(16)));
+
+v4f32
+fcmpOeqVector4 (v4f32 a, v4f32 b)
+{
+  return a + b;
+}
+
+v2f64
+fcmpOeqVector2 (v2f64 a, v2f64 b)
+{
+  return a + b;
+}
+
+/* { dg-final { scan-assembler-not "copy_s" } } */
+/* { dg-final { scan-assembler-not "insert" } } */