blob: 4596bfa34ad0f52175a77d76238d9f0f806057bf [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
Jan Voung109fa152014-10-07 17:22:51 -070057#define COMPARE_VEC(Func, FromCName, ToCName, Input, FromString, ToString) \
58 do { \
59 ToCName ResultSz, ResultLlc; \
60 ResultLlc = Func<FromCName, ToCName>(Input); \
61 ResultSz = Subzero_::Func<FromCName, ToCName>(Input); \
62 ++TotalTests; \
63 if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \
64 ++Passes; \
65 } else { \
66 ++Failures; \
67 std::cout << std::fixed << XSTR(Func) << "<" << FromString << ", " \
68 << ToString << ">(" << vectAsString<FromCName>(Input) \
69 << "): "; \
70 std::cout << "sz=" << vectAsString<ToCName>(ResultSz) \
71 << " llc=" << vectAsString<ToCName>(ResultLlc); \
72 std::cout << "\n"; \
73 } \
74 } while (0)
75
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070076template <typename FromType>
77void testValue(FromType Val, size_t &TotalTests, size_t &Passes,
Jim Stichnothb63cd882014-09-08 10:47:23 -070078 size_t &Failures, const char *FromTypeString) {
79 COMPARE(cast, FromType, bool, Val, FromTypeString);
80 COMPARE(cast, FromType, uint8_t, Val, FromTypeString);
81 COMPARE(cast, FromType, myint8_t, Val, FromTypeString);
82 COMPARE(cast, FromType, uint16_t, Val, FromTypeString);
83 COMPARE(cast, FromType, int16_t, Val, FromTypeString);
84 COMPARE(cast, FromType, uint32_t, Val, FromTypeString);
85 COMPARE(cast, FromType, int32_t, Val, FromTypeString);
John Porto1d235422015-08-12 12:37:53 -070086 COMPARE(cast, FromType, uint64, Val, FromTypeString);
87 COMPARE(cast, FromType, int64, Val, FromTypeString);
Jim Stichnothb63cd882014-09-08 10:47:23 -070088 COMPARE(cast, FromType, float, Val, FromTypeString);
89 COMPARE(cast, FromType, double, Val, FromTypeString);
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070090}
91
Jan Voung109fa152014-10-07 17:22:51 -070092template <typename FromType, typename ToType>
93void testVector(size_t &TotalTests, size_t &Passes, size_t &Failures,
94 const char *FromTypeString, const char *ToTypeString) {
95 const static size_t NumElementsInType = Vectors<FromType>::NumElements;
96 PRNG Index;
97 static const float NegInf = -1.0 / 0.0;
98 static const float PosInf = 1.0 / 0.0;
99 static const float Nan = 0.0 / 0.0;
100 static const float NegNan = -0.0 / 0.0;
101 volatile float Values[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan);
102 static const size_t NumValues = sizeof(Values) / sizeof(*Values);
103 const size_t MaxTestsPerFunc = 20000;
104 for (size_t i = 0; i < MaxTestsPerFunc; ++i) {
105 // Initialize the test vectors.
106 FromType Value;
107 for (size_t j = 0; j < NumElementsInType; ++j) {
108 Value[j] = Values[Index() % NumValues];
109 }
110 COMPARE_VEC(cast, FromType, ToType, Value, FromTypeString, ToTypeString);
111 }
112}
113
John Porto1d235422015-08-12 12:37:53 -0700114#ifdef X8664_STACK_HACK
115extern "C" int wrapped_main(int argc, char *argv[]) {
116#else // !defined(X8664_STACK_HACK)
117int main(int argc, char *argv[]) {
118#endif // X8664_STACK_HACK
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700119 size_t TotalTests = 0;
120 size_t Passes = 0;
121 size_t Failures = 0;
122
Jim Stichnothdd842db2015-01-27 12:53:53 -0800123 volatile bool ValsUi1[] = {false, true};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700124 static const size_t NumValsUi1 = sizeof(ValsUi1) / sizeof(*ValsUi1);
Jim Stichnothdd842db2015-01-27 12:53:53 -0800125 volatile uint8_t ValsUi8[] = {0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700126 static const size_t NumValsUi8 = sizeof(ValsUi8) / sizeof(*ValsUi8);
127
Jim Stichnothdd842db2015-01-27 12:53:53 -0800128 volatile myint8_t ValsSi8[] = {0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700129 static const size_t NumValsSi8 = sizeof(ValsSi8) / sizeof(*ValsSi8);
130
Jim Stichnothdd842db2015-01-27 12:53:53 -0800131 volatile uint16_t ValsUi16[] = {0, 1, 0x7e, 0x7f, 0x80,
132 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
133 0x8000, 0x8001, 0xfffe, 0xffff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700134 static const size_t NumValsUi16 = sizeof(ValsUi16) / sizeof(*ValsUi16);
135
Jim Stichnothdd842db2015-01-27 12:53:53 -0800136 volatile int16_t ValsSi16[] = {0, 1, 0x7e, 0x7f, 0x80,
137 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
138 0x8000, 0x8001, 0xfffe, 0xffff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700139 static const size_t NumValsSi16 = sizeof(ValsSi16) / sizeof(*ValsSi16);
140
Jim Stichnothdd842db2015-01-27 12:53:53 -0800141 volatile size_t ValsUi32[] = {0, 1, 0x7e, 0x7f,
142 0x80, 0x81, 0xfe, 0xff,
143 0x7ffe, 0x7fff, 0x8000, 0x8001,
144 0xfffe, 0xffff, 0x7ffffffe, 0x7fffffff,
145 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700146 static const size_t NumValsUi32 = sizeof(ValsUi32) / sizeof(*ValsUi32);
147
Jim Stichnothdd842db2015-01-27 12:53:53 -0800148 volatile size_t ValsSi32[] = {0, 1, 0x7e, 0x7f,
149 0x80, 0x81, 0xfe, 0xff,
150 0x7ffe, 0x7fff, 0x8000, 0x8001,
151 0xfffe, 0xffff, 0x7ffffffe, 0x7fffffff,
152 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700153 static const size_t NumValsSi32 = sizeof(ValsSi32) / sizeof(*ValsSi32);
154
John Porto1d235422015-08-12 12:37:53 -0700155 volatile uint64 ValsUi64[] = {
Jim Stichnothd9dc82e2015-03-03 17:06:33 -0800156 0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff, 0x8000, 0x8001,
157 0xfffe, 0xffff, 0x7ffffffe, 0x7fffffff, 0x80000000, 0x80000001,
158 0xfffffffe, 0xffffffff, 0x100000000ull, 0x100000001ull,
159 0x7ffffffffffffffeull, 0x7fffffffffffffffull, 0x8000000000000000ull,
160 0x8000000000000001ull, 0xfffffffffffffffeull, 0xffffffffffffffffull};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700161 static const size_t NumValsUi64 = sizeof(ValsUi64) / sizeof(*ValsUi64);
162
John Porto1d235422015-08-12 12:37:53 -0700163 volatile int64 ValsSi64[] = {
Jim Stichnothd9dc82e2015-03-03 17:06:33 -0800164 0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff, 0x8000, 0x8001,
165 0xfffe, 0xffff, 0x7ffffffe, 0x7fffffff, 0x80000000, 0x80000001,
166 0xfffffffe, 0xffffffff, 0x100000000ll, 0x100000001ll,
167 0x7ffffffffffffffell, 0x7fffffffffffffffll, 0x8000000000000000ll,
168 0x8000000000000001ll, 0xfffffffffffffffell, 0xffffffffffffffffll};
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700169 static const size_t NumValsSi64 = sizeof(ValsSi64) / sizeof(*ValsSi64);
170
Jan Voung109fa152014-10-07 17:22:51 -0700171 static const double NegInf = -1.0 / 0.0;
172 static const double PosInf = 1.0 / 0.0;
173 static const double Nan = 0.0 / 0.0;
174 static const double NegNan = -0.0 / 0.0;
175 volatile float ValsF32[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan);
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700176 static const size_t NumValsF32 = sizeof(ValsF32) / sizeof(*ValsF32);
177
Jan Voung109fa152014-10-07 17:22:51 -0700178 volatile double ValsF64[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan);
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700179 static const size_t NumValsF64 = sizeof(ValsF64) / sizeof(*ValsF64);
180
181 for (size_t i = 0; i < NumValsUi1; ++i) {
182 bool Val = ValsUi1[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700183 testValue<bool>(Val, TotalTests, Passes, Failures, "bool");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700184 }
185 for (size_t i = 0; i < NumValsUi8; ++i) {
186 uint8_t Val = ValsUi8[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700187 testValue<uint8_t>(Val, TotalTests, Passes, Failures, "uint8_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700188 }
189 for (size_t i = 0; i < NumValsSi8; ++i) {
Jim Stichnoth7da431b2014-08-05 11:22:37 -0700190 myint8_t Val = ValsSi8[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700191 testValue<myint8_t>(Val, TotalTests, Passes, Failures, "int8_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700192 }
193 for (size_t i = 0; i < NumValsUi16; ++i) {
194 uint16_t Val = ValsUi16[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700195 testValue<uint16_t>(Val, TotalTests, Passes, Failures, "uint16_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700196 }
197 for (size_t i = 0; i < NumValsSi16; ++i) {
198 int16_t Val = ValsSi16[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700199 testValue<int16_t>(Val, TotalTests, Passes, Failures, "int16_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700200 }
201 for (size_t i = 0; i < NumValsUi32; ++i) {
202 uint32_t Val = ValsUi32[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700203 testValue<uint32_t>(Val, TotalTests, Passes, Failures, "uint32_t");
204 COMPARE(castBits, uint32_t, float, Val, "uint32_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700205 }
206 for (size_t i = 0; i < NumValsSi32; ++i) {
207 int32_t Val = ValsSi32[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700208 testValue<int32_t>(Val, TotalTests, Passes, Failures, "int32_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700209 }
210 for (size_t i = 0; i < NumValsUi64; ++i) {
John Porto1d235422015-08-12 12:37:53 -0700211 uint64 Val = ValsUi64[i];
212 testValue<uint64>(Val, TotalTests, Passes, Failures, "uint64");
213 COMPARE(castBits, uint64, double, Val, "uint64");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700214 }
215 for (size_t i = 0; i < NumValsSi64; ++i) {
John Porto1d235422015-08-12 12:37:53 -0700216 int64 Val = ValsSi64[i];
217 testValue<int64>(Val, TotalTests, Passes, Failures, "int64");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700218 }
219 for (size_t i = 0; i < NumValsF32; ++i) {
220 for (unsigned j = 0; j < 2; ++j) {
221 float Val = ValsF32[i];
222 if (j > 0)
223 Val = -Val;
Jim Stichnothb63cd882014-09-08 10:47:23 -0700224 testValue<float>(Val, TotalTests, Passes, Failures, "float");
225 COMPARE(castBits, float, uint32_t, Val, "float");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700226 }
227 }
228 for (size_t i = 0; i < NumValsF64; ++i) {
229 for (unsigned j = 0; j < 2; ++j) {
230 double Val = ValsF64[i];
231 if (j > 0)
232 Val = -Val;
Jim Stichnothb63cd882014-09-08 10:47:23 -0700233 testValue<double>(Val, TotalTests, Passes, Failures, "double");
John Porto1d235422015-08-12 12:37:53 -0700234 COMPARE(castBits, double, uint64, Val, "double");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700235 }
236 }
Jan Voung109fa152014-10-07 17:22:51 -0700237 testVector<v4ui32, v4f32>(TotalTests, Passes, Failures, "v4ui32", "v4f32");
238 testVector<v4si32, v4f32>(TotalTests, Passes, Failures, "v4si32", "v4f32");
239 testVector<v4f32, v4si32>(TotalTests, Passes, Failures, "v4f32", "v4si32");
240 testVector<v4f32, v4ui32>(TotalTests, Passes, Failures, "v4f32", "v4ui32");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700241
242 std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes
243 << " Failures=" << Failures << "\n";
244 return Failures;
245}