blob: 199aaa3a16252aea839fbabcf768961d4c288060 [file] [log] [blame]
/* -*-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