diff options
author | Lokesh Janghel <lokeshjanghel91@gmail.com> | 2018-11-21 20:09:56 +0000 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2018-11-21 21:09:56 +0100 |
commit | c339a8985df1288e569d550a1f22f50399e998e8 (patch) | |
tree | b98c691600b53a83320b00fbc928f17524f942b6 /gcc | |
parent | 99b5ace4696fa38118604cf80069c0c25f65c5ea (diff) | |
download | gcc-c339a8985df1288e569d550a1f22f50399e998e8.zip gcc-c339a8985df1288e569d550a1f22f50399e998e8.tar.gz gcc-c339a8985df1288e569d550a1f22f50399e998e8.tar.bz2 |
re PR target/85667 (ms_abi rules aren't followed when returning short structs with float values)
PR target/85667
* config/i386/i386.c (function_value_ms_64): Return AX_REG instead
of FIRST_SSE_REG for 4 or 8 byte modes.
testsuite/ChangeLog:
PR target/85667
* gcc.target/pr85667-1.c: New testcase.
* gcc.target/pr85667-2.c: New testcase.
* gcc.target/pr85667-3.c: New testcase.
* gcc.target/pr85667-4.c: New testcase.
From-SVN: r266355
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr85667-1.c | 33 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr85667-2.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr85667-3.c | 33 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr85667-4.c | 15 |
7 files changed, 110 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 82a1710..d789d9f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-11-21 Lokesh Janghel <lokeshjanghel91@gmail.com> + + PR target/85667 + * config/i386/i386.c (function_value_ms_64): Return AX_REG instead + of FIRST_SSE_REG for 4 or 8 byte modes. + 2018-11-21 Jan Hubicka <jh@suse.cz> PR lto/87957 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index c18c60a..41def54c 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -9005,11 +9005,6 @@ 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 (mode == SFmode || mode == DFmode) - regno = FIRST_SSE_REG; - break; default: break; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 29b0c83..a25a24b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +018-11-21 Lokesh Janghel <lokeshjanghel91@gmail.com> + + PR target/85667 + * gcc.target/pr85667-1.c: New testcase. + * gcc.target/pr85667-2.c: New testcase. + * gcc.target/pr85667-3.c: New testcase. + * gcc.target/pr85667-4.c: New testcase. + 2018-11-21 Jan Hubicka <hubicka@ucw.cz> PR lto/87957 diff --git a/gcc/testsuite/gcc.target/i386/pr85667-1.c b/gcc/testsuite/gcc.target/i386/pr85667-1.c new file mode 100644 index 0000000..d5508b7 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr85667-1.c @@ -0,0 +1,33 @@ +/* { dg-do run { target lp64 } } */ +/* { dg-options "-O2" } */ + +void abort (void); + +typedef struct +{ + float x; +} Float; + +Float __attribute__((ms_abi)) fn1 () +{ + Float v; + v.x = 3.145; + return v; +} + +Float fn2 () +{ + Float v; + v.x = 3.145; + return v; +} + +int main () +{ + Float a, b; + a = fn1 (); + b = fn2 (); + if (a.x == 3.145f && b.x == 3.145f) + return 0; + abort (); +} diff --git a/gcc/testsuite/gcc.target/i386/pr85667-2.c b/gcc/testsuite/gcc.target/i386/pr85667-2.c new file mode 100644 index 0000000..c3c0ba3 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr85667-2.c @@ -0,0 +1,15 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-times "movl\[^\n\r]*, %eax|mov\[ \t]*eax," 1 } } */ + +typedef struct +{ + float x; +} Float; + +Float __attribute__((ms_abi)) fn1 () +{ + Float v; + v.x = 3.145; + return v; +} diff --git a/gcc/testsuite/gcc.target/i386/pr85667-3.c b/gcc/testsuite/gcc.target/i386/pr85667-3.c new file mode 100644 index 0000000..73e83bcf --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr85667-3.c @@ -0,0 +1,33 @@ +/* { dg-do run { target lp64 } } */ +/* { dg-options "-O2" } */ + +void abort (void); + +typedef struct +{ + double x; +} Double; + +Double __attribute__((ms_abi)) fn1 () +{ + Double v; + v.x = 3.145; + return v; +} + +Double fn2 () +{ + Double v; + v.x = 3.145; + return v; +} + +int main () +{ + Double a, b; + a = fn1 (); + b = fn2 (); + if (a.x == 3.145 && b.x == 3.145) + return 0; + abort (); +} diff --git a/gcc/testsuite/gcc.target/i386/pr85667-4.c b/gcc/testsuite/gcc.target/i386/pr85667-4.c new file mode 100644 index 0000000..a49f06b --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr85667-4.c @@ -0,0 +1,15 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-times "movq\[^\n\r]*, %rax|mov\[ \t]*rax," 1 } } */ + +typedef struct +{ + double x; +} Double; + +Double __attribute__((ms_abi)) fn1 () +{ + Double v; + v.x = 3.145; + return v; +} |