aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@mvista.com>2004-04-23 13:51:21 +0000
committerDaniel Jacobowitz <drow@gcc.gnu.org>2004-04-23 13:51:21 +0000
commit01d4c813e84d813bcc5ac0b4acafe2eb382fdef4 (patch)
tree078627b568904e8511ae186f72dd68fd9fd02028
parent4424e0da57fd1562550505beefc2b6b62a733701 (diff)
downloadgcc-01d4c813e84d813bcc5ac0b4acafe2eb382fdef4.zip
gcc-01d4c813e84d813bcc5ac0b4acafe2eb382fdef4.tar.gz
gcc-01d4c813e84d813bcc5ac0b4acafe2eb382fdef4.tar.bz2
arm.c (arm_output_epilogue): Reverse the order of loading iWMMXt registers with a frame pointer.
* config/arm/arm.c (arm_output_epilogue): Reverse the order of loading iWMMXt registers with a frame pointer. Use post-increment without a frame pointer. (arm_expand_prologue): Reverse the order of saving iWMMXt registers. testsuite/ * gcc.c-torture/execute/simd-5.c: New test. From-SVN: r81092
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/arm/arm.c6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/simd-5.c59
4 files changed, 73 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b45f29a..e544a23 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-04-23 Daniel Jacobowitz <drow@mvista.com>
+
+ * config/arm/arm.c (arm_output_epilogue): Reverse the order of
+ loading iWMMXt registers with a frame pointer. Use post-increment
+ without a frame pointer.
+ (arm_expand_prologue): Reverse the order of saving iWMMXt registers.
+
2004-04-23 Paolo Bonzini <bonzini@gnu.org>
* doc/invoke.texi (Optimize Options): Refer to "unit-at-a-time
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index d6c0c3d..1c2f2b2 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -9492,7 +9492,7 @@ arm_output_epilogue (rtx sibling)
the live_regs_mask. */
lrm_count += (lrm_count % 2 ? 2 : 1);
- for (reg = FIRST_IWMMXT_REGNUM; reg <= LAST_IWMMXT_REGNUM; reg++)
+ for (reg = LAST_IWMMXT_REGNUM; reg >= FIRST_IWMMXT_REGNUM; reg--)
if (regs_ever_live[reg] && !call_used_regs[reg])
{
asm_fprintf (f, "\twldrd\t%r, [%r, #-%d]\n",
@@ -9613,7 +9613,7 @@ arm_output_epilogue (rtx sibling)
if (TARGET_IWMMXT)
for (reg = FIRST_IWMMXT_REGNUM; reg <= LAST_IWMMXT_REGNUM; reg++)
if (regs_ever_live[reg] && !call_used_regs[reg])
- asm_fprintf (f, "\twldrd\t%r, [%r, #+8]!\n", reg, SP_REGNUM);
+ asm_fprintf (f, "\twldrd\t%r, [%r], #8\n", reg, SP_REGNUM);
/* If we can, restore the LR into the PC. */
if (ARM_FUNC_TYPE (func_type) == ARM_FT_NORMAL
@@ -10339,7 +10339,7 @@ arm_expand_prologue (void)
}
if (TARGET_IWMMXT)
- for (reg = FIRST_IWMMXT_REGNUM; reg <= LAST_IWMMXT_REGNUM; reg++)
+ for (reg = LAST_IWMMXT_REGNUM; reg >= FIRST_IWMMXT_REGNUM; reg--)
if (regs_ever_live[reg] && ! call_used_regs [reg])
{
insn = gen_rtx_PRE_DEC (V2SImode, stack_pointer_rtx);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b57694e..f25bfd1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2004-04-23 Daniel Jacobowitz <drow@mvista.com>
+
+ * gcc.c-torture/execute/simd-5.c: New test.
+
2004-04-23 Giovanni Bajo <giovannibajo@gcc.gnu.org>
PR c++/15064
diff --git a/gcc/testsuite/gcc.c-torture/execute/simd-5.c b/gcc/testsuite/gcc.c-torture/execute/simd-5.c
new file mode 100644
index 0000000..f058432
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/simd-5.c
@@ -0,0 +1,59 @@
+/* Test saving and restoring of SIMD registers. */
+
+typedef short Q __attribute__((vector_size(8)));
+
+Q q1 = {1, 2}, q2 = {3, 4}, q3 = {5, 6}, q4 = {7, 8};
+
+Q w1, w2, w3, w4;
+Q z1, z2, z3, z4;
+
+volatile int dummy;
+
+void __attribute__((__noinline__))
+func0 (void)
+{
+ dummy = 1;
+}
+
+void __attribute__((__noinline__))
+func1 (void)
+{
+ Q a, b;
+ a = q1 * q2;
+ b = q3 * q4;
+ w1 = a;
+ w2 = b;
+ func0 ();
+ w3 = a;
+ w4 = b;
+}
+
+void __attribute__((__noinline__))
+func2 (void)
+{
+ Q a, b;
+ a = q1 + q2;
+ b = q3 - q4;
+ z1 = a;
+ z2 = b;
+ func1 ();
+ z3 = a;
+ z4 = b;
+}
+
+int
+main (void)
+{
+ func2 ();
+
+ if (memcmp (&w1, &w3, sizeof (Q)) != 0)
+ abort ();
+ if (memcmp (&w2, &w4, sizeof (Q)) != 0)
+ abort ();
+ if (memcmp (&z1, &z3, sizeof (Q)) != 0)
+ abort ();
+ if (memcmp (&z2, &z4, sizeof (Q)) != 0)
+ abort ();
+
+ return 0;
+}