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

Side by Side Diff: test/cctest/wasm/test-run-wasm-64.cc

Issue 1990923002: [wasm] Refactor WASM run tests to allow them to run in the interpreter too. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdint.h> 5 #include <stdint.h>
6 #include <stdlib.h> 6 #include <stdlib.h>
7 #include <string.h> 7 #include <string.h>
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/wasm/wasm-macro-gen.h" 10 #include "src/wasm/wasm-macro-gen.h"
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 V(I64Ror, true) \ 83 V(I64Ror, true) \
84 V(I64Rol, true) 84 V(I64Rol, true)
85 85
86 #define DECLARE_CONST(name, cond) static const bool kSupported_##name = cond; 86 #define DECLARE_CONST(name, cond) static const bool kSupported_##name = cond;
87 FOREACH_I64_OPERATOR(DECLARE_CONST) 87 FOREACH_I64_OPERATOR(DECLARE_CONST)
88 #undef DECLARE_CONST 88 #undef DECLARE_CONST
89 89
90 #define REQUIRE(name) \ 90 #define REQUIRE(name) \
91 if (!WASM_64 && !kSupported_##name) return 91 if (!WASM_64 && !kSupported_##name) return
92 92
93 TEST(Run_Wasm_I64Const) { 93 WASM_EXEC_TEST(I64Const) {
94 REQUIRE(I64Const); 94 REQUIRE(I64Const);
95 WasmRunner<int64_t> r; 95 WasmRunner<int64_t> r;
96 const int64_t kExpectedValue = 0x1122334455667788LL; 96 const int64_t kExpectedValue = 0x1122334455667788LL;
97 // return(kExpectedValue) 97 // return(kExpectedValue)
98 BUILD(r, WASM_I64V_9(kExpectedValue)); 98 BUILD(r, WASM_I64V_9(kExpectedValue));
99 CHECK_EQ(kExpectedValue, r.Call()); 99 CHECK_EQ(kExpectedValue, r.Call());
100 } 100 }
101 101
102 TEST(Run_Wasm_I64Const_many) { 102 WASM_EXEC_TEST(I64Const_many) {
103 REQUIRE(I64Const); 103 REQUIRE(I64Const);
104 int cntr = 0; 104 int cntr = 0;
105 FOR_INT32_INPUTS(i) { 105 FOR_INT32_INPUTS(i) {
106 WasmRunner<int64_t> r; 106 WasmRunner<int64_t> r;
107 const int64_t kExpectedValue = (static_cast<int64_t>(*i) << 32) | cntr; 107 const int64_t kExpectedValue = (static_cast<int64_t>(*i) << 32) | cntr;
108 // return(kExpectedValue) 108 // return(kExpectedValue)
109 BUILD(r, WASM_I64V(kExpectedValue)); 109 BUILD(r, WASM_I64V(kExpectedValue));
110 CHECK_EQ(kExpectedValue, r.Call()); 110 CHECK_EQ(kExpectedValue, r.Call());
111 cntr++; 111 cntr++;
112 } 112 }
113 } 113 }
114 114
115 TEST(Run_Wasm_Return_I64) { 115 WASM_EXEC_TEST(Return_I64) {
116 REQUIRE(I64Return); 116 REQUIRE(I64Return);
117 WasmRunner<int64_t> r(MachineType::Int64()); 117 WasmRunner<int64_t> r(MachineType::Int64());
118 118
119 BUILD(r, WASM_RETURN1(WASM_GET_LOCAL(0))); 119 BUILD(r, WASM_RETURN1(WASM_GET_LOCAL(0)));
120 120
121 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); } 121 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); }
122 } 122 }
123 123
124 TEST(Run_WasmI64Add) { 124 WASM_EXEC_TEST(I64Add) {
125 REQUIRE(I64Add); 125 REQUIRE(I64Add);
126 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 126 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
127 BUILD(r, WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 127 BUILD(r, WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
128 FOR_INT64_INPUTS(i) { 128 FOR_INT64_INPUTS(i) {
129 FOR_INT64_INPUTS(j) { CHECK_EQ(*i + *j, r.Call(*i, *j)); } 129 FOR_INT64_INPUTS(j) { CHECK_EQ(*i + *j, r.Call(*i, *j)); }
130 } 130 }
131 } 131 }
132 132
133 TEST(Run_Wasm_I64Sub) { 133 WASM_EXEC_TEST(I64Sub) {
134 REQUIRE(I64Sub); 134 REQUIRE(I64Sub);
135 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 135 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
136 BUILD(r, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 136 BUILD(r, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
137 FOR_INT64_INPUTS(i) { 137 FOR_INT64_INPUTS(i) {
138 FOR_INT64_INPUTS(j) { CHECK_EQ(*i - *j, r.Call(*i, *j)); } 138 FOR_INT64_INPUTS(j) { CHECK_EQ(*i - *j, r.Call(*i, *j)); }
139 } 139 }
140 } 140 }
141 141
142 TEST(Run_WasmI64DivS) { 142 WASM_EXEC_TEST(I64DivS) {
143 REQUIRE(I64DivS); 143 REQUIRE(I64DivS);
144 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 144 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
145 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 145 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
146 FOR_INT64_INPUTS(i) { 146 FOR_INT64_INPUTS(i) {
147 FOR_INT64_INPUTS(j) { 147 FOR_INT64_INPUTS(j) {
148 if (*j == 0) { 148 if (*j == 0) {
149 CHECK_TRAP64(r.Call(*i, *j)); 149 CHECK_TRAP64(r.Call(*i, *j));
150 } else if (*j == -1 && *i == std::numeric_limits<int64_t>::min()) { 150 } else if (*j == -1 && *i == std::numeric_limits<int64_t>::min()) {
151 CHECK_TRAP64(r.Call(*i, *j)); 151 CHECK_TRAP64(r.Call(*i, *j));
152 } else { 152 } else {
153 CHECK_EQ(*i / *j, r.Call(*i, *j)); 153 CHECK_EQ(*i / *j, r.Call(*i, *j));
154 } 154 }
155 } 155 }
156 } 156 }
157 } 157 }
158 158
159 TEST(Run_WasmI64DivS_Trap) { 159 WASM_EXEC_TEST(I64DivS_Trap) {
160 REQUIRE(I64DivS); 160 REQUIRE(I64DivS);
161 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 161 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
162 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 162 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
163 CHECK_EQ(0, r.Call(asi64(0), asi64(100))); 163 CHECK_EQ(0, r.Call(asi64(0), asi64(100)));
164 CHECK_TRAP64(r.Call(asi64(100), asi64(0))); 164 CHECK_TRAP64(r.Call(asi64(100), asi64(0)));
165 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0))); 165 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0)));
166 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(-1))); 166 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(-1)));
167 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0))); 167 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0)));
168 } 168 }
169 169
170 TEST(Run_WasmI64DivS_Byzero_Const) { 170 WASM_EXEC_TEST(I64DivS_Byzero_Const) {
171 REQUIRE(I64DivS); 171 REQUIRE(I64DivS);
172 for (int8_t denom = -2; denom < 8; denom++) { 172 for (int8_t denom = -2; denom < 8; denom++) {
173 WasmRunner<int64_t> r(MachineType::Int64()); 173 WasmRunner<int64_t> r(MachineType::Int64());
174 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(denom))); 174 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(denom)));
175 for (int64_t val = -7; val < 8; val++) { 175 for (int64_t val = -7; val < 8; val++) {
176 if (denom == 0) { 176 if (denom == 0) {
177 CHECK_TRAP64(r.Call(val)); 177 CHECK_TRAP64(r.Call(val));
178 } else { 178 } else {
179 CHECK_EQ(val / denom, r.Call(val)); 179 CHECK_EQ(val / denom, r.Call(val));
180 } 180 }
181 } 181 }
182 } 182 }
183 } 183 }
184 184
185 TEST(Run_WasmI64DivU) { 185 WASM_EXEC_TEST(I64DivU) {
186 REQUIRE(I64DivU); 186 REQUIRE(I64DivU);
187 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 187 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64());
188 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 188 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
189 FOR_UINT64_INPUTS(i) { 189 FOR_UINT64_INPUTS(i) {
190 FOR_UINT64_INPUTS(j) { 190 FOR_UINT64_INPUTS(j) {
191 if (*j == 0) { 191 if (*j == 0) {
192 CHECK_TRAP64(r.Call(*i, *j)); 192 CHECK_TRAP64(r.Call(*i, *j));
193 } else { 193 } else {
194 CHECK_EQ(*i / *j, r.Call(*i, *j)); 194 CHECK_EQ(*i / *j, r.Call(*i, *j));
195 } 195 }
196 } 196 }
197 } 197 }
198 } 198 }
199 199
200 TEST(Run_WasmI64DivU_Trap) { 200 WASM_EXEC_TEST(I64DivU_Trap) {
201 REQUIRE(I64DivU); 201 REQUIRE(I64DivU);
202 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 202 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64());
203 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 203 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
204 CHECK_EQ(0, r.Call(asu64(0), asu64(100))); 204 CHECK_EQ(0, r.Call(asu64(0), asu64(100)));
205 CHECK_TRAP64(r.Call(asu64(100), asu64(0))); 205 CHECK_TRAP64(r.Call(asu64(100), asu64(0)));
206 CHECK_TRAP64(r.Call(asu64(1001), asu64(0))); 206 CHECK_TRAP64(r.Call(asu64(1001), asu64(0)));
207 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0))); 207 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0)));
208 } 208 }
209 209
210 TEST(Run_WasmI64DivU_Byzero_Const) { 210 WASM_EXEC_TEST(I64DivU_Byzero_Const) {
211 REQUIRE(I64DivU); 211 REQUIRE(I64DivU);
212 for (uint64_t denom = 0xfffffffffffffffe; denom < 8; denom++) { 212 for (uint64_t denom = 0xfffffffffffffffe; denom < 8; denom++) {
213 WasmRunner<uint64_t> r(MachineType::Uint64()); 213 WasmRunner<uint64_t> r(MachineType::Uint64());
214 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(denom))); 214 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(denom)));
215 215
216 for (uint64_t val = 0xfffffffffffffff0; val < 8; val++) { 216 for (uint64_t val = 0xfffffffffffffff0; val < 8; val++) {
217 if (denom == 0) { 217 if (denom == 0) {
218 CHECK_TRAP64(r.Call(val)); 218 CHECK_TRAP64(r.Call(val));
219 } else { 219 } else {
220 CHECK_EQ(val / denom, r.Call(val)); 220 CHECK_EQ(val / denom, r.Call(val));
221 } 221 }
222 } 222 }
223 } 223 }
224 } 224 }
225 225
226 TEST(Run_WasmI64RemS) { 226 WASM_EXEC_TEST(I64RemS) {
227 REQUIRE(I64RemS); 227 REQUIRE(I64RemS);
228 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 228 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
229 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 229 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
230 FOR_INT64_INPUTS(i) { 230 FOR_INT64_INPUTS(i) {
231 FOR_INT64_INPUTS(j) { 231 FOR_INT64_INPUTS(j) {
232 if (*j == 0) { 232 if (*j == 0) {
233 CHECK_TRAP64(r.Call(*i, *j)); 233 CHECK_TRAP64(r.Call(*i, *j));
234 } else { 234 } else {
235 CHECK_EQ(*i % *j, r.Call(*i, *j)); 235 CHECK_EQ(*i % *j, r.Call(*i, *j));
236 } 236 }
237 } 237 }
238 } 238 }
239 } 239 }
240 240
241 TEST(Run_WasmI64RemS_Trap) { 241 WASM_EXEC_TEST(I64RemS_Trap) {
242 REQUIRE(I64RemS); 242 REQUIRE(I64RemS);
243 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 243 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
244 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 244 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
245 CHECK_EQ(33, r.Call(asi64(133), asi64(100))); 245 CHECK_EQ(33, r.Call(asi64(133), asi64(100)));
246 CHECK_EQ(0, r.Call(std::numeric_limits<int64_t>::min(), asi64(-1))); 246 CHECK_EQ(0, r.Call(std::numeric_limits<int64_t>::min(), asi64(-1)));
247 CHECK_TRAP64(r.Call(asi64(100), asi64(0))); 247 CHECK_TRAP64(r.Call(asi64(100), asi64(0)));
248 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0))); 248 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0)));
249 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0))); 249 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0)));
250 } 250 }
251 251
252 TEST(Run_WasmI64RemU) { 252 WASM_EXEC_TEST(I64RemU) {
253 REQUIRE(I64RemU); 253 REQUIRE(I64RemU);
254 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 254 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64());
255 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 255 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
256 FOR_UINT64_INPUTS(i) { 256 FOR_UINT64_INPUTS(i) {
257 FOR_UINT64_INPUTS(j) { 257 FOR_UINT64_INPUTS(j) {
258 if (*j == 0) { 258 if (*j == 0) {
259 CHECK_TRAP64(r.Call(*i, *j)); 259 CHECK_TRAP64(r.Call(*i, *j));
260 } else { 260 } else {
261 CHECK_EQ(*i % *j, r.Call(*i, *j)); 261 CHECK_EQ(*i % *j, r.Call(*i, *j));
262 } 262 }
263 } 263 }
264 } 264 }
265 } 265 }
266 266
267 TEST(Run_Wasm_I64RemU_Trap) { 267 WASM_EXEC_TEST(I64RemU_Trap) {
268 REQUIRE(I64RemU); 268 REQUIRE(I64RemU);
269 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 269 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64());
270 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 270 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
271 CHECK_EQ(17, r.Call(asu64(217), asu64(100))); 271 CHECK_EQ(17, r.Call(asu64(217), asu64(100)));
272 CHECK_TRAP64(r.Call(asu64(100), asu64(0))); 272 CHECK_TRAP64(r.Call(asu64(100), asu64(0)));
273 CHECK_TRAP64(r.Call(asu64(1001), asu64(0))); 273 CHECK_TRAP64(r.Call(asu64(1001), asu64(0)));
274 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0))); 274 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0)));
275 } 275 }
276 276
277 TEST(Run_Wasm_I64And) { 277 WASM_EXEC_TEST(I64And) {
278 REQUIRE(I64And); 278 REQUIRE(I64And);
279 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 279 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
280 BUILD(r, WASM_I64_AND(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 280 BUILD(r, WASM_I64_AND(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
281 FOR_INT64_INPUTS(i) { 281 FOR_INT64_INPUTS(i) {
282 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) & (*j), r.Call(*i, *j)); } 282 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) & (*j), r.Call(*i, *j)); }
283 } 283 }
284 } 284 }
285 285
286 TEST(Run_Wasm_I64Ior) { 286 WASM_EXEC_TEST(I64Ior) {
287 REQUIRE(I64Ior); 287 REQUIRE(I64Ior);
288 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 288 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
289 BUILD(r, WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 289 BUILD(r, WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
290 FOR_INT64_INPUTS(i) { 290 FOR_INT64_INPUTS(i) {
291 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) | (*j), r.Call(*i, *j)); } 291 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) | (*j), r.Call(*i, *j)); }
292 } 292 }
293 } 293 }
294 294
295 TEST(Run_Wasm_I64Xor) { 295 WASM_EXEC_TEST(I64Xor) {
296 REQUIRE(I64Xor); 296 REQUIRE(I64Xor);
297 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 297 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
298 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 298 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
299 FOR_INT64_INPUTS(i) { 299 FOR_INT64_INPUTS(i) {
300 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) ^ (*j), r.Call(*i, *j)); } 300 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) ^ (*j), r.Call(*i, *j)); }
301 } 301 }
302 } 302 }
303 303
304 TEST(Run_Wasm_I64Shl) { 304 WASM_EXEC_TEST(I64Shl) {
305 REQUIRE(I64Shl); 305 REQUIRE(I64Shl);
306 { 306 {
307 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 307 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64());
308 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 308 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
309 309
310 FOR_UINT64_INPUTS(i) { 310 FOR_UINT64_INPUTS(i) {
311 FOR_UINT64_INPUTS(j) { 311 FOR_UINT64_INPUTS(j) {
312 uint64_t expected = (*i) << (*j & 0x3f); 312 uint64_t expected = (*i) << (*j & 0x3f);
313 CHECK_EQ(expected, r.Call(*i, *j)); 313 CHECK_EQ(expected, r.Call(*i, *j));
314 } 314 }
(...skipping 14 matching lines...) Expand all
329 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(20))); 329 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(20)));
330 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 20, r.Call(*i)); } 330 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 20, r.Call(*i)); }
331 } 331 }
332 { 332 {
333 WasmRunner<int64_t> r(MachineType::Int64()); 333 WasmRunner<int64_t> r(MachineType::Int64());
334 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(40))); 334 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(40)));
335 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 40, r.Call(*i)); } 335 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 40, r.Call(*i)); }
336 } 336 }
337 } 337 }
338 338
339 TEST(Run_Wasm_I64ShrU) { 339 WASM_EXEC_TEST(I64ShrU) {
340 REQUIRE(I64ShrU); 340 REQUIRE(I64ShrU);
341 { 341 {
342 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 342 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64());
343 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 343 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
344 344
345 FOR_UINT64_INPUTS(i) { 345 FOR_UINT64_INPUTS(i) {
346 FOR_UINT64_INPUTS(j) { 346 FOR_UINT64_INPUTS(j) {
347 uint64_t expected = (*i) >> (*j & 0x3f); 347 uint64_t expected = (*i) >> (*j & 0x3f);
348 CHECK_EQ(expected, r.Call(*i, *j)); 348 CHECK_EQ(expected, r.Call(*i, *j));
349 } 349 }
(...skipping 14 matching lines...) Expand all
364 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(20))); 364 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(20)));
365 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 20, r.Call(*i)); } 365 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 20, r.Call(*i)); }
366 } 366 }
367 { 367 {
368 WasmRunner<int64_t> r(MachineType::Int64()); 368 WasmRunner<int64_t> r(MachineType::Int64());
369 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(40))); 369 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(40)));
370 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 40, r.Call(*i)); } 370 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 40, r.Call(*i)); }
371 } 371 }
372 } 372 }
373 373
374 TEST(Run_Wasm_I64ShrS) { 374 WASM_EXEC_TEST(I64ShrS) {
375 REQUIRE(I64ShrS); 375 REQUIRE(I64ShrS);
376 { 376 {
377 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 377 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
378 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 378 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
379 379
380 FOR_INT64_INPUTS(i) { 380 FOR_INT64_INPUTS(i) {
381 FOR_INT64_INPUTS(j) { 381 FOR_INT64_INPUTS(j) {
382 int64_t expected = (*i) >> (*j & 0x3f); 382 int64_t expected = (*i) >> (*j & 0x3f);
383 CHECK_EQ(expected, r.Call(*i, *j)); 383 CHECK_EQ(expected, r.Call(*i, *j));
384 } 384 }
(...skipping 14 matching lines...) Expand all
399 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(20))); 399 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(20)));
400 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 20, r.Call(*i)); } 400 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 20, r.Call(*i)); }
401 } 401 }
402 { 402 {
403 WasmRunner<int64_t> r(MachineType::Int64()); 403 WasmRunner<int64_t> r(MachineType::Int64());
404 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(40))); 404 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(40)));
405 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 40, r.Call(*i)); } 405 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 40, r.Call(*i)); }
406 } 406 }
407 } 407 }
408 408
409 TEST(Run_Wasm_I64Eq) { 409 WASM_EXEC_TEST(I64Eq) {
410 REQUIRE(I64Eq); 410 REQUIRE(I64Eq);
411 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 411 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64());
412 BUILD(r, WASM_I64_EQ(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 412 BUILD(r, WASM_I64_EQ(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
413 FOR_INT64_INPUTS(i) { 413 FOR_INT64_INPUTS(i) {
414 FOR_INT64_INPUTS(j) { CHECK_EQ(*i == *j ? 1 : 0, r.Call(*i, *j)); } 414 FOR_INT64_INPUTS(j) { CHECK_EQ(*i == *j ? 1 : 0, r.Call(*i, *j)); }
415 } 415 }
416 } 416 }
417 417
418 TEST(Run_Wasm_I64Ne) { 418 WASM_EXEC_TEST(I64Ne) {
419 REQUIRE(I64Ne); 419 REQUIRE(I64Ne);
420 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 420 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64());
421 BUILD(r, WASM_I64_NE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 421 BUILD(r, WASM_I64_NE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
422 FOR_INT64_INPUTS(i) { 422 FOR_INT64_INPUTS(i) {
423 FOR_INT64_INPUTS(j) { CHECK_EQ(*i != *j ? 1 : 0, r.Call(*i, *j)); } 423 FOR_INT64_INPUTS(j) { CHECK_EQ(*i != *j ? 1 : 0, r.Call(*i, *j)); }
424 } 424 }
425 } 425 }
426 426
427 TEST(Run_Wasm_I64LtS) { 427 WASM_EXEC_TEST(I64LtS) {
428 REQUIRE(I64LtS); 428 REQUIRE(I64LtS);
429 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 429 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64());
430 BUILD(r, WASM_I64_LTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 430 BUILD(r, WASM_I64_LTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
431 FOR_INT64_INPUTS(i) { 431 FOR_INT64_INPUTS(i) {
432 FOR_INT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); } 432 FOR_INT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); }
433 } 433 }
434 } 434 }
435 435
436 TEST(Run_Wasm_I64LeS) { 436 WASM_EXEC_TEST(I64LeS) {
437 REQUIRE(I64LeS); 437 REQUIRE(I64LeS);
438 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 438 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64());
439 BUILD(r, WASM_I64_LES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 439 BUILD(r, WASM_I64_LES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
440 FOR_INT64_INPUTS(i) { 440 FOR_INT64_INPUTS(i) {
441 FOR_INT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); } 441 FOR_INT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); }
442 } 442 }
443 } 443 }
444 444
445 TEST(Run_Wasm_I64LtU) { 445 WASM_EXEC_TEST(I64LtU) {
446 REQUIRE(I64LtU); 446 REQUIRE(I64LtU);
447 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 447 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64());
448 BUILD(r, WASM_I64_LTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 448 BUILD(r, WASM_I64_LTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
449 FOR_UINT64_INPUTS(i) { 449 FOR_UINT64_INPUTS(i) {
450 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); } 450 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); }
451 } 451 }
452 } 452 }
453 453
454 TEST(Run_Wasm_I64LeU) { 454 WASM_EXEC_TEST(I64LeU) {
455 REQUIRE(I64LeU); 455 REQUIRE(I64LeU);
456 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 456 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64());
457 BUILD(r, WASM_I64_LEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 457 BUILD(r, WASM_I64_LEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
458 FOR_UINT64_INPUTS(i) { 458 FOR_UINT64_INPUTS(i) {
459 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); } 459 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); }
460 } 460 }
461 } 461 }
462 462
463 TEST(Run_Wasm_I64GtS) { 463 WASM_EXEC_TEST(I64GtS) {
464 REQUIRE(I64GtS); 464 REQUIRE(I64GtS);
465 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 465 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64());
466 BUILD(r, WASM_I64_GTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 466 BUILD(r, WASM_I64_GTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
467 FOR_INT64_INPUTS(i) { 467 FOR_INT64_INPUTS(i) {
468 FOR_INT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); } 468 FOR_INT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); }
469 } 469 }
470 } 470 }
471 471
472 TEST(Run_Wasm_I64GeS) { 472 WASM_EXEC_TEST(I64GeS) {
473 REQUIRE(I64GeS); 473 REQUIRE(I64GeS);
474 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 474 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64());
475 BUILD(r, WASM_I64_GES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 475 BUILD(r, WASM_I64_GES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
476 FOR_INT64_INPUTS(i) { 476 FOR_INT64_INPUTS(i) {
477 FOR_INT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); } 477 FOR_INT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); }
478 } 478 }
479 } 479 }
480 480
481 TEST(Run_Wasm_I64GtU) { 481 WASM_EXEC_TEST(I64GtU) {
482 REQUIRE(I64GtU); 482 REQUIRE(I64GtU);
483 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 483 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64());
484 BUILD(r, WASM_I64_GTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 484 BUILD(r, WASM_I64_GTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
485 FOR_UINT64_INPUTS(i) { 485 FOR_UINT64_INPUTS(i) {
486 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); } 486 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); }
487 } 487 }
488 } 488 }
489 489
490 TEST(Run_Wasm_I64GeU) { 490 WASM_EXEC_TEST(I64GeU) {
491 REQUIRE(I64GeU); 491 REQUIRE(I64GeU);
492 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 492 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64());
493 BUILD(r, WASM_I64_GEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 493 BUILD(r, WASM_I64_GEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
494 FOR_UINT64_INPUTS(i) { 494 FOR_UINT64_INPUTS(i) {
495 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); } 495 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); }
496 } 496 }
497 } 497 }
498 498
499 TEST(Run_Wasm_I32ConvertI64) { 499 WASM_EXEC_TEST(I32ConvertI64) {
500 REQUIRE(I32ConvertI64); 500 REQUIRE(I32ConvertI64);
501 FOR_INT64_INPUTS(i) { 501 FOR_INT64_INPUTS(i) {
502 WasmRunner<int32_t> r; 502 WasmRunner<int32_t> r;
503 BUILD(r, WASM_I32_CONVERT_I64(WASM_I64V(*i))); 503 BUILD(r, WASM_I32_CONVERT_I64(WASM_I64V(*i)));
504 CHECK_EQ(static_cast<int32_t>(*i), r.Call()); 504 CHECK_EQ(static_cast<int32_t>(*i), r.Call());
505 } 505 }
506 } 506 }
507 507
508 TEST(Run_Wasm_I64SConvertI32) { 508 WASM_EXEC_TEST(I64SConvertI32) {
509 REQUIRE(I64SConvertI32); 509 REQUIRE(I64SConvertI32);
510 WasmRunner<int64_t> r(MachineType::Int32()); 510 WasmRunner<int64_t> r(MachineType::Int32());
511 BUILD(r, WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0))); 511 BUILD(r, WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0)));
512 FOR_INT32_INPUTS(i) { CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); } 512 FOR_INT32_INPUTS(i) { CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); }
513 } 513 }
514 514
515 TEST(Run_Wasm_I64UConvertI32) { 515 WASM_EXEC_TEST(I64UConvertI32) {
516 REQUIRE(I64UConvertI32); 516 REQUIRE(I64UConvertI32);
517 WasmRunner<int64_t> r(MachineType::Uint32()); 517 WasmRunner<int64_t> r(MachineType::Uint32());
518 BUILD(r, WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(0))); 518 BUILD(r, WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(0)));
519 FOR_UINT32_INPUTS(i) { CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); } 519 FOR_UINT32_INPUTS(i) { CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); }
520 } 520 }
521 521
522 TEST(Run_WasmI64Popcnt) { 522 WASM_EXEC_TEST(I64Popcnt) {
523 struct { 523 struct {
524 int64_t expected; 524 int64_t expected;
525 uint64_t input; 525 uint64_t input;
526 } values[] = {{64, 0xffffffffffffffff}, 526 } values[] = {{64, 0xffffffffffffffff},
527 {0, 0x0000000000000000}, 527 {0, 0x0000000000000000},
528 {2, 0x0000080000008000}, 528 {2, 0x0000080000008000},
529 {26, 0x1123456782345678}, 529 {26, 0x1123456782345678},
530 {38, 0xffedcba09edcba09}}; 530 {38, 0xffedcba09edcba09}};
531 531
532 WasmRunner<int64_t> r(MachineType::Uint64()); 532 WasmRunner<int64_t> r(MachineType::Uint64());
533 BUILD(r, WASM_I64_POPCNT(WASM_GET_LOCAL(0))); 533 BUILD(r, WASM_I64_POPCNT(WASM_GET_LOCAL(0)));
534 for (size_t i = 0; i < arraysize(values); i++) { 534 for (size_t i = 0; i < arraysize(values); i++) {
535 CHECK_EQ(values[i].expected, r.Call(values[i].input)); 535 CHECK_EQ(values[i].expected, r.Call(values[i].input));
536 } 536 }
537 } 537 }
538 538
539 TEST(Run_WasmF32SConvertI64) { 539 WASM_EXEC_TEST(F32SConvertI64) {
540 REQUIRE(F32SConvertI64); 540 REQUIRE(F32SConvertI64);
541 WasmRunner<float> r(MachineType::Int64()); 541 WasmRunner<float> r(MachineType::Int64());
542 BUILD(r, WASM_F32_SCONVERT_I64(WASM_GET_LOCAL(0))); 542 BUILD(r, WASM_F32_SCONVERT_I64(WASM_GET_LOCAL(0)));
543 FOR_INT64_INPUTS(i) { CHECK_FLOAT_EQ(static_cast<float>(*i), r.Call(*i)); } 543 FOR_INT64_INPUTS(i) { CHECK_FLOAT_EQ(static_cast<float>(*i), r.Call(*i)); }
544 } 544 }
545 545
546 TEST(Run_WasmF32UConvertI64) { 546 WASM_EXEC_TEST(F32UConvertI64) {
547 REQUIRE(F32UConvertI64); 547 REQUIRE(F32UConvertI64);
548 struct { 548 struct {
549 uint64_t input; 549 uint64_t input;
550 uint32_t expected; 550 uint32_t expected;
551 } values[] = {{0x0, 0x0}, 551 } values[] = {{0x0, 0x0},
552 {0x1, 0x3f800000}, 552 {0x1, 0x3f800000},
553 {0xffffffff, 0x4f800000}, 553 {0xffffffff, 0x4f800000},
554 {0x1b09788b, 0x4dd84bc4}, 554 {0x1b09788b, 0x4dd84bc4},
555 {0x4c5fce8, 0x4c98bf9d}, 555 {0x4c5fce8, 0x4c98bf9d},
556 {0xcc0de5bf, 0x4f4c0de6}, 556 {0xcc0de5bf, 0x4f4c0de6},
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 {0x8000008000000001, 0x5f000001}, 624 {0x8000008000000001, 0x5f000001},
625 {0x8000000000000400, 0x5f000000}, 625 {0x8000000000000400, 0x5f000000},
626 {0x8000000000000401, 0x5f000000}}; 626 {0x8000000000000401, 0x5f000000}};
627 WasmRunner<float> r(MachineType::Uint64()); 627 WasmRunner<float> r(MachineType::Uint64());
628 BUILD(r, WASM_F32_UCONVERT_I64(WASM_GET_LOCAL(0))); 628 BUILD(r, WASM_F32_UCONVERT_I64(WASM_GET_LOCAL(0)));
629 for (size_t i = 0; i < arraysize(values); i++) { 629 for (size_t i = 0; i < arraysize(values); i++) {
630 CHECK_EQ(bit_cast<float>(values[i].expected), r.Call(values[i].input)); 630 CHECK_EQ(bit_cast<float>(values[i].expected), r.Call(values[i].input));
631 } 631 }
632 } 632 }
633 633
634 TEST(Run_WasmF64SConvertI64) { 634 WASM_EXEC_TEST(F64SConvertI64) {
635 REQUIRE(F64SConvertI64); 635 REQUIRE(F64SConvertI64);
636 WasmRunner<double> r(MachineType::Int64()); 636 WasmRunner<double> r(MachineType::Int64());
637 BUILD(r, WASM_F64_SCONVERT_I64(WASM_GET_LOCAL(0))); 637 BUILD(r, WASM_F64_SCONVERT_I64(WASM_GET_LOCAL(0)));
638 FOR_INT64_INPUTS(i) { CHECK_DOUBLE_EQ(static_cast<double>(*i), r.Call(*i)); } 638 FOR_INT64_INPUTS(i) { CHECK_DOUBLE_EQ(static_cast<double>(*i), r.Call(*i)); }
639 } 639 }
640 640
641 TEST(Run_Wasm_F64UConvertI64) { 641 WASM_EXEC_TEST(F64UConvertI64) {
642 REQUIRE(F64UConvertI64); 642 REQUIRE(F64UConvertI64);
643 struct { 643 struct {
644 uint64_t input; 644 uint64_t input;
645 uint64_t expected; 645 uint64_t expected;
646 } values[] = {{0x0, 0x0}, 646 } values[] = {{0x0, 0x0},
647 {0x1, 0x3ff0000000000000}, 647 {0x1, 0x3ff0000000000000},
648 {0xffffffff, 0x41efffffffe00000}, 648 {0xffffffff, 0x41efffffffe00000},
649 {0x1b09788b, 0x41bb09788b000000}, 649 {0x1b09788b, 0x41bb09788b000000},
650 {0x4c5fce8, 0x419317f3a0000000}, 650 {0x4c5fce8, 0x419317f3a0000000},
651 {0xcc0de5bf, 0x41e981bcb7e00000}, 651 {0xcc0de5bf, 0x41e981bcb7e00000},
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 {0x8000008000000001, 0x43e0000010000000}, 718 {0x8000008000000001, 0x43e0000010000000},
719 {0x8000000000000400, 0x43e0000000000000}, 719 {0x8000000000000400, 0x43e0000000000000},
720 {0x8000000000000401, 0x43e0000000000001}}; 720 {0x8000000000000401, 0x43e0000000000001}};
721 WasmRunner<double> r(MachineType::Uint64()); 721 WasmRunner<double> r(MachineType::Uint64());
722 BUILD(r, WASM_F64_UCONVERT_I64(WASM_GET_LOCAL(0))); 722 BUILD(r, WASM_F64_UCONVERT_I64(WASM_GET_LOCAL(0)));
723 for (size_t i = 0; i < arraysize(values); i++) { 723 for (size_t i = 0; i < arraysize(values); i++) {
724 CHECK_EQ(bit_cast<double>(values[i].expected), r.Call(values[i].input)); 724 CHECK_EQ(bit_cast<double>(values[i].expected), r.Call(values[i].input));
725 } 725 }
726 } 726 }
727 727
728 TEST(Run_Wasm_I64SConvertF32a) { 728 WASM_EXEC_TEST(I64SConvertF32a) {
729 WasmRunner<int64_t> r(MachineType::Float32()); 729 WasmRunner<int64_t> r(MachineType::Float32());
730 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0))); 730 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0)));
731 731
732 FOR_FLOAT32_INPUTS(i) { 732 FOR_FLOAT32_INPUTS(i) {
733 if (*i < static_cast<float>(std::numeric_limits<int64_t>::max()) && 733 if (*i < static_cast<float>(std::numeric_limits<int64_t>::max()) &&
734 *i >= static_cast<float>(std::numeric_limits<int64_t>::min())) { 734 *i >= static_cast<float>(std::numeric_limits<int64_t>::min())) {
735 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 735 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
736 } else { 736 } else {
737 CHECK_TRAP64(r.Call(*i)); 737 CHECK_TRAP64(r.Call(*i));
738 } 738 }
739 } 739 }
740 } 740 }
741 741
742 TEST(Run_Wasm_I64SConvertF64a) { 742 WASM_EXEC_TEST(I64SConvertF64a) {
743 WasmRunner<int64_t> r(MachineType::Float64()); 743 WasmRunner<int64_t> r(MachineType::Float64());
744 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))); 744 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0)));
745 745
746 FOR_FLOAT64_INPUTS(i) { 746 FOR_FLOAT64_INPUTS(i) {
747 if (*i < static_cast<double>(std::numeric_limits<int64_t>::max()) && 747 if (*i < static_cast<double>(std::numeric_limits<int64_t>::max()) &&
748 *i >= static_cast<double>(std::numeric_limits<int64_t>::min())) { 748 *i >= static_cast<double>(std::numeric_limits<int64_t>::min())) {
749 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 749 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
750 } else { 750 } else {
751 CHECK_TRAP64(r.Call(*i)); 751 CHECK_TRAP64(r.Call(*i));
752 } 752 }
753 } 753 }
754 } 754 }
755 755
756 TEST(Run_Wasm_I64UConvertF32a) { 756 WASM_EXEC_TEST(I64UConvertF32a) {
757 WasmRunner<uint64_t> r(MachineType::Float32()); 757 WasmRunner<uint64_t> r(MachineType::Float32());
758 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0))); 758 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0)));
759 759
760 FOR_FLOAT32_INPUTS(i) { 760 FOR_FLOAT32_INPUTS(i) {
761 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) && 761 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) &&
762 *i > -1) { 762 *i > -1) {
763 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 763 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
764 } else { 764 } else {
765 CHECK_TRAP64(r.Call(*i)); 765 CHECK_TRAP64(r.Call(*i));
766 } 766 }
767 } 767 }
768 } 768 }
769 769
770 TEST(Run_Wasm_I64UConvertF64a) { 770 WASM_EXEC_TEST(I64UConvertF64a) {
771 WasmRunner<uint64_t> r(MachineType::Float64()); 771 WasmRunner<uint64_t> r(MachineType::Float64());
772 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0))); 772 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0)));
773 773
774 FOR_FLOAT64_INPUTS(i) { 774 FOR_FLOAT64_INPUTS(i) {
775 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) && 775 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) &&
776 *i > -1) { 776 *i > -1) {
777 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 777 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
778 } else { 778 } else {
779 CHECK_TRAP64(r.Call(*i)); 779 CHECK_TRAP64(r.Call(*i));
780 } 780 }
781 } 781 }
782 } 782 }
783 783
784 TEST(Run_WasmCallI64Parameter) { 784 WASM_EXEC_TEST(CallI64Parameter) {
785 // Build the target function. 785 // Build the target function.
786 LocalType param_types[20]; 786 LocalType param_types[20];
787 for (int i = 0; i < 20; i++) param_types[i] = kAstI64; 787 for (int i = 0; i < 20; i++) param_types[i] = kAstI64;
788 param_types[3] = kAstI32; 788 param_types[3] = kAstI32;
789 param_types[4] = kAstI32; 789 param_types[4] = kAstI32;
790 FunctionSig sig(1, 19, param_types); 790 FunctionSig sig(1, 19, param_types);
791 for (int i = 0; i < 19; i++) { 791 for (int i = 0; i < 19; i++) {
792 TestingModule module; 792 TestingModule module;
793 WasmFunctionCompiler t(&sig, &module); 793 WasmFunctionCompiler t(&sig, &module);
794 if (i == 2 || i == 3) { 794 if (i == 2 || i == 3) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 CHECK_EQ(expected, r.Call(a, b)); 848 CHECK_EQ(expected, r.Call(a, b));
849 } 849 }
850 } 850 }
851 851
852 #define TEST_I64_BINOP(name, expected, a, b) \ 852 #define TEST_I64_BINOP(name, expected, a, b) \
853 do { \ 853 do { \
854 if (WASM_64 || kSupported_##name) \ 854 if (WASM_64 || kSupported_##name) \
855 TestI64Binop(kExpr##name, expected, a, b); \ 855 TestI64Binop(kExpr##name, expected, a, b); \
856 } while (false) 856 } while (false)
857 857
858 TEST(Run_Wasm_I64Binops) { 858 WASM_EXEC_TEST(I64Binops) {
859 TEST_I64_BINOP(I64Add, -5586332274295447011, 0x501b72ebabc26847, 859 TEST_I64_BINOP(I64Add, -5586332274295447011, 0x501b72ebabc26847,
860 0x625de9793d8f79d6); 860 0x625de9793d8f79d6);
861 TEST_I64_BINOP(I64Sub, 9001903251710731490, 0xf24fe6474640002e, 861 TEST_I64_BINOP(I64Sub, 9001903251710731490, 0xf24fe6474640002e,
862 0x7562b6f711991b4c); 862 0x7562b6f711991b4c);
863 TEST_I64_BINOP(I64Mul, -4569547818546064176, 0x231a263c2cbc6451, 863 TEST_I64_BINOP(I64Mul, -4569547818546064176, 0x231a263c2cbc6451,
864 0xead44de6bd3e23d0); 864 0xead44de6bd3e23d0);
865 TEST_I64_BINOP(I64Mul, -25963122347507043, 0x4da1fa47c9352b73, 865 TEST_I64_BINOP(I64Mul, -25963122347507043, 0x4da1fa47c9352b73,
866 0x91fe82317aa035af); 866 0x91fe82317aa035af);
867 TEST_I64_BINOP(I64Mul, 7640290486138131960, 0x185731abe8eea47c, 867 TEST_I64_BINOP(I64Mul, 7640290486138131960, 0x185731abe8eea47c,
868 0x714ec59f1380d4c2); 868 0x714ec59f1380d4c2);
(...skipping 16 matching lines...) Expand all
885 TEST_I64_BINOP(I64Ror, 7617662827409989779, 0xebff67cf0c126d36, 13); 885 TEST_I64_BINOP(I64Ror, 7617662827409989779, 0xebff67cf0c126d36, 13);
886 TEST_I64_BINOP(I64Rol, -2097714064174346012, 0x43938b8db0b0f230, 14); 886 TEST_I64_BINOP(I64Rol, -2097714064174346012, 0x43938b8db0b0f230, 14);
887 TEST_I64_BINOP(I64Rol, 8728493013947314237, 0xe07af243ac4d219d, 15); 887 TEST_I64_BINOP(I64Rol, 8728493013947314237, 0xe07af243ac4d219d, 15);
888 } 888 }
889 889
890 #define TEST_I64_CMP(name, expected, a, b) \ 890 #define TEST_I64_CMP(name, expected, a, b) \
891 do { \ 891 do { \
892 if (WASM_64 || kSupported_##name) TestI64Cmp(kExpr##name, expected, a, b); \ 892 if (WASM_64 || kSupported_##name) TestI64Cmp(kExpr##name, expected, a, b); \
893 } while (false) 893 } while (false)
894 894
895 TEST(Run_Wasm_I64Compare) { 895 WASM_EXEC_TEST(I64Compare) {
896 TEST_I64_CMP(I64Eq, 0, 0xB915D8FA494064F0, 0x04D700B2536019A3); 896 TEST_I64_CMP(I64Eq, 0, 0xB915D8FA494064F0, 0x04D700B2536019A3);
897 TEST_I64_CMP(I64Ne, 1, 0xC2FAFAAAB0446CDC, 0x52A3328F780C97A3); 897 TEST_I64_CMP(I64Ne, 1, 0xC2FAFAAAB0446CDC, 0x52A3328F780C97A3);
898 TEST_I64_CMP(I64LtS, 0, 0x673636E6306B0578, 0x028EC9ECA78F7227); 898 TEST_I64_CMP(I64LtS, 0, 0x673636E6306B0578, 0x028EC9ECA78F7227);
899 TEST_I64_CMP(I64LeS, 1, 0xAE5214114B86A0FA, 0x7C1D21DA3DFD0CCF); 899 TEST_I64_CMP(I64LeS, 1, 0xAE5214114B86A0FA, 0x7C1D21DA3DFD0CCF);
900 TEST_I64_CMP(I64LtU, 0, 0x7D52166381EC1CE0, 0x59F4A6A9E78CD3D8); 900 TEST_I64_CMP(I64LtU, 0, 0x7D52166381EC1CE0, 0x59F4A6A9E78CD3D8);
901 TEST_I64_CMP(I64LeU, 1, 0xE4169A385C7EA0E0, 0xFBDBED2C8781E5BC); 901 TEST_I64_CMP(I64LeU, 1, 0xE4169A385C7EA0E0, 0xFBDBED2C8781E5BC);
902 TEST_I64_CMP(I64GtS, 0, 0x9D08FF8FB5F42E81, 0xD4E5C9D7FE09F621); 902 TEST_I64_CMP(I64GtS, 0, 0x9D08FF8FB5F42E81, 0xD4E5C9D7FE09F621);
903 TEST_I64_CMP(I64GeS, 1, 0x78DA3B2F73264E0F, 0x6FE5E2A67C501CBE); 903 TEST_I64_CMP(I64GeS, 1, 0x78DA3B2F73264E0F, 0x6FE5E2A67C501CBE);
904 TEST_I64_CMP(I64GtU, 0, 0x8F691284E44F7DA9, 0xD5EA9BC1EE149192); 904 TEST_I64_CMP(I64GtU, 0, 0x8F691284E44F7DA9, 0xD5EA9BC1EE149192);
905 TEST_I64_CMP(I64GeU, 0, 0x0886A0C58C7AA224, 0x5DDBE5A81FD7EE47); 905 TEST_I64_CMP(I64GeU, 0, 0x0886A0C58C7AA224, 0x5DDBE5A81FD7EE47);
906 } 906 }
907 907
908 TEST(Run_Wasm_I64Clz) { 908 WASM_EXEC_TEST(I64Clz) {
909 REQUIRE(I64Clz); 909 REQUIRE(I64Clz);
910 struct { 910 struct {
911 int64_t expected; 911 int64_t expected;
912 uint64_t input; 912 uint64_t input;
913 } values[] = {{0, 0x8000100000000000}, {1, 0x4000050000000000}, 913 } values[] = {{0, 0x8000100000000000}, {1, 0x4000050000000000},
914 {2, 0x2000030000000000}, {3, 0x1000000300000000}, 914 {2, 0x2000030000000000}, {3, 0x1000000300000000},
915 {4, 0x0805000000000000}, {5, 0x0400600000000000}, 915 {4, 0x0805000000000000}, {5, 0x0400600000000000},
916 {6, 0x0200000000000000}, {7, 0x010000a000000000}, 916 {6, 0x0200000000000000}, {7, 0x010000a000000000},
917 {8, 0x00800c0000000000}, {9, 0x0040000000000000}, 917 {8, 0x00800c0000000000}, {9, 0x0040000000000000},
918 {10, 0x0020000d00000000}, {11, 0x00100f0000000000}, 918 {10, 0x0020000d00000000}, {11, 0x00100f0000000000},
(...skipping 25 matching lines...) Expand all
944 {62, 0x0000000000000002}, {63, 0x0000000000000001}, 944 {62, 0x0000000000000002}, {63, 0x0000000000000001},
945 {64, 0x0000000000000000}}; 945 {64, 0x0000000000000000}};
946 946
947 WasmRunner<int64_t> r(MachineType::Uint64()); 947 WasmRunner<int64_t> r(MachineType::Uint64());
948 BUILD(r, WASM_I64_CLZ(WASM_GET_LOCAL(0))); 948 BUILD(r, WASM_I64_CLZ(WASM_GET_LOCAL(0)));
949 for (size_t i = 0; i < arraysize(values); i++) { 949 for (size_t i = 0; i < arraysize(values); i++) {
950 CHECK_EQ(values[i].expected, r.Call(values[i].input)); 950 CHECK_EQ(values[i].expected, r.Call(values[i].input));
951 } 951 }
952 } 952 }
953 953
954 TEST(Run_Wasm_I64Ctz) { 954 WASM_EXEC_TEST(I64Ctz) {
955 REQUIRE(I64Ctz); 955 REQUIRE(I64Ctz);
956 struct { 956 struct {
957 int64_t expected; 957 int64_t expected;
958 uint64_t input; 958 uint64_t input;
959 } values[] = {{64, 0x0000000000000000}, {63, 0x8000000000000000}, 959 } values[] = {{64, 0x0000000000000000}, {63, 0x8000000000000000},
960 {62, 0x4000000000000000}, {61, 0x2000000000000000}, 960 {62, 0x4000000000000000}, {61, 0x2000000000000000},
961 {60, 0x1000000000000000}, {59, 0xa800000000000000}, 961 {60, 0x1000000000000000}, {59, 0xa800000000000000},
962 {58, 0xf400000000000000}, {57, 0x6200000000000000}, 962 {58, 0xf400000000000000}, {57, 0x6200000000000000},
963 {56, 0x9100000000000000}, {55, 0xcd80000000000000}, 963 {56, 0x9100000000000000}, {55, 0xcd80000000000000},
964 {54, 0x0940000000000000}, {53, 0xaf20000000000000}, 964 {54, 0x0940000000000000}, {53, 0xaf20000000000000},
(...skipping 25 matching lines...) Expand all
990 {2, 0x000000009afdbc84}, {1, 0x000000009afdbc82}, 990 {2, 0x000000009afdbc84}, {1, 0x000000009afdbc82},
991 {0, 0x000000009afdbc81}}; 991 {0, 0x000000009afdbc81}};
992 992
993 WasmRunner<int64_t> r(MachineType::Uint64()); 993 WasmRunner<int64_t> r(MachineType::Uint64());
994 BUILD(r, WASM_I64_CTZ(WASM_GET_LOCAL(0))); 994 BUILD(r, WASM_I64_CTZ(WASM_GET_LOCAL(0)));
995 for (size_t i = 0; i < arraysize(values); i++) { 995 for (size_t i = 0; i < arraysize(values); i++) {
996 CHECK_EQ(values[i].expected, r.Call(values[i].input)); 996 CHECK_EQ(values[i].expected, r.Call(values[i].input));
997 } 997 }
998 } 998 }
999 999
1000 TEST(Run_Wasm_I64Popcnt) { 1000 WASM_EXEC_TEST(I64Popcnt2) {
1001 REQUIRE(I64Popcnt); 1001 REQUIRE(I64Popcnt);
1002 struct { 1002 struct {
1003 int64_t expected; 1003 int64_t expected;
1004 uint64_t input; 1004 uint64_t input;
1005 } values[] = {{64, 0xffffffffffffffff}, 1005 } values[] = {{64, 0xffffffffffffffff},
1006 {0, 0x0000000000000000}, 1006 {0, 0x0000000000000000},
1007 {2, 0x0000080000008000}, 1007 {2, 0x0000080000008000},
1008 {26, 0x1123456782345678}, 1008 {26, 0x1123456782345678},
1009 {38, 0xffedcba09edcba09}}; 1009 {38, 0xffedcba09edcba09}};
1010 1010
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 FOR_INT64_INPUTS(j) { 1061 FOR_INT64_INPUTS(j) {
1062 CHECK_EQ(*i ^ *j ^ *j ^ *j, r.Call(*i, *j, *j, *j)); 1062 CHECK_EQ(*i ^ *j ^ *j ^ *j, r.Call(*i, *j, *j, *j));
1063 CHECK_EQ(*j ^ *i ^ *j ^ *j, r.Call(*j, *i, *j, *j)); 1063 CHECK_EQ(*j ^ *i ^ *j ^ *j, r.Call(*j, *i, *j, *j));
1064 CHECK_EQ(*j ^ *j ^ *i ^ *j, r.Call(*j, *j, *i, *j)); 1064 CHECK_EQ(*j ^ *j ^ *i ^ *j, r.Call(*j, *j, *i, *j));
1065 CHECK_EQ(*j ^ *j ^ *j ^ *i, r.Call(*j, *j, *j, *i)); 1065 CHECK_EQ(*j ^ *j ^ *j ^ *i, r.Call(*j, *j, *j, *i));
1066 } 1066 }
1067 } 1067 }
1068 } 1068 }
1069 } 1069 }
1070 1070
1071 TEST(Run_WasmCall_Int64Sub) { 1071 WASM_EXEC_TEST(Call_Int64Sub) {
1072 REQUIRE(I64Sub); 1072 REQUIRE(I64Sub);
1073 // Build the target function. 1073 // Build the target function.
1074 TestSignatures sigs; 1074 TestSignatures sigs;
1075 TestingModule module; 1075 TestingModule module;
1076 WasmFunctionCompiler t(sigs.l_ll(), &module); 1076 WasmFunctionCompiler t(sigs.l_ll(), &module);
1077 BUILD(t, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1077 BUILD(t, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1078 uint32_t index = t.CompileAndAdd(); 1078 uint32_t index = t.CompileAndAdd();
1079 1079
1080 // Build the caller function. 1080 // Build the caller function.
1081 WasmRunner<int64_t> r(&module, MachineType::Int64(), MachineType::Int64()); 1081 WasmRunner<int64_t> r(&module, MachineType::Int64(), MachineType::Int64());
1082 BUILD(r, WASM_CALL_FUNCTION2(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1082 BUILD(r, WASM_CALL_FUNCTION2(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1083 1083
1084 FOR_INT32_INPUTS(i) { 1084 FOR_INT32_INPUTS(i) {
1085 FOR_INT32_INPUTS(j) { 1085 FOR_INT32_INPUTS(j) {
1086 int64_t a = static_cast<int64_t>(*i) << 32 | 1086 int64_t a = static_cast<int64_t>(*i) << 32 |
1087 (static_cast<int64_t>(*j) | 0xFFFFFFFF); 1087 (static_cast<int64_t>(*j) | 0xFFFFFFFF);
1088 int64_t b = static_cast<int64_t>(*j) << 32 | 1088 int64_t b = static_cast<int64_t>(*j) << 32 |
1089 (static_cast<int64_t>(*i) | 0xFFFFFFFF); 1089 (static_cast<int64_t>(*i) | 0xFFFFFFFF);
1090 1090
1091 int64_t expected = static_cast<int64_t>(static_cast<uint64_t>(a) - 1091 int64_t expected = static_cast<int64_t>(static_cast<uint64_t>(a) -
1092 static_cast<uint64_t>(b)); 1092 static_cast<uint64_t>(b));
1093 CHECK_EQ(expected, r.Call(a, b)); 1093 CHECK_EQ(expected, r.Call(a, b));
1094 } 1094 }
1095 } 1095 }
1096 } 1096 }
1097 1097
1098 TEST(Run_Wasm_LoadStoreI64_sx) { 1098 WASM_EXEC_TEST(LoadStoreI64_sx) {
1099 REQUIRE(I64LoadStore); 1099 REQUIRE(I64LoadStore);
1100 REQUIRE(DepthFirst); 1100 REQUIRE(DepthFirst);
1101 byte loads[] = {kExprI64LoadMem8S, kExprI64LoadMem16S, kExprI64LoadMem32S, 1101 byte loads[] = {kExprI64LoadMem8S, kExprI64LoadMem16S, kExprI64LoadMem32S,
1102 kExprI64LoadMem}; 1102 kExprI64LoadMem};
1103 1103
1104 for (size_t m = 0; m < arraysize(loads); m++) { 1104 for (size_t m = 0; m < arraysize(loads); m++) {
1105 TestingModule module; 1105 TestingModule module;
1106 byte* memory = module.AddMemoryElems<byte>(16); 1106 byte* memory = module.AddMemoryElems<byte>(16);
1107 WasmRunner<int64_t> r(&module); 1107 WasmRunner<int64_t> r(&module);
1108 1108
(...skipping 20 matching lines...) Expand all
1129 1129
1130 CHECK_EQ(expected, r.Call()); 1130 CHECK_EQ(expected, r.Call());
1131 CHECK_EQ(static_cast<byte>(i), memory[8 + size - 1]); 1131 CHECK_EQ(static_cast<byte>(i), memory[8 + size - 1]);
1132 for (int j = size; j < 8; j++) { 1132 for (int j = size; j < 8; j++) {
1133 CHECK_EQ(255, memory[8 + j]); 1133 CHECK_EQ(255, memory[8 + j]);
1134 } 1134 }
1135 } 1135 }
1136 } 1136 }
1137 } 1137 }
1138 1138
1139 TEST(Run_Wasm_I64SConvertF32b) { 1139 WASM_EXEC_TEST(I64SConvertF32b) {
1140 REQUIRE(I64SConvertF32); 1140 REQUIRE(I64SConvertF32);
1141 WasmRunner<int64_t> r(MachineType::Float32()); 1141 WasmRunner<int64_t> r(MachineType::Float32());
1142 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0))); 1142 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0)));
1143 1143
1144 FOR_FLOAT32_INPUTS(i) { 1144 FOR_FLOAT32_INPUTS(i) {
1145 if (*i < static_cast<float>(INT64_MAX) && 1145 if (*i < static_cast<float>(INT64_MAX) &&
1146 *i >= static_cast<float>(INT64_MIN)) { 1146 *i >= static_cast<float>(INT64_MIN)) {
1147 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 1147 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
1148 } else { 1148 } else {
1149 CHECK_TRAP64(r.Call(*i)); 1149 CHECK_TRAP64(r.Call(*i));
1150 } 1150 }
1151 } 1151 }
1152 } 1152 }
1153 1153
1154 TEST(Run_Wasm_I64SConvertF64b) { 1154 WASM_EXEC_TEST(I64SConvertF64b) {
1155 REQUIRE(I64SConvertF64); 1155 REQUIRE(I64SConvertF64);
1156 WasmRunner<int64_t> r(MachineType::Float64()); 1156 WasmRunner<int64_t> r(MachineType::Float64());
1157 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))); 1157 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0)));
1158 1158
1159 FOR_FLOAT64_INPUTS(i) { 1159 FOR_FLOAT64_INPUTS(i) {
1160 if (*i < static_cast<double>(INT64_MAX) && 1160 if (*i < static_cast<double>(INT64_MAX) &&
1161 *i >= static_cast<double>(INT64_MIN)) { 1161 *i >= static_cast<double>(INT64_MIN)) {
1162 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 1162 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
1163 } else { 1163 } else {
1164 CHECK_TRAP64(r.Call(*i)); 1164 CHECK_TRAP64(r.Call(*i));
1165 } 1165 }
1166 } 1166 }
1167 } 1167 }
1168 1168
1169 TEST(Run_Wasm_I64UConvertF32b) { 1169 WASM_EXEC_TEST(I64UConvertF32b) {
1170 REQUIRE(I64UConvertF32); 1170 REQUIRE(I64UConvertF32);
1171 WasmRunner<uint64_t> r(MachineType::Float32()); 1171 WasmRunner<uint64_t> r(MachineType::Float32());
1172 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0))); 1172 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0)));
1173 1173
1174 FOR_FLOAT32_INPUTS(i) { 1174 FOR_FLOAT32_INPUTS(i) {
1175 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) { 1175 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) {
1176 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 1176 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
1177 } else { 1177 } else {
1178 CHECK_TRAP64(r.Call(*i)); 1178 CHECK_TRAP64(r.Call(*i));
1179 } 1179 }
1180 } 1180 }
1181 } 1181 }
1182 1182
1183 TEST(Run_Wasm_I64UConvertF64b) { 1183 WASM_EXEC_TEST(I64UConvertF64b) {
1184 REQUIRE(I64UConvertF64); 1184 REQUIRE(I64UConvertF64);
1185 WasmRunner<uint64_t> r(MachineType::Float64()); 1185 WasmRunner<uint64_t> r(MachineType::Float64());
1186 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0))); 1186 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0)));
1187 1187
1188 FOR_FLOAT64_INPUTS(i) { 1188 FOR_FLOAT64_INPUTS(i) {
1189 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) { 1189 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) {
1190 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 1190 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
1191 } else { 1191 } else {
1192 CHECK_TRAP64(r.Call(*i)); 1192 CHECK_TRAP64(r.Call(*i));
1193 } 1193 }
1194 } 1194 }
1195 } 1195 }
1196 1196
1197 TEST(Run_Wasm_I64ReinterpretF64) { 1197 WASM_EXEC_TEST(I64ReinterpretF64) {
1198 REQUIRE(I64ReinterpretF64); 1198 REQUIRE(I64ReinterpretF64);
1199 TestingModule module; 1199 TestingModule module;
1200 int64_t* memory = module.AddMemoryElems<int64_t>(8); 1200 int64_t* memory = module.AddMemoryElems<int64_t>(8);
1201 WasmRunner<int64_t> r(&module); 1201 WasmRunner<int64_t> r(&module);
1202 1202
1203 BUILD(r, WASM_I64_REINTERPRET_F64( 1203 BUILD(r, WASM_I64_REINTERPRET_F64(
1204 WASM_LOAD_MEM(MachineType::Float64(), WASM_ZERO))); 1204 WASM_LOAD_MEM(MachineType::Float64(), WASM_ZERO)));
1205 1205
1206 FOR_INT32_INPUTS(i) { 1206 FOR_INT32_INPUTS(i) {
1207 int64_t expected = static_cast<int64_t>(*i) * 0x300010001; 1207 int64_t expected = static_cast<int64_t>(*i) * 0x300010001;
1208 memory[0] = expected; 1208 memory[0] = expected;
1209 CHECK_EQ(expected, r.Call()); 1209 CHECK_EQ(expected, r.Call());
1210 } 1210 }
1211 } 1211 }
1212 1212
1213 TEST(Run_Wasm_F64ReinterpretI64) { 1213 WASM_EXEC_TEST(F64ReinterpretI64) {
1214 REQUIRE(F64ReinterpretI64); 1214 REQUIRE(F64ReinterpretI64);
1215 TestingModule module; 1215 TestingModule module;
1216 int64_t* memory = module.AddMemoryElems<int64_t>(8); 1216 int64_t* memory = module.AddMemoryElems<int64_t>(8);
1217 WasmRunner<int64_t> r(&module, MachineType::Int64()); 1217 WasmRunner<int64_t> r(&module, MachineType::Int64());
1218 1218
1219 BUILD(r, WASM_BLOCK( 1219 BUILD(r, WASM_BLOCK(
1220 2, WASM_STORE_MEM(MachineType::Float64(), WASM_ZERO, 1220 2, WASM_STORE_MEM(MachineType::Float64(), WASM_ZERO,
1221 WASM_F64_REINTERPRET_I64(WASM_GET_LOCAL(0))), 1221 WASM_F64_REINTERPRET_I64(WASM_GET_LOCAL(0))),
1222 WASM_GET_LOCAL(0))); 1222 WASM_GET_LOCAL(0)));
1223 1223
1224 FOR_INT32_INPUTS(i) { 1224 FOR_INT32_INPUTS(i) {
1225 int64_t expected = static_cast<int64_t>(*i) * 0x300010001; 1225 int64_t expected = static_cast<int64_t>(*i) * 0x300010001;
1226 CHECK_EQ(expected, r.Call(expected)); 1226 CHECK_EQ(expected, r.Call(expected));
1227 CHECK_EQ(expected, memory[0]); 1227 CHECK_EQ(expected, memory[0]);
1228 } 1228 }
1229 } 1229 }
1230 1230
1231 TEST(Run_Wasm_LoadMemI64) { 1231 WASM_EXEC_TEST(LoadMemI64) {
1232 REQUIRE(I64LoadStore); 1232 REQUIRE(I64LoadStore);
1233 TestingModule module; 1233 TestingModule module;
1234 int64_t* memory = module.AddMemoryElems<int64_t>(8); 1234 int64_t* memory = module.AddMemoryElems<int64_t>(8);
1235 module.RandomizeMemory(1111); 1235 module.RandomizeMemory(1111);
1236 WasmRunner<int64_t> r(&module); 1236 WasmRunner<int64_t> r(&module);
1237 1237
1238 BUILD(r, WASM_LOAD_MEM(MachineType::Int64(), WASM_I8(0))); 1238 BUILD(r, WASM_LOAD_MEM(MachineType::Int64(), WASM_I8(0)));
1239 1239
1240 memory[0] = 0xaabbccdd00112233LL; 1240 memory[0] = 0xaabbccdd00112233LL;
1241 CHECK_EQ(0xaabbccdd00112233LL, r.Call()); 1241 CHECK_EQ(0xaabbccdd00112233LL, r.Call());
1242 1242
1243 memory[0] = 0x33aabbccdd001122LL; 1243 memory[0] = 0x33aabbccdd001122LL;
1244 CHECK_EQ(0x33aabbccdd001122LL, r.Call()); 1244 CHECK_EQ(0x33aabbccdd001122LL, r.Call());
1245 1245
1246 memory[0] = 77777777; 1246 memory[0] = 77777777;
1247 CHECK_EQ(77777777, r.Call()); 1247 CHECK_EQ(77777777, r.Call());
1248 } 1248 }
1249 1249
1250 TEST(Run_Wasm_MemI64_Sum) { 1250 WASM_EXEC_TEST(MemI64_Sum) {
1251 REQUIRE(I64LoadStore); 1251 REQUIRE(I64LoadStore);
1252 REQUIRE(I64Add); 1252 REQUIRE(I64Add);
1253 REQUIRE(I64Sub); 1253 REQUIRE(I64Sub);
1254 REQUIRE(I64Phi); 1254 REQUIRE(I64Phi);
1255 const int kNumElems = 20; 1255 const int kNumElems = 20;
1256 TestingModule module; 1256 TestingModule module;
1257 uint64_t* memory = module.AddMemoryElems<uint64_t>(kNumElems); 1257 uint64_t* memory = module.AddMemoryElems<uint64_t>(kNumElems);
1258 WasmRunner<uint64_t> r(&module, MachineType::Int32()); 1258 WasmRunner<uint64_t> r(&module, MachineType::Int32());
1259 const byte kSum = r.AllocateLocal(kAstI64); 1259 const byte kSum = r.AllocateLocal(kAstI64);
1260 1260
(...skipping 15 matching lines...) Expand all
1276 module.RandomizeMemory(i * 33); 1276 module.RandomizeMemory(i * 33);
1277 uint64_t expected = 0; 1277 uint64_t expected = 0;
1278 for (size_t j = kNumElems - 1; j > 0; j--) { 1278 for (size_t j = kNumElems - 1; j > 0; j--) {
1279 expected += memory[j]; 1279 expected += memory[j];
1280 } 1280 }
1281 uint64_t result = r.Call(8 * (kNumElems - 1)); 1281 uint64_t result = r.Call(8 * (kNumElems - 1));
1282 CHECK_EQ(expected, result); 1282 CHECK_EQ(expected, result);
1283 } 1283 }
1284 } 1284 }
1285 1285
1286 TEST(Run_Wasm_I64Global) { 1286 WASM_EXEC_TEST(I64Global) {
1287 REQUIRE(I64LoadStore); 1287 REQUIRE(I64LoadStore);
1288 REQUIRE(I64SConvertI32); 1288 REQUIRE(I64SConvertI32);
1289 REQUIRE(I64And); 1289 REQUIRE(I64And);
1290 REQUIRE(DepthFirst); 1290 REQUIRE(DepthFirst);
1291 TestingModule module; 1291 TestingModule module;
1292 int64_t* global = module.AddGlobal<int64_t>(MachineType::Int64()); 1292 int64_t* global = module.AddGlobal<int64_t>(MachineType::Int64());
1293 WasmRunner<int32_t> r(&module, MachineType::Int32()); 1293 WasmRunner<int32_t> r(&module, MachineType::Int32());
1294 // global = global + p0 1294 // global = global + p0
1295 BUILD(r, B2(WASM_STORE_GLOBAL( 1295 BUILD(r, B2(WASM_STORE_GLOBAL(
1296 0, WASM_I64_AND(WASM_LOAD_GLOBAL(0), 1296 0, WASM_I64_AND(WASM_LOAD_GLOBAL(0),
1297 WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0)))), 1297 WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0)))),
1298 WASM_ZERO)); 1298 WASM_ZERO));
1299 1299
1300 *global = 0xFFFFFFFFFFFFFFFFLL; 1300 *global = 0xFFFFFFFFFFFFFFFFLL;
1301 for (int i = 9; i < 444444; i += 111111) { 1301 for (int i = 9; i < 444444; i += 111111) {
1302 int64_t expected = *global & i; 1302 int64_t expected = *global & i;
1303 r.Call(i); 1303 r.Call(i);
1304 CHECK_EQ(expected, *global); 1304 CHECK_EQ(expected, *global);
1305 } 1305 }
1306 } 1306 }
1307 1307
1308 TEST(Run_Wasm_I64Eqz) { 1308 WASM_EXEC_TEST(I64Eqz) {
1309 REQUIRE(I64Eq); 1309 REQUIRE(I64Eq);
1310 1310
1311 WasmRunner<int32_t> r(MachineType::Int64()); 1311 WasmRunner<int32_t> r(MachineType::Int64());
1312 BUILD(r, WASM_I64_EQZ(WASM_GET_LOCAL(0))); 1312 BUILD(r, WASM_I64_EQZ(WASM_GET_LOCAL(0)));
1313 1313
1314 FOR_INT64_INPUTS(i) { 1314 FOR_INT64_INPUTS(i) {
1315 int32_t result = *i == 0 ? 1 : 0; 1315 int32_t result = *i == 0 ? 1 : 0;
1316 CHECK_EQ(result, r.Call(*i)); 1316 CHECK_EQ(result, r.Call(*i));
1317 } 1317 }
1318 } 1318 }
1319 1319
1320 TEST(Run_Wasm_I64Ror) { 1320 WASM_EXEC_TEST(I64Ror) {
1321 REQUIRE(I64Ror); 1321 REQUIRE(I64Ror);
1322 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 1322 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
1323 BUILD(r, WASM_I64_ROR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1323 BUILD(r, WASM_I64_ROR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1324 1324
1325 FOR_UINT64_INPUTS(i) { 1325 FOR_UINT64_INPUTS(i) {
1326 FOR_UINT64_INPUTS(j) { 1326 FOR_UINT64_INPUTS(j) {
1327 int64_t expected = bits::RotateRight64(*i, *j & 0x3f); 1327 int64_t expected = bits::RotateRight64(*i, *j & 0x3f);
1328 CHECK_EQ(expected, r.Call(*i, *j)); 1328 CHECK_EQ(expected, r.Call(*i, *j));
1329 } 1329 }
1330 } 1330 }
1331 } 1331 }
1332 1332
1333 TEST(Run_Wasm_I64Rol) { 1333 WASM_EXEC_TEST(I64Rol) {
1334 REQUIRE(I64Rol); 1334 REQUIRE(I64Rol);
1335 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 1335 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64());
1336 BUILD(r, WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1336 BUILD(r, WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1337 1337
1338 FOR_UINT64_INPUTS(i) { 1338 FOR_UINT64_INPUTS(i) {
1339 FOR_UINT64_INPUTS(j) { 1339 FOR_UINT64_INPUTS(j) {
1340 int64_t expected = bits::RotateLeft64(*i, *j & 0x3f); 1340 int64_t expected = bits::RotateLeft64(*i, *j & 0x3f);
1341 CHECK_EQ(expected, r.Call(*i, *j)); 1341 CHECK_EQ(expected, r.Call(*i, *j));
1342 } 1342 }
1343 } 1343 }
1344 } 1344 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698