diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2016-01-06 21:19:04 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2016-01-06 21:19:04 +0100 |
commit | 5027395ec641081ed33dd2c4b8204aba7053782c (patch) | |
tree | 56f596dbabca08e4f85f1296550c7a7c0d76ab1c | |
parent | 7443cf13054da143f0ec0ae12786c8853cfe31e4 (diff) | |
download | gcc-5027395ec641081ed33dd2c4b8204aba7053782c.zip gcc-5027395ec641081ed33dd2c4b8204aba7053782c.tar.gz gcc-5027395ec641081ed33dd2c4b8204aba7053782c.tar.bz2 |
re PR target/69140 (stack alignment + O1 breaks with Microsoft ABI)
PR target/69140
* config/i386/i386.c (ix86_expand_prologue): Declare fs.sp_valid
depending on frame_pointer_needed before remaining integer and SSE
registers are saved.
testsuite/ChangeLog:
PR target/69140
* gcc.target/i386/pr69140.c: New test
From-SVN: r232111
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr69140.c | 24 |
4 files changed, 38 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eaae4ec..c807433 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-01-06 Uros Bizjak <ubizjak@gmail.com> + + PR target/69140 + * config/i386/i386.c (ix86_expand_prologue): Declare fs.sp_valid + depending on frame_pointer_needed before remaining integer and SSE + registers are saved. + 2015-01-06 Bill Schmidt <wschmidt@linux.vnet.ibm.com> * config/rs6000/vsx.md (*p9_vecload_<mode>): Replace VSX_M diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index c6c66c7..9c3fa70 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -13065,6 +13065,8 @@ ix86_expand_prologue (void) m->fs.fp_valid = true; } + m->fs.sp_valid = !frame_pointer_needed; + if (!int_registers_saved) ix86_emit_save_regs_using_mov (frame.reg_save_offset); if (!sse_registers_saved) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e3a742a..5ca10b3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-01-06 Uros Bizjak <ubizjak@gmail.com> + + PR target/69140 + * gcc.target/i386/pr69140.c: New test + 2016-01-06 David Malcolm <dmalcolm@redhat.com> * gcc.dg/bad-dereference.c: New test case. diff --git a/gcc/testsuite/gcc.target/i386/pr69140.c b/gcc/testsuite/gcc.target/i386/pr69140.c new file mode 100644 index 0000000..2c345dd --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr69140.c @@ -0,0 +1,24 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O2 -mincoming-stack-boundary=3" } */ + +typedef struct { + unsigned int buf[4]; + unsigned char in[64]; +} MD4_CTX; + +static void +MD4Transform (unsigned int buf[4], const unsigned int in[16]) +{ + unsigned int a, b, c, d; + (b) += ((((c)) & ((d))) | ((~(c)) & ((a)))) + (in[7]); + (a) += ((((b)) & ((c))) | ((~(b)) & ((d)))) + (in[8]); + (d) += ((((a)) & ((b))) | ((~(a)) & ((c)))) + (in[9]); + buf[3] += d; +} + +void __attribute__((ms_abi)) +MD4Update (MD4_CTX *ctx, const unsigned char *buf) +{ + MD4Transform( ctx->buf, (unsigned int *)ctx->in); + MD4Transform( ctx->buf, (unsigned int *)ctx->in); +} |