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