| /* Support code for atomic instruction tests. */ |
| |
| /* Define types names without spaces. */ |
| typedef unsigned char uchar; |
| typedef unsigned short ushort; |
| typedef unsigned int uint; |
| typedef long long longlong; |
| typedef unsigned long long ulonglong; |
| typedef __int128_t int128; |
| typedef __uint128_t uint128; |
| |
| #define FNNAME(NAME,TY) NAME |
| |
| /* Expand one-model functions. */ |
| #define TEST_M1(NAME, FN, TY, MODEL, DUMMY) \ |
| FN (test_##NAME##_##TY, TY, MODEL) |
| |
| /* Expand two-model functions. */ |
| #define TEST_M2(NAME, FN, TY, MODEL1, MODEL2) \ |
| FN (test_##NAME##_##TY, TY, MODEL1, MODEL2) |
| |
| /* Typest to test. */ |
| #define TEST_TY(NAME, FN, N, MODEL1, MODEL2) \ |
| TEST_M##N (NAME, FN, char, MODEL1, MODEL2) \ |
| TEST_M##N (NAME, FN, uchar, MODEL1, MODEL2) \ |
| TEST_M##N (NAME, FN, short, MODEL1, MODEL2) \ |
| TEST_M##N (NAME, FN, ushort, MODEL1, MODEL2) \ |
| TEST_M##N (NAME, FN, int, MODEL1, MODEL2) \ |
| TEST_M##N (NAME, FN, uint, MODEL1, MODEL2) \ |
| TEST_M##N (NAME, FN, longlong, MODEL1, MODEL2) \ |
| TEST_M##N (NAME, FN, ulonglong, MODEL1, MODEL2) \ |
| TEST_M##N (NAME, FN, int128, MODEL1, MODEL2) \ |
| TEST_M##N (NAME, FN, uint128, MODEL1, MODEL2) |
| |
| /* Models to test. */ |
| #define TEST_MODEL(NAME, FN, N) \ |
| TEST_TY (NAME##_relaxed, FN, N, __ATOMIC_RELAXED, DUMMY) \ |
| TEST_TY (NAME##_consume, FN, N, __ATOMIC_CONSUME, DUMMY) \ |
| TEST_TY (NAME##_acquire, FN, N, __ATOMIC_ACQUIRE, DUMMY) \ |
| TEST_TY (NAME##_release, FN, N, __ATOMIC_RELEASE, DUMMY) \ |
| TEST_TY (NAME##_acq_rel, FN, N, __ATOMIC_ACQ_REL, DUMMY) \ |
| TEST_TY (NAME##_seq_cst, FN, N, __ATOMIC_SEQ_CST, DUMMY) \ |
| |
| /* Cross-product of models to test. */ |
| #define TEST_MODEL_M1(NAME, FN, N, M) \ |
| TEST_TY (NAME##_relaxed, FN, N, M, __ATOMIC_RELAXED) \ |
| TEST_TY (NAME##_consume, FN, N, M, __ATOMIC_CONSUME) \ |
| TEST_TY (NAME##_acquire, FN, N, M, __ATOMIC_ACQUIRE) \ |
| TEST_TY (NAME##_release, FN, N, M, __ATOMIC_RELEASE) \ |
| TEST_TY (NAME##_acq_rel, FN, N, M, __ATOMIC_ACQ_REL) \ |
| TEST_TY (NAME##_seq_cst, FN, N, M, __ATOMIC_SEQ_CST) \ |
| |
| #define TEST_MODEL_M2(NAME, FN) \ |
| TEST_MODEL_M1 (NAME##_relaxed, FN, 2, __ATOMIC_RELAXED) \ |
| TEST_MODEL_M1 (NAME##_consume, FN, 2, __ATOMIC_CONSUME) \ |
| TEST_MODEL_M1 (NAME##_acquire, FN, 2, __ATOMIC_ACQUIRE) \ |
| TEST_MODEL_M1 (NAME##_release, FN, 2, __ATOMIC_RELEASE) \ |
| TEST_MODEL_M1 (NAME##_acq_rel, FN, 2, __ATOMIC_ACQ_REL) \ |
| TEST_MODEL_M1 (NAME##_seq_cst, FN, 2, __ATOMIC_SEQ_CST) \ |
| |
| /* Expand functions for a cross-product of memory models and types. */ |
| #define TEST_TWO(NAME, FN) TEST_MODEL_M2 (NAME, FN) |
| |
| /* Expand functions for a set of memory models and types. */ |
| #define TEST_ONE(NAME, FN) TEST_MODEL (NAME, FN, 1) |
| |