OLD | NEW |
1 //===- subzero/crosstest/test_sync_atomic_main.cpp - Driver for tests -----===// | 1 //===- subzero/crosstest/test_sync_atomic_main.cpp - Driver for tests -----===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // Driver for cross testing atomic intrinsics, via the sync builtins. | 10 // Driver for cross testing atomic intrinsics, via the sync builtins. |
(...skipping 109 matching lines...) Loading... |
120 } | 120 } |
121 } | 121 } |
122 } | 122 } |
123 } | 123 } |
124 } | 124 } |
125 } | 125 } |
126 | 126 |
127 template <typename Type> | 127 template <typename Type> |
128 void testValCompareAndSwap(volatile Type *AtomicLoc, size_t &TotalTests, | 128 void testValCompareAndSwap(volatile Type *AtomicLoc, size_t &TotalTests, |
129 size_t &Passes, size_t &Failures) { | 129 size_t &Passes, size_t &Failures) { |
130 for (size_t i = 0; i < NumValues; ++i) { | 130 typedef Type (*FuncType)(volatile Type *, Type, Type); |
131 Type Value1 = static_cast<Type>(Values[i]); | 131 static struct { |
132 for (size_t j = 0; j < NumValues; ++j) { | 132 const char *Name; |
133 Type Value2 = static_cast<Type>(Values[j]); | 133 FuncType FuncLlc; |
134 for (size_t f = 0; f < 2; ++f) { | 134 FuncType FuncSz; |
135 bool flip = f; | 135 } Funcs[] = {{"val_cmp_swap", test_val_cmp_swap, Subzero_::test_val_cmp_swap}, |
136 ++TotalTests; | 136 {"val_cmp_swap_loop", test_val_cmp_swap_loop, |
137 *AtomicLoc = Value1; | 137 Subzero_::test_val_cmp_swap_loop}}; |
138 Type ResultSz1 = Subzero_::test_val_cmp_swap( | 138 const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs); |
139 AtomicLoc, flip ? Value2 : Value1, Value2); | 139 for (size_t f = 0; f < NumFuncs; ++f) { |
140 Type ResultSz2 = *AtomicLoc; | 140 for (size_t i = 0; i < NumValues; ++i) { |
141 *AtomicLoc = Value1; | 141 Type Value1 = static_cast<Type>(Values[i]); |
142 Type ResultLlc1 = test_val_cmp_swap( | 142 for (size_t j = 0; j < NumValues; ++j) { |
143 AtomicLoc, flip ? Value2 : Value1, Value2); | 143 Type Value2 = static_cast<Type>(Values[j]); |
144 Type ResultLlc2 = *AtomicLoc; | 144 for (size_t f = 0; f < 2; ++f) { |
145 if (ResultSz1 == ResultLlc1 && ResultSz2 == ResultLlc2) { | 145 bool flip = f; |
146 ++Passes; | 146 ++TotalTests; |
147 } else { | 147 *AtomicLoc = Value1; |
148 ++Failures; | 148 Type ResultSz1 = |
149 std::cout << "test_val_cmp_swap" << (CHAR_BIT * sizeof(Type)) << "(" | 149 Funcs[f].FuncSz(AtomicLoc, flip ? Value2 : Value1, Value2); |
150 << static_cast<uint64_t>(Value1) << ", " | 150 Type ResultSz2 = *AtomicLoc; |
151 << static_cast<uint64_t>(Value2) | 151 *AtomicLoc = Value1; |
152 << "): sz1=" << static_cast<uint64_t>(ResultSz1) | 152 Type ResultLlc1 = |
153 << " llc1=" << static_cast<uint64_t>(ResultLlc1) | 153 Funcs[f].FuncLlc(AtomicLoc, flip ? Value2 : Value1, Value2); |
154 << " sz2=" << static_cast<uint64_t>(ResultSz2) | 154 Type ResultLlc2 = *AtomicLoc; |
155 << " llc2=" << static_cast<uint64_t>(ResultLlc2) | 155 if (ResultSz1 == ResultLlc1 && ResultSz2 == ResultLlc2) { |
156 << "\n"; | 156 ++Passes; |
| 157 } else { |
| 158 ++Failures; |
| 159 std::cout << "test_" << Funcs[f].Name << (CHAR_BIT * sizeof(Type)) |
| 160 << "(" << static_cast<uint64_t>(Value1) << ", " |
| 161 << static_cast<uint64_t>(Value2) |
| 162 << "): sz1=" << static_cast<uint64_t>(ResultSz1) |
| 163 << " llc1=" << static_cast<uint64_t>(ResultLlc1) |
| 164 << " sz2=" << static_cast<uint64_t>(ResultSz2) |
| 165 << " llc2=" << static_cast<uint64_t>(ResultLlc2) << "\n"; |
| 166 } |
157 } | 167 } |
158 } | 168 } |
159 } | 169 } |
160 } | 170 } |
161 } | 171 } |
162 | 172 |
163 template <typename Type> | 173 template <typename Type> |
164 struct ThreadData { | 174 struct ThreadData { |
165 Type (*FuncPtr)(bool, volatile Type*, Type); | 175 Type (*FuncPtr)(bool, volatile Type*, Type); |
166 bool Fetch; | 176 bool Fetch; |
(...skipping 122 matching lines...) Loading... |
289 &AtomicLocs.l16, TotalTests, Passes, Failures); | 299 &AtomicLocs.l16, TotalTests, Passes, Failures); |
290 testAtomicRMWThreads<uint32_t>( | 300 testAtomicRMWThreads<uint32_t>( |
291 &AtomicLocs.l32, TotalTests, Passes, Failures); | 301 &AtomicLocs.l32, TotalTests, Passes, Failures); |
292 testAtomicRMWThreads<uint64_t>( | 302 testAtomicRMWThreads<uint64_t>( |
293 &AtomicLocs.l64, TotalTests, Passes, Failures); | 303 &AtomicLocs.l64, TotalTests, Passes, Failures); |
294 | 304 |
295 std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes | 305 std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes |
296 << " Failures=" << Failures << "\n"; | 306 << " Failures=" << Failures << "\n"; |
297 return Failures; | 307 return Failures; |
298 } | 308 } |
OLD | NEW |