| 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 |