diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2014-01-24 03:38:10 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2014-01-23 19:38:10 -0800 |
commit | 16370fa72fff9ed8f0a65d167e3e5b9f9200180d (patch) | |
tree | 1b60119c165780604b3601e747df63618ab474ea /gcc | |
parent | b846c948f29c4b56d6c14a509df4164049dabbd3 (diff) | |
download | gcc-16370fa72fff9ed8f0a65d167e3e5b9f9200180d.zip gcc-16370fa72fff9ed8f0a65d167e3e5b9f9200180d.tar.gz gcc-16370fa72fff9ed8f0a65d167e3e5b9f9200180d.tar.bz2 |
Get stack adjustment from push operand in pushsf splitter
pushsf for -m64/-mx32 looks like
(set (mem:SF (pre_modify:SI (reg/f:SI 7 sp)
(plus:SI (reg/f:SI 7 sp)
(const_int -8))))
(reg:SF 22 xmm1 [orig:84 D.1790 ] [84]))
Stack adjustment is in push operand and it isn't stack register mode size
which may be 4 bytes for -mx32. This patch gets stack adjustment from
push operand if code of push isn't PRE_DEC.
gcc/
PR target/59929
* config/i386/i386.md (pushsf splitter): Get stack adjustment
from push operand if code of push isn't PRE_DEC.
gcc/testsuite/
PR target/59929
* gcc.target/i386/pr59929.c: New test.
From-SVN: r207023
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr59929.c | 55 |
4 files changed, 80 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cd0e03d..cdbedad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-01-23 H.J. Lu <hongjiu.lu@intel.com> + + PR target/59929 + * config/i386/i386.md (pushsf splitter): Get stack adjustment + from push operand if code of push isn't PRE_DEC. + 2014-01-23 Michael Meissner <meissner@linux.vnet.ibm.com> PR target/59909 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index ddc3be6..92e8fd0 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -2765,7 +2765,20 @@ "reload_completed" [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2))) (set (mem:SF (reg:P SP_REG)) (match_dup 1))] - "operands[2] = GEN_INT (-<P:MODE_SIZE>);") +{ + rtx op = XEXP (operands[0], 0); + if (GET_CODE (op) == PRE_DEC) + { + gcc_assert (!TARGET_64BIT); + op = GEN_INT (-4); + } + else + { + op = XEXP (XEXP (op, 1), 1); + gcc_assert (CONST_INT_P (op)); + } + operands[2] = op; +}) (define_split [(set (match_operand:SF 0 "push_operand") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1240250..91c06d5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-01-23 H.J. Lu <hongjiu.lu@intel.com> + + PR target/59929 + * gcc.target/i386/pr59929.c: New test. + 2014-01-23 Michael Meissner <meissner@linux.vnet.ibm.com> PR target/59909 diff --git a/gcc/testsuite/gcc.target/i386/pr59929.c b/gcc/testsuite/gcc.target/i386/pr59929.c new file mode 100644 index 0000000..4591dc4 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr59929.c @@ -0,0 +1,55 @@ +/* { dg-do run } */ +/* { dg-options "-O0 -mno-accumulate-outgoing-args" } */ +/* { dg-options "-O0 -mno-accumulate-outgoing-args -mx32 -maddress-mode=short" { target x32 } } */ + +void +__attribute__ ((noinline)) +test (float x1, float x2, float x3, float x4, float x5, float x6, + float x7, float x8, float x9, float x10, float x11, float x12, + float x13, float x14, float x15, float x16) +{ + if (x1 != 91 + || x2 != 92 + || x3 != 93 + || x4 != 94 + || x5 != 95 + || x6 != 96 + || x7 != 97 + || x8 != 98 + || x9 != 99 + || x10 != 100 + || x11 != 101 + || x12 != 102 + || x13 != 103 + || x14 != 104 + || x15 != 105 + || x16 != 106) + __builtin_abort (); +} + +float x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, + x14, x15, x16; + +int +main () +{ + x1 = 91; + x2 = 92; + x3 = 93; + x4 = 94; + x5 = 95; + x6 = 96; + x7 = 97; + x8 = 98; + x9 = 99; + x10 = 100; + x11 = 101; + x12 = 102; + x13 = 103; + x14 = 104; + x15 = 105; + x16 = 106; + test (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, + x14, x15, x16); + return 0; +} |