1 /* Wrong method to get number of arg reg will cause argument corruption. */
2 /* { dg-do run } */
3 /* { dg-skip-if "incompatible options" { ! { arm_thumb1_ok || arm_thumb2_ok } } { "*" } { "" } } */
4 /* { dg-require-effective-target arm_eabi } */
5 /* { dg-options "-mthumb -O1" } */
6
7 extern void abort (void);
8
9 int foo (int, int, int, int) __attribute__((noinline));
10
11 int
foo(int a,int b,int c,int d)12 foo (int a, int b, int c, int d)
13 {
14 register int m asm ("r8");
15
16 m = a;
17 m += b;
18 m += c;
19 m += d;
20
21 asm ("" : "=r" (m) : "0" (m));
22
23 return m;
24 }
25
26 int
main()27 main ()
28 {
29 volatile int a = 10;
30 volatile int b = 20;
31 volatile int c = 30;
32 volatile int d = 40;
33 volatile int sum = 0;
34
35 sum = foo (a, b, c, d);
36
37 if (sum != 100)
38 abort ();
39
40 return 0;
41 }
42