aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/asm-redzone-1.c
blob: 87b91809a1412b13b38bd91fd14560c9fef838ce (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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/* { dg-do run { target lp64 } } */
/* { dg-options "-O2" } */

__attribute__((noipa)) int
foo (void)
{
  int a = 1;
  int b = 2;
  int c = 3;
  int d = 4;
  int e = 5;
  int f = 6;
  int g = 7;
  int h = 8;
  int i = 9;
  int j = 10;
  int k = 11;
  int l = 12;
  int m = 13;
  int n = 14;
  int o = 15;
  int p = 16;
  int q = 17;
  int r = 18;
  int s = 19;
  int t = 20;
  int u = 21;
  int v = 22;
  int w = 23;
  int x = 24;
  int y = 25;
  int z = 26;
  asm volatile ("" : "+g" (a), "+g" (b), "+g" (c), "+g" (d), "+g" (e));
  asm volatile ("" : "+g" (f), "+g" (g), "+g" (h), "+g" (i), "+g" (j));
  asm volatile ("" : "+g" (k), "+g" (l), "+g" (m), "+g" (n), "+g" (o));
  asm volatile ("" : "+g" (k), "+g" (l), "+g" (m), "+g" (n), "+g" (o));
  asm volatile ("" : "+g" (p), "+g" (q), "+g" (s), "+g" (t), "+g" (u));
  asm volatile ("" : "+g" (v), "+g" (w), "+g" (y), "+g" (z));
#ifdef __PPC64__
  asm volatile ("std 1,-8(1); std 1,-16(1); std 1,-24(1); std 1,-32(1)"
		: : : "18", "19", "20", "redzone");
#elif defined(_AIX)
  asm volatile ("stw 1,-4(1); stw 1,-8(1); stw 1,-12(1); stw 1,-16(1)"
		: : : "18", "19", "20", "redzone");
#endif
  asm volatile ("" : "+g" (a), "+g" (b), "+g" (c), "+g" (d), "+g" (e));
  asm volatile ("" : "+g" (f), "+g" (g), "+g" (h), "+g" (i), "+g" (j));
  asm volatile ("" : "+g" (k), "+g" (l), "+g" (m), "+g" (n), "+g" (o));
  asm volatile ("" : "+g" (p), "+g" (q), "+g" (s), "+g" (t), "+g" (u));
  asm volatile ("" : "+g" (v), "+g" (w), "+g" (y), "+g" (z));
  return a + b + c + d + e + f + g + h + i + j + k + l + m + n;
}

__attribute__((noipa)) void
bar (char *p, long *q)
{
  (void) p;
  *q = 42;
}

int
main ()
{
  volatile int x = 256;
  long y;
  bar (__builtin_alloca (x), &y);
  if (foo () != 105)
    __builtin_abort ();
  if (y != 42)
    __builtin_abort ();
}