aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2006-08-22 12:42:41 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2006-08-22 12:42:41 +0000
commit883259c6d3071d35451cd34353191565bc4cee34 (patch)
tree6e7c1102b7427b165b152c76374ec903a367ef5a /gcc
parent173c3aa1f43840ee822431971f3d448dea0775c6 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/i386/i386.c12
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))