summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2016-01-18 16:19:53 +0000
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2016-01-18 16:19:53 +0000
commit11e330df4d27cf801f7edd61605082f66d1ee4ae (patch)
treeab7642b0de513ef71e1bf64dcb8672552e2a768e
parent256b464ad6bdf3c4635848d2713edd4e53becb76 (diff)
downloadgcc-11e330df4d27cf801f7edd61605082f66d1ee4ae.tar.gz
Backport from mainline
2016-01-07 Uros Bizjak <ubizjak@gmail.com> PR target/69140 * config/i386/i386.c (ix86_frame_pointer_required): Enable frame pointer for TARGET_64BIT_MS_ABI when stack is misaligned. testsuite/ChangeLog: Backport from mainline 2016-01-06 Uros Bizjak <ubizjak@gmail.com> PR target/69140 * gcc.target/i386/pr69140.c: New test git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-5-branch@232528 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/i386/i386.c4
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.target/i386/pr69140.c24
4 files changed, 45 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bb8d1fbc16e..373f07a9b78 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2016-01-18 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2016-01-07 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/69140
+ * config/i386/i386.c (ix86_frame_pointer_required): Enable
+ frame pointer for TARGET_64BIT_MS_ABI when stack is misaligned.
+
2016-01-17 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
Backport from mainline:
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index c1b68aaa1c2..504e8b8d871 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -9690,6 +9690,10 @@ ix86_frame_pointer_required (void)
if (TARGET_64BIT_MS_ABI && get_frame_size () > SEH_MAX_FRAME_SIZE)
return true;
+ /* SSE saves require frame-pointer when stack is misaligned. */
+ if (TARGET_64BIT_MS_ABI && ix86_incoming_stack_boundary < 128)
+ return true;
+
/* In ix86_option_override_internal, TARGET_OMIT_LEAF_FRAME_POINTER
turns off the frame pointer by default. Turn it back on now if
we've not got a leaf function. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 121ea955700..b4f892816a9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2016-01-18 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2016-01-06 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/69140
+ * gcc.target/i386/pr69140.c: New test
+
2016-01-18 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/inline12.adb: New test.
diff --git a/gcc/testsuite/gcc.target/i386/pr69140.c b/gcc/testsuite/gcc.target/i386/pr69140.c
new file mode 100644
index 00000000000..2c345dd75bc
--- /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);
+}