diff options
author | Kyrylo Tkachov <kyrylo.tkachov@arm.com> | 2016-05-12 09:56:46 +0000 |
---|---|---|
committer | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2016-05-12 09:56:46 +0000 |
commit | 5acc47a40d13af51cd1709f0238c798a666bcd7b (patch) | |
tree | 43c42f7af9755f290377e17a4c95ed428514cfc4 /gcc/testsuite | |
parent | 3cd638421e2d9639f68313a6b18522b31f702b04 (diff) | |
download | gcc-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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/interrupt-1.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/interrupt-2.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/pr70830.c | 14 |
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}\\^" } } */ |