OLD | NEW |
(Empty) | |
| 1 // abtest.py --test=test_cast.cpp --test=test_cast_to_u1.ll --driver=test_cast_m
ain.cpp --prefix=Subzero_ --output=test_cast |
| 2 |
| 3 #include <stdio.h> |
| 4 #include <stdint.h> |
| 5 #include <string.h> |
| 6 |
| 7 #include "test_cast.h" |
| 8 |
| 9 namespace Subzero_ { |
| 10 #include "test_cast.h" |
| 11 } |
| 12 |
| 13 #define XSTR(s) STR(s) |
| 14 #define STR(s) #s |
| 15 #define COMPARE(FromCName, FromIceName, FromPrintf, ToCName, ToIceName, \ |
| 16 ToPrintf, Input) \ |
| 17 do { \ |
| 18 ToCName ResultSz, ResultLlc; \ |
| 19 ResultLlc = cast##FromIceName##To##ToIceName(Input); \ |
| 20 ResultSz = Subzero_::cast##FromIceName##To##ToIceName(Input); \ |
| 21 ++TotalTests; \ |
| 22 if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \ |
| 23 ++Passes; \ |
| 24 } else { \ |
| 25 ++Failures; \ |
| 26 printf("cast" XSTR(FromIceName) "To" XSTR(ToIceName) "(" XSTR( \ |
| 27 FromPrintf) "): " \ |
| 28 "sz=" ToPrintf " llc=" ToPrintf "\n", \ |
| 29 Input, ResultSz, ResultLlc); \ |
| 30 } \ |
| 31 } while (0) |
| 32 |
| 33 int main(int argc, char **argv) { |
| 34 unsigned TotalTests = 0; |
| 35 unsigned Passes = 0; |
| 36 unsigned Failures = 0; |
| 37 |
| 38 static const bool ValsUi1[] = { false, true }; |
| 39 static const unsigned NumValsUi1 = sizeof(ValsUi1) / sizeof(*ValsUi1); |
| 40 static const unsigned char ValsUi8[] = { 0, 1, 0x7e, 0x7f, |
| 41 0x80, 0x81, 0xfe, 0xff }; |
| 42 static const unsigned NumValsUi8 = sizeof(ValsUi8) / sizeof(*ValsUi8); |
| 43 |
| 44 static const signed char ValsSi8[] = { 0, 1, 0x7e, 0x7f, |
| 45 0x80, 0x81, 0xfe, 0xff }; |
| 46 static const unsigned NumValsSi8 = sizeof(ValsSi8) / sizeof(*ValsSi8); |
| 47 |
| 48 static const unsigned short ValsUi16[] = { 0, 1, 0x7e, 0x7f, |
| 49 0x80, 0x81, 0xfe, 0xff, |
| 50 0x7ffe, 0x7fff, 0x8000, 0x8001, |
| 51 0xfffe, 0xffff }; |
| 52 static const unsigned NumValsUi16 = sizeof(ValsUi16) / sizeof(*ValsUi16); |
| 53 |
| 54 static const short ValsSi16[] = { 0, 1, 0x7e, 0x7f, 0x80, |
| 55 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff, |
| 56 0x8000, 0x8001, 0xfffe, 0xffff }; |
| 57 static const unsigned NumValsSi16 = sizeof(ValsSi16) / sizeof(*ValsSi16); |
| 58 |
| 59 static const unsigned ValsUi32[] = { |
| 60 0, 1, 0x7e, 0x7f, 0x80, |
| 61 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff, |
| 62 0x8000, 0x8001, 0xfffe, 0xffff, 0x7ffffffe, |
| 63 0x7fffffff, 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff |
| 64 }; |
| 65 static const unsigned NumValsUi32 = sizeof(ValsUi32) / sizeof(*ValsUi32); |
| 66 |
| 67 static const unsigned ValsSi32[] = { |
| 68 0, 1, 0x7e, 0x7f, 0x80, |
| 69 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff, |
| 70 0x8000, 0x8001, 0xfffe, 0xffff, 0x7ffffffe, |
| 71 0x7fffffff, 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff |
| 72 }; |
| 73 static const unsigned NumValsSi32 = sizeof(ValsSi32) / sizeof(*ValsSi32); |
| 74 |
| 75 static const uint64_t ValsUi64[] = { |
| 76 0, 1, 0x7e, |
| 77 0x7f, 0x80, 0x81, |
| 78 0xfe, 0xff, 0x7ffe, |
| 79 0x7fff, 0x8000, 0x8001, |
| 80 0xfffe, 0xffff, 0x7ffffffe, |
| 81 0x7fffffff, 0x80000000, 0x80000001, |
| 82 0xfffffffe, 0xffffffff, 0x100000000ull, |
| 83 0x100000001ull, 0x7ffffffffffffffeull, 0x7fffffffffffffffull, |
| 84 0x8000000000000000ull, 0x8000000000000001ull, 0xfffffffffffffffeull, |
| 85 0xffffffffffffffffull |
| 86 }; |
| 87 static const unsigned NumValsUi64 = sizeof(ValsUi64) / sizeof(*ValsUi64); |
| 88 |
| 89 static const int64_t ValsSi64[] = { |
| 90 0, 1, 0x7e, |
| 91 0x7f, 0x80, 0x81, |
| 92 0xfe, 0xff, 0x7ffe, |
| 93 0x7fff, 0x8000, 0x8001, |
| 94 0xfffe, 0xffff, 0x7ffffffe, |
| 95 0x7fffffff, 0x80000000, 0x80000001, |
| 96 0xfffffffe, 0xffffffff, 0x100000000ll, |
| 97 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll, |
| 98 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell, |
| 99 0xffffffffffffffffll |
| 100 }; |
| 101 static const unsigned NumValsSi64 = sizeof(ValsSi64) / sizeof(*ValsSi64); |
| 102 |
| 103 static const float ValsF32[] = { |
| 104 0, 1, 0x7e, |
| 105 0x7f, 0x80, 0x81, |
| 106 0xfe, 0xff, 0x7ffe, |
| 107 0x7fff, 0x8000, 0x8001, |
| 108 0xfffe, 0xffff, 0x7ffffffe, |
| 109 0x7fffffff, 0x80000000, 0x80000001, |
| 110 0xfffffffe, 0xffffffff, 0x100000000ll, |
| 111 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll, |
| 112 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell, |
| 113 0xffffffffffffffffll |
| 114 }; |
| 115 static const unsigned NumValsF32 = sizeof(ValsF32) / sizeof(*ValsF32); |
| 116 |
| 117 static const double ValsF64[] = { |
| 118 0, 1, 0x7e, |
| 119 0x7f, 0x80, 0x81, |
| 120 0xfe, 0xff, 0x7ffe, |
| 121 0x7fff, 0x8000, 0x8001, |
| 122 0xfffe, 0xffff, 0x7ffffffe, |
| 123 0x7fffffff, 0x80000000, 0x80000001, |
| 124 0xfffffffe, 0xffffffff, 0x100000000ll, |
| 125 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll, |
| 126 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell, |
| 127 0xffffffffffffffffll |
| 128 }; |
| 129 static const unsigned NumValsF64 = sizeof(ValsF64) / sizeof(*ValsF64); |
| 130 |
| 131 for (unsigned i = 0; i < NumValsUi1; ++i) { |
| 132 { |
| 133 bool Val = ValsUi1[i]; |
| 134 COMPARE(bool, Ui1, "%u", bool, Ui1, "%u", Val); |
| 135 COMPARE(bool, Ui1, "%u", unsigned char, Ui8, "%u", Val); |
| 136 COMPARE(bool, Ui1, "%u", signed char, Si8, "%d", Val); |
| 137 COMPARE(bool, Ui1, "%u", unsigned short, Ui16, "%u", Val); |
| 138 COMPARE(bool, Ui1, "%u", short, Si16, "%d", Val); |
| 139 COMPARE(bool, Ui1, "%u", uint32_t, Ui32, "%u", Val); |
| 140 COMPARE(bool, Ui1, "%u", int32_t, Si32, "%d", Val); |
| 141 COMPARE(bool, Ui1, "%u", uint64_t, Ui64, "%llu", Val); |
| 142 COMPARE(bool, Ui1, "%u", int64_t, Si64, "%lld", Val); |
| 143 COMPARE(bool, Ui1, "%u", float, F32, "%f", Val); |
| 144 COMPARE(bool, Ui1, "%u", double, F64, "%f", Val); |
| 145 } |
| 146 } |
| 147 for (unsigned i = 0; i < NumValsUi8; ++i) { |
| 148 { |
| 149 unsigned char Val = ValsUi8[i]; |
| 150 COMPARE(unsigned char, Ui8, "%u", bool, Ui1, "%u", Val); |
| 151 COMPARE(unsigned char, Ui8, "%u", unsigned char, Ui8, "%u", Val); |
| 152 COMPARE(unsigned char, Ui8, "%u", signed char, Si8, "%d", Val); |
| 153 COMPARE(unsigned char, Ui8, "%u", unsigned short, Ui16, "%u", Val); |
| 154 COMPARE(unsigned char, Ui8, "%u", short, Si16, "%d", Val); |
| 155 COMPARE(unsigned char, Ui8, "%u", uint32_t, Ui32, "%u", Val); |
| 156 COMPARE(unsigned char, Ui8, "%u", int32_t, Si32, "%d", Val); |
| 157 COMPARE(unsigned char, Ui8, "%u", uint64_t, Ui64, "%llu", Val); |
| 158 COMPARE(unsigned char, Ui8, "%u", int64_t, Si64, "%lld", Val); |
| 159 COMPARE(unsigned char, Ui8, "%u", float, F32, "%f", Val); |
| 160 COMPARE(unsigned char, Ui8, "%u", double, F64, "%f", Val); |
| 161 } |
| 162 } |
| 163 for (unsigned i = 0; i < NumValsSi8; ++i) { |
| 164 { |
| 165 signed char Val = ValsSi8[i]; |
| 166 COMPARE(signed char, Si8, "%d", bool, Ui1, "%u", Val); |
| 167 COMPARE(signed char, Si8, "%d", unsigned char, Ui8, "%u", Val); |
| 168 COMPARE(signed char, Si8, "%d", signed char, Si8, "%d", Val); |
| 169 COMPARE(signed char, Si8, "%d", unsigned short, Ui16, "%u", Val); |
| 170 COMPARE(signed char, Si8, "%d", short, Si16, "%d", Val); |
| 171 COMPARE(signed char, Si8, "%d", uint32_t, Ui32, "%u", Val); |
| 172 COMPARE(signed char, Si8, "%d", int32_t, Si32, "%d", Val); |
| 173 COMPARE(signed char, Si8, "%d", uint64_t, Ui64, "%llu", Val); |
| 174 COMPARE(signed char, Si8, "%d", int64_t, Si64, "%lld", Val); |
| 175 COMPARE(signed char, Si8, "%d", float, F32, "%f", Val); |
| 176 COMPARE(signed char, Si8, "%d", double, F64, "%f", Val); |
| 177 } |
| 178 } |
| 179 for (unsigned i = 0; i < NumValsUi16; ++i) { |
| 180 { |
| 181 unsigned short Val = ValsUi16[i]; |
| 182 COMPARE(unsigned short, Ui16, "%u", bool, Ui1, "%u", Val); |
| 183 COMPARE(unsigned short, Ui16, "%u", unsigned char, Ui8, "%u", Val); |
| 184 COMPARE(unsigned short, Ui16, "%u", signed char, Si8, "%d", Val); |
| 185 COMPARE(unsigned short, Ui16, "%u", unsigned short, Ui16, "%u", Val); |
| 186 COMPARE(unsigned short, Ui16, "%u", short, Si16, "%d", Val); |
| 187 COMPARE(unsigned short, Ui16, "%u", uint32_t, Ui32, "%u", Val); |
| 188 COMPARE(unsigned short, Ui16, "%u", int32_t, Si32, "%d", Val); |
| 189 COMPARE(unsigned short, Ui16, "%u", uint64_t, Ui64, "%llu", Val); |
| 190 COMPARE(unsigned short, Ui16, "%u", int64_t, Si64, "%lld", Val); |
| 191 COMPARE(unsigned short, Ui16, "%u", float, F32, "%f", Val); |
| 192 COMPARE(unsigned short, Ui16, "%u", double, F64, "%f", Val); |
| 193 } |
| 194 } |
| 195 for (unsigned i = 0; i < NumValsSi16; ++i) { |
| 196 { |
| 197 signed char Val = ValsSi16[i]; |
| 198 COMPARE(short, Si16, "%d", bool, Ui1, "%u", Val); |
| 199 COMPARE(short, Si16, "%d", unsigned char, Ui8, "%u", Val); |
| 200 COMPARE(short, Si16, "%d", signed char, Si8, "%d", Val); |
| 201 COMPARE(short, Si16, "%d", unsigned short, Ui16, "%u", Val); |
| 202 COMPARE(short, Si16, "%d", short, Si16, "%d", Val); |
| 203 COMPARE(short, Si16, "%d", uint32_t, Ui32, "%u", Val); |
| 204 COMPARE(short, Si16, "%d", int32_t, Si32, "%d", Val); |
| 205 COMPARE(short, Si16, "%d", uint64_t, Ui64, "%llu", Val); |
| 206 COMPARE(short, Si16, "%d", int64_t, Si64, "%lld", Val); |
| 207 COMPARE(short, Si16, "%d", float, F32, "%f", Val); |
| 208 COMPARE(short, Si16, "%d", double, F64, "%f", Val); |
| 209 } |
| 210 } |
| 211 for (unsigned i = 0; i < NumValsUi32; ++i) { |
| 212 { |
| 213 unsigned Val = ValsUi32[i]; |
| 214 COMPARE(unsigned, Ui32, "%u", bool, Ui1, "%u", Val); |
| 215 COMPARE(unsigned, Ui32, "%u", unsigned char, Ui8, "%u", Val); |
| 216 COMPARE(unsigned, Ui32, "%u", signed char, Si8, "%d", Val); |
| 217 COMPARE(unsigned, Ui32, "%u", unsigned short, Ui16, "%u", Val); |
| 218 COMPARE(unsigned, Ui32, "%u", short, Si16, "%d", Val); |
| 219 COMPARE(unsigned, Ui32, "%u", uint32_t, Ui32, "%u", Val); |
| 220 COMPARE(unsigned, Ui32, "%u", int32_t, Si32, "%d", Val); |
| 221 COMPARE(unsigned, Ui32, "%u", uint64_t, Ui64, "%llu", Val); |
| 222 COMPARE(unsigned, Ui32, "%u", int64_t, Si64, "%lld", Val); |
| 223 COMPARE(unsigned, Ui32, "%u", float, F32, "%f", Val); |
| 224 COMPARE(unsigned, Ui32, "%u", double, F64, "%f", Val); |
| 225 COMPARE(unsigned, bits_Ui32, "%u", float, F32, "%f", Val); |
| 226 } |
| 227 } |
| 228 for (unsigned i = 0; i < NumValsSi32; ++i) { |
| 229 { |
| 230 int Val = ValsSi32[i]; |
| 231 COMPARE(int, Si32, "%d", bool, Ui1, "%u", Val); |
| 232 COMPARE(int, Si32, "%d", unsigned char, Ui8, "%u", Val); |
| 233 COMPARE(int, Si32, "%d", signed char, Si8, "%d", Val); |
| 234 COMPARE(int, Si32, "%d", unsigned short, Ui16, "%u", Val); |
| 235 COMPARE(int, Si32, "%d", short, Si16, "%d", Val); |
| 236 COMPARE(int, Si32, "%d", uint32_t, Ui32, "%u", Val); |
| 237 COMPARE(int, Si32, "%d", int32_t, Si32, "%d", Val); |
| 238 COMPARE(int, Si32, "%d", uint64_t, Ui64, "%llu", Val); |
| 239 COMPARE(int, Si32, "%d", int64_t, Si64, "%lld", Val); |
| 240 COMPARE(int, Si32, "%d", float, F32, "%f", Val); |
| 241 COMPARE(int, Si32, "%d", double, F64, "%f", Val); |
| 242 } |
| 243 } |
| 244 for (unsigned i = 0; i < NumValsUi64; ++i) { |
| 245 { |
| 246 uint64_t Val = ValsUi64[i]; |
| 247 COMPARE(uint64_t, Ui64, "%llu", bool, Ui1, "%u", Val); |
| 248 COMPARE(uint64_t, Ui64, "%llu", unsigned char, Ui8, "%u", Val); |
| 249 COMPARE(uint64_t, Ui64, "%llu", signed char, Si8, "%d", Val); |
| 250 COMPARE(uint64_t, Ui64, "%llu", unsigned short, Ui16, "%u", Val); |
| 251 COMPARE(uint64_t, Ui64, "%llu", short, Si16, "%d", Val); |
| 252 COMPARE(uint64_t, Ui64, "%llu", uint32_t, Ui32, "%u", Val); |
| 253 COMPARE(uint64_t, Ui64, "%llu", int32_t, Si32, "%d", Val); |
| 254 COMPARE(uint64_t, Ui64, "%llu", uint64_t, Ui64, "%llu", Val); |
| 255 COMPARE(uint64_t, Ui64, "%llu", int64_t, Si64, "%lld", Val); |
| 256 COMPARE(uint64_t, Ui64, "%llu", float, F32, "%f", Val); |
| 257 COMPARE(uint64_t, Ui64, "%llu", double, F64, "%f", Val); |
| 258 COMPARE(uint64_t, bits_Ui64, "%llu", float, F64, "%f", Val); |
| 259 } |
| 260 } |
| 261 for (unsigned i = 0; i < NumValsSi64; ++i) { |
| 262 { |
| 263 uint64_t Val = ValsSi64[i]; |
| 264 COMPARE(int64_t, Si64, "%lld", bool, Ui1, "%u", Val); |
| 265 COMPARE(int64_t, Si64, "%lld", unsigned char, Ui8, "%u", Val); |
| 266 COMPARE(int64_t, Si64, "%lld", signed char, Si8, "%d", Val); |
| 267 COMPARE(int64_t, Si64, "%lld", unsigned short, Ui16, "%u", Val); |
| 268 COMPARE(int64_t, Si64, "%lld", short, Si16, "%d", Val); |
| 269 COMPARE(int64_t, Si64, "%lld", uint32_t, Ui32, "%u", Val); |
| 270 COMPARE(int64_t, Si64, "%lld", int32_t, Si32, "%d", Val); |
| 271 COMPARE(int64_t, Si64, "%lld", uint64_t, Ui64, "%llu", Val); |
| 272 COMPARE(int64_t, Si64, "%lld", int64_t, Si64, "%lld", Val); |
| 273 COMPARE(int64_t, Si64, "%lld", float, F32, "%f", Val); |
| 274 COMPARE(int64_t, Si64, "%lld", double, F64, "%f", Val); |
| 275 } |
| 276 } |
| 277 for (unsigned i = 0; i < NumValsF32; ++i) { |
| 278 for (unsigned j = 0; j < 2; ++j) { |
| 279 float Val = ValsF32[i]; |
| 280 if (j > 0) |
| 281 Val = -Val; |
| 282 COMPARE(float, F32, "%f", bool, Ui1, "%u", Val); |
| 283 COMPARE(float, F32, "%f", unsigned char, Ui8, "%u", Val); |
| 284 COMPARE(float, F32, "%f", signed char, Si8, "%d", Val); |
| 285 COMPARE(float, F32, "%f", unsigned short, Ui16, "%u", Val); |
| 286 COMPARE(float, F32, "%f", short, Si16, "%d", Val); |
| 287 COMPARE(float, F32, "%f", uint32_t, Ui32, "%u", Val); |
| 288 COMPARE(float, F32, "%f", int32_t, Si32, "%d", Val); |
| 289 COMPARE(float, F32, "%f", uint64_t, Ui64, "%llu", Val); |
| 290 COMPARE(float, F32, "%f", int64_t, Si64, "%lld", Val); |
| 291 COMPARE(float, F32, "%f", float, F32, "%f", Val); |
| 292 COMPARE(float, F32, "%f", double, F64, "%f", Val); |
| 293 COMPARE(float, bits_F32, "%f", uint32_t, Ui32, "%u", Val); |
| 294 } |
| 295 } |
| 296 for (unsigned i = 0; i < NumValsF64; ++i) { |
| 297 for (unsigned j = 0; j < 2; ++j) { |
| 298 double Val = ValsF64[i]; |
| 299 if (j > 0) |
| 300 Val = -Val; |
| 301 COMPARE(double, F64, "%f", bool, Ui1, "%u", Val); |
| 302 COMPARE(double, F64, "%f", unsigned char, Ui8, "%u", Val); |
| 303 COMPARE(double, F64, "%f", signed char, Si8, "%d", Val); |
| 304 COMPARE(double, F64, "%f", unsigned short, Ui16, "%u", Val); |
| 305 COMPARE(double, F64, "%f", short, Si16, "%d", Val); |
| 306 COMPARE(double, F64, "%f", uint32_t, Ui32, "%u", Val); |
| 307 COMPARE(double, F64, "%f", int32_t, Si32, "%d", Val); |
| 308 COMPARE(double, F64, "%f", uint64_t, Ui64, "%llu", Val); |
| 309 COMPARE(double, F64, "%f", int64_t, Si64, "%lld", Val); |
| 310 COMPARE(double, F64, "%f", float, F32, "%f", Val); |
| 311 COMPARE(double, F64, "%f", double, F64, "%f", Val); |
| 312 COMPARE(double, bits_F64, "%f", uint64_t, Ui64, "%llu", Val); |
| 313 } |
| 314 } |
| 315 |
| 316 printf("TotalTests=%u Passes=%u Failures=%u\n", TotalTests, Passes, Failures); |
| 317 return Failures; |
| 318 } |
| 319 |
| 320 //////////////////////////////////////////////////////////////// |
| 321 |
| 322 // The following are helper definitions that should be part of the |
| 323 // Subzero runtime. |
| 324 |
| 325 extern "C" uint32_t cvtdtoui32(double a) { return (uint32_t)a; } |
| 326 |
| 327 extern "C" uint32_t cvtftoui32(float a) { return (uint32_t)a; } |
| 328 |
| 329 extern "C" int64_t cvtdtosi64(double a) { return (int64_t)a; } |
| 330 |
| 331 extern "C" int64_t cvtftosi64(float a) { return (int64_t)a; } |
| 332 |
| 333 extern "C" uint64_t cvtdtoui64(double a) { return (uint64_t)a; } |
| 334 |
| 335 extern "C" uint64_t cvtftoui64(float a) { return (uint64_t)a; } |
| 336 |
| 337 extern "C" float cvtui64tof(uint64_t a) { return (float)a; } |
| 338 |
| 339 extern "C" double cvtui64tod(uint64_t a) { return (double)a; } |
| 340 |
| 341 extern "C" float cvtsi64tof(int64_t a) { return (float)a; } |
| 342 |
| 343 extern "C" float cvtui32tof(uint32_t a) { return (float)a; } |
| 344 |
| 345 extern "C" double cvtui32tod(uint32_t a) { return (double)a; } |
| 346 |
| 347 extern "C" double cvtsi64tod(int64_t a) { return (double)a; } |
OLD | NEW |