summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/sh/rte-delay-slot.c
blob: eca5db94355b5a852681eb4c130215a588619a75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* { dg-do compile { target "sh-*-*" } } */
/* { dg-options "-O2" } */
/* { dg-skip-if "" { "sh*-*-*" } "*" "-m1 -m2*" }  */
/* { dg-final { scan-assembler-not "\trte\t\n\tmov.l\t@r15\\+" } } */

/* This test checks if the compiler generates a pop instruction
   in the delay slot after rte.  For the sh and sh2, the rte
   instruction reads the return pc from the stack and any pop
   in the delay slot crashes the hardware.

   Incorrect code generated
        mov.l   @r15+,r1
        rte
        mov.l   @r15+,r14

   The right code should be

        mov.l   @r15+,r1
        mov.l   @r15+,r14
        rte
        nop
*/
void INT_MTU2_1_TGIA1 (void)
  __attribute__ ((interrupt_handler));
void
INT_MTU2_1_TGIA1 (void)
{
  volatile int i = 0;
  volatile int x, y;

  for (i = 0; i < 10; i++)
    y = y + x;
}