diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 12e8f05..21067f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-12-26 Mateusz B + + PR target/88521 + * config/i386/i386.c (function_value_ms_64): Return small sturct in + AX_REG and float/double in FIRST_SSE_REG for 4 or 8 byte modes. + 2018-12-19 Bin Cheng * auto-profile.c (afdo_indirect_call): Skip generating histogram diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index b3c8676..e54c489 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -9063,6 +9063,13 @@ function_value_ms_64 (machine_mode orig_mode, machine_mode mode, && !COMPLEX_MODE_P (mode)) regno = FIRST_SSE_REG; break; + case 8: + case 4: + if (valtype != NULL_TREE && AGGREGATE_TYPE_P (valtype)) + break; + if (mode == SFmode || mode == DFmode) + regno = FIRST_SSE_REG; + break; default: break; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 188b6c5..f4b3400 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-12-26 Mateusz B + + PR target/88521 + * gcc.target/i386/pr88521.c: New testcase. + 2018-12-18 Jakub Jelinek PR rtl-optimization/87759 diff --git a/gcc/testsuite/gcc.target/i386/pr88521.c b/gcc/testsuite/gcc.target/i386/pr88521.c new file mode 100644 index 0000000..f42703a --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr88521.c @@ -0,0 +1,30 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-times "movl\[^\n\r]*, %eax|mov\[ \t]*eax," 1 } } */ +/* { dg-final { scan-assembler-times "movss\[^\n\r]*, %xmm" 1 } } */ +/* { dg-final { scan-assembler-times "movsd\[^\n\r]*, %xmm" 1 } } */ +typedef struct +{ + float x; +} Float; + +Float __attribute__((ms_abi)) fn1() +{ + Float v; + v.x = 3.145F; + return v; +} + +float __attribute__((ms_abi)) fn2 () +{ + float v; + v = 3.145F; + return v; +} + +double __attribute__((ms_abi)) fn3 () +{ + double v; + v = 3.145; + return v; +}