diff options
Diffstat (limited to 'gcc/config/i386/i386.c')
| -rw-r--r-- | gcc/config/i386/i386.c | 12 |
1 files changed, 7 insertions, 5 deletions
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)) |
