1 /* Check that addressing modes for atomics are generated as expected. */
3 #define concat_1(x, y) x ## y
4 #define concat(x, y) concat_1 (x, y)
5 #define makefuncname(name) concat (concat (test_, __LINE__), name)
7 #define emitfuncs(name,val,off)\
8 char makefuncname (_0) (char* mem)\
10 return name (mem + off, val, __ATOMIC_ACQ_REL);\
12 char makefuncname (_1) (void)\
14 char* mem = (char*)__builtin_thread_pointer ();\
15 return name (mem + off, val, __ATOMIC_ACQ_REL);\
17 short makefuncname (_2) (short* mem)\
19 return name (mem + off, val, __ATOMIC_ACQ_REL);\
21 short makefuncname (_3) (void)\
23 short* mem = (short*)__builtin_thread_pointer ();\
24 return name (mem + off, val, __ATOMIC_ACQ_REL);\
26 int makefuncname (_4) (int* mem)\
28 return name (mem + off, val, __ATOMIC_ACQ_REL);\
30 int makefuncname (_5) (void)\
32 int* mem = (int*)__builtin_thread_pointer ();\
33 return name (mem + off, val, __ATOMIC_ACQ_REL);\
36 emitfuncs (__atomic_add_fetch, 1, 0)
37 emitfuncs (__atomic_add_fetch
, 1, 4)
39 emitfuncs (__atomic_fetch_add
, 1, 0)
40 emitfuncs (__atomic_fetch_add
, 1, 4)
42 emitfuncs (__atomic_sub_fetch
, 1, 0)
43 emitfuncs (__atomic_sub_fetch
, 1, 4)
44 emitfuncs (__atomic_fetch_sub
, 1, 0)
45 emitfuncs (__atomic_fetch_sub
, 1, 4)
47 emitfuncs (__atomic_and_fetch
, 1, 0)
48 emitfuncs (__atomic_and_fetch
, 1, 4)
49 emitfuncs (__atomic_fetch_and
, 1, 0)
50 emitfuncs (__atomic_fetch_and
, 1, 4)
52 emitfuncs (__atomic_or_fetch
, 1, 0)
53 emitfuncs (__atomic_or_fetch
, 1, 4)
54 emitfuncs (__atomic_fetch_or
, 1, 0)
55 emitfuncs (__atomic_fetch_or
, 1, 4)
57 emitfuncs (__atomic_xor_fetch
, 1, 0)
58 emitfuncs (__atomic_xor_fetch
, 1, 4)
59 emitfuncs (__atomic_fetch_xor
, 1, 0)
60 emitfuncs (__atomic_fetch_xor
, 1, 4)
62 emitfuncs (__atomic_nand_fetch
, 1, 0)
63 emitfuncs (__atomic_nand_fetch
, 1, 4)
64 emitfuncs (__atomic_fetch_nand
, 1, 0)
65 emitfuncs (__atomic_fetch_nand
, 1, 4)
67 emitfuncs (__atomic_xor_fetch
, -1, 0)
68 emitfuncs (__atomic_xor_fetch
, -1, 4)
69 emitfuncs (__atomic_fetch_xor
, -1, 0)
70 emitfuncs (__atomic_fetch_xor
, -1, 4)
72 emitfuncs (__atomic_nand_fetch
, -1, 0)
73 emitfuncs (__atomic_nand_fetch
, -1, 4)
74 emitfuncs (__atomic_fetch_nand
, -1, 0)
75 emitfuncs (__atomic_fetch_nand
, -1, 4)
78 #define emitfuncs(off)\
79 char makefuncname (_6) (char* mem)\
83 return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
84 __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
86 char makefuncname (_7) (void)\
88 char* mem = (char*)__builtin_thread_pointer ();\
91 return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
92 __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
94 short makefuncname (_8) (short* mem)\
98 return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
99 __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
101 short makefuncname (_9) (void)\
103 short* mem = (short*)__builtin_thread_pointer ();\
106 return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
107 __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
109 int makefuncname (_10) (int* mem)\
113 return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
114 __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
116 int makefuncname (_11) (void)\
118 int* mem = (int*)__builtin_thread_pointer ();\
121 return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
122 __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
124 char makefuncname (_12) (char* mem)\
128 __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
131 char makefuncname (_13) (void)\
133 char* mem = (char*)__builtin_thread_pointer ();\
136 __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
139 short makefuncname (_14) (short* mem)\
143 __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
146 short makefuncname (_15) (void)\
148 short* mem = (short*)__builtin_thread_pointer ();\
151 __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
154 int makefuncname (_16) (int* mem)\
158 __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
161 int makefuncname (_17) (void)\
163 int* mem = (int*)__builtin_thread_pointer ();\
166 __atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\