@@ -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));
}
/* Implement TARGET_SETUP_INCOMING_VARARGS. */
new file mode 100644
@@ -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" } } */