| /* -*-c-*- */ |
| |
| #undef NEW |
| #define NEW 3 |
| |
| __attribute__ ((noinline)) |
| int FN(_bo)(TYPE *mem, TYPE *old_ret, TYPE old) |
| { |
| *old_ret = old; |
| return __atomic_compare_exchange_n (mem, (void *)old_ret, NEW, 1, 2, 0); |
| } |
| |
| __attribute__ ((noinline)) |
| void FN(_o)(TYPE *mem, TYPE *old_ret, TYPE old) |
| { |
| *old_ret = old; |
| __atomic_compare_exchange_n (mem, (void *)old_ret, NEW, 1, 2, 0); |
| return; |
| } |
| |
| __attribute__ ((noinline)) |
| int FN(_b)(TYPE *mem, TYPE old) |
| { |
| return __atomic_compare_exchange_n (mem, (void *)&old, NEW, 1, 2, 0); |
| } |
| |
| __attribute__ ((noinline)) |
| void FN()(TYPE *mem, TYPE old) |
| { |
| __atomic_compare_exchange_n (mem, (void *)&old, NEW, 1, 2, 0); |
| return; |
| } |
| |
| /* Const != 0 old value. */ |
| __attribute__ ((noinline)) |
| int FN(_c1_bo)(TYPE *mem, TYPE *old_ret) |
| { |
| *old_ret = 1; |
| return __atomic_compare_exchange_n (mem, (void *)old_ret, NEW, 1, 2, 0); |
| } |
| |
| __attribute__ ((noinline)) |
| void FN(_c1_o)(TYPE *mem, TYPE *old_ret) |
| { |
| *old_ret = 1; |
| __atomic_compare_exchange_n (mem, (void *)old_ret, NEW, 1, 2, 0); |
| return; |
| } |
| |
| __attribute__ ((noinline)) |
| int FN(_c1_b)(TYPE *mem) |
| { |
| TYPE old = 1; |
| return __atomic_compare_exchange_n (mem, (void *)&old, NEW, 1, 2, 0); |
| } |
| |
| __attribute__ ((noinline)) |
| void FN(_c1)(TYPE *mem) |
| { |
| TYPE old = 1; |
| __atomic_compare_exchange_n (mem, (void *)&old, NEW, 1, 2, 0); |
| return; |
| } |
| |
| /* Const == 0 old value. */ |
| __attribute__ ((noinline)) |
| int FN(_c0_bo)(TYPE *mem, TYPE *old_ret) |
| { |
| *old_ret = 0; |
| return __atomic_compare_exchange_n (mem, (void *)old_ret, NEW, 1, 2, 0); |
| } |
| |
| __attribute__ ((noinline)) |
| void FN(_c0_o)(TYPE *mem, TYPE *old_ret) |
| { |
| *old_ret = 0; |
| __atomic_compare_exchange_n (mem, (void *)old_ret, NEW, 1, 2, 0); |
| return; |
| } |
| |
| __attribute__ ((noinline)) |
| int FN(_c0_b)(TYPE *mem) |
| { |
| TYPE old = 0; |
| return __atomic_compare_exchange_n (mem, (void *)&old, NEW, 1, 2, 0); |
| } |
| |
| __attribute__ ((noinline)) |
| void FN(_c0)(TYPE *mem) |
| { |
| TYPE old = 0; |
| __atomic_compare_exchange_n (mem, (void *)&old, NEW, 1, 2, 0); |
| return; |
| } |
| |
| int FN(_validate_mem)(TYPE *mem, TYPE expected_mem) |
| { |
| if (*mem != expected_mem) |
| { |
| fprintf(stderr, " BAD: mem %d != expected mem %d\n", |
| *mem, expected_mem); |
| return 1; |
| } |
| |
| return 0; |
| } |
| |
| int FN(_validate_rc)(int rc, int expected_rc) |
| { |
| if (rc != expected_rc) |
| { |
| fprintf(stderr, " BAD: rc %d != expected rc %d\n", |
| rc, expected_rc); |
| return 1; |
| } |
| |
| return 0; |
| } |
| |
| int FN(_validate_old_ret)(int old_ret, int expected_old_ret) |
| { |
| if (old_ret != expected_old_ret) |
| { |
| fprintf(stderr, " BAD: old_ret %d != expected old_ret %d\n", |
| old_ret, expected_old_ret); |
| return 1; |
| } |
| |
| return 0; |
| } |
| |
| int FN(_validate)(TYPE *mem, TYPE init_mem, TYPE old) |
| { |
| int err_count = 0; |
| int rc; |
| TYPE expected_mem; |
| int expected_rc; |
| TYPE old_ret; |
| int failed; |
| const char *fname; |
| |
| fprintf(stderr, "%s: init_mem %d @ %p\n", __FUNCTION__, init_mem, mem); |
| { |
| failed = 0; |
| old = 1; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| expected_rc = (init_mem == old); |
| fname = FNS(_bo); |
| rc = FN(_bo)(mem, &old_ret, old); |
| failed |= FN(_validate_rc)(rc, expected_rc); |
| failed |= FN(_validate_old_ret)(old_ret, init_mem); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| { |
| failed = 0; |
| old = 1; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| fname = FNS(_o); |
| FN(_o)(mem, &old_ret, old); |
| failed |= FN(_validate_old_ret)(old_ret, init_mem); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| { |
| failed = 0; |
| old = 1; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| expected_rc = (init_mem == old); |
| fname = FNS(_b); |
| rc = FN(_b)(mem, old); |
| failed |= FN(_validate_rc)(rc, expected_rc); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| { |
| failed = 0; |
| old = 1; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| fname = FNS(); |
| FN()(mem, old); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| { |
| failed = 0; |
| old = 1; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| expected_rc = (init_mem == old); |
| fname = FNS(_c1_bo); |
| rc = FN(_c1_bo)(mem, &old_ret); |
| failed |= FN(_validate_rc)(rc, expected_rc); |
| failed |= FN(_validate_old_ret)(old_ret, init_mem); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| { |
| failed = 0; |
| old = 1; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| fname = FNS(_c1_o); |
| FN(_c1_o)(mem, &old_ret); |
| failed |= FN(_validate_old_ret)(old_ret, init_mem); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| { |
| failed = 0; |
| old = 1; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| expected_rc = (init_mem == old); |
| fname = FNS(_c1_b); |
| rc = FN(_c1_b)(mem); |
| failed |= FN(_validate_rc)(rc, expected_rc); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| { |
| failed = 0; |
| old = 1; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| fname = FNS(_c1); |
| FN(_c1)(mem); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| { |
| failed = 0; |
| old = 0; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| expected_rc = (init_mem == old); |
| fname = FNS(_c0_bo); |
| rc = FN(_c0_bo)(mem, &old_ret); |
| failed |= FN(_validate_rc)(rc, expected_rc); |
| failed |= FN(_validate_old_ret)(old_ret, init_mem); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| { |
| failed = 0; |
| old = 0; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| fname = FNS(_c0_o); |
| FN(_c0_o)(mem, &old_ret); |
| failed |= FN(_validate_old_ret)(old_ret, init_mem); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| { |
| failed = 0; |
| old = 0; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| expected_rc = (init_mem == old); |
| fname = FNS(_c0_b); |
| rc = FN(_c0_b)(mem); |
| failed |= FN(_validate_rc)(rc, expected_rc); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| { |
| failed = 0; |
| old = 0; |
| *mem = init_mem; |
| expected_mem = (init_mem == old) ? NEW : *mem; |
| fname = FNS(_c0); |
| FN(_c0)(mem); |
| failed |= FN(_validate_mem)(mem, expected_mem); |
| if (failed) |
| { |
| fprintf(stderr, " FAIL: %s: near line %d\n", fname, __LINE__ - 3); |
| err_count++; |
| } |
| } |
| |
| return err_count; |
| } |
| |
| #undef TYPE |
| #undef MEM |
| #undef FN |
| #undef FNS |