aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2016-01-06 21:19:04 +0100
committerUros Bizjak <uros@gcc.gnu.org>2016-01-06 21:19:04 +0100
commit5027395ec641081ed33dd2c4b8204aba7053782c (patch)
tree56f596dbabca08e4f85f1296550c7a7c0d76ab1c
parent7443cf13054da143f0ec0ae12786c8853cfe31e4 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/config/i386/i386.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr69140.c24
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);
+}