aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2014-01-24 03:38:10 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2014-01-23 19:38:10 -0800
commit16370fa72fff9ed8f0a65d167e3e5b9f9200180d (patch)
tree1b60119c165780604b3601e747df63618ab474ea /gcc
parentb846c948f29c4b56d6c14a509df4164049dabbd3 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr59929.c55
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;
+}