diff options
author | Mateusz B <mateuszb@poczta.onet.pl> | 2019-01-07 08:31:19 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2019-01-07 07:31:19 +0000 |
commit | 4075fc70242c293fa46eef78af924ed5cc3f6647 (patch) | |
tree | c8320a287aca1c152f99000b1ea6c10dc1620452 /gcc | |
parent | 0aa6ee36708f0c70b2e98905480ca035a6f56689 (diff) | |
download | gcc-4075fc70242c293fa46eef78af924ed5cc3f6647.zip gcc-4075fc70242c293fa46eef78af924ed5cc3f6647.tar.gz gcc-4075fc70242c293fa46eef78af924ed5cc3f6647.tar.bz2 |
re PR target/88521 (GCC from r266355 miscompiles x265 for mingw-w64 target)
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.
From-SVN: r267622
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr88521.c | 30 |
4 files changed, 48 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1741b7e..9a01516 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-12-26 Mateusz B <mateuszb@poczta.onet.pl> + + 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. + 2019-01-05 Jan Hubicka <hubicka@ucw.cz> PR tree-opt/86020 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 5cf876a..d01278d 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 fcbbd74..c0bb281 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-12-26 Mateusz B <mateuszb@poczta.onet.pl> + + PR target/88521 + * gcc.target/i386/pr88521.c: New testcase. + 2019-01-06 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/88658 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; +} |