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