blob: fd50011aff1b34d1f42e8b96e82bc2e6846f9c02 [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"
25
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070026// Include test_cast.h twice - once normally, and once within the
27// Subzero_ namespace, corresponding to the llc and Subzero translated
28// object files, respectively.
29#include "test_cast.h"
30namespace Subzero_ {
31#include "test_cast.h"
32}
33
34#define XSTR(s) STR(s)
35#define STR(s) #s
Jim Stichnothb63cd882014-09-08 10:47:23 -070036#define COMPARE(Func, FromCName, ToCName, Input, FromString) \
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070037 do { \
38 ToCName ResultSz, ResultLlc; \
39 ResultLlc = Func<FromCName, ToCName>(Input); \
40 ResultSz = Subzero_::Func<FromCName, ToCName>(Input); \
41 ++TotalTests; \
42 if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \
43 ++Passes; \
44 } else { \
45 ++Failures; \
Jim Stichnothb63cd882014-09-08 10:47:23 -070046 std::cout << std::fixed << XSTR(Func) << "<" << FromString \
47 << ", " XSTR(ToCName) ">(" << Input << "): "; \
48 if (sizeof(ToCName) == 1) \
49 std::cout << "sz=" << (int)ResultSz << " llc=" << (int)ResultLlc; \
50 else \
51 std::cout << "sz=" << ResultSz << " llc=" << ResultLlc; \
52 std::cout << "\n"; \
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070053 } \
54 } while (0)
55
Jan Voung109fa152014-10-07 17:22:51 -070056#define COMPARE_VEC(Func, FromCName, ToCName, Input, FromString, ToString) \
57 do { \
58 ToCName ResultSz, ResultLlc; \
59 ResultLlc = Func<FromCName, ToCName>(Input); \
60 ResultSz = Subzero_::Func<FromCName, ToCName>(Input); \
61 ++TotalTests; \
62 if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \
63 ++Passes; \
64 } else { \
65 ++Failures; \
66 std::cout << std::fixed << XSTR(Func) << "<" << FromString << ", " \
67 << ToString << ">(" << vectAsString<FromCName>(Input) \
68 << "): "; \
69 std::cout << "sz=" << vectAsString<ToCName>(ResultSz) \
70 << " llc=" << vectAsString<ToCName>(ResultLlc); \
71 std::cout << "\n"; \
72 } \
73 } while (0)
74
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070075template <typename FromType>
76void testValue(FromType Val, size_t &TotalTests, size_t &Passes,
Jim Stichnothb63cd882014-09-08 10:47:23 -070077 size_t &Failures, const char *FromTypeString) {
78 COMPARE(cast, FromType, bool, Val, FromTypeString);
79 COMPARE(cast, FromType, uint8_t, Val, FromTypeString);
80 COMPARE(cast, FromType, myint8_t, Val, FromTypeString);
81 COMPARE(cast, FromType, uint16_t, Val, FromTypeString);
82 COMPARE(cast, FromType, int16_t, Val, FromTypeString);
83 COMPARE(cast, FromType, uint32_t, Val, FromTypeString);
84 COMPARE(cast, FromType, int32_t, Val, FromTypeString);
85 COMPARE(cast, FromType, uint64_t, Val, FromTypeString);
86 COMPARE(cast, FromType, int64_t, Val, FromTypeString);
87 COMPARE(cast, FromType, float, Val, FromTypeString);
88 COMPARE(cast, FromType, double, Val, FromTypeString);
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070089}
90
Jan Voung109fa152014-10-07 17:22:51 -070091template <typename FromType, typename ToType>
92void testVector(size_t &TotalTests, size_t &Passes, size_t &Failures,
93 const char *FromTypeString, const char *ToTypeString) {
94 const static size_t NumElementsInType = Vectors<FromType>::NumElements;
95 PRNG Index;
96 static const float NegInf = -1.0 / 0.0;
97 static const float PosInf = 1.0 / 0.0;
98 static const float Nan = 0.0 / 0.0;
99 static const float NegNan = -0.0 / 0.0;
100 volatile float Values[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan);
101 static const size_t NumValues = sizeof(Values) / sizeof(*Values);
102 const size_t MaxTestsPerFunc = 20000;
103 for (size_t i = 0; i < MaxTestsPerFunc; ++i) {
104 // Initialize the test vectors.
105 FromType Value;
106 for (size_t j = 0; j < NumElementsInType; ++j) {
107 Value[j] = Values[Index() % NumValues];
108 }
109 COMPARE_VEC(cast, FromType, ToType, Value, FromTypeString, ToTypeString);
110 }
111}
112
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700113int main(int argc, char **argv) {
114 size_t TotalTests = 0;
115 size_t Passes = 0;
116 size_t Failures = 0;
117
118 volatile bool ValsUi1[] = { false, true };
119 static const size_t NumValsUi1 = sizeof(ValsUi1) / sizeof(*ValsUi1);
120 volatile uint8_t ValsUi8[] = { 0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff };
121 static const size_t NumValsUi8 = sizeof(ValsUi8) / sizeof(*ValsUi8);
122
Jim Stichnoth7da431b2014-08-05 11:22:37 -0700123 volatile myint8_t ValsSi8[] = { 0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff };
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700124 static const size_t NumValsSi8 = sizeof(ValsSi8) / sizeof(*ValsSi8);
125
126 volatile uint16_t ValsUi16[] = { 0, 1, 0x7e, 0x7f, 0x80,
127 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
128 0x8000, 0x8001, 0xfffe, 0xffff };
129 static const size_t NumValsUi16 = sizeof(ValsUi16) / sizeof(*ValsUi16);
130
131 volatile int16_t ValsSi16[] = { 0, 1, 0x7e, 0x7f, 0x80,
132 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
133 0x8000, 0x8001, 0xfffe, 0xffff };
134 static const size_t NumValsSi16 = sizeof(ValsSi16) / sizeof(*ValsSi16);
135
136 volatile size_t ValsUi32[] = {
137 0, 1, 0x7e, 0x7f, 0x80,
138 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
139 0x8000, 0x8001, 0xfffe, 0xffff, 0x7ffffffe,
140 0x7fffffff, 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff
141 };
142 static const size_t NumValsUi32 = sizeof(ValsUi32) / sizeof(*ValsUi32);
143
144 volatile size_t ValsSi32[] = {
145 0, 1, 0x7e, 0x7f, 0x80,
146 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
147 0x8000, 0x8001, 0xfffe, 0xffff, 0x7ffffffe,
148 0x7fffffff, 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff
149 };
150 static const size_t NumValsSi32 = sizeof(ValsSi32) / sizeof(*ValsSi32);
151
152 volatile uint64_t ValsUi64[] = {
153 0, 1, 0x7e,
154 0x7f, 0x80, 0x81,
155 0xfe, 0xff, 0x7ffe,
156 0x7fff, 0x8000, 0x8001,
157 0xfffe, 0xffff, 0x7ffffffe,
158 0x7fffffff, 0x80000000, 0x80000001,
159 0xfffffffe, 0xffffffff, 0x100000000ull,
160 0x100000001ull, 0x7ffffffffffffffeull, 0x7fffffffffffffffull,
161 0x8000000000000000ull, 0x8000000000000001ull, 0xfffffffffffffffeull,
162 0xffffffffffffffffull
163 };
164 static const size_t NumValsUi64 = sizeof(ValsUi64) / sizeof(*ValsUi64);
165
166 volatile int64_t ValsSi64[] = {
167 0, 1, 0x7e,
168 0x7f, 0x80, 0x81,
169 0xfe, 0xff, 0x7ffe,
170 0x7fff, 0x8000, 0x8001,
171 0xfffe, 0xffff, 0x7ffffffe,
172 0x7fffffff, 0x80000000, 0x80000001,
173 0xfffffffe, 0xffffffff, 0x100000000ll,
174 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll,
175 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell,
176 0xffffffffffffffffll
177 };
178 static const size_t NumValsSi64 = sizeof(ValsSi64) / sizeof(*ValsSi64);
179
Jan Voung109fa152014-10-07 17:22:51 -0700180 static const double NegInf = -1.0 / 0.0;
181 static const double PosInf = 1.0 / 0.0;
182 static const double Nan = 0.0 / 0.0;
183 static const double NegNan = -0.0 / 0.0;
184 volatile float ValsF32[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan);
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700185 static const size_t NumValsF32 = sizeof(ValsF32) / sizeof(*ValsF32);
186
Jan Voung109fa152014-10-07 17:22:51 -0700187 volatile double ValsF64[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan);
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700188 static const size_t NumValsF64 = sizeof(ValsF64) / sizeof(*ValsF64);
189
190 for (size_t i = 0; i < NumValsUi1; ++i) {
191 bool Val = ValsUi1[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700192 testValue<bool>(Val, TotalTests, Passes, Failures, "bool");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700193 }
194 for (size_t i = 0; i < NumValsUi8; ++i) {
195 uint8_t Val = ValsUi8[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700196 testValue<uint8_t>(Val, TotalTests, Passes, Failures, "uint8_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700197 }
198 for (size_t i = 0; i < NumValsSi8; ++i) {
Jim Stichnoth7da431b2014-08-05 11:22:37 -0700199 myint8_t Val = ValsSi8[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700200 testValue<myint8_t>(Val, TotalTests, Passes, Failures, "int8_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700201 }
202 for (size_t i = 0; i < NumValsUi16; ++i) {
203 uint16_t Val = ValsUi16[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700204 testValue<uint16_t>(Val, TotalTests, Passes, Failures, "uint16_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700205 }
206 for (size_t i = 0; i < NumValsSi16; ++i) {
207 int16_t Val = ValsSi16[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700208 testValue<int16_t>(Val, TotalTests, Passes, Failures, "int16_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700209 }
210 for (size_t i = 0; i < NumValsUi32; ++i) {
211 uint32_t Val = ValsUi32[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700212 testValue<uint32_t>(Val, TotalTests, Passes, Failures, "uint32_t");
213 COMPARE(castBits, uint32_t, float, Val, "uint32_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700214 }
215 for (size_t i = 0; i < NumValsSi32; ++i) {
216 int32_t Val = ValsSi32[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700217 testValue<int32_t>(Val, TotalTests, Passes, Failures, "int32_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700218 }
219 for (size_t i = 0; i < NumValsUi64; ++i) {
220 uint64_t Val = ValsUi64[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700221 testValue<uint64_t>(Val, TotalTests, Passes, Failures, "uint64_t");
222 COMPARE(castBits, uint64_t, double, Val, "uint64_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700223 }
224 for (size_t i = 0; i < NumValsSi64; ++i) {
225 int64_t Val = ValsSi64[i];
Jim Stichnothb63cd882014-09-08 10:47:23 -0700226 testValue<int64_t>(Val, TotalTests, Passes, Failures, "int64_t");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700227 }
228 for (size_t i = 0; i < NumValsF32; ++i) {
229 for (unsigned j = 0; j < 2; ++j) {
230 float Val = ValsF32[i];
231 if (j > 0)
232 Val = -Val;
Jim Stichnothb63cd882014-09-08 10:47:23 -0700233 testValue<float>(Val, TotalTests, Passes, Failures, "float");
234 COMPARE(castBits, float, uint32_t, Val, "float");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700235 }
236 }
237 for (size_t i = 0; i < NumValsF64; ++i) {
238 for (unsigned j = 0; j < 2; ++j) {
239 double Val = ValsF64[i];
240 if (j > 0)
241 Val = -Val;
Jim Stichnothb63cd882014-09-08 10:47:23 -0700242 testValue<double>(Val, TotalTests, Passes, Failures, "double");
243 COMPARE(castBits, double, uint64_t, Val, "double");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700244 }
245 }
Jan Voung109fa152014-10-07 17:22:51 -0700246 testVector<v4ui32, v4f32>(TotalTests, Passes, Failures, "v4ui32", "v4f32");
247 testVector<v4si32, v4f32>(TotalTests, Passes, Failures, "v4si32", "v4f32");
248 testVector<v4f32, v4si32>(TotalTests, Passes, Failures, "v4f32", "v4si32");
249 testVector<v4f32, v4ui32>(TotalTests, Passes, Failures, "v4f32", "v4ui32");
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700250
251 std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes
252 << " Failures=" << Failures << "\n";
253 return Failures;
254}