aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2016-05-12 09:56:46 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2016-05-12 09:56:46 +0000
commit5acc47a40d13af51cd1709f0238c798a666bcd7b (patch)
tree43c42f7af9755f290377e17a4c95ed428514cfc4 /gcc/testsuite
parent3cd638421e2d9639f68313a6b18522b31f702b04 (diff)
downloadgcc-5acc47a40d13af51cd1709f0238c798a666bcd7b.zip
gcc-5acc47a40d13af51cd1709f0238c798a666bcd7b.tar.gz
gcc-5acc47a40d13af51cd1709f0238c798a666bcd7b.tar.bz2
[ARM] PR target/70830: Avoid POP-{reglist}^ when returning from interrupt handlers
PR target/70830 * config/arm/arm.c (arm_output_multireg_pop): Avoid POP instruction when popping the PC and within an interrupt handler routine. Add missing tab to output of "ldmfd". (output_return_instruction): Output LDMFD with SP update rather than POP when returning from interrupt handler. * gcc.target/arm/interrupt-1.c: Change dg-compile to dg-assemble. Add -save-temps to dg-options. Scan for ldmfd rather than pop instruction. * gcc.target/arm/interrupt-2.c: Likewise. * gcc.target/arm/pr70830.c: New test. From-SVN: r236169
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gcc.target/arm/interrupt-1.c6
-rw-r--r--gcc/testsuite/gcc.target/arm/interrupt-2.c6
-rw-r--r--gcc/testsuite/gcc.target/arm/pr70830.c14
4 files changed, 29 insertions, 6 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f4f2390..41e5d51 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2016-05-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ PR target/70830
+ * gcc.target/arm/interrupt-1.c: Change dg-compile to dg-assemble.
+ Add -save-temps to dg-options.
+ Scan for ldmfd rather than pop instruction.
+ * gcc.target/arm/interrupt-2.c: Likewise.
+ * gcc.target/arm/pr70830.c: New test.
+
2016-05-12 Jakub Jelinek <jakub@redhat.com>
* gcc.target/i386/avx512bw-vpextr-1.c: New test.
diff --git a/gcc/testsuite/gcc.target/arm/interrupt-1.c b/gcc/testsuite/gcc.target/arm/interrupt-1.c
index debbaf7..fe94877 100644
--- a/gcc/testsuite/gcc.target/arm/interrupt-1.c
+++ b/gcc/testsuite/gcc.target/arm/interrupt-1.c
@@ -1,8 +1,8 @@
/* Verify that prologue and epilogue are correct for functions with
__attribute__ ((interrupt)). */
-/* { dg-do compile } */
+/* { dg-do assemble } */
/* { dg-require-effective-target arm_nothumb } */
-/* { dg-options "-O0 -marm" } */
+/* { dg-options "-O0 -marm -save-temps" } */
/* This test is not valid when -mthumb. */
extern void bar (int);
@@ -14,4 +14,4 @@ void foo ()
}
/* { dg-final { scan-assembler "push\t{r0, r1, r2, r3, r4, fp, ip, lr}" } } */
-/* { dg-final { scan-assembler "pop\t{r0, r1, r2, r3, r4, fp, ip, pc}\\^" } } */
+/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, fp, ip, pc}\\^" } } */
diff --git a/gcc/testsuite/gcc.target/arm/interrupt-2.c b/gcc/testsuite/gcc.target/arm/interrupt-2.c
index 92f8630..289eca0 100644
--- a/gcc/testsuite/gcc.target/arm/interrupt-2.c
+++ b/gcc/testsuite/gcc.target/arm/interrupt-2.c
@@ -1,8 +1,8 @@
/* Verify that prologue and epilogue are correct for functions with
__attribute__ ((interrupt)). */
-/* { dg-do compile } */
+/* { dg-do assemble } */
/* { dg-require-effective-target arm_nothumb } */
-/* { dg-options "-O1 -marm" } */
+/* { dg-options "-O1 -marm -save-temps" } */
/* This test is not valid when -mthumb. */
extern void bar (int);
@@ -16,4 +16,4 @@ void test()
}
/* { dg-final { scan-assembler "push\t{r0, r1, r2, r3, r4, r5, ip, lr}" } } */
-/* { dg-final { scan-assembler "pop\t{r0, r1, r2, r3, r4, r5, ip, pc}\\^" } } */
+/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, r5, ip, pc}\\^" } } */
diff --git a/gcc/testsuite/gcc.target/arm/pr70830.c b/gcc/testsuite/gcc.target/arm/pr70830.c
new file mode 100644
index 0000000..cad903b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr70830.c
@@ -0,0 +1,14 @@
+/* PR target/70830. */
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_arm_ok } */
+/* { dg-options "-Os -marm -save-temps" } */
+
+/* This test is not valid when -mthumb. */
+
+extern void prints (char *);
+
+void __attribute__ ((interrupt ("IRQ"))) dm3730_IRQHandler(void)
+{
+ prints("IRQ" );
+}
+/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, ip, pc}\\^" } } */