1/* { dg-do run { target arm*-*-* } } */
2/* Test Armv7m interrupt routines.  */
3#include <stdlib.h>
4
5#ifdef __ARM_ARCH_7M__
6void __attribute__((interrupt))
7foo(void)
8{
9  long long n;
10  long p;
11  asm volatile ("" : "=r" (p) : "0" (&n));
12  if (p & 4)
13    abort ();
14  return;
15}
16
17void __attribute__((interrupt))
18bar(void)
19{
20  throw 42;
21}
22
23int main()
24{
25  int a;
26  int before;
27  int after;
28  volatile register int sp asm("sp");
29
30  asm volatile ("mov %0, sp\n"
31		"blx %2\n"
32		"mov %1, sp\n"
33		: "=&r" (before), "=r" (after) : "r" (foo)
34		: "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr");
35  if (before != after)
36    abort();
37  asm volatile ("mov %0, sp\n"
38		"sub sp, sp, #4\n"
39		"blx %2\n"
40		"add sp, sp, #4\n"
41		"mov %1, sp\n"
42		: "=&r" (before), "=r" (after) : "r" (foo)
43		: "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr");
44  if (before != after)
45    abort();
46  before = sp;
47  try
48    {
49      bar();
50    }
51  catch (int i)
52    {
53      if (i != 42)
54	abort();
55    }
56  catch (...)
57    {
58      abort();
59    }
60  if (before != sp)
61    abort();
62  exit(0);
63}
64#else
65int main()
66{
67  exit (0);
68}
69#endif
70