17da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth//===- subzero/crosstest/test_cast_main.cpp - Driver for tests ------------===// 27da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth// 37da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth// The Subzero Code Generator 47da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth// 57da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth// This file is distributed under the University of Illinois Open Source 67da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth// License. See LICENSE.TXT for details. 77da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth// 87da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth//===----------------------------------------------------------------------===// 97da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth// 107da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth// Driver for crosstesting cast operations. 117da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth// 127da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth//===----------------------------------------------------------------------===// 137da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth 145bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth/* crosstest.py --test=test_cast.cpp --test=test_cast_to_u1.ll \ 15109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung --test=test_cast_vectors.ll \ 165bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth --driver=test_cast_main.cpp --prefix=Subzero_ --output=test_cast */ 175bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 18109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung#include <cfloat> 195bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#include <cstring> 205bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#include <iostream> 215bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#include <stdint.h> 225bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 23109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung#include "test_arith.def" 24109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung#include "vectors.h" 251d235425dab1f3dd059973fc53f1b1d5879469e3John Porto#include "xdefs.h" 26109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung 275bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth// Include test_cast.h twice - once normally, and once within the 285bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth// Subzero_ namespace, corresponding to the llc and Subzero translated 295bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth// object files, respectively. 305bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#include "test_cast.h" 315bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnothnamespace Subzero_ { 325bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#include "test_cast.h" 335bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth} 345bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 355bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#define XSTR(s) STR(s) 365bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#define STR(s) #s 37b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth#define COMPARE(Func, FromCName, ToCName, Input, FromString) \ 385bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth do { \ 395bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth ToCName ResultSz, ResultLlc; \ 405bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth ResultLlc = Func<FromCName, ToCName>(Input); \ 415bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth ResultSz = Subzero_::Func<FromCName, ToCName>(Input); \ 425bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth ++TotalTests; \ 435bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \ 445bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth ++Passes; \ 455bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } else { \ 465bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth ++Failures; \ 47b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth std::cout << std::fixed << XSTR(Func) << "<" << FromString \ 48b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth << ", " XSTR(ToCName) ">(" << Input << "): "; \ 49b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth if (sizeof(ToCName) == 1) \ 50b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth std::cout << "sz=" << (int)ResultSz << " llc=" << (int)ResultLlc; \ 51b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth else \ 52b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth std::cout << "sz=" << ResultSz << " llc=" << ResultLlc; \ 53b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth std::cout << "\n"; \ 545bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } \ 555bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } while (0) 565bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 57a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil#define COMPARE_ARG(Func, FromCName, ToCName, Input, FromString) \ 58a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil do { \ 59a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil ToCName ResultSz, ResultLlc; \ 60a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil ResultLlc = Func<FromCName, ToCName>(1, Input, 2); \ 61a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil ResultSz = Subzero_::Func<FromCName, ToCName>(1, Input, 2); \ 62a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil ++TotalTests; \ 63a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \ 64a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil ++Passes; \ 65a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil } else { \ 66a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil ++Failures; \ 67a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil std::cout << std::fixed << XSTR(Func) << "<" << FromString \ 68a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil << ", " XSTR(ToCName) ">(" << Input << "): "; \ 69a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil if (sizeof(ToCName) == 1) \ 70a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil std::cout << "sz=" << (int)ResultSz << " llc=" << (int)ResultLlc; \ 71a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil else \ 72a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil std::cout << "sz=" << ResultSz << " llc=" << ResultLlc; \ 73a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil std::cout << "\n"; \ 74a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil } \ 75a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil } while (0) 76a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil 77109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung#define COMPARE_VEC(Func, FromCName, ToCName, Input, FromString, ToString) \ 78109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung do { \ 79109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung ToCName ResultSz, ResultLlc; \ 80109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung ResultLlc = Func<FromCName, ToCName>(Input); \ 81109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung ResultSz = Subzero_::Func<FromCName, ToCName>(Input); \ 82109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung ++TotalTests; \ 83109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \ 84109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung ++Passes; \ 85109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung } else { \ 86109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung ++Failures; \ 87109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung std::cout << std::fixed << XSTR(Func) << "<" << FromString << ", " \ 88109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung << ToString << ">(" << vectAsString<FromCName>(Input) \ 89109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung << "): "; \ 90109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung std::cout << "sz=" << vectAsString<ToCName>(ResultSz) \ 91109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung << " llc=" << vectAsString<ToCName>(ResultLlc); \ 92109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung std::cout << "\n"; \ 93109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung } \ 94109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung } while (0) 95109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung 965bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnothtemplate <typename FromType> 975bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnothvoid testValue(FromType Val, size_t &TotalTests, size_t &Passes, 98b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth size_t &Failures, const char *FromTypeString) { 99b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth COMPARE(cast, FromType, bool, Val, FromTypeString); 100b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth COMPARE(cast, FromType, uint8_t, Val, FromTypeString); 101b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth COMPARE(cast, FromType, myint8_t, Val, FromTypeString); 102b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth COMPARE(cast, FromType, uint16_t, Val, FromTypeString); 103b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth COMPARE(cast, FromType, int16_t, Val, FromTypeString); 104b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth COMPARE(cast, FromType, uint32_t, Val, FromTypeString); 105b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth COMPARE(cast, FromType, int32_t, Val, FromTypeString); 1061d235425dab1f3dd059973fc53f1b1d5879469e3John Porto COMPARE(cast, FromType, uint64, Val, FromTypeString); 1071d235425dab1f3dd059973fc53f1b1d5879469e3John Porto COMPARE(cast, FromType, int64, Val, FromTypeString); 108b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth COMPARE(cast, FromType, float, Val, FromTypeString); 109b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth COMPARE(cast, FromType, double, Val, FromTypeString); 110a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(cast, FromType, bool, Val, FromTypeString); 111a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(cast, FromType, uint8_t, Val, FromTypeString); 112a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(cast, FromType, myint8_t, Val, FromTypeString); 113a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(cast, FromType, uint16_t, Val, FromTypeString); 114a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(cast, FromType, int16_t, Val, FromTypeString); 115a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(cast, FromType, uint32_t, Val, FromTypeString); 116a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(cast, FromType, int32_t, Val, FromTypeString); 117a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(cast, FromType, uint64, Val, FromTypeString); 118a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(cast, FromType, int64, Val, FromTypeString); 119a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(cast, FromType, float, Val, FromTypeString); 120a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(cast, FromType, double, Val, FromTypeString); 1215bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth} 1225bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 123109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voungtemplate <typename FromType, typename ToType> 124109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voungvoid testVector(size_t &TotalTests, size_t &Passes, size_t &Failures, 125109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung const char *FromTypeString, const char *ToTypeString) { 126109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung const static size_t NumElementsInType = Vectors<FromType>::NumElements; 127109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung PRNG Index; 128109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung static const float NegInf = -1.0 / 0.0; 129109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung static const float PosInf = 1.0 / 0.0; 130109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung static const float Nan = 0.0 / 0.0; 131109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung static const float NegNan = -0.0 / 0.0; 132109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung volatile float Values[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan); 133109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung static const size_t NumValues = sizeof(Values) / sizeof(*Values); 134109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung const size_t MaxTestsPerFunc = 20000; 135109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung for (size_t i = 0; i < MaxTestsPerFunc; ++i) { 136109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung // Initialize the test vectors. 137109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung FromType Value; 138109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung for (size_t j = 0; j < NumElementsInType; ++j) { 139109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung Value[j] = Values[Index() % NumValues]; 140109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung } 141109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung COMPARE_VEC(cast, FromType, ToType, Value, FromTypeString, ToTypeString); 142109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung } 143109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung} 144109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung 1451d235425dab1f3dd059973fc53f1b1d5879469e3John Portoint main(int argc, char *argv[]) { 1465bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth size_t TotalTests = 0; 1475bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth size_t Passes = 0; 1485bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth size_t Failures = 0; 1495bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 150dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth volatile bool ValsUi1[] = {false, true}; 1515bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth static const size_t NumValsUi1 = sizeof(ValsUi1) / sizeof(*ValsUi1); 152dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth volatile uint8_t ValsUi8[] = {0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff}; 1535bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth static const size_t NumValsUi8 = sizeof(ValsUi8) / sizeof(*ValsUi8); 1545bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 155dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth volatile myint8_t ValsSi8[] = {0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff}; 1565bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth static const size_t NumValsSi8 = sizeof(ValsSi8) / sizeof(*ValsSi8); 1575bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 158dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth volatile uint16_t ValsUi16[] = {0, 1, 0x7e, 0x7f, 0x80, 159dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff, 160dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0x8000, 0x8001, 0xfffe, 0xffff}; 1615bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth static const size_t NumValsUi16 = sizeof(ValsUi16) / sizeof(*ValsUi16); 1625bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 163dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth volatile int16_t ValsSi16[] = {0, 1, 0x7e, 0x7f, 0x80, 164dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff, 165dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0x8000, 0x8001, 0xfffe, 0xffff}; 1665bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth static const size_t NumValsSi16 = sizeof(ValsSi16) / sizeof(*ValsSi16); 1675bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 168dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth volatile size_t ValsUi32[] = {0, 1, 0x7e, 0x7f, 169dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0x80, 0x81, 0xfe, 0xff, 170dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0x7ffe, 0x7fff, 0x8000, 0x8001, 171dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0xfffe, 0xffff, 0x7ffffffe, 0x7fffffff, 172dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff}; 1735bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth static const size_t NumValsUi32 = sizeof(ValsUi32) / sizeof(*ValsUi32); 1745bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 175dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth volatile size_t ValsSi32[] = {0, 1, 0x7e, 0x7f, 176dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0x80, 0x81, 0xfe, 0xff, 177dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0x7ffe, 0x7fff, 0x8000, 0x8001, 178dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0xfffe, 0xffff, 0x7ffffffe, 0x7fffffff, 179dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff}; 1805bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth static const size_t NumValsSi32 = sizeof(ValsSi32) / sizeof(*ValsSi32); 1815bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 1821d235425dab1f3dd059973fc53f1b1d5879469e3John Porto volatile uint64 ValsUi64[] = { 183d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth 0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff, 0x8000, 0x8001, 184d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth 0xfffe, 0xffff, 0x7ffffffe, 0x7fffffff, 0x80000000, 0x80000001, 185d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth 0xfffffffe, 0xffffffff, 0x100000000ull, 0x100000001ull, 186d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth 0x7ffffffffffffffeull, 0x7fffffffffffffffull, 0x8000000000000000ull, 187d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth 0x8000000000000001ull, 0xfffffffffffffffeull, 0xffffffffffffffffull}; 1885bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth static const size_t NumValsUi64 = sizeof(ValsUi64) / sizeof(*ValsUi64); 1895bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 1901d235425dab1f3dd059973fc53f1b1d5879469e3John Porto volatile int64 ValsSi64[] = { 191d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth 0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff, 0x8000, 0x8001, 192d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth 0xfffe, 0xffff, 0x7ffffffe, 0x7fffffff, 0x80000000, 0x80000001, 193d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth 0xfffffffe, 0xffffffff, 0x100000000ll, 0x100000001ll, 194d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth 0x7ffffffffffffffell, 0x7fffffffffffffffll, 0x8000000000000000ll, 195d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth 0x8000000000000001ll, 0xfffffffffffffffell, 0xffffffffffffffffll}; 1965bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth static const size_t NumValsSi64 = sizeof(ValsSi64) / sizeof(*ValsSi64); 1975bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 198109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung static const double NegInf = -1.0 / 0.0; 199109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung static const double PosInf = 1.0 / 0.0; 200109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung static const double Nan = 0.0 / 0.0; 201109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung static const double NegNan = -0.0 / 0.0; 202109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung volatile float ValsF32[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan); 2035bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth static const size_t NumValsF32 = sizeof(ValsF32) / sizeof(*ValsF32); 2045bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 205109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung volatile double ValsF64[] = FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan); 2065bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth static const size_t NumValsF64 = sizeof(ValsF64) / sizeof(*ValsF64); 2075bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 2085bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (size_t i = 0; i < NumValsUi1; ++i) { 2095bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth bool Val = ValsUi1[i]; 210b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth testValue<bool>(Val, TotalTests, Passes, Failures, "bool"); 2115bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2125bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (size_t i = 0; i < NumValsUi8; ++i) { 2135bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth uint8_t Val = ValsUi8[i]; 214b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth testValue<uint8_t>(Val, TotalTests, Passes, Failures, "uint8_t"); 2155bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2165bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (size_t i = 0; i < NumValsSi8; ++i) { 2177da431b59be69bc6af383f3288f48f816b1c4f07Jim Stichnoth myint8_t Val = ValsSi8[i]; 218b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth testValue<myint8_t>(Val, TotalTests, Passes, Failures, "int8_t"); 2195bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2205bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (size_t i = 0; i < NumValsUi16; ++i) { 2215bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth uint16_t Val = ValsUi16[i]; 222b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth testValue<uint16_t>(Val, TotalTests, Passes, Failures, "uint16_t"); 2235bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2245bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (size_t i = 0; i < NumValsSi16; ++i) { 2255bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth int16_t Val = ValsSi16[i]; 226b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth testValue<int16_t>(Val, TotalTests, Passes, Failures, "int16_t"); 2275bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2285bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (size_t i = 0; i < NumValsUi32; ++i) { 2295bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth uint32_t Val = ValsUi32[i]; 230b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth testValue<uint32_t>(Val, TotalTests, Passes, Failures, "uint32_t"); 231b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth COMPARE(castBits, uint32_t, float, Val, "uint32_t"); 232a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(castBits, uint32_t, float, Val, "uint32_t"); 2335bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2345bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (size_t i = 0; i < NumValsSi32; ++i) { 2355bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth int32_t Val = ValsSi32[i]; 236b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth testValue<int32_t>(Val, TotalTests, Passes, Failures, "int32_t"); 2375bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2385bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (size_t i = 0; i < NumValsUi64; ++i) { 2391d235425dab1f3dd059973fc53f1b1d5879469e3John Porto uint64 Val = ValsUi64[i]; 2401d235425dab1f3dd059973fc53f1b1d5879469e3John Porto testValue<uint64>(Val, TotalTests, Passes, Failures, "uint64"); 2411d235425dab1f3dd059973fc53f1b1d5879469e3John Porto COMPARE(castBits, uint64, double, Val, "uint64"); 242a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(castBits, uint64, double, Val, "uint64"); 2435bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2445bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (size_t i = 0; i < NumValsSi64; ++i) { 2451d235425dab1f3dd059973fc53f1b1d5879469e3John Porto int64 Val = ValsSi64[i]; 2461d235425dab1f3dd059973fc53f1b1d5879469e3John Porto testValue<int64>(Val, TotalTests, Passes, Failures, "int64"); 2475bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2485bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (size_t i = 0; i < NumValsF32; ++i) { 2495bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (unsigned j = 0; j < 2; ++j) { 2505bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth float Val = ValsF32[i]; 2515bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth if (j > 0) 2525bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth Val = -Val; 253b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth testValue<float>(Val, TotalTests, Passes, Failures, "float"); 254b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth COMPARE(castBits, float, uint32_t, Val, "float"); 255a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(castBits, float, uint32_t, Val, "float"); 2565bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2575bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2585bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (size_t i = 0; i < NumValsF64; ++i) { 2595bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth for (unsigned j = 0; j < 2; ++j) { 2605bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth double Val = ValsF64[i]; 2615bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth if (j > 0) 2625bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth Val = -Val; 263b63cd886c9d2d2e351d1da16570fd311415156b5Jim Stichnoth testValue<double>(Val, TotalTests, Passes, Failures, "double"); 2641d235425dab1f3dd059973fc53f1b1d5879469e3John Porto COMPARE(castBits, double, uint64, Val, "double"); 265a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil COMPARE_ARG(castBits, double, uint64, Val, "double"); 2665bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 2675bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth } 268a7979bfd84bc01c0891169e8d058063fe699cc0eJaydeep Patil 269109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung testVector<v4ui32, v4f32>(TotalTests, Passes, Failures, "v4ui32", "v4f32"); 270109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung testVector<v4si32, v4f32>(TotalTests, Passes, Failures, "v4si32", "v4f32"); 271109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung testVector<v4f32, v4si32>(TotalTests, Passes, Failures, "v4f32", "v4si32"); 272109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung testVector<v4f32, v4ui32>(TotalTests, Passes, Failures, "v4f32", "v4ui32"); 2735bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth 2745bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes 2755bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth << " Failures=" << Failures << "\n"; 2765bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth return Failures; 2775bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth} 278