blob: 3f1d901f24e495c1e112ae4fdca0888cc8c3285e [file] [log] [blame]
/* Check that addressing modes for atomics are generated as expected. */
#define concat_1(x, y) x ## y
#define concat(x, y) concat_1 (x, y)
#define makefuncname(name) concat (concat (test_, __LINE__), name)
#define emitfuncs(name,val,off)\
char makefuncname (_0) (char* mem)\
{\
return name (mem + off, val, __ATOMIC_ACQ_REL);\
}\
char makefuncname (_1) (void)\
{\
char* mem = (char*)__builtin_thread_pointer ();\
return name (mem + off, val, __ATOMIC_ACQ_REL);\
}\
short makefuncname (_2) (short* mem)\
{\
return name (mem + off, val, __ATOMIC_ACQ_REL);\
}\
short makefuncname (_3) (void)\
{\
short* mem = (short*)__builtin_thread_pointer ();\
return name (mem + off, val, __ATOMIC_ACQ_REL);\
}\
int makefuncname (_4) (int* mem)\
{\
return name (mem + off, val, __ATOMIC_ACQ_REL);\
}\
int makefuncname (_5) (void)\
{\
int* mem = (int*)__builtin_thread_pointer ();\
return name (mem + off, val, __ATOMIC_ACQ_REL);\
}\
emitfuncs (__atomic_add_fetch, 1, 0)
emitfuncs (__atomic_add_fetch, 1, 4)
emitfuncs (__atomic_fetch_add, 1, 0)
emitfuncs (__atomic_fetch_add, 1, 4)
emitfuncs (__atomic_sub_fetch, 1, 0)
emitfuncs (__atomic_sub_fetch, 1, 4)
emitfuncs (__atomic_fetch_sub, 1, 0)
emitfuncs (__atomic_fetch_sub, 1, 4)
emitfuncs (__atomic_and_fetch, 1, 0)
emitfuncs (__atomic_and_fetch, 1, 4)
emitfuncs (__atomic_fetch_and, 1, 0)
emitfuncs (__atomic_fetch_and, 1, 4)
emitfuncs (__atomic_or_fetch, 1, 0)
emitfuncs (__atomic_or_fetch, 1, 4)
emitfuncs (__atomic_fetch_or, 1, 0)
emitfuncs (__atomic_fetch_or, 1, 4)
emitfuncs (__atomic_xor_fetch, 1, 0)
emitfuncs (__atomic_xor_fetch, 1, 4)
emitfuncs (__atomic_fetch_xor, 1, 0)
emitfuncs (__atomic_fetch_xor, 1, 4)
emitfuncs (__atomic_nand_fetch, 1, 0)
emitfuncs (__atomic_nand_fetch, 1, 4)
emitfuncs (__atomic_fetch_nand, 1, 0)
emitfuncs (__atomic_fetch_nand, 1, 4)
emitfuncs (__atomic_xor_fetch, -1, 0)
emitfuncs (__atomic_xor_fetch, -1, 4)
emitfuncs (__atomic_fetch_xor, -1, 0)
emitfuncs (__atomic_fetch_xor, -1, 4)
emitfuncs (__atomic_nand_fetch, -1, 0)
emitfuncs (__atomic_nand_fetch, -1, 4)
emitfuncs (__atomic_fetch_nand, -1, 0)
emitfuncs (__atomic_fetch_nand, -1, 4)
#undef emitfuncs
#define emitfuncs(off)\
char makefuncname (_6) (char* mem)\
{\
char expected = 1;\
char desired = 5;\
return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
__ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
}\
char makefuncname (_7) (void)\
{\
char* mem = (char*)__builtin_thread_pointer ();\
char expected = 1;\
char desired = 5;\
return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
__ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
}\
short makefuncname (_8) (short* mem)\
{\
short expected = 1;\
short desired = 5;\
return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
__ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
}\
short makefuncname (_9) (void)\
{\
short* mem = (short*)__builtin_thread_pointer ();\
short expected = 1;\
short desired = 5;\
return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
__ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
}\
int makefuncname (_10) (int* mem)\
{\
int expected = 1;\
int desired = 5;\
return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
__ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
}\
int makefuncname (_11) (void)\
{\
int* mem = (int*)__builtin_thread_pointer ();\
int expected = 1;\
int desired = 5;\
return __atomic_compare_exchange (mem + off, &expected, &desired, 0,\
__ATOMIC_ACQ_REL, __ATOMIC_RELAXED);\
}\
char makefuncname (_12) (char* mem)\
{\
char newval = 5;\
char prevval;\
__atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
return prevval;\
}\
char makefuncname (_13) (void)\
{\
char* mem = (char*)__builtin_thread_pointer ();\
char newval = 5;\
char prevval;\
__atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
return prevval;\
}\
short makefuncname (_14) (short* mem)\
{\
short newval = 5;\
short prevval;\
__atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
return prevval;\
}\
short makefuncname (_15) (void)\
{\
short* mem = (short*)__builtin_thread_pointer ();\
short newval = 5;\
short prevval;\
__atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
return prevval;\
}\
int makefuncname (_16) (int* mem)\
{\
int newval = 5;\
int prevval;\
__atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
return prevval;\
}\
int makefuncname (_17) (void)\
{\
int* mem = (int*)__builtin_thread_pointer ();\
int newval = 5;\
int prevval;\
__atomic_exchange (mem + off, &newval, &prevval, __ATOMIC_ACQ_REL);\
return prevval;\
}\
emitfuncs (0)
emitfuncs (4)