diff options
author | Kai Tietz <ktietz@redhat.com> | 2013-02-04 17:37:44 +0100 |
---|---|---|
committer | Kai Tietz <ktietz@gcc.gnu.org> | 2013-02-04 17:37:44 +0100 |
commit | 152689dc44791375394b952dbebdfb81e361dffc (patch) | |
tree | 1440d5f80d79e5915728b3dc05fbe12ced0b2e7b | |
parent | 2b5987b550c62dec5b79670dfe34984a3d1d0c8b (diff) | |
download | gcc-152689dc44791375394b952dbebdfb81e361dffc.zip gcc-152689dc44791375394b952dbebdfb81e361dffc.tar.gz gcc-152689dc44791375394b952dbebdfb81e361dffc.tar.bz2 |
re PR target/56186 (function return ABI change for 128-bit types on Win64)
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.
From-SVN: r195721
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 23 |
2 files changed, 28 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 138f6d4..7d0988c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +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. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index acdfa6c..895028b 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -7336,17 +7336,24 @@ function_value_64 (enum machine_mode orig_mode, enum machine_mode mode, } 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: @@ -7373,7 +7380,7 @@ ix86_function_value_1 (const_tree valtype, const_tree fntype_or_decl, 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 @@ -7486,7 +7493,9 @@ return_in_memory_ms_64 (const_tree type, enum machine_mode mode) 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; |