diff options
author | Roger Sayle <roger@eyesopen.com> | 2006-08-22 12:42:41 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2006-08-22 12:42:41 +0000 |
commit | 883259c6d3071d35451cd34353191565bc4cee34 (patch) | |
tree | 6e7c1102b7427b165b152c76374ec903a367ef5a | |
parent | 173c3aa1f43840ee822431971f3d448dea0775c6 (diff) | |
download | gcc-883259c6d3071d35451cd34353191565bc4cee34.zip gcc-883259c6d3071d35451cd34353191565bc4cee34.tar.gz gcc-883259c6d3071d35451cd34353191565bc4cee34.tar.bz2 |
i386.c (ix86_value_regno): Don't return FIRST_MMX_REG if !TARGET_MMX...
* config/i386/i386.c (ix86_value_regno): Don't return FIRST_MMX_REG
if !TARGET_MMX, and don't return FIRST_SSE_REG if !TARGET_SSE.
From-SVN: r116321
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 12 |
2 files changed, 12 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 685b4b6..136ba9d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2006-08-22 Roger Sayle <roger@eyesopen.com> + + * config/i386/i386.c (ix86_value_regno): Don't return FIRST_MMX_REG + if !TARGET_MMX, and don't return FIRST_SSE_REG if !TARGET_SSE. + 2006-08-21 Jason Merrill <jason@redhat.com> PR c++/27115 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index fe0d516..5161dda 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -3980,14 +3980,16 @@ ix86_value_regno (enum machine_mode mode, tree func, tree fntype) gcc_assert (!TARGET_64BIT); /* 8-byte vector modes in %mm0. See ix86_return_in_memory for where - we prevent this case when mmx is not available. */ - if ((VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)) - return FIRST_MMX_REG; + we normally prevent this case when mmx is not available. However + some ABIs may require the result to be returned like DImode. */ + if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8) + return TARGET_MMX ? FIRST_MMX_REG : 0; /* 16-byte vector modes in %xmm0. See ix86_return_in_memory for where - we prevent this case when sse is not available. */ + we prevent this case when sse is not available. However some ABIs + may require the result to be returned like integer TImode. */ if (mode == TImode || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16)) - return FIRST_SSE_REG; + return TARGET_SSE ? FIRST_SSE_REG : 0; /* Decimal floating point values can go in %eax, unlike other float modes. */ if (DECIMAL_FLOAT_MODE_P (mode)) |