| Index: crosstest/test_sync_atomic_main.cpp
|
| diff --git a/crosstest/test_sync_atomic_main.cpp b/crosstest/test_sync_atomic_main.cpp
|
| index 0cae7cd16ddcdc0409dde8c4e032b6396fb7bcb1..6a00f31c6724fba494e1ea1ffdcfe3d2ddc0024a 100644
|
| --- a/crosstest/test_sync_atomic_main.cpp
|
| +++ b/crosstest/test_sync_atomic_main.cpp
|
| @@ -127,33 +127,43 @@ void testAtomicRMW(volatile Type *AtomicLoc,
|
| template <typename Type>
|
| void testValCompareAndSwap(volatile Type *AtomicLoc, size_t &TotalTests,
|
| size_t &Passes, size_t &Failures) {
|
| - for (size_t i = 0; i < NumValues; ++i) {
|
| - Type Value1 = static_cast<Type>(Values[i]);
|
| - for (size_t j = 0; j < NumValues; ++j) {
|
| - Type Value2 = static_cast<Type>(Values[j]);
|
| - for (size_t f = 0; f < 2; ++f) {
|
| - bool flip = f;
|
| - ++TotalTests;
|
| - *AtomicLoc = Value1;
|
| - Type ResultSz1 = Subzero_::test_val_cmp_swap(
|
| - AtomicLoc, flip ? Value2 : Value1, Value2);
|
| - Type ResultSz2 = *AtomicLoc;
|
| - *AtomicLoc = Value1;
|
| - Type ResultLlc1 = test_val_cmp_swap(
|
| - AtomicLoc, flip ? Value2 : Value1, Value2);
|
| - Type ResultLlc2 = *AtomicLoc;
|
| - if (ResultSz1 == ResultLlc1 && ResultSz2 == ResultLlc2) {
|
| - ++Passes;
|
| - } else {
|
| - ++Failures;
|
| - std::cout << "test_val_cmp_swap" << (CHAR_BIT * sizeof(Type)) << "("
|
| - << static_cast<uint64_t>(Value1) << ", "
|
| - << static_cast<uint64_t>(Value2)
|
| - << "): sz1=" << static_cast<uint64_t>(ResultSz1)
|
| - << " llc1=" << static_cast<uint64_t>(ResultLlc1)
|
| - << " sz2=" << static_cast<uint64_t>(ResultSz2)
|
| - << " llc2=" << static_cast<uint64_t>(ResultLlc2)
|
| - << "\n";
|
| + typedef Type (*FuncType)(volatile Type *, Type, Type);
|
| + static struct {
|
| + const char *Name;
|
| + FuncType FuncLlc;
|
| + FuncType FuncSz;
|
| + } Funcs[] = {{"val_cmp_swap", test_val_cmp_swap, Subzero_::test_val_cmp_swap},
|
| + {"val_cmp_swap_loop", test_val_cmp_swap_loop,
|
| + Subzero_::test_val_cmp_swap_loop}};
|
| + const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs);
|
| + for (size_t f = 0; f < NumFuncs; ++f) {
|
| + for (size_t i = 0; i < NumValues; ++i) {
|
| + Type Value1 = static_cast<Type>(Values[i]);
|
| + for (size_t j = 0; j < NumValues; ++j) {
|
| + Type Value2 = static_cast<Type>(Values[j]);
|
| + for (size_t f = 0; f < 2; ++f) {
|
| + bool flip = f;
|
| + ++TotalTests;
|
| + *AtomicLoc = Value1;
|
| + Type ResultSz1 =
|
| + Funcs[f].FuncSz(AtomicLoc, flip ? Value2 : Value1, Value2);
|
| + Type ResultSz2 = *AtomicLoc;
|
| + *AtomicLoc = Value1;
|
| + Type ResultLlc1 =
|
| + Funcs[f].FuncLlc(AtomicLoc, flip ? Value2 : Value1, Value2);
|
| + Type ResultLlc2 = *AtomicLoc;
|
| + if (ResultSz1 == ResultLlc1 && ResultSz2 == ResultLlc2) {
|
| + ++Passes;
|
| + } else {
|
| + ++Failures;
|
| + std::cout << "test_" << Funcs[f].Name << (CHAR_BIT * sizeof(Type))
|
| + << "(" << static_cast<uint64_t>(Value1) << ", "
|
| + << static_cast<uint64_t>(Value2)
|
| + << "): sz1=" << static_cast<uint64_t>(ResultSz1)
|
| + << " llc1=" << static_cast<uint64_t>(ResultLlc1)
|
| + << " sz2=" << static_cast<uint64_t>(ResultSz2)
|
| + << " llc2=" << static_cast<uint64_t>(ResultLlc2) << "\n";
|
| + }
|
| }
|
| }
|
| }
|
|
|