+2013-02-04 Kai Tietz <ktietz@redhat.com>
+
+ PR target/56186
+ * config/i386/i386.c (function_value_ms_64): Add additional valtype
+ argument and improve checking of return-argument types for 16-byte
+ modes.
+ (ix86_function_value_1): Add additional valtype argument on call
+ of function_value_64.
+ (return_in_memory_ms_64): Sync 16-byte sized mode handling with
+ handling infunction_value_64 function.
+
+
2013-02-04 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
* gcc/reload.c (subst_reloads): Fix DEBUG_RELOAD build issue.
}
static rtx
-function_value_ms_64 (enum machine_mode orig_mode, enum machine_mode mode)
+function_value_ms_64 (enum machine_mode orig_mode, enum machine_mode mode,
+ const_tree valtype)
{
unsigned int regno = AX_REG;
if (TARGET_SSE)
{
switch (GET_MODE_SIZE (mode))
- {
- case 16:
- if((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
- && !COMPLEX_MODE_P (mode))
+ {
+ case 16:
+ if (valtype != NULL_TREE
+ && !VECTOR_INTEGER_TYPE_P (valtype)
+ && !VECTOR_INTEGER_TYPE_P (valtype)
+ && !INTEGRAL_TYPE_P (valtype)
+ && !VECTOR_FLOAT_TYPE_P (valtype))
+ break;
+ if ((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
+ && !COMPLEX_MODE_P (mode))
regno = FIRST_SSE_REG;
break;
case 8:
fntype = fn ? TREE_TYPE (fn) : fntype_or_decl;
if (TARGET_64BIT && ix86_function_type_abi (fntype) == MS_ABI)
- return function_value_ms_64 (orig_mode, mode);
+ return function_value_ms_64 (orig_mode, mode, valtype);
else if (TARGET_64BIT)
return function_value_64 (orig_mode, mode, valtype);
else
HOST_WIDE_INT size = int_size_in_bytes (type);
/* __m128 is returned in xmm0. */
- if ((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
+ if ((!type || VECTOR_INTEGER_TYPE_P (type) || INTEGRAL_TYPE_P (type)
+ || VECTOR_FLOAT_TYPE_P (type))
+ && (SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
&& !COMPLEX_MODE_P (mode) && (GET_MODE_SIZE (mode) == 16 || size == 16))
return false;