aboutsummaryrefslogtreecommitdiffstats
path: root/test/regression/extasm.c
blob: e78fb7411cca07c27c6a9059a93aa0deddefa22f (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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/* Testing extended asm.
   To run the test, compile with -S and grep "TEST" in the generated .s */

int clobbers(int x, int z)
{
  int y;
  asm("TEST0 out:%0 in:%1" : "=r"(y) : "r"(x) : "cc"
#if defined(ARCH_x86) && defined(MODEL_64)
      , "rax", "rdx", "rbx"
#elif defined(ARCH_x86) && !defined(MODEL_64)
      , "eax", "edx", "ebx"
#elif defined(ARCH_arm)
      , "r0", "r1", "r4"
#elif defined(ARCH_powerpc)
      , "r0", "r3", "r4", "r31"
#elif defined(ARCH_aarch64)
      , "x0", "x1", "x16", "x29", "x30"
#endif
);
  return y + z;
}

#if (defined(ARCH_x86) && defined(MODEL_64)) \
 || (defined(ARCH_riscV) && defined(MODEL_64)) \
 || (defined(ARCH_powerpc) && defined(MODEL_ppc64)) \
 || (defined(ARCH_powerpc) && defined(MODEL_e5500)) \
 || (defined(ARCH_kvx) && defined(MODEL_64)) \
 || defined(ARCH_aarch64)
#define SIXTYFOUR
#else
#undef SIXTYFOUR
#endif

int main()
{
  int x;
  void * y;
  long long z;
  double f;
  float sf;
  char c[16];

  /* No inputs, no outputs */
  asm("TEST1 %%");
  /* r inputs */
  asm("TEST2 in:%0" : : "r" (x));
  asm("TEST3 in:%0,%1" : : "r" (x), "r" (f));
  /* r output */
  asm("TEST4 out:%0" : "=r" (x));
  /* r inputs and outputs */
  asm("TEST5 out:%0 in:%1" : "=r" (f) : "r" (y));
  /* m inputs */
  asm("TEST6 in:%0" : : "m" (c[2]));
  asm("TEST7 out:%0 in:%1,%2" : "=r"(x) : "m" (c[0]), "r" (y));
  /* m output */
  asm("TEST8 out:%0 in:%1" : "=m" (c[4]) : "r" (f));
  /* i input */
  asm("TEST9 in:%0,%1,%2" : : "r"(x), "i"(sizeof(x) + 2), "r"(y));
#ifdef FAILURES
  asm("FAIL1 in:%0" : : "i"(x));
#endif
  /* 64-bit output */
#ifndef SIXTYFOUR
  asm("TEST10 out: high %R0,lo %Q0" : "=r" (z));
  /* 64-bit input */
  asm("TEST11 out:%0 in:%1,high %R2,lo %Q2,%3" 
      : "=r"(x) : "r"(y), "r"(z), "r"(f));
#endif
#ifdef FAILURES
  asm("FAIL2 out:%0" : "=r"(z));
  asm("FAIL3 in:%0" : : "r"(z));
#endif
  /* Named arguments */
  asm("TEST12 a:%[a] b:%[b] c:%[c]" : : [a]"i"(12), [b]"i"(34), [c]"i"(56));
  asm("TEST13 a:%[a] x:%[x]" : [x]"=r"(x) : [a]"i"(78));
  asm("TEST14 a:%[a] in2:%1 c:%[c]" : : [a]"i"(12), "i"(34), [c]"i"(56));
#ifdef FAILURES
  asm("FAIL4 a:%[a]" : "=r"(x) : [z]"i"(0));
#endif
  /* One argument of each type */
  asm("TEST15 int32 %0" : : "r" (x));
#ifdef SIXTYFOUR
  asm("TEST15 int64 %0" : : "r" (z));
#else
  asm("TEST15 int64 %Q0 / %R0" : : "r" (z));
#endif
  asm("TEST15 float64 %0" : : "r" (f));
  asm("TEST15 float32 %0" : : "r" (sf));
  /* Various failures */
#ifdef FAILURES
  asm("FAIL5 out:%0,%1" : "=r"(x), "=r"(y));
  asm("FAIL6 in:%0" : : "g"(x));
  asm("FAIL7 out:%0" : "=r" (x+1));
#endif
  return 0;
}