blob: 289956ca399506fba0a168b1c1cbdce04f61b1e2 [file] [log] [blame]
Jim Stichnoth7da431b2014-08-05 11:22:37 -07001//===- subzero/crosstest/test_cast_main.cpp - Driver for tests ------------===//
2//
3// The Subzero Code Generator
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Driver for crosstesting cast operations.
11//
12//===----------------------------------------------------------------------===//
13
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070014/* crosstest.py --test=test_cast.cpp --test=test_cast_to_u1.ll \
Jan Voung109fa152014-10-07 17:22:51 -070015 --test=test_cast_vectors.ll \
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070016 --driver=test_cast_main.cpp --prefix=Subzero_ --output=test_cast */
17
Jan Voung109fa152014-10-07 17:22:51 -070018#include <cfloat>
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070019#include <cstring>
20#include <iostream>
21#include <stdint.h>
22
Jan Voung109fa152014-10-07 17:22:51 -070023#include "test_arith.def"
24#include "vectors.h"
John Porto1d235422015-08-12 12:37:53 -070025#include "xdefs.h"
Jan Voung109fa152014-10-07 17:22:51 -070026
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070027// Include test_cast.h twice - once normally, and once within the
28// Subzero_ namespace, corresponding to the llc and Subzero translated
29// object files, respectively.
30#include "test_cast.h"
31namespace Subzero_ {
32#include "test_cast.h"
33}
34
35#define XSTR(s) STR(s)
36#define STR(s) #s
Jim Stichnothb63cd882014-09-08 10:47:23 -070037#define COMPARE(Func, FromCName, ToCName, Input, FromString) \
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070038 do { \
39 ToCName ResultSz, ResultLlc; \
40 ResultLlc = Func<FromCName, ToCName>(Input); \
41 ResultSz = Subzero_::Func<FromCName, ToCName>(Input); \
42 ++TotalTests; \
43 if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \
44 ++Passes; \
45 } else { \
46 ++Failures; \
Jim Stichnothb63cd882014-09-08 10:47:23 -070047 std::cout << std::fixed << XSTR(Func) << "<" << FromString \
48 << ", " XSTR(ToCName) ">(" << Input << "): "; \
49 if (sizeof(ToCName) == 1) \
50 std::cout << "sz=" << (int)ResultSz << " llc=" << (int)ResultLlc; \
51 else \
52 std::cout << "sz=" << ResultSz << " llc=" << ResultLlc; \
53 std::cout << "\n"; \
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070054 } \
55 } while (0)
56
Jaydeep Patila7979bf2016-10-26 06:16:19 -070057#define COMPARE_ARG(Func, FromCName, ToCName, Input, FromString) \
58 do { \
59 ToCName ResultSz, ResultLlc; \
60 ResultLlc = Func<FromCName, ToCName>(1, Input, 2); \
61 ResultSz = Subzero_::Func<FromCName, ToCName>(1, Input, 2); \
62 ++TotalTests; \
63 if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \
64 ++Passes; \
65 } else { \
66 ++Failures; \
67 std::cout << std::fixed << XSTR(Func) << "<" << FromString \
68 << ", " XSTR(ToCName) ">(" << Input << "): "; \
69 if (sizeof(ToCName) == 1) \
70 std::cout << "sz=" << (int)ResultSz << " llc=" << (int)ResultLlc; \
71 else \
72 std::cout << "sz=" << ResultSz << " llc=" << ResultLlc; \
73 std::cout << "\n"; \
74 } \
75 } while (0)
76
Jan Voung109fa152014-10-07 17:22:51 -070077#define COMPARE_VEC(Func, FromCName, ToCName, Input, FromString, ToString) \
78 do { \
79 ToCName ResultSz, ResultLlc; \
80 ResultLlc = Func<FromCName, ToCName>(Input); \
81 ResultSz = Subzero_::Func<FromCName, ToCName>(Input); \
82 ++TotalTests; \
83 if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \
84 ++Passes; \
85 } else { \
86 ++Failures; \
87 std::cout << std::fixed << XSTR(Func) << "<" << FromString << ", " \
88 << ToString << ">(" << vectAsString<FromCName>(Input) \
89 << "): "; \
90 std::cout << "sz=" << vectAsString<ToCName>(ResultSz) \
91 << " llc=" << vectAsString<ToCName>(ResultLlc); \
92 std::cout << "\n"; \
93 } \
94 } while (0)
95
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070096template <typename FromType>
97void testValue(FromType Val, size_t &TotalTests, size_t &Passes,
Jim Stichnothb63cd882014-09-08 10:47:23 -070098 size_t &Failures, const char *FromTypeString) {
99 COMPARE(cast, FromType, bool, Val, FromTypeString);
100 COMPARE(cast, FromType, uint8_t, Val, FromTypeString);
101 COMPARE(cast, FromType, myint8_t, Val, FromTypeString);
102 COMPARE(cast, FromType, uint16_t, Val, FromTypeString);
103 COMPARE(cast, FromType, int16_t, Val, FromTypeString);
104 COMPARE(cast, FromType, uint32_t, Val, FromTypeString);
105 COMPARE(cast, FromType, int32_t, Val, FromTypeString);
John Porto1d235422015-08-12 12:37:53 -0700106 COMPARE(cast, FromType, uint64, Val, FromTypeString);
107 COMPARE(cast, FromType, int64, Val, FromTypeString);
Jim Stichnothb63cd882014-09-08 10:47:23 -0700108 COMPARE(cast, FromType, float, Val, FromTypeString);
109 COMPARE(cast, FromType, double, Val, FromTypeString);
Jaydeep Patila7979bf2016-10-26 06:16:19 -0700110 COMPARE_ARG(cast, FromType, bool, Val, FromTypeString);
111 COMPARE_ARG(cast, FromType, uint8_t, Val, FromTypeString);
112 COMPARE_ARG(cast, FromType, myint8_t, Val, FromTypeString);
113 COMPARE_ARG(cast, FromType, uint16_t, Val, FromTypeString);
114 COMPARE_ARG(cast, FromType, int16_t, Val, FromTypeString);
115 COMPARE_ARG(cast, FromType, uint32_t, Val, FromTypeString);
116 COMPARE_ARG(cast, FromType, int32_t, Val, FromTypeString);
117 COMPARE_ARG(cast, FromType, uint64, Val, FromTypeString);
118 COMPARE_ARG(cast, FromType, int64, Val, FromTypeString);
119 COMPARE_ARG(cast, FromType, float, Val, FromTypeString);
120 COMPARE_ARG(cast, FromType, double, Val, FromTypeString);
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700121}
122
Jan Voung109fa152014-10-07 17:22:51 -0700123template <typename FromType, typename ToType>
124void testVector(size_t &TotalTests, size_t &Passes, size_t &Failures,
125 const char *FromTypeString, const char *ToTypeString) {
126 const static size_t NumElementsInType = Vectors<FromType>::NumElements;
127 PRNG Index;
128 static const float NegInf = -1.0 / 0.0;
129 static const float PosInf = 1.0 / 0.0;
130 static const float Nan = 0.0 / 0.0;
131 static const float NegNan = -0.0 / 0.0;
132 volatile float Values[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan);
133 static const size_t NumValues = sizeof(Values) / sizeof(*Values);
134 const size_t MaxTestsPerFunc = 20000;
135 for (size_t i = 0; i < MaxTestsPerFunc; ++i) {
136 // Initialize the test vectors.
137 FromType Value;
138 for (size_t j = 0; j < NumElementsInType; ++j) {
139 Value[j] = Values[Index() % NumValues];
140 }
141 COMPARE_VEC(cast, FromType, ToType, Value, FromTypeString, ToTypeString);
142 }
143}
144
John Porto1d235422015-08-12 12:37:53 -0700145int main(int argc, char *argv[]) {
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700146 size_t TotalTests = 0;
147 size_t Passes = 0;
148 size_t Failures = 0;
149
Jim Stichnothdd842db2015-01-27 12:53:53 -0800150 volatile bool ValsUi1[] = {false, true};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700151 static const size_t NumValsUi1 = sizeof(ValsUi1) / sizeof(*ValsUi1);
Jim Stichnothdd842db2015-01-27 12:53:53 -0800152 volatile uint8_t ValsUi8[] = {0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700153 static const size_t NumValsUi8 = sizeof(ValsUi8) / sizeof(*ValsUi8);
154
Jim Stichnothdd842db2015-01-27 12:53:53 -0800155 volatile myint8_t ValsSi8[] = {0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700156 static const size_t NumValsSi8 = sizeof(ValsSi8) / sizeof(*ValsSi8);
157
Jim Stichnothdd842db2015-01-27 12:53:53 -0800158 volatile uint16_t ValsUi16[] = {0, 1, 0x7e, 0x7f, 0x80,
159 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
160 0x8000, 0x8001, 0xfffe, 0xffff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700161 static const size_t NumValsUi16 = sizeof(ValsUi16) / sizeof(*ValsUi16);
162
Jim Stichnothdd842db2015-01-27 12:53:53 -0800163 volatile int16_t ValsSi16[] = {0, 1, 0x7e, 0x7f, 0x80,
164 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
165 0x8000, 0x8001, 0xfffe, 0xffff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700166 static const size_t NumValsSi16 = sizeof(ValsSi16) / sizeof(*ValsSi16);
167
Jim Stichnothdd842db2015-01-27 12:53:53 -0800168 volatile size_t ValsUi32[] = {0, 1, 0x7e, 0x7f,
169 0x80, 0x81, 0xfe, 0xff,
170 0x7ffe, 0x7fff, 0x8000, 0x8001,
171 0xfffe, 0xffff, 0x7ffffffe, 0x7fffffff,
172 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700173 static const size_t NumValsUi32 = sizeof(ValsUi32) / sizeof(*ValsUi32);
174
Jim Stichnothdd842db2015-01-27 12:53:53 -0800175 volatile size_t ValsSi32[] = {0, 1, 0x7e, 0x7f,
176 0x80, 0x81, 0xfe, 0xff,
177 0x7ffe, 0x7fff, 0x8000, 0x8001,
178 0xfffe, 0xffff, 0x7ffffffe, 0x7fffffff,
179 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700180 static const size_t NumValsSi32 = sizeof(ValsSi32) / sizeof(*ValsSi32);
181
Antonio Maioranoca8a16e2020-11-10 16:56:20 -0500182 volatile uint64 ValsUi64[] = {0,
183 1,
184 0x7e,
185 0x7f,
186 0x80,
187 0x81,
188 0xfe,
189 0xff,
190 0x7ffe,
191 0x7fff,
192 0x8000,
193 0x8001,
194 0xfffe,
195 0xffff,
196 0x7ffffffe,
197 0x7fffffff,
198 0x80000000,
199 0x80000001,
200 0xfffffffe,
201 0xffffffff,
202 0x100000000ull,
203 0x100000001ull,
204 0x7ffffffffffffffeull,
205 0x7fffffffffffffffull,
206 0x8000000000000000ull,
207 0x8000000000000001ull,
208 0xfffffffffffffffeull,
209 0xffffffffffffffffull};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700210 static const size_t NumValsUi64 = sizeof(ValsUi64) / sizeof(*ValsUi64);
211
Antonio Maioranoca8a16e2020-11-10 16:56:20 -0500212 volatile int64 ValsSi64[] = {0,
213 1,
214 0x7e,
215 0x7f,
216 0x80,
217 0x81,
218 0xfe,
219 0xff,
220 0x7ffe,
221 0x7fff,
222 0x8000,
223 0x8001,
224 0xfffe,
225 0xffff,
226 0x7ffffffe,
227 0x7fffffff,
228 0x80000000,
229 0x80000001,
230 0xfffffffe,
231 0xffffffff,
232 0x100000000ll,
233 0x100000001ll,
234 0x7ffffffffffffffell,
235 0x7fffffffffffffffll,
236 0x8000000000000000ll,
237 0x8000000000000001ll,
238 0xfffffffffffffffell,
239 0xffffffffffffffffll};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700240 static const size_t NumValsSi64 = sizeof(ValsSi64) / sizeof(*ValsSi64);
241
Jan Voung109fa152014-10-07 17:22:51 -0700242 static const double NegInf = -1.0 / 0.0;
243 static const double PosInf = 1.0 / 0.0;
244 static const double Nan = 0.0 / 0.0;
245 static const double NegNan = -0.0 / 0.0;
246 volatile float ValsF32[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan);
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700247 static const size_t NumValsF32 = sizeof(ValsF32) / sizeof(*ValsF32);
248
Jan Voung109fa152014-10-07 17:22:51 -0700249 volatile double ValsF64[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan);
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700250 static const size_t NumValsF64 = sizeof(ValsF64) / sizeof(*ValsF64);
251
252 for (size_t i = 0; i < NumValsUi1; ++i) {
253 bool Val = ValsUi1[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700254 testValue<bool>(Val, TotalTests, Passes, Failures, "bool");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700255 }
256 for (size_t i = 0; i < NumValsUi8; ++i) {
257 uint8_t Val = ValsUi8[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700258 testValue<uint8_t>(Val, TotalTests, Passes, Failures, "uint8_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700259 }
260 for (size_t i = 0; i < NumValsSi8; ++i) {
Jim Stichnoth7da431b2014-08-05 11:22:37 -0700261 myint8_t Val = ValsSi8[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700262 testValue<myint8_t>(Val, TotalTests, Passes, Failures, "int8_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700263 }
264 for (size_t i = 0; i < NumValsUi16; ++i) {
265 uint16_t Val = ValsUi16[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700266 testValue<uint16_t>(Val, TotalTests, Passes, Failures, "uint16_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700267 }
268 for (size_t i = 0; i < NumValsSi16; ++i) {
269 int16_t Val = ValsSi16[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700270 testValue<int16_t>(Val, TotalTests, Passes, Failures, "int16_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700271 }
272 for (size_t i = 0; i < NumValsUi32; ++i) {
273 uint32_t Val = ValsUi32[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700274 testValue<uint32_t>(Val, TotalTests, Passes, Failures, "uint32_t");
275 COMPARE(castBits, uint32_t, float, Val, "uint32_t");
Jaydeep Patila7979bf2016-10-26 06:16:19 -0700276 COMPARE_ARG(castBits, uint32_t, float, Val, "uint32_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700277 }
278 for (size_t i = 0; i < NumValsSi32; ++i) {
279 int32_t Val = ValsSi32[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700280 testValue<int32_t>(Val, TotalTests, Passes, Failures, "int32_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700281 }
282 for (size_t i = 0; i < NumValsUi64; ++i) {
John Porto1d235422015-08-12 12:37:53 -0700283 uint64 Val = ValsUi64[i];
284 testValue<uint64>(Val, TotalTests, Passes, Failures, "uint64");
285 COMPARE(castBits, uint64, double, Val, "uint64");
Jaydeep Patila7979bf2016-10-26 06:16:19 -0700286 COMPARE_ARG(castBits, uint64, double, Val, "uint64");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700287 }
288 for (size_t i = 0; i < NumValsSi64; ++i) {
John Porto1d235422015-08-12 12:37:53 -0700289 int64 Val = ValsSi64[i];
290 testValue<int64>(Val, TotalTests, Passes, Failures, "int64");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700291 }
292 for (size_t i = 0; i < NumValsF32; ++i) {
293 for (unsigned j = 0; j < 2; ++j) {
294 float Val = ValsF32[i];
295 if (j > 0)
296 Val = -Val;
Jim Stichnothb63cd882014-09-08 10:47:23 -0700297 testValue<float>(Val, TotalTests, Passes, Failures, "float");
298 COMPARE(castBits, float, uint32_t, Val, "float");
Jaydeep Patila7979bf2016-10-26 06:16:19 -0700299 COMPARE_ARG(castBits, float, uint32_t, Val, "float");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700300 }
301 }
302 for (size_t i = 0; i < NumValsF64; ++i) {
303 for (unsigned j = 0; j < 2; ++j) {
304 double Val = ValsF64[i];
305 if (j > 0)
306 Val = -Val;
Jim Stichnothb63cd882014-09-08 10:47:23 -0700307 testValue<double>(Val, TotalTests, Passes, Failures, "double");
John Porto1d235422015-08-12 12:37:53 -0700308 COMPARE(castBits, double, uint64, Val, "double");
Jaydeep Patila7979bf2016-10-26 06:16:19 -0700309 COMPARE_ARG(castBits, double, uint64, Val, "double");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700310 }
311 }
Jaydeep Patila7979bf2016-10-26 06:16:19 -0700312
Jan Voung109fa152014-10-07 17:22:51 -0700313 testVector<v4ui32, v4f32>(TotalTests, Passes, Failures, "v4ui32", "v4f32");
314 testVector<v4si32, v4f32>(TotalTests, Passes, Failures, "v4si32", "v4f32");
315 testVector<v4f32, v4si32>(TotalTests, Passes, Failures, "v4f32", "v4si32");
316 testVector<v4f32, v4ui32>(TotalTests, Passes, Failures, "v4f32", "v4ui32");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700317
318 std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes
319 << " Failures=" << Failures << "\n";
320 return Failures;
321}