OLD | NEW |
1 //===- subzero/crosstest/test_cast_main.cpp - Driver for tests ------------===// | 1 //===- subzero/crosstest/test_cast_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 cast operations. | 10 // Driver for crosstesting cast operations. |
(...skipping 10 matching lines...) Expand all Loading... |
21 // Include test_cast.h twice - once normally, and once within the | 21 // Include test_cast.h twice - once normally, and once within the |
22 // Subzero_ namespace, corresponding to the llc and Subzero translated | 22 // Subzero_ namespace, corresponding to the llc and Subzero translated |
23 // object files, respectively. | 23 // object files, respectively. |
24 #include "test_cast.h" | 24 #include "test_cast.h" |
25 namespace Subzero_ { | 25 namespace Subzero_ { |
26 #include "test_cast.h" | 26 #include "test_cast.h" |
27 } | 27 } |
28 | 28 |
29 #define XSTR(s) STR(s) | 29 #define XSTR(s) STR(s) |
30 #define STR(s) #s | 30 #define STR(s) #s |
31 #define COMPARE(Func, FromCName, ToCName, Input) \ | 31 #define COMPARE(Func, FromCName, ToCName, Input, FromString) \ |
32 do { \ | 32 do { \ |
33 ToCName ResultSz, ResultLlc; \ | 33 ToCName ResultSz, ResultLlc; \ |
34 ResultLlc = Func<FromCName, ToCName>(Input); \ | 34 ResultLlc = Func<FromCName, ToCName>(Input); \ |
35 ResultSz = Subzero_::Func<FromCName, ToCName>(Input); \ | 35 ResultSz = Subzero_::Func<FromCName, ToCName>(Input); \ |
36 ++TotalTests; \ | 36 ++TotalTests; \ |
37 if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \ | 37 if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \ |
38 ++Passes; \ | 38 ++Passes; \ |
39 } else { \ | 39 } else { \ |
40 ++Failures; \ | 40 ++Failures; \ |
41 std::cout << std::fixed << XSTR(Func) \ | 41 std::cout << std::fixed << XSTR(Func) << "<" << FromString \ |
42 << "<" XSTR(FromCName) ", " XSTR(ToCName) ">(" << Input \ | 42 << ", " XSTR(ToCName) ">(" << Input << "): "; \ |
43 << "): sz=" << ResultSz << " llc=" << ResultLlc << "\n"; \ | 43 if (sizeof(ToCName) == 1) \ |
| 44 std::cout << "sz=" << (int)ResultSz << " llc=" << (int)ResultLlc; \ |
| 45 else \ |
| 46 std::cout << "sz=" << ResultSz << " llc=" << ResultLlc; \ |
| 47 std::cout << "\n"; \ |
44 } \ | 48 } \ |
45 } while (0) | 49 } while (0) |
46 | 50 |
47 template <typename FromType> | 51 template <typename FromType> |
48 void testValue(FromType Val, size_t &TotalTests, size_t &Passes, | 52 void testValue(FromType Val, size_t &TotalTests, size_t &Passes, |
49 size_t &Failures) { | 53 size_t &Failures, const char *FromTypeString) { |
50 COMPARE(cast, FromType, bool, Val); | 54 COMPARE(cast, FromType, bool, Val, FromTypeString); |
51 COMPARE(cast, FromType, uint8_t, Val); | 55 COMPARE(cast, FromType, uint8_t, Val, FromTypeString); |
52 COMPARE(cast, FromType, myint8_t, Val); | 56 COMPARE(cast, FromType, myint8_t, Val, FromTypeString); |
53 COMPARE(cast, FromType, uint16_t, Val); | 57 COMPARE(cast, FromType, uint16_t, Val, FromTypeString); |
54 COMPARE(cast, FromType, int16_t, Val); | 58 COMPARE(cast, FromType, int16_t, Val, FromTypeString); |
55 COMPARE(cast, FromType, uint32_t, Val); | 59 COMPARE(cast, FromType, uint32_t, Val, FromTypeString); |
56 COMPARE(cast, FromType, int32_t, Val); | 60 COMPARE(cast, FromType, int32_t, Val, FromTypeString); |
57 COMPARE(cast, FromType, uint64_t, Val); | 61 COMPARE(cast, FromType, uint64_t, Val, FromTypeString); |
58 COMPARE(cast, FromType, int64_t, Val); | 62 COMPARE(cast, FromType, int64_t, Val, FromTypeString); |
59 COMPARE(cast, FromType, float, Val); | 63 COMPARE(cast, FromType, float, Val, FromTypeString); |
60 COMPARE(cast, FromType, double, Val); | 64 COMPARE(cast, FromType, double, Val, FromTypeString); |
61 } | 65 } |
62 | 66 |
63 int main(int argc, char **argv) { | 67 int main(int argc, char **argv) { |
64 size_t TotalTests = 0; | 68 size_t TotalTests = 0; |
65 size_t Passes = 0; | 69 size_t Passes = 0; |
66 size_t Failures = 0; | 70 size_t Failures = 0; |
67 | 71 |
68 volatile bool ValsUi1[] = { false, true }; | 72 volatile bool ValsUi1[] = { false, true }; |
69 static const size_t NumValsUi1 = sizeof(ValsUi1) / sizeof(*ValsUi1); | 73 static const size_t NumValsUi1 = sizeof(ValsUi1) / sizeof(*ValsUi1); |
70 volatile uint8_t ValsUi8[] = { 0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff }; | 74 volatile uint8_t ValsUi8[] = { 0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff }; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 0xfffe, 0xffff, 0x7ffffffe, | 125 0xfffe, 0xffff, 0x7ffffffe, |
122 0x7fffffff, 0x80000000, 0x80000001, | 126 0x7fffffff, 0x80000000, 0x80000001, |
123 0xfffffffe, 0xffffffff, 0x100000000ll, | 127 0xfffffffe, 0xffffffff, 0x100000000ll, |
124 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll, | 128 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll, |
125 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell, | 129 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell, |
126 0xffffffffffffffffll | 130 0xffffffffffffffffll |
127 }; | 131 }; |
128 static const size_t NumValsSi64 = sizeof(ValsSi64) / sizeof(*ValsSi64); | 132 static const size_t NumValsSi64 = sizeof(ValsSi64) / sizeof(*ValsSi64); |
129 | 133 |
130 volatile float ValsF32[] = { | 134 volatile float ValsF32[] = { |
131 0, 1, 0x7e, | 135 0, 1, 1.4, |
| 136 1.5, 1.6, -1.4, |
| 137 -1.5, -1.6, 0x7e, |
132 0x7f, 0x80, 0x81, | 138 0x7f, 0x80, 0x81, |
133 0xfe, 0xff, 0x7ffe, | 139 0xfe, 0xff, 0x7ffe, |
134 0x7fff, 0x8000, 0x8001, | 140 0x7fff, 0x8000, 0x8001, |
135 0xfffe, 0xffff, 0x7ffffffe, | 141 0xfffe, 0xffff, 0x7ffffffe, |
136 0x7fffffff, 0x80000000, 0x80000001, | 142 0x7fffffff, 0x80000000, 0x80000001, |
137 0xfffffffe, 0xffffffff, 0x100000000ll, | 143 0xfffffffe, 0xffffffff, 0x100000000ll, |
138 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll, | 144 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll, |
139 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell, | 145 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell, |
140 0xffffffffffffffffll | 146 0xffffffffffffffffll |
141 }; | 147 }; |
142 static const size_t NumValsF32 = sizeof(ValsF32) / sizeof(*ValsF32); | 148 static const size_t NumValsF32 = sizeof(ValsF32) / sizeof(*ValsF32); |
143 | 149 |
144 volatile double ValsF64[] = { | 150 volatile double ValsF64[] = { |
145 0, 1, 0x7e, | 151 0, 1, 1.4, |
| 152 1.5, 1.6, -1.4, |
| 153 -1.5, -1.6, 0x7e, |
146 0x7f, 0x80, 0x81, | 154 0x7f, 0x80, 0x81, |
147 0xfe, 0xff, 0x7ffe, | 155 0xfe, 0xff, 0x7ffe, |
148 0x7fff, 0x8000, 0x8001, | 156 0x7fff, 0x8000, 0x8001, |
149 0xfffe, 0xffff, 0x7ffffffe, | 157 0xfffe, 0xffff, 0x7ffffffe, |
150 0x7fffffff, 0x80000000, 0x80000001, | 158 0x7fffffff, 0x80000000, 0x80000001, |
151 0xfffffffe, 0xffffffff, 0x100000000ll, | 159 0xfffffffe, 0xffffffff, 0x100000000ll, |
152 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll, | 160 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll, |
153 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell, | 161 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell, |
154 0xffffffffffffffffll | 162 0xffffffffffffffffll |
155 }; | 163 }; |
156 static const size_t NumValsF64 = sizeof(ValsF64) / sizeof(*ValsF64); | 164 static const size_t NumValsF64 = sizeof(ValsF64) / sizeof(*ValsF64); |
157 | 165 |
158 for (size_t i = 0; i < NumValsUi1; ++i) { | 166 for (size_t i = 0; i < NumValsUi1; ++i) { |
159 bool Val = ValsUi1[i]; | 167 bool Val = ValsUi1[i]; |
160 testValue<bool>(Val, TotalTests, Passes, Failures); | 168 testValue<bool>(Val, TotalTests, Passes, Failures, "bool"); |
161 } | 169 } |
162 for (size_t i = 0; i < NumValsUi8; ++i) { | 170 for (size_t i = 0; i < NumValsUi8; ++i) { |
163 uint8_t Val = ValsUi8[i]; | 171 uint8_t Val = ValsUi8[i]; |
164 testValue<uint8_t>(Val, TotalTests, Passes, Failures); | 172 testValue<uint8_t>(Val, TotalTests, Passes, Failures, "uint8_t"); |
165 } | 173 } |
166 for (size_t i = 0; i < NumValsSi8; ++i) { | 174 for (size_t i = 0; i < NumValsSi8; ++i) { |
167 myint8_t Val = ValsSi8[i]; | 175 myint8_t Val = ValsSi8[i]; |
168 testValue<myint8_t>(Val, TotalTests, Passes, Failures); | 176 testValue<myint8_t>(Val, TotalTests, Passes, Failures, "int8_t"); |
169 } | 177 } |
170 for (size_t i = 0; i < NumValsUi16; ++i) { | 178 for (size_t i = 0; i < NumValsUi16; ++i) { |
171 uint16_t Val = ValsUi16[i]; | 179 uint16_t Val = ValsUi16[i]; |
172 testValue<uint16_t>(Val, TotalTests, Passes, Failures); | 180 testValue<uint16_t>(Val, TotalTests, Passes, Failures, "uint16_t"); |
173 } | 181 } |
174 for (size_t i = 0; i < NumValsSi16; ++i) { | 182 for (size_t i = 0; i < NumValsSi16; ++i) { |
175 int16_t Val = ValsSi16[i]; | 183 int16_t Val = ValsSi16[i]; |
176 testValue<int16_t>(Val, TotalTests, Passes, Failures); | 184 testValue<int16_t>(Val, TotalTests, Passes, Failures, "int16_t"); |
177 } | 185 } |
178 for (size_t i = 0; i < NumValsUi32; ++i) { | 186 for (size_t i = 0; i < NumValsUi32; ++i) { |
179 uint32_t Val = ValsUi32[i]; | 187 uint32_t Val = ValsUi32[i]; |
180 testValue<uint32_t>(Val, TotalTests, Passes, Failures); | 188 testValue<uint32_t>(Val, TotalTests, Passes, Failures, "uint32_t"); |
181 COMPARE(castBits, uint32_t, float, Val); | 189 COMPARE(castBits, uint32_t, float, Val, "uint32_t"); |
182 } | 190 } |
183 for (size_t i = 0; i < NumValsSi32; ++i) { | 191 for (size_t i = 0; i < NumValsSi32; ++i) { |
184 int32_t Val = ValsSi32[i]; | 192 int32_t Val = ValsSi32[i]; |
185 testValue<int32_t>(Val, TotalTests, Passes, Failures); | 193 testValue<int32_t>(Val, TotalTests, Passes, Failures, "int32_t"); |
186 } | 194 } |
187 for (size_t i = 0; i < NumValsUi64; ++i) { | 195 for (size_t i = 0; i < NumValsUi64; ++i) { |
188 uint64_t Val = ValsUi64[i]; | 196 uint64_t Val = ValsUi64[i]; |
189 testValue<uint64_t>(Val, TotalTests, Passes, Failures); | 197 testValue<uint64_t>(Val, TotalTests, Passes, Failures, "uint64_t"); |
190 COMPARE(castBits, uint64_t, double, Val); | 198 COMPARE(castBits, uint64_t, double, Val, "uint64_t"); |
191 } | 199 } |
192 for (size_t i = 0; i < NumValsSi64; ++i) { | 200 for (size_t i = 0; i < NumValsSi64; ++i) { |
193 int64_t Val = ValsSi64[i]; | 201 int64_t Val = ValsSi64[i]; |
194 testValue<int64_t>(Val, TotalTests, Passes, Failures); | 202 testValue<int64_t>(Val, TotalTests, Passes, Failures, "int64_t"); |
195 } | 203 } |
196 for (size_t i = 0; i < NumValsF32; ++i) { | 204 for (size_t i = 0; i < NumValsF32; ++i) { |
197 for (unsigned j = 0; j < 2; ++j) { | 205 for (unsigned j = 0; j < 2; ++j) { |
198 float Val = ValsF32[i]; | 206 float Val = ValsF32[i]; |
199 if (j > 0) | 207 if (j > 0) |
200 Val = -Val; | 208 Val = -Val; |
201 testValue<float>(Val, TotalTests, Passes, Failures); | 209 testValue<float>(Val, TotalTests, Passes, Failures, "float"); |
202 COMPARE(castBits, float, uint32_t, Val); | 210 COMPARE(castBits, float, uint32_t, Val, "float"); |
203 } | 211 } |
204 } | 212 } |
205 for (size_t i = 0; i < NumValsF64; ++i) { | 213 for (size_t i = 0; i < NumValsF64; ++i) { |
206 for (unsigned j = 0; j < 2; ++j) { | 214 for (unsigned j = 0; j < 2; ++j) { |
207 double Val = ValsF64[i]; | 215 double Val = ValsF64[i]; |
208 if (j > 0) | 216 if (j > 0) |
209 Val = -Val; | 217 Val = -Val; |
210 testValue<double>(Val, TotalTests, Passes, Failures); | 218 testValue<double>(Val, TotalTests, Passes, Failures, "double"); |
211 COMPARE(castBits, double, uint64_t, Val); | 219 COMPARE(castBits, double, uint64_t, Val, "double"); |
212 } | 220 } |
213 } | 221 } |
214 | 222 |
215 std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes | 223 std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes |
216 << " Failures=" << Failures << "\n"; | 224 << " Failures=" << Failures << "\n"; |
217 return Failures; | 225 return Failures; |
218 } | 226 } |
219 | 227 |
220 //////////////////////////////////////////////////////////////// | 228 //////////////////////////////////////////////////////////////// |
221 | 229 |
222 // The following are helper definitions that should be part of the | 230 // The following are helper definitions that should be part of the |
223 // Subzero runtime. | 231 // Subzero runtime. |
224 | 232 |
225 extern "C" { | 233 extern "C" { |
226 uint32_t cvtdtoui32(double a) { return (uint32_t)a; } | 234 uint32_t cvtdtoui32(double a) { return (uint32_t)a; } |
227 uint32_t cvtftoui32(float a) { return (uint32_t)a; } | 235 uint32_t cvtftoui32(float a) { return (uint32_t)a; } |
228 int64_t cvtdtosi64(double a) { return (int64_t)a; } | 236 int64_t cvtdtosi64(double a) { return (int64_t)a; } |
229 int64_t cvtftosi64(float a) { return (int64_t)a; } | 237 int64_t cvtftosi64(float a) { return (int64_t)a; } |
230 uint64_t cvtdtoui64(double a) { return (uint64_t)a; } | 238 uint64_t cvtdtoui64(double a) { return (uint64_t)a; } |
231 uint64_t cvtftoui64(float a) { return (uint64_t)a; } | 239 uint64_t cvtftoui64(float a) { return (uint64_t)a; } |
232 float cvtui64tof(uint64_t a) { return (float)a; } | 240 float cvtui64tof(uint64_t a) { return (float)a; } |
233 double cvtui64tod(uint64_t a) { return (double)a; } | 241 double cvtui64tod(uint64_t a) { return (double)a; } |
234 float cvtsi64tof(int64_t a) { return (float)a; } | 242 float cvtsi64tof(int64_t a) { return (float)a; } |
235 float cvtui32tof(uint32_t a) { return (float)a; } | 243 float cvtui32tof(uint32_t a) { return (float)a; } |
236 double cvtui32tod(uint32_t a) { return (double)a; } | 244 double cvtui32tod(uint32_t a) { return (double)a; } |
237 double cvtsi64tod(int64_t a) { return (double)a; } | 245 double cvtsi64tod(int64_t a) { return (double)a; } |
238 } | 246 } |
OLD | NEW |