From: H.J. Lu Date: Fri, 24 Jan 2014 03:38:10 +0000 (+0000) Subject: Get stack adjustment from push operand in pushsf splitter X-Git-Tag: releases/gcc-4.9.0~1405 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=16370fa72fff9ed8f0a65d167e3e5b9f9200180d;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cd0e03d8647e..cdbedadc64cb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-01-23 H.J. Lu + + 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 PR target/59909 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index ddc3be67c65c..92e8fd0144cf 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 (-);") +{ + 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 1240250b7b81..91c06d50f3ea 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-01-23 H.J. Lu + + PR target/59929 + * gcc.target/i386/pr59929.c: New test. + 2014-01-23 Michael Meissner 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 000000000000..4591dc4d6016 --- /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; +}