Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: crosstest/test_cast_main.cpp

Issue 550723002: Subzero: Use cvttss2si and similar instead of cvtss2si for fp->int casts. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Use truncating conversion instruction for fp to int conversions Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/IceInstX8632.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | src/IceInstX8632.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698