OLD | NEW |
1 //===- subzero/crosstest/test_arith_main.cpp - Driver for tests -----------===// | 1 //===- subzero/crosstest/test_arith_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 crosstesting arithmetic operations | 10 // Driver for crosstesting arithmetic operations |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 // FuncLlcSigned and FuncSzSigned fields are NULL. For functions | 54 // FuncLlcSigned and FuncSzSigned fields are NULL. For functions |
55 // that operate on signed values, the FuncLlcUnsigned and | 55 // that operate on signed values, the FuncLlcUnsigned and |
56 // FuncSzUnsigned fields are NULL. | 56 // FuncSzUnsigned fields are NULL. |
57 const char *Name; | 57 const char *Name; |
58 FuncTypeUnsigned FuncLlcUnsigned; | 58 FuncTypeUnsigned FuncLlcUnsigned; |
59 FuncTypeUnsigned FuncSzUnsigned; | 59 FuncTypeUnsigned FuncSzUnsigned; |
60 FuncTypeSigned FuncLlcSigned; | 60 FuncTypeSigned FuncLlcSigned; |
61 FuncTypeSigned FuncSzSigned; | 61 FuncTypeSigned FuncSzSigned; |
62 bool ExcludeDivExceptions; // for divide related tests | 62 bool ExcludeDivExceptions; // for divide related tests |
63 } Funcs[] = { | 63 } Funcs[] = { |
64 #define X(inst, op, isdiv) \ | 64 #define X(inst, op, isdiv, isshift) \ |
65 { STR(inst), test##inst, Subzero_::test##inst, NULL, NULL, isdiv } \ | 65 { STR(inst), test##inst, Subzero_::test##inst, NULL, NULL, isdiv } \ |
66 , | 66 , |
67 UINTOP_TABLE | 67 UINTOP_TABLE |
68 #undef X | 68 #undef X |
69 #define X(inst, op, isdiv) \ | 69 #define X(inst, op, isdiv, isshift) \ |
70 { STR(inst), NULL, NULL, test##inst, Subzero_::test##inst, isdiv } \ | 70 { STR(inst), NULL, NULL, test##inst, Subzero_::test##inst, isdiv } \ |
71 , | 71 , |
72 SINTOP_TABLE | 72 SINTOP_TABLE |
73 #undef X | 73 #undef X |
74 }; | 74 }; |
75 const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs); | 75 const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs); |
76 | 76 |
77 if (sizeof(TypeUnsigned) <= sizeof(uint32_t)) { | 77 if (sizeof(TypeUnsigned) <= sizeof(uint32_t)) { |
78 // This is the "normal" version of the loop nest, for 32-bit or | 78 // This is the "normal" version of the loop nest, for 32-bit or |
79 // narrower types. | 79 // narrower types. |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 // For functions that operate on unsigned values, the | 165 // For functions that operate on unsigned values, the |
166 // FuncLlcSigned and FuncSzSigned fields are NULL. For functions | 166 // FuncLlcSigned and FuncSzSigned fields are NULL. For functions |
167 // that operate on signed values, the FuncLlcUnsigned and | 167 // that operate on signed values, the FuncLlcUnsigned and |
168 // FuncSzUnsigned fields are NULL. | 168 // FuncSzUnsigned fields are NULL. |
169 const char *Name; | 169 const char *Name; |
170 FuncTypeUnsigned FuncLlcUnsigned; | 170 FuncTypeUnsigned FuncLlcUnsigned; |
171 FuncTypeUnsigned FuncSzUnsigned; | 171 FuncTypeUnsigned FuncSzUnsigned; |
172 FuncTypeSigned FuncLlcSigned; | 172 FuncTypeSigned FuncLlcSigned; |
173 FuncTypeSigned FuncSzSigned; | 173 FuncTypeSigned FuncSzSigned; |
174 bool ExcludeDivExceptions; // for divide related tests | 174 bool ExcludeDivExceptions; // for divide related tests |
| 175 bool MaskShiftOperations; // for shift related tests |
175 } Funcs[] = { | 176 } Funcs[] = { |
176 #define X(inst, op, isdiv) \ | 177 #define X(inst, op, isdiv, isshift) \ |
177 { \ | 178 { \ |
178 STR(inst), test##inst, Subzero_::test##inst, NULL, NULL, isdiv \ | 179 STR(inst), test##inst, Subzero_::test##inst, NULL, NULL, isdiv, isshift \ |
179 } \ | 180 } \ |
180 , | 181 , |
181 UINTOP_TABLE | 182 UINTOP_TABLE |
182 #undef X | 183 #undef X |
183 #define X(inst, op, isdiv) \ | 184 #define X(inst, op, isdiv, isshift) \ |
184 { \ | 185 { \ |
185 STR(inst), NULL, NULL, test##inst, Subzero_::test##inst, isdiv \ | 186 STR(inst), NULL, NULL, test##inst, Subzero_::test##inst, isdiv, isshift \ |
186 } \ | 187 } \ |
187 , | 188 , |
188 SINTOP_TABLE | 189 SINTOP_TABLE |
189 #undef X | 190 #undef X |
190 }; | 191 }; |
191 const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs); | 192 const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs); |
192 const static size_t NumElementsInType = Vectors<TypeUnsigned>::NumElements; | 193 const static size_t NumElementsInType = Vectors<TypeUnsigned>::NumElements; |
193 for (size_t f = 0; f < NumFuncs; ++f) { | 194 for (size_t f = 0; f < NumFuncs; ++f) { |
194 PRNG Index; | 195 PRNG Index; |
195 for (size_t i = 0; i < MaxTestsPerFunc; ++i) { | 196 for (size_t i = 0; i < MaxTestsPerFunc; ++i) { |
196 // Initialize the test vectors. | 197 // Initialize the test vectors. |
197 TypeUnsigned Value1, Value2; | 198 TypeUnsigned Value1, Value2; |
198 for (size_t j = 0; j < NumElementsInType;) { | 199 for (size_t j = 0; j < NumElementsInType;) { |
199 ElementTypeUnsigned Element1 = Values[Index() % NumValues]; | 200 ElementTypeUnsigned Element1 = Values[Index() % NumValues]; |
200 ElementTypeUnsigned Element2 = Values[Index() % NumValues]; | 201 ElementTypeUnsigned Element2 = Values[Index() % NumValues]; |
201 if (Funcs[f].ExcludeDivExceptions && | 202 if (Funcs[f].ExcludeDivExceptions && |
202 inputsMayTriggerException<ElementTypeSigned>(Element1, Element2)) | 203 inputsMayTriggerException<ElementTypeSigned>(Element1, Element2)) |
203 continue; | 204 continue; |
| 205 if (Funcs[f].MaskShiftOperations) |
| 206 Element2 &= CHAR_BIT * sizeof(ElementTypeUnsigned) - 1; |
204 Value1[j] = Element1; | 207 Value1[j] = Element1; |
205 Value2[j] = Element2; | 208 Value2[j] = Element2; |
206 ++j; | 209 ++j; |
207 } | 210 } |
208 // Perform the test. | 211 // Perform the test. |
209 TypeUnsigned ResultSz, ResultLlc; | 212 TypeUnsigned ResultSz, ResultLlc; |
210 ++TotalTests; | 213 ++TotalTests; |
211 if (Funcs[f].FuncSzUnsigned) { | 214 if (Funcs[f].FuncSzUnsigned) { |
212 ResultSz = Funcs[f].FuncSzUnsigned(Value1, Value2); | 215 ResultSz = Funcs[f].FuncSzUnsigned(Value1, Value2); |
213 ResultLlc = Funcs[f].FuncLlcUnsigned(Value1, Value2); | 216 ResultLlc = Funcs[f].FuncLlcUnsigned(Value1, Value2); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 testsVecInt<v16ui8, v16si8>(TotalTests, Passes, Failures); | 356 testsVecInt<v16ui8, v16si8>(TotalTests, Passes, Failures); |
354 testsFp<float>(TotalTests, Passes, Failures); | 357 testsFp<float>(TotalTests, Passes, Failures); |
355 testsFp<double>(TotalTests, Passes, Failures); | 358 testsFp<double>(TotalTests, Passes, Failures); |
356 testsVecFp(TotalTests, Passes, Failures); | 359 testsVecFp(TotalTests, Passes, Failures); |
357 | 360 |
358 std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes | 361 std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes |
359 << " Failures=" << Failures << "\n"; | 362 << " Failures=" << Failures << "\n"; |
360 return Failures; | 363 return Failures; |
361 } | 364 } |
362 | 365 |
363 extern "C" { | |
364 // Subzero helpers | |
365 v4si32 Sz_shl_v4i32(v4si32 a, v4si32 b) { return a << b; } | |
366 v4si32 Sz_ashr_v4i32(v4si32 a, v4si32 b) { return a >> b; } | |
367 v4ui32 Sz_lshr_v4i32(v4ui32 a, v4ui32 b) { return a >> b; } | |
368 v4si32 Sz_sdiv_v4i32(v4si32 a, v4si32 b) { return a / b; } | |
369 v4ui32 Sz_udiv_v4i32(v4ui32 a, v4ui32 b) { return a / b; } | |
370 v4si32 Sz_srem_v4i32(v4si32 a, v4si32 b) { return a % b; } | |
371 v4ui32 Sz_urem_v4i32(v4ui32 a, v4ui32 b) { return a % b; } | |
372 | |
373 v8si16 Sz_shl_v8i16(v8si16 a, v8si16 b) { return a << b; } | |
374 v8si16 Sz_ashr_v8i16(v8si16 a, v8si16 b) { return a >> b; } | |
375 v8ui16 Sz_lshr_v8i16(v8ui16 a, v8ui16 b) { return a >> b; } | |
376 v8si16 Sz_sdiv_v8i16(v8si16 a, v8si16 b) { return a / b; } | |
377 v8ui16 Sz_udiv_v8i16(v8ui16 a, v8ui16 b) { return a / b; } | |
378 v8si16 Sz_srem_v8i16(v8si16 a, v8si16 b) { return a % b; } | |
379 v8ui16 Sz_urem_v8i16(v8ui16 a, v8ui16 b) { return a % b; } | |
380 | |
381 v16ui8 Sz_mul_v16i8(v16ui8 a, v16ui8 b) { return a * b; } | |
382 v16si8 Sz_shl_v16i8(v16si8 a, v16si8 b) { return a << b; } | |
383 v16si8 Sz_ashr_v16i8(v16si8 a, v16si8 b) { return a >> b; } | |
384 v16ui8 Sz_lshr_v16i8(v16ui8 a, v16ui8 b) { return a >> b; } | |
385 v16si8 Sz_sdiv_v16i8(v16si8 a, v16si8 b) { return a / b; } | |
386 v16ui8 Sz_udiv_v16i8(v16ui8 a, v16ui8 b) { return a / b; } | |
387 v16si8 Sz_srem_v16i8(v16si8 a, v16si8 b) { return a % b; } | |
388 v16ui8 Sz_urem_v16i8(v16ui8 a, v16ui8 b) { return a % b; } | |
389 | |
390 v4f32 Sz_frem_v4f32(v4f32 a, v4f32 b) { | |
391 v4f32 Result; | |
392 for (int i = 0; i < 4; ++i) | |
393 Result[i] = fmodf(a[i], b[i]); | |
394 return Result; | |
395 } | |
396 } | |
OLD | NEW |