blob: 414fcbbbbc96ba489d9fdf1763cfa28d21eab6bf [file] [log] [blame]
Jim Stichnoth7da431b2014-08-05 11:22:37 -07001//===- subzero/crosstest/test_cast_main.cpp - Driver for tests ------------===//
2//
3// The Subzero Code Generator
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Driver for crosstesting cast operations.
11//
12//===----------------------------------------------------------------------===//
13
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070014/* crosstest.py --test=test_cast.cpp --test=test_cast_to_u1.ll \
15 --driver=test_cast_main.cpp --prefix=Subzero_ --output=test_cast */
16
17#include <cstring>
18#include <iostream>
19#include <stdint.h>
20
21// Include test_cast.h twice - once normally, and once within the
22// Subzero_ namespace, corresponding to the llc and Subzero translated
23// object files, respectively.
24#include "test_cast.h"
25namespace Subzero_ {
26#include "test_cast.h"
27}
28
29#define XSTR(s) STR(s)
30#define STR(s) #s
31#define COMPARE(Func, FromCName, ToCName, Input) \
32 do { \
33 ToCName ResultSz, ResultLlc; \
34 ResultLlc = Func<FromCName, ToCName>(Input); \
35 ResultSz = Subzero_::Func<FromCName, ToCName>(Input); \
36 ++TotalTests; \
37 if (!memcmp(&ResultLlc, &ResultSz, sizeof(ToCName))) { \
38 ++Passes; \
39 } else { \
40 ++Failures; \
41 std::cout << std::fixed << XSTR(Func) \
42 << "<" XSTR(FromCName) ", " XSTR(ToCName) ">(" << Input \
43 << "): sz=" << ResultSz << " llc=" << ResultLlc << "\n"; \
44 } \
45 } while (0)
46
47template <typename FromType>
48void testValue(FromType Val, size_t &TotalTests, size_t &Passes,
49 size_t &Failures) {
50 COMPARE(cast, FromType, bool, Val);
51 COMPARE(cast, FromType, uint8_t, Val);
Jim Stichnoth7da431b2014-08-05 11:22:37 -070052 COMPARE(cast, FromType, myint8_t, Val);
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070053 COMPARE(cast, FromType, uint16_t, Val);
54 COMPARE(cast, FromType, int16_t, Val);
55 COMPARE(cast, FromType, uint32_t, Val);
56 COMPARE(cast, FromType, int32_t, Val);
57 COMPARE(cast, FromType, uint64_t, Val);
58 COMPARE(cast, FromType, int64_t, Val);
59 COMPARE(cast, FromType, float, Val);
60 COMPARE(cast, FromType, double, Val);
61}
62
63int main(int argc, char **argv) {
64 size_t TotalTests = 0;
65 size_t Passes = 0;
66 size_t Failures = 0;
67
68 volatile bool ValsUi1[] = { false, true };
69 static const size_t NumValsUi1 = sizeof(ValsUi1) / sizeof(*ValsUi1);
70 volatile uint8_t ValsUi8[] = { 0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff };
71 static const size_t NumValsUi8 = sizeof(ValsUi8) / sizeof(*ValsUi8);
72
Jim Stichnoth7da431b2014-08-05 11:22:37 -070073 volatile myint8_t ValsSi8[] = { 0, 1, 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff };
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070074 static const size_t NumValsSi8 = sizeof(ValsSi8) / sizeof(*ValsSi8);
75
76 volatile uint16_t ValsUi16[] = { 0, 1, 0x7e, 0x7f, 0x80,
77 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
78 0x8000, 0x8001, 0xfffe, 0xffff };
79 static const size_t NumValsUi16 = sizeof(ValsUi16) / sizeof(*ValsUi16);
80
81 volatile int16_t ValsSi16[] = { 0, 1, 0x7e, 0x7f, 0x80,
82 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
83 0x8000, 0x8001, 0xfffe, 0xffff };
84 static const size_t NumValsSi16 = sizeof(ValsSi16) / sizeof(*ValsSi16);
85
86 volatile size_t ValsUi32[] = {
87 0, 1, 0x7e, 0x7f, 0x80,
88 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
89 0x8000, 0x8001, 0xfffe, 0xffff, 0x7ffffffe,
90 0x7fffffff, 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff
91 };
92 static const size_t NumValsUi32 = sizeof(ValsUi32) / sizeof(*ValsUi32);
93
94 volatile size_t ValsSi32[] = {
95 0, 1, 0x7e, 0x7f, 0x80,
96 0x81, 0xfe, 0xff, 0x7ffe, 0x7fff,
97 0x8000, 0x8001, 0xfffe, 0xffff, 0x7ffffffe,
98 0x7fffffff, 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff
99 };
100 static const size_t NumValsSi32 = sizeof(ValsSi32) / sizeof(*ValsSi32);
101
102 volatile uint64_t ValsUi64[] = {
103 0, 1, 0x7e,
104 0x7f, 0x80, 0x81,
105 0xfe, 0xff, 0x7ffe,
106 0x7fff, 0x8000, 0x8001,
107 0xfffe, 0xffff, 0x7ffffffe,
108 0x7fffffff, 0x80000000, 0x80000001,
109 0xfffffffe, 0xffffffff, 0x100000000ull,
110 0x100000001ull, 0x7ffffffffffffffeull, 0x7fffffffffffffffull,
111 0x8000000000000000ull, 0x8000000000000001ull, 0xfffffffffffffffeull,
112 0xffffffffffffffffull
113 };
114 static const size_t NumValsUi64 = sizeof(ValsUi64) / sizeof(*ValsUi64);
115
116 volatile int64_t ValsSi64[] = {
117 0, 1, 0x7e,
118 0x7f, 0x80, 0x81,
119 0xfe, 0xff, 0x7ffe,
120 0x7fff, 0x8000, 0x8001,
121 0xfffe, 0xffff, 0x7ffffffe,
122 0x7fffffff, 0x80000000, 0x80000001,
123 0xfffffffe, 0xffffffff, 0x100000000ll,
124 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll,
125 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell,
126 0xffffffffffffffffll
127 };
128 static const size_t NumValsSi64 = sizeof(ValsSi64) / sizeof(*ValsSi64);
129
130 volatile float ValsF32[] = {
131 0, 1, 0x7e,
132 0x7f, 0x80, 0x81,
133 0xfe, 0xff, 0x7ffe,
134 0x7fff, 0x8000, 0x8001,
135 0xfffe, 0xffff, 0x7ffffffe,
136 0x7fffffff, 0x80000000, 0x80000001,
137 0xfffffffe, 0xffffffff, 0x100000000ll,
138 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll,
139 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell,
140 0xffffffffffffffffll
141 };
142 static const size_t NumValsF32 = sizeof(ValsF32) / sizeof(*ValsF32);
143
144 volatile double ValsF64[] = {
145 0, 1, 0x7e,
146 0x7f, 0x80, 0x81,
147 0xfe, 0xff, 0x7ffe,
148 0x7fff, 0x8000, 0x8001,
149 0xfffe, 0xffff, 0x7ffffffe,
150 0x7fffffff, 0x80000000, 0x80000001,
151 0xfffffffe, 0xffffffff, 0x100000000ll,
152 0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll,
153 0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell,
154 0xffffffffffffffffll
155 };
156 static const size_t NumValsF64 = sizeof(ValsF64) / sizeof(*ValsF64);
157
158 for (size_t i = 0; i < NumValsUi1; ++i) {
159 bool Val = ValsUi1[i];
160 testValue<bool>(Val, TotalTests, Passes, Failures);
161 }
162 for (size_t i = 0; i < NumValsUi8; ++i) {
163 uint8_t Val = ValsUi8[i];
164 testValue<uint8_t>(Val, TotalTests, Passes, Failures);
165 }
166 for (size_t i = 0; i < NumValsSi8; ++i) {
Jim Stichnoth7da431b2014-08-05 11:22:37 -0700167 myint8_t Val = ValsSi8[i];
168 testValue<myint8_t>(Val, TotalTests, Passes, Failures);
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -0700169 }
170 for (size_t i = 0; i < NumValsUi16; ++i) {
171 uint16_t Val = ValsUi16[i];
172 testValue<uint16_t>(Val, TotalTests, Passes, Failures);
173 }
174 for (size_t i = 0; i < NumValsSi16; ++i) {
175 int16_t Val = ValsSi16[i];
176 testValue<int16_t>(Val, TotalTests, Passes, Failures);
177 }
178 for (size_t i = 0; i < NumValsUi32; ++i) {
179 uint32_t Val = ValsUi32[i];
180 testValue<uint32_t>(Val, TotalTests, Passes, Failures);
181 COMPARE(castBits, uint32_t, float, Val);
182 }
183 for (size_t i = 0; i < NumValsSi32; ++i) {
184 int32_t Val = ValsSi32[i];
185 testValue<int32_t>(Val, TotalTests, Passes, Failures);
186 }
187 for (size_t i = 0; i < NumValsUi64; ++i) {
188 uint64_t Val = ValsUi64[i];
189 testValue<uint64_t>(Val, TotalTests, Passes, Failures);
190 COMPARE(castBits, uint64_t, double, Val);
191 }
192 for (size_t i = 0; i < NumValsSi64; ++i) {
193 int64_t Val = ValsSi64[i];
194 testValue<int64_t>(Val, TotalTests, Passes, Failures);
195 }
196 for (size_t i = 0; i < NumValsF32; ++i) {
197 for (unsigned j = 0; j < 2; ++j) {
198 float Val = ValsF32[i];
199 if (j > 0)
200 Val = -Val;
201 testValue<float>(Val, TotalTests, Passes, Failures);
202 COMPARE(castBits, float, uint32_t, Val);
203 }
204 }
205 for (size_t i = 0; i < NumValsF64; ++i) {
206 for (unsigned j = 0; j < 2; ++j) {
207 double Val = ValsF64[i];
208 if (j > 0)
209 Val = -Val;
210 testValue<double>(Val, TotalTests, Passes, Failures);
211 COMPARE(castBits, double, uint64_t, Val);
212 }
213 }
214
215 std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes
216 << " Failures=" << Failures << "\n";
217 return Failures;
218}
219
220////////////////////////////////////////////////////////////////
221
222// The following are helper definitions that should be part of the
223// Subzero runtime.
224
225extern "C" {
226uint32_t cvtdtoui32(double a) { return (uint32_t)a; }
227uint32_t cvtftoui32(float a) { return (uint32_t)a; }
228int64_t cvtdtosi64(double a) { return (int64_t)a; }
229int64_t cvtftosi64(float a) { return (int64_t)a; }
230uint64_t cvtdtoui64(double a) { return (uint64_t)a; }
231uint64_t cvtftoui64(float a) { return (uint64_t)a; }
232float cvtui64tof(uint64_t a) { return (float)a; }
233double cvtui64tod(uint64_t a) { return (double)a; }
234float cvtsi64tof(int64_t a) { return (float)a; }
235float cvtui32tof(uint32_t a) { return (float)a; }
236double cvtui32tod(uint32_t a) { return (double)a; }
237double cvtsi64tod(int64_t a) { return (double)a; }
238}