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

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

Issue 1972153002: [wasm] Implement an interpreter for WASM. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase 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
« no previous file with comments | « test/cctest/wasm/test-run-wasm.cc ('k') | test/cctest/wasm/test-run-wasm-asmjs.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 WASM_EXEC_TEST(I64Const) { 93 WASM_EXEC_TEST(I64Const) {
94 REQUIRE(I64Const); 94 REQUIRE(I64Const);
95 WasmRunner<int64_t> r; 95 WasmRunner<int64_t> r(execution_mode);
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 WASM_EXEC_TEST(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(execution_mode);
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 WASM_EXEC_TEST(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(execution_mode, 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 WASM_EXEC_TEST(I64Add) { 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(execution_mode, MachineType::Int64(),
127 MachineType::Int64());
127 BUILD(r, WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 128 BUILD(r, WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
128 FOR_INT64_INPUTS(i) { 129 FOR_INT64_INPUTS(i) {
129 FOR_INT64_INPUTS(j) { CHECK_EQ(*i + *j, r.Call(*i, *j)); } 130 FOR_INT64_INPUTS(j) { CHECK_EQ(*i + *j, r.Call(*i, *j)); }
130 } 131 }
131 } 132 }
132 133
133 WASM_EXEC_TEST(I64Sub) { 134 WASM_EXEC_TEST(I64Sub) {
134 REQUIRE(I64Sub); 135 REQUIRE(I64Sub);
135 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 136 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
137 MachineType::Int64());
136 BUILD(r, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 138 BUILD(r, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
137 FOR_INT64_INPUTS(i) { 139 FOR_INT64_INPUTS(i) {
138 FOR_INT64_INPUTS(j) { CHECK_EQ(*i - *j, r.Call(*i, *j)); } 140 FOR_INT64_INPUTS(j) { CHECK_EQ(*i - *j, r.Call(*i, *j)); }
139 } 141 }
140 } 142 }
141 143
142 WASM_EXEC_TEST(I64DivS) { 144 WASM_EXEC_TEST(I64DivS) {
143 REQUIRE(I64DivS); 145 REQUIRE(I64DivS);
144 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 146 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
147 MachineType::Int64());
145 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 148 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
146 FOR_INT64_INPUTS(i) { 149 FOR_INT64_INPUTS(i) {
147 FOR_INT64_INPUTS(j) { 150 FOR_INT64_INPUTS(j) {
148 if (*j == 0) { 151 if (*j == 0) {
149 CHECK_TRAP64(r.Call(*i, *j)); 152 CHECK_TRAP64(r.Call(*i, *j));
150 } else if (*j == -1 && *i == std::numeric_limits<int64_t>::min()) { 153 } else if (*j == -1 && *i == std::numeric_limits<int64_t>::min()) {
151 CHECK_TRAP64(r.Call(*i, *j)); 154 CHECK_TRAP64(r.Call(*i, *j));
152 } else { 155 } else {
153 CHECK_EQ(*i / *j, r.Call(*i, *j)); 156 CHECK_EQ(*i / *j, r.Call(*i, *j));
154 } 157 }
155 } 158 }
156 } 159 }
157 } 160 }
158 161
159 WASM_EXEC_TEST(I64DivS_Trap) { 162 WASM_EXEC_TEST(I64DivS_Trap) {
160 REQUIRE(I64DivS); 163 REQUIRE(I64DivS);
161 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 164 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
165 MachineType::Int64());
162 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 166 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
163 CHECK_EQ(0, r.Call(asi64(0), asi64(100))); 167 CHECK_EQ(0, r.Call(asi64(0), asi64(100)));
164 CHECK_TRAP64(r.Call(asi64(100), asi64(0))); 168 CHECK_TRAP64(r.Call(asi64(100), asi64(0)));
165 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0))); 169 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0)));
166 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(-1))); 170 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))); 171 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0)));
168 } 172 }
169 173
170 WASM_EXEC_TEST(I64DivS_Byzero_Const) { 174 WASM_EXEC_TEST(I64DivS_Byzero_Const) {
171 REQUIRE(I64DivS); 175 REQUIRE(I64DivS);
172 for (int8_t denom = -2; denom < 8; denom++) { 176 for (int8_t denom = -2; denom < 8; denom++) {
173 WasmRunner<int64_t> r(MachineType::Int64()); 177 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
174 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(denom))); 178 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(denom)));
175 for (int64_t val = -7; val < 8; val++) { 179 for (int64_t val = -7; val < 8; val++) {
176 if (denom == 0) { 180 if (denom == 0) {
177 CHECK_TRAP64(r.Call(val)); 181 CHECK_TRAP64(r.Call(val));
178 } else { 182 } else {
179 CHECK_EQ(val / denom, r.Call(val)); 183 CHECK_EQ(val / denom, r.Call(val));
180 } 184 }
181 } 185 }
182 } 186 }
183 } 187 }
184 188
185 WASM_EXEC_TEST(I64DivU) { 189 WASM_EXEC_TEST(I64DivU) {
186 REQUIRE(I64DivU); 190 REQUIRE(I64DivU);
187 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 191 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
192 MachineType::Uint64());
188 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 193 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
189 FOR_UINT64_INPUTS(i) { 194 FOR_UINT64_INPUTS(i) {
190 FOR_UINT64_INPUTS(j) { 195 FOR_UINT64_INPUTS(j) {
191 if (*j == 0) { 196 if (*j == 0) {
192 CHECK_TRAP64(r.Call(*i, *j)); 197 CHECK_TRAP64(r.Call(*i, *j));
193 } else { 198 } else {
194 CHECK_EQ(*i / *j, r.Call(*i, *j)); 199 CHECK_EQ(*i / *j, r.Call(*i, *j));
195 } 200 }
196 } 201 }
197 } 202 }
198 } 203 }
199 204
200 WASM_EXEC_TEST(I64DivU_Trap) { 205 WASM_EXEC_TEST(I64DivU_Trap) {
201 REQUIRE(I64DivU); 206 REQUIRE(I64DivU);
202 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 207 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
208 MachineType::Uint64());
203 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 209 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
204 CHECK_EQ(0, r.Call(asu64(0), asu64(100))); 210 CHECK_EQ(0, r.Call(asu64(0), asu64(100)));
205 CHECK_TRAP64(r.Call(asu64(100), asu64(0))); 211 CHECK_TRAP64(r.Call(asu64(100), asu64(0)));
206 CHECK_TRAP64(r.Call(asu64(1001), asu64(0))); 212 CHECK_TRAP64(r.Call(asu64(1001), asu64(0)));
207 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0))); 213 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0)));
208 } 214 }
209 215
210 WASM_EXEC_TEST(I64DivU_Byzero_Const) { 216 WASM_EXEC_TEST(I64DivU_Byzero_Const) {
211 REQUIRE(I64DivU); 217 REQUIRE(I64DivU);
212 for (uint64_t denom = 0xfffffffffffffffe; denom < 8; denom++) { 218 for (uint64_t denom = 0xfffffffffffffffe; denom < 8; denom++) {
213 WasmRunner<uint64_t> r(MachineType::Uint64()); 219 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64());
214 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(denom))); 220 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(denom)));
215 221
216 for (uint64_t val = 0xfffffffffffffff0; val < 8; val++) { 222 for (uint64_t val = 0xfffffffffffffff0; val < 8; val++) {
217 if (denom == 0) { 223 if (denom == 0) {
218 CHECK_TRAP64(r.Call(val)); 224 CHECK_TRAP64(r.Call(val));
219 } else { 225 } else {
220 CHECK_EQ(val / denom, r.Call(val)); 226 CHECK_EQ(val / denom, r.Call(val));
221 } 227 }
222 } 228 }
223 } 229 }
224 } 230 }
225 231
226 WASM_EXEC_TEST(I64RemS) { 232 WASM_EXEC_TEST(I64RemS) {
227 REQUIRE(I64RemS); 233 REQUIRE(I64RemS);
228 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 234 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
235 MachineType::Int64());
229 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 236 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
230 FOR_INT64_INPUTS(i) { 237 FOR_INT64_INPUTS(i) {
231 FOR_INT64_INPUTS(j) { 238 FOR_INT64_INPUTS(j) {
232 if (*j == 0) { 239 if (*j == 0) {
233 CHECK_TRAP64(r.Call(*i, *j)); 240 CHECK_TRAP64(r.Call(*i, *j));
234 } else { 241 } else {
235 CHECK_EQ(*i % *j, r.Call(*i, *j)); 242 CHECK_EQ(*i % *j, r.Call(*i, *j));
236 } 243 }
237 } 244 }
238 } 245 }
239 } 246 }
240 247
241 WASM_EXEC_TEST(I64RemS_Trap) { 248 WASM_EXEC_TEST(I64RemS_Trap) {
242 REQUIRE(I64RemS); 249 REQUIRE(I64RemS);
243 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 250 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
251 MachineType::Int64());
244 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 252 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
245 CHECK_EQ(33, r.Call(asi64(133), asi64(100))); 253 CHECK_EQ(33, r.Call(asi64(133), asi64(100)));
246 CHECK_EQ(0, r.Call(std::numeric_limits<int64_t>::min(), asi64(-1))); 254 CHECK_EQ(0, r.Call(std::numeric_limits<int64_t>::min(), asi64(-1)));
247 CHECK_TRAP64(r.Call(asi64(100), asi64(0))); 255 CHECK_TRAP64(r.Call(asi64(100), asi64(0)));
248 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0))); 256 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0)));
249 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0))); 257 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0)));
250 } 258 }
251 259
252 WASM_EXEC_TEST(I64RemU) { 260 WASM_EXEC_TEST(I64RemU) {
253 REQUIRE(I64RemU); 261 REQUIRE(I64RemU);
254 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 262 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
263 MachineType::Uint64());
255 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 264 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
256 FOR_UINT64_INPUTS(i) { 265 FOR_UINT64_INPUTS(i) {
257 FOR_UINT64_INPUTS(j) { 266 FOR_UINT64_INPUTS(j) {
258 if (*j == 0) { 267 if (*j == 0) {
259 CHECK_TRAP64(r.Call(*i, *j)); 268 CHECK_TRAP64(r.Call(*i, *j));
260 } else { 269 } else {
261 CHECK_EQ(*i % *j, r.Call(*i, *j)); 270 CHECK_EQ(*i % *j, r.Call(*i, *j));
262 } 271 }
263 } 272 }
264 } 273 }
265 } 274 }
266 275
267 WASM_EXEC_TEST(I64RemU_Trap) { 276 WASM_EXEC_TEST(I64RemU_Trap) {
268 REQUIRE(I64RemU); 277 REQUIRE(I64RemU);
269 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 278 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
279 MachineType::Uint64());
270 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 280 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
271 CHECK_EQ(17, r.Call(asu64(217), asu64(100))); 281 CHECK_EQ(17, r.Call(asu64(217), asu64(100)));
272 CHECK_TRAP64(r.Call(asu64(100), asu64(0))); 282 CHECK_TRAP64(r.Call(asu64(100), asu64(0)));
273 CHECK_TRAP64(r.Call(asu64(1001), asu64(0))); 283 CHECK_TRAP64(r.Call(asu64(1001), asu64(0)));
274 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0))); 284 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0)));
275 } 285 }
276 286
277 WASM_EXEC_TEST(I64And) { 287 WASM_EXEC_TEST(I64And) {
278 REQUIRE(I64And); 288 REQUIRE(I64And);
279 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 289 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
290 MachineType::Int64());
280 BUILD(r, WASM_I64_AND(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 291 BUILD(r, WASM_I64_AND(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
281 FOR_INT64_INPUTS(i) { 292 FOR_INT64_INPUTS(i) {
282 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) & (*j), r.Call(*i, *j)); } 293 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) & (*j), r.Call(*i, *j)); }
283 } 294 }
284 } 295 }
285 296
286 WASM_EXEC_TEST(I64Ior) { 297 WASM_EXEC_TEST(I64Ior) {
287 REQUIRE(I64Ior); 298 REQUIRE(I64Ior);
288 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 299 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
300 MachineType::Int64());
289 BUILD(r, WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 301 BUILD(r, WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
290 FOR_INT64_INPUTS(i) { 302 FOR_INT64_INPUTS(i) {
291 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) | (*j), r.Call(*i, *j)); } 303 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) | (*j), r.Call(*i, *j)); }
292 } 304 }
293 } 305 }
294 306
295 WASM_EXEC_TEST(I64Xor) { 307 WASM_EXEC_TEST(I64Xor) {
296 REQUIRE(I64Xor); 308 REQUIRE(I64Xor);
297 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 309 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
310 MachineType::Int64());
298 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 311 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
299 FOR_INT64_INPUTS(i) { 312 FOR_INT64_INPUTS(i) {
300 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) ^ (*j), r.Call(*i, *j)); } 313 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) ^ (*j), r.Call(*i, *j)); }
301 } 314 }
302 } 315 }
303 316
304 WASM_EXEC_TEST(I64Shl) { 317 WASM_EXEC_TEST(I64Shl) {
305 REQUIRE(I64Shl); 318 REQUIRE(I64Shl);
306 { 319 {
307 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 320 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
321 MachineType::Uint64());
308 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 322 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
309 323
310 FOR_UINT64_INPUTS(i) { 324 FOR_UINT64_INPUTS(i) {
311 FOR_UINT64_INPUTS(j) { 325 FOR_UINT64_INPUTS(j) {
312 uint64_t expected = (*i) << (*j & 0x3f); 326 uint64_t expected = (*i) << (*j & 0x3f);
313 CHECK_EQ(expected, r.Call(*i, *j)); 327 CHECK_EQ(expected, r.Call(*i, *j));
314 } 328 }
315 } 329 }
316 } 330 }
317 { 331 {
318 WasmRunner<int64_t> r(MachineType::Int64()); 332 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
319 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(0))); 333 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(0)));
320 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 0, r.Call(*i)); } 334 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 0, r.Call(*i)); }
321 } 335 }
322 { 336 {
323 WasmRunner<int64_t> r(MachineType::Int64()); 337 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
324 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(32))); 338 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(32)));
325 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 32, r.Call(*i)); } 339 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 32, r.Call(*i)); }
326 } 340 }
327 { 341 {
328 WasmRunner<int64_t> r(MachineType::Int64()); 342 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
329 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(20))); 343 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)); } 344 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 20, r.Call(*i)); }
331 } 345 }
332 { 346 {
333 WasmRunner<int64_t> r(MachineType::Int64()); 347 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
334 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(40))); 348 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)); } 349 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 40, r.Call(*i)); }
336 } 350 }
337 } 351 }
338 352
339 WASM_EXEC_TEST(I64ShrU) { 353 WASM_EXEC_TEST(I64ShrU) {
340 REQUIRE(I64ShrU); 354 REQUIRE(I64ShrU);
341 { 355 {
342 WasmRunner<uint64_t> r(MachineType::Uint64(), MachineType::Uint64()); 356 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
357 MachineType::Uint64());
343 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 358 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
344 359
345 FOR_UINT64_INPUTS(i) { 360 FOR_UINT64_INPUTS(i) {
346 FOR_UINT64_INPUTS(j) { 361 FOR_UINT64_INPUTS(j) {
347 uint64_t expected = (*i) >> (*j & 0x3f); 362 uint64_t expected = (*i) >> (*j & 0x3f);
348 CHECK_EQ(expected, r.Call(*i, *j)); 363 CHECK_EQ(expected, r.Call(*i, *j));
349 } 364 }
350 } 365 }
351 } 366 }
352 { 367 {
353 WasmRunner<int64_t> r(MachineType::Int64()); 368 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
354 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(0))); 369 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(0)));
355 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 0, r.Call(*i)); } 370 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 0, r.Call(*i)); }
356 } 371 }
357 { 372 {
358 WasmRunner<int64_t> r(MachineType::Int64()); 373 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
359 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(32))); 374 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(32)));
360 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 32, r.Call(*i)); } 375 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 32, r.Call(*i)); }
361 } 376 }
362 { 377 {
363 WasmRunner<int64_t> r(MachineType::Int64()); 378 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
364 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(20))); 379 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)); } 380 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 20, r.Call(*i)); }
366 } 381 }
367 { 382 {
368 WasmRunner<int64_t> r(MachineType::Int64()); 383 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
369 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(40))); 384 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)); } 385 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 40, r.Call(*i)); }
371 } 386 }
372 } 387 }
373 388
374 WASM_EXEC_TEST(I64ShrS) { 389 WASM_EXEC_TEST(I64ShrS) {
375 REQUIRE(I64ShrS); 390 REQUIRE(I64ShrS);
376 { 391 {
377 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 392 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
393 MachineType::Int64());
378 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 394 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
379 395
380 FOR_INT64_INPUTS(i) { 396 FOR_INT64_INPUTS(i) {
381 FOR_INT64_INPUTS(j) { 397 FOR_INT64_INPUTS(j) {
382 int64_t expected = (*i) >> (*j & 0x3f); 398 int64_t expected = (*i) >> (*j & 0x3f);
383 CHECK_EQ(expected, r.Call(*i, *j)); 399 CHECK_EQ(expected, r.Call(*i, *j));
384 } 400 }
385 } 401 }
386 } 402 }
387 { 403 {
388 WasmRunner<int64_t> r(MachineType::Int64()); 404 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
389 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(0))); 405 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(0)));
390 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 0, r.Call(*i)); } 406 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 0, r.Call(*i)); }
391 } 407 }
392 { 408 {
393 WasmRunner<int64_t> r(MachineType::Int64()); 409 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
394 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(32))); 410 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(32)));
395 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 32, r.Call(*i)); } 411 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 32, r.Call(*i)); }
396 } 412 }
397 { 413 {
398 WasmRunner<int64_t> r(MachineType::Int64()); 414 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
399 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(20))); 415 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)); } 416 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 20, r.Call(*i)); }
401 } 417 }
402 { 418 {
403 WasmRunner<int64_t> r(MachineType::Int64()); 419 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
404 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(40))); 420 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)); } 421 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 40, r.Call(*i)); }
406 } 422 }
407 } 423 }
408 424
409 WASM_EXEC_TEST(I64Eq) { 425 WASM_EXEC_TEST(I64Eq) {
410 REQUIRE(I64Eq); 426 REQUIRE(I64Eq);
411 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 427 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
428 MachineType::Int64());
412 BUILD(r, WASM_I64_EQ(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 429 BUILD(r, WASM_I64_EQ(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
413 FOR_INT64_INPUTS(i) { 430 FOR_INT64_INPUTS(i) {
414 FOR_INT64_INPUTS(j) { CHECK_EQ(*i == *j ? 1 : 0, r.Call(*i, *j)); } 431 FOR_INT64_INPUTS(j) { CHECK_EQ(*i == *j ? 1 : 0, r.Call(*i, *j)); }
415 } 432 }
416 } 433 }
417 434
418 WASM_EXEC_TEST(I64Ne) { 435 WASM_EXEC_TEST(I64Ne) {
419 REQUIRE(I64Ne); 436 REQUIRE(I64Ne);
420 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 437 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
438 MachineType::Int64());
421 BUILD(r, WASM_I64_NE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 439 BUILD(r, WASM_I64_NE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
422 FOR_INT64_INPUTS(i) { 440 FOR_INT64_INPUTS(i) {
423 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)); }
424 } 442 }
425 } 443 }
426 444
427 WASM_EXEC_TEST(I64LtS) { 445 WASM_EXEC_TEST(I64LtS) {
428 REQUIRE(I64LtS); 446 REQUIRE(I64LtS);
429 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 447 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
448 MachineType::Int64());
430 BUILD(r, WASM_I64_LTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 449 BUILD(r, WASM_I64_LTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
431 FOR_INT64_INPUTS(i) { 450 FOR_INT64_INPUTS(i) {
432 FOR_INT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); } 451 FOR_INT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); }
433 } 452 }
434 } 453 }
435 454
436 WASM_EXEC_TEST(I64LeS) { 455 WASM_EXEC_TEST(I64LeS) {
437 REQUIRE(I64LeS); 456 REQUIRE(I64LeS);
438 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 457 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
458 MachineType::Int64());
439 BUILD(r, WASM_I64_LES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 459 BUILD(r, WASM_I64_LES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
440 FOR_INT64_INPUTS(i) { 460 FOR_INT64_INPUTS(i) {
441 FOR_INT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); } 461 FOR_INT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); }
442 } 462 }
443 } 463 }
444 464
445 WASM_EXEC_TEST(I64LtU) { 465 WASM_EXEC_TEST(I64LtU) {
446 REQUIRE(I64LtU); 466 REQUIRE(I64LtU);
447 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 467 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
468 MachineType::Int64());
448 BUILD(r, WASM_I64_LTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 469 BUILD(r, WASM_I64_LTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
449 FOR_UINT64_INPUTS(i) { 470 FOR_UINT64_INPUTS(i) {
450 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); } 471 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); }
451 } 472 }
452 } 473 }
453 474
454 WASM_EXEC_TEST(I64LeU) { 475 WASM_EXEC_TEST(I64LeU) {
455 REQUIRE(I64LeU); 476 REQUIRE(I64LeU);
456 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 477 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
478 MachineType::Int64());
457 BUILD(r, WASM_I64_LEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 479 BUILD(r, WASM_I64_LEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
458 FOR_UINT64_INPUTS(i) { 480 FOR_UINT64_INPUTS(i) {
459 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); } 481 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); }
460 } 482 }
461 } 483 }
462 484
463 WASM_EXEC_TEST(I64GtS) { 485 WASM_EXEC_TEST(I64GtS) {
464 REQUIRE(I64GtS); 486 REQUIRE(I64GtS);
465 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 487 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
488 MachineType::Int64());
466 BUILD(r, WASM_I64_GTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 489 BUILD(r, WASM_I64_GTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
467 FOR_INT64_INPUTS(i) { 490 FOR_INT64_INPUTS(i) {
468 FOR_INT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); } 491 FOR_INT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); }
469 } 492 }
470 } 493 }
471 494
472 WASM_EXEC_TEST(I64GeS) { 495 WASM_EXEC_TEST(I64GeS) {
473 REQUIRE(I64GeS); 496 REQUIRE(I64GeS);
474 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 497 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
498 MachineType::Int64());
475 BUILD(r, WASM_I64_GES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 499 BUILD(r, WASM_I64_GES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
476 FOR_INT64_INPUTS(i) { 500 FOR_INT64_INPUTS(i) {
477 FOR_INT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); } 501 FOR_INT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); }
478 } 502 }
479 } 503 }
480 504
481 WASM_EXEC_TEST(I64GtU) { 505 WASM_EXEC_TEST(I64GtU) {
482 REQUIRE(I64GtU); 506 REQUIRE(I64GtU);
483 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 507 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
508 MachineType::Int64());
484 BUILD(r, WASM_I64_GTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 509 BUILD(r, WASM_I64_GTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
485 FOR_UINT64_INPUTS(i) { 510 FOR_UINT64_INPUTS(i) {
486 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); } 511 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); }
487 } 512 }
488 } 513 }
489 514
490 WASM_EXEC_TEST(I64GeU) { 515 WASM_EXEC_TEST(I64GeU) {
491 REQUIRE(I64GeU); 516 REQUIRE(I64GeU);
492 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 517 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
518 MachineType::Int64());
493 BUILD(r, WASM_I64_GEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 519 BUILD(r, WASM_I64_GEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
494 FOR_UINT64_INPUTS(i) { 520 FOR_UINT64_INPUTS(i) {
495 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); } 521 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); }
496 } 522 }
497 } 523 }
498 524
499 WASM_EXEC_TEST(I32ConvertI64) { 525 WASM_EXEC_TEST(I32ConvertI64) {
500 REQUIRE(I32ConvertI64); 526 REQUIRE(I32ConvertI64);
501 FOR_INT64_INPUTS(i) { 527 FOR_INT64_INPUTS(i) {
502 WasmRunner<int32_t> r; 528 WasmRunner<int32_t> r(execution_mode);
503 BUILD(r, WASM_I32_CONVERT_I64(WASM_I64V(*i))); 529 BUILD(r, WASM_I32_CONVERT_I64(WASM_I64V(*i)));
504 CHECK_EQ(static_cast<int32_t>(*i), r.Call()); 530 CHECK_EQ(static_cast<int32_t>(*i), r.Call());
505 } 531 }
506 } 532 }
507 533
508 WASM_EXEC_TEST(I64SConvertI32) { 534 WASM_EXEC_TEST(I64SConvertI32) {
509 REQUIRE(I64SConvertI32); 535 REQUIRE(I64SConvertI32);
510 WasmRunner<int64_t> r(MachineType::Int32()); 536 WasmRunner<int64_t> r(execution_mode, MachineType::Int32());
511 BUILD(r, WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0))); 537 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)); } 538 FOR_INT32_INPUTS(i) { CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); }
513 } 539 }
514 540
515 WASM_EXEC_TEST(I64UConvertI32) { 541 WASM_EXEC_TEST(I64UConvertI32) {
516 REQUIRE(I64UConvertI32); 542 REQUIRE(I64UConvertI32);
517 WasmRunner<int64_t> r(MachineType::Uint32()); 543 WasmRunner<int64_t> r(execution_mode, MachineType::Uint32());
518 BUILD(r, WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(0))); 544 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)); } 545 FOR_UINT32_INPUTS(i) { CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); }
520 } 546 }
521 547
522 WASM_EXEC_TEST(I64Popcnt) { 548 WASM_EXEC_TEST(I64Popcnt) {
523 struct { 549 struct {
524 int64_t expected; 550 int64_t expected;
525 uint64_t input; 551 uint64_t input;
526 } values[] = {{64, 0xffffffffffffffff}, 552 } values[] = {{64, 0xffffffffffffffff},
527 {0, 0x0000000000000000}, 553 {0, 0x0000000000000000},
528 {2, 0x0000080000008000}, 554 {2, 0x0000080000008000},
529 {26, 0x1123456782345678}, 555 {26, 0x1123456782345678},
530 {38, 0xffedcba09edcba09}}; 556 {38, 0xffedcba09edcba09}};
531 557
532 WasmRunner<int64_t> r(MachineType::Uint64()); 558 WasmRunner<int64_t> r(execution_mode, MachineType::Uint64());
533 BUILD(r, WASM_I64_POPCNT(WASM_GET_LOCAL(0))); 559 BUILD(r, WASM_I64_POPCNT(WASM_GET_LOCAL(0)));
534 for (size_t i = 0; i < arraysize(values); i++) { 560 for (size_t i = 0; i < arraysize(values); i++) {
535 CHECK_EQ(values[i].expected, r.Call(values[i].input)); 561 CHECK_EQ(values[i].expected, r.Call(values[i].input));
536 } 562 }
537 } 563 }
538 564
539 WASM_EXEC_TEST(F32SConvertI64) { 565 WASM_EXEC_TEST(F32SConvertI64) {
540 REQUIRE(F32SConvertI64); 566 REQUIRE(F32SConvertI64);
541 WasmRunner<float> r(MachineType::Int64()); 567 WasmRunner<float> r(execution_mode, MachineType::Int64());
542 BUILD(r, WASM_F32_SCONVERT_I64(WASM_GET_LOCAL(0))); 568 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)); } 569 FOR_INT64_INPUTS(i) { CHECK_FLOAT_EQ(static_cast<float>(*i), r.Call(*i)); }
544 } 570 }
545 571
546 WASM_EXEC_TEST(F32UConvertI64) { 572 WASM_EXEC_TEST(F32UConvertI64) {
547 REQUIRE(F32UConvertI64); 573 REQUIRE(F32UConvertI64);
548 struct { 574 struct {
549 uint64_t input; 575 uint64_t input;
550 uint32_t expected; 576 uint32_t expected;
551 } values[] = {{0x0, 0x0}, 577 } values[] = {{0x0, 0x0},
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 {0x3fffffffffff, 0x56800000}, 643 {0x3fffffffffff, 0x56800000},
618 {0x1fffffffffff, 0x56000000}, 644 {0x1fffffffffff, 0x56000000},
619 {0xfffffffffff, 0x55800000}, 645 {0xfffffffffff, 0x55800000},
620 {0x7ffffffffff, 0x55000000}, 646 {0x7ffffffffff, 0x55000000},
621 {0x3ffffffffff, 0x54800000}, 647 {0x3ffffffffff, 0x54800000},
622 {0x1ffffffffff, 0x54000000}, 648 {0x1ffffffffff, 0x54000000},
623 {0x8000008000000000, 0x5f000000}, 649 {0x8000008000000000, 0x5f000000},
624 {0x8000008000000001, 0x5f000001}, 650 {0x8000008000000001, 0x5f000001},
625 {0x8000000000000400, 0x5f000000}, 651 {0x8000000000000400, 0x5f000000},
626 {0x8000000000000401, 0x5f000000}}; 652 {0x8000000000000401, 0x5f000000}};
627 WasmRunner<float> r(MachineType::Uint64()); 653 WasmRunner<float> r(execution_mode, MachineType::Uint64());
628 BUILD(r, WASM_F32_UCONVERT_I64(WASM_GET_LOCAL(0))); 654 BUILD(r, WASM_F32_UCONVERT_I64(WASM_GET_LOCAL(0)));
629 for (size_t i = 0; i < arraysize(values); i++) { 655 for (size_t i = 0; i < arraysize(values); i++) {
630 CHECK_EQ(bit_cast<float>(values[i].expected), r.Call(values[i].input)); 656 CHECK_EQ(bit_cast<float>(values[i].expected), r.Call(values[i].input));
631 } 657 }
632 } 658 }
633 659
634 WASM_EXEC_TEST(F64SConvertI64) { 660 WASM_EXEC_TEST(F64SConvertI64) {
635 REQUIRE(F64SConvertI64); 661 REQUIRE(F64SConvertI64);
636 WasmRunner<double> r(MachineType::Int64()); 662 WasmRunner<double> r(execution_mode, MachineType::Int64());
637 BUILD(r, WASM_F64_SCONVERT_I64(WASM_GET_LOCAL(0))); 663 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)); } 664 FOR_INT64_INPUTS(i) { CHECK_DOUBLE_EQ(static_cast<double>(*i), r.Call(*i)); }
639 } 665 }
640 666
641 WASM_EXEC_TEST(F64UConvertI64) { 667 WASM_EXEC_TEST(F64UConvertI64) {
642 REQUIRE(F64UConvertI64); 668 REQUIRE(F64UConvertI64);
643 struct { 669 struct {
644 uint64_t input; 670 uint64_t input;
645 uint64_t expected; 671 uint64_t expected;
646 } values[] = {{0x0, 0x0}, 672 } values[] = {{0x0, 0x0},
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 {0x3fffffffffff, 0x42cfffffffffff80}, 737 {0x3fffffffffff, 0x42cfffffffffff80},
712 {0x1fffffffffff, 0x42bfffffffffff00}, 738 {0x1fffffffffff, 0x42bfffffffffff00},
713 {0xfffffffffff, 0x42affffffffffe00}, 739 {0xfffffffffff, 0x42affffffffffe00},
714 {0x7ffffffffff, 0x429ffffffffffc00}, 740 {0x7ffffffffff, 0x429ffffffffffc00},
715 {0x3ffffffffff, 0x428ffffffffff800}, 741 {0x3ffffffffff, 0x428ffffffffff800},
716 {0x1ffffffffff, 0x427ffffffffff000}, 742 {0x1ffffffffff, 0x427ffffffffff000},
717 {0x8000008000000000, 0x43e0000010000000}, 743 {0x8000008000000000, 0x43e0000010000000},
718 {0x8000008000000001, 0x43e0000010000000}, 744 {0x8000008000000001, 0x43e0000010000000},
719 {0x8000000000000400, 0x43e0000000000000}, 745 {0x8000000000000400, 0x43e0000000000000},
720 {0x8000000000000401, 0x43e0000000000001}}; 746 {0x8000000000000401, 0x43e0000000000001}};
721 WasmRunner<double> r(MachineType::Uint64()); 747 WasmRunner<double> r(execution_mode, MachineType::Uint64());
722 BUILD(r, WASM_F64_UCONVERT_I64(WASM_GET_LOCAL(0))); 748 BUILD(r, WASM_F64_UCONVERT_I64(WASM_GET_LOCAL(0)));
723 for (size_t i = 0; i < arraysize(values); i++) { 749 for (size_t i = 0; i < arraysize(values); i++) {
724 CHECK_EQ(bit_cast<double>(values[i].expected), r.Call(values[i].input)); 750 CHECK_EQ(bit_cast<double>(values[i].expected), r.Call(values[i].input));
725 } 751 }
726 } 752 }
727 753
728 WASM_EXEC_TEST(I64SConvertF32a) { 754 WASM_EXEC_TEST(I64SConvertF32a) {
729 WasmRunner<int64_t> r(MachineType::Float32()); 755 WasmRunner<int64_t> r(execution_mode, MachineType::Float32());
730 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0))); 756 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0)));
731 757
732 FOR_FLOAT32_INPUTS(i) { 758 FOR_FLOAT32_INPUTS(i) {
733 if (*i < static_cast<float>(std::numeric_limits<int64_t>::max()) && 759 if (*i < static_cast<float>(std::numeric_limits<int64_t>::max()) &&
734 *i >= static_cast<float>(std::numeric_limits<int64_t>::min())) { 760 *i >= static_cast<float>(std::numeric_limits<int64_t>::min())) {
735 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 761 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
736 } else { 762 } else {
737 CHECK_TRAP64(r.Call(*i)); 763 CHECK_TRAP64(r.Call(*i));
738 } 764 }
739 } 765 }
740 } 766 }
741 767
742 WASM_EXEC_TEST(I64SConvertF64a) { 768 WASM_EXEC_TEST(I64SConvertF64a) {
743 WasmRunner<int64_t> r(MachineType::Float64()); 769 WasmRunner<int64_t> r(execution_mode, MachineType::Float64());
744 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))); 770 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0)));
745 771
746 FOR_FLOAT64_INPUTS(i) { 772 FOR_FLOAT64_INPUTS(i) {
747 if (*i < static_cast<double>(std::numeric_limits<int64_t>::max()) && 773 if (*i < static_cast<double>(std::numeric_limits<int64_t>::max()) &&
748 *i >= static_cast<double>(std::numeric_limits<int64_t>::min())) { 774 *i >= static_cast<double>(std::numeric_limits<int64_t>::min())) {
749 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 775 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
750 } else { 776 } else {
751 CHECK_TRAP64(r.Call(*i)); 777 CHECK_TRAP64(r.Call(*i));
752 } 778 }
753 } 779 }
754 } 780 }
755 781
756 WASM_EXEC_TEST(I64UConvertF32a) { 782 WASM_EXEC_TEST(I64UConvertF32a) {
757 WasmRunner<uint64_t> r(MachineType::Float32()); 783 WasmRunner<uint64_t> r(execution_mode, MachineType::Float32());
758 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0))); 784 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0)));
759 785
760 FOR_FLOAT32_INPUTS(i) { 786 FOR_FLOAT32_INPUTS(i) {
761 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) && 787 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) &&
762 *i > -1) { 788 *i > -1) {
763 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 789 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
764 } else { 790 } else {
765 CHECK_TRAP64(r.Call(*i)); 791 CHECK_TRAP64(r.Call(*i));
766 } 792 }
767 } 793 }
768 } 794 }
769 795
770 WASM_EXEC_TEST(I64UConvertF64a) { 796 WASM_EXEC_TEST(I64UConvertF64a) {
771 WasmRunner<uint64_t> r(MachineType::Float64()); 797 WasmRunner<uint64_t> r(execution_mode, MachineType::Float64());
772 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0))); 798 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0)));
773 799
774 FOR_FLOAT64_INPUTS(i) { 800 FOR_FLOAT64_INPUTS(i) {
775 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) && 801 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) &&
776 *i > -1) { 802 *i > -1) {
777 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 803 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
778 } else { 804 } else {
779 CHECK_TRAP64(r.Call(*i)); 805 CHECK_TRAP64(r.Call(*i));
780 } 806 }
781 } 807 }
782 } 808 }
783 809
784 WASM_EXEC_TEST(CallI64Parameter) { 810 WASM_EXEC_TEST(CallI64Parameter) {
785 // Build the target function. 811 // Build the target function.
786 LocalType param_types[20]; 812 LocalType param_types[20];
787 for (int i = 0; i < 20; i++) param_types[i] = kAstI64; 813 for (int i = 0; i < 20; i++) param_types[i] = kAstI64;
788 param_types[3] = kAstI32; 814 param_types[3] = kAstI32;
789 param_types[4] = kAstI32; 815 param_types[4] = kAstI32;
790 FunctionSig sig(1, 19, param_types); 816 FunctionSig sig(1, 19, param_types);
791 for (int i = 0; i < 19; i++) { 817 for (int i = 0; i < 19; i++) {
792 TestingModule module; 818 TestingModule module(execution_mode);
793 WasmFunctionCompiler t(&sig, &module); 819 WasmFunctionCompiler t(&sig, &module);
794 if (i == 2 || i == 3) { 820 if (i == 2 || i == 3) {
795 continue; 821 continue;
796 } else { 822 } else {
797 BUILD(t, WASM_GET_LOCAL(i)); 823 BUILD(t, WASM_GET_LOCAL(i));
798 } 824 }
799 uint32_t index = t.CompileAndAdd(); 825 uint32_t index = t.CompileAndAdd();
800 826
801 // Build the calling function. 827 // Build the calling function.
802 WasmRunner<int32_t> r(&module); 828 WasmRunner<int32_t> r(&module);
803 BUILD( 829 BUILD(
804 r, 830 r,
805 WASM_I32_CONVERT_I64(WASM_CALL_FUNCTIONN( 831 WASM_I32_CONVERT_I64(WASM_CALL_FUNCTIONN(
806 19, index, WASM_I64V_9(0xbcd12340000000b), 832 19, index, WASM_I64V_9(0xbcd12340000000b),
807 WASM_I64V_9(0xbcd12340000000c), WASM_I32V_1(0xd), 833 WASM_I64V_9(0xbcd12340000000c), WASM_I32V_1(0xd),
808 WASM_I32_CONVERT_I64(WASM_I64V_9(0xbcd12340000000e)), 834 WASM_I32_CONVERT_I64(WASM_I64V_9(0xbcd12340000000e)),
809 WASM_I64V_9(0xbcd12340000000f), WASM_I64V_10(0xbcd1234000000010), 835 WASM_I64V_9(0xbcd12340000000f), WASM_I64V_10(0xbcd1234000000010),
810 WASM_I64V_10(0xbcd1234000000011), WASM_I64V_10(0xbcd1234000000012), 836 WASM_I64V_10(0xbcd1234000000011), WASM_I64V_10(0xbcd1234000000012),
811 WASM_I64V_10(0xbcd1234000000013), WASM_I64V_10(0xbcd1234000000014), 837 WASM_I64V_10(0xbcd1234000000013), WASM_I64V_10(0xbcd1234000000014),
812 WASM_I64V_10(0xbcd1234000000015), WASM_I64V_10(0xbcd1234000000016), 838 WASM_I64V_10(0xbcd1234000000015), WASM_I64V_10(0xbcd1234000000016),
813 WASM_I64V_10(0xbcd1234000000017), WASM_I64V_10(0xbcd1234000000018), 839 WASM_I64V_10(0xbcd1234000000017), WASM_I64V_10(0xbcd1234000000018),
814 WASM_I64V_10(0xbcd1234000000019), WASM_I64V_10(0xbcd123400000001a), 840 WASM_I64V_10(0xbcd1234000000019), WASM_I64V_10(0xbcd123400000001a),
815 WASM_I64V_10(0xbcd123400000001b), WASM_I64V_10(0xbcd123400000001c), 841 WASM_I64V_10(0xbcd123400000001b), WASM_I64V_10(0xbcd123400000001c),
816 WASM_I64V_10(0xbcd123400000001d)))); 842 WASM_I64V_10(0xbcd123400000001d))));
817 843
818 CHECK_EQ(i + 0xb, r.Call()); 844 CHECK_EQ(i + 0xb, r.Call());
819 } 845 }
820 } 846 }
821 847
822 void TestI64Binop(WasmOpcode opcode, int64_t expected, int64_t a, int64_t b) { 848 void TestI64Binop(WasmExecutionMode execution_mode, WasmOpcode opcode,
849 int64_t expected, int64_t a, int64_t b) {
823 { 850 {
824 WasmRunner<int64_t> r; 851 WasmRunner<int64_t> r(execution_mode);
825 // return K op K 852 // return K op K
826 BUILD(r, WASM_BINOP(opcode, WASM_I64V(a), WASM_I64V(b))); 853 BUILD(r, WASM_BINOP(opcode, WASM_I64V(a), WASM_I64V(b)));
827 CHECK_EQ(expected, r.Call()); 854 CHECK_EQ(expected, r.Call());
828 } 855 }
829 { 856 {
830 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 857 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
858 MachineType::Int64());
831 // return a op b 859 // return a op b
832 BUILD(r, WASM_BINOP(opcode, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 860 BUILD(r, WASM_BINOP(opcode, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
833 CHECK_EQ(expected, r.Call(a, b)); 861 CHECK_EQ(expected, r.Call(a, b));
834 } 862 }
835 } 863 }
836 864
837 void TestI64Cmp(WasmOpcode opcode, int64_t expected, int64_t a, int64_t b) { 865 void TestI64Cmp(WasmExecutionMode execution_mode, WasmOpcode opcode,
866 int64_t expected, int64_t a, int64_t b) {
838 { 867 {
839 WasmRunner<int32_t> r; 868 WasmRunner<int32_t> r(execution_mode);
840 // return K op K 869 // return K op K
841 BUILD(r, WASM_BINOP(opcode, WASM_I64V(a), WASM_I64V(b))); 870 BUILD(r, WASM_BINOP(opcode, WASM_I64V(a), WASM_I64V(b)));
842 CHECK_EQ(expected, r.Call()); 871 CHECK_EQ(expected, r.Call());
843 } 872 }
844 { 873 {
845 WasmRunner<int32_t> r(MachineType::Int64(), MachineType::Int64()); 874 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
875 MachineType::Int64());
846 // return a op b 876 // return a op b
847 BUILD(r, WASM_BINOP(opcode, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 877 BUILD(r, WASM_BINOP(opcode, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
848 CHECK_EQ(expected, r.Call(a, b)); 878 CHECK_EQ(expected, r.Call(a, b));
849 } 879 }
850 } 880 }
851 881
852 #define TEST_I64_BINOP(name, expected, a, b) \ 882 #define TEST_I64_BINOP(name, expected, a, b) \
853 do { \ 883 do { \
854 if (WASM_64 || kSupported_##name) \ 884 if (WASM_64 || kSupported_##name) \
855 TestI64Binop(kExpr##name, expected, a, b); \ 885 TestI64Binop(execution_mode, kExpr##name, expected, a, b); \
856 } while (false) 886 } while (false)
857 887
858 WASM_EXEC_TEST(I64Binops) { 888 WASM_EXEC_TEST(I64Binops) {
859 TEST_I64_BINOP(I64Add, -5586332274295447011, 0x501b72ebabc26847, 889 TEST_I64_BINOP(I64Add, -5586332274295447011, 0x501b72ebabc26847,
860 0x625de9793d8f79d6); 890 0x625de9793d8f79d6);
861 TEST_I64_BINOP(I64Sub, 9001903251710731490, 0xf24fe6474640002e, 891 TEST_I64_BINOP(I64Sub, 9001903251710731490, 0xf24fe6474640002e,
862 0x7562b6f711991b4c); 892 0x7562b6f711991b4c);
863 TEST_I64_BINOP(I64Mul, -4569547818546064176, 0x231a263c2cbc6451, 893 TEST_I64_BINOP(I64Mul, -4569547818546064176, 0x231a263c2cbc6451,
864 0xead44de6bd3e23d0); 894 0xead44de6bd3e23d0);
865 TEST_I64_BINOP(I64Mul, -25963122347507043, 0x4da1fa47c9352b73, 895 TEST_I64_BINOP(I64Mul, -25963122347507043, 0x4da1fa47c9352b73,
(...skipping 14 matching lines...) Expand all
880 0x76ff4da6c80688bf); 910 0x76ff4da6c80688bf);
881 TEST_I64_BINOP(I64Shl, -7240704056088331264, 0xef4dc1ed030e8ffe, 9); 911 TEST_I64_BINOP(I64Shl, -7240704056088331264, 0xef4dc1ed030e8ffe, 9);
882 TEST_I64_BINOP(I64ShrU, 12500673744059159, 0xb1a52fa7deec5d14, 10); 912 TEST_I64_BINOP(I64ShrU, 12500673744059159, 0xb1a52fa7deec5d14, 10);
883 TEST_I64_BINOP(I64ShrS, 1725103446999874, 0x3107c791461a112b, 11); 913 TEST_I64_BINOP(I64ShrS, 1725103446999874, 0x3107c791461a112b, 11);
884 TEST_I64_BINOP(I64Ror, -8960135652432576946, 0x73418d1717e4e83a, 12); 914 TEST_I64_BINOP(I64Ror, -8960135652432576946, 0x73418d1717e4e83a, 12);
885 TEST_I64_BINOP(I64Ror, 7617662827409989779, 0xebff67cf0c126d36, 13); 915 TEST_I64_BINOP(I64Ror, 7617662827409989779, 0xebff67cf0c126d36, 13);
886 TEST_I64_BINOP(I64Rol, -2097714064174346012, 0x43938b8db0b0f230, 14); 916 TEST_I64_BINOP(I64Rol, -2097714064174346012, 0x43938b8db0b0f230, 14);
887 TEST_I64_BINOP(I64Rol, 8728493013947314237, 0xe07af243ac4d219d, 15); 917 TEST_I64_BINOP(I64Rol, 8728493013947314237, 0xe07af243ac4d219d, 15);
888 } 918 }
889 919
890 #define TEST_I64_CMP(name, expected, a, b) \ 920 #define TEST_I64_CMP(name, expected, a, b) \
891 do { \ 921 do { \
892 if (WASM_64 || kSupported_##name) TestI64Cmp(kExpr##name, expected, a, b); \ 922 if (WASM_64 || kSupported_##name) \
923 TestI64Cmp(execution_mode, kExpr##name, expected, a, b); \
893 } while (false) 924 } while (false)
894 925
895 WASM_EXEC_TEST(I64Compare) { 926 WASM_EXEC_TEST(I64Compare) {
896 TEST_I64_CMP(I64Eq, 0, 0xB915D8FA494064F0, 0x04D700B2536019A3); 927 TEST_I64_CMP(I64Eq, 0, 0xB915D8FA494064F0, 0x04D700B2536019A3);
897 TEST_I64_CMP(I64Ne, 1, 0xC2FAFAAAB0446CDC, 0x52A3328F780C97A3); 928 TEST_I64_CMP(I64Ne, 1, 0xC2FAFAAAB0446CDC, 0x52A3328F780C97A3);
898 TEST_I64_CMP(I64LtS, 0, 0x673636E6306B0578, 0x028EC9ECA78F7227); 929 TEST_I64_CMP(I64LtS, 0, 0x673636E6306B0578, 0x028EC9ECA78F7227);
899 TEST_I64_CMP(I64LeS, 1, 0xAE5214114B86A0FA, 0x7C1D21DA3DFD0CCF); 930 TEST_I64_CMP(I64LeS, 1, 0xAE5214114B86A0FA, 0x7C1D21DA3DFD0CCF);
900 TEST_I64_CMP(I64LtU, 0, 0x7D52166381EC1CE0, 0x59F4A6A9E78CD3D8); 931 TEST_I64_CMP(I64LtU, 0, 0x7D52166381EC1CE0, 0x59F4A6A9E78CD3D8);
901 TEST_I64_CMP(I64LeU, 1, 0xE4169A385C7EA0E0, 0xFBDBED2C8781E5BC); 932 TEST_I64_CMP(I64LeU, 1, 0xE4169A385C7EA0E0, 0xFBDBED2C8781E5BC);
902 TEST_I64_CMP(I64GtS, 0, 0x9D08FF8FB5F42E81, 0xD4E5C9D7FE09F621); 933 TEST_I64_CMP(I64GtS, 0, 0x9D08FF8FB5F42E81, 0xD4E5C9D7FE09F621);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 {48, 0x0000000000008040}, {49, 0x0000000000004005}, 968 {48, 0x0000000000008040}, {49, 0x0000000000004005},
938 {50, 0x0000000000002050}, {51, 0x0000000000001700}, 969 {50, 0x0000000000002050}, {51, 0x0000000000001700},
939 {52, 0x0000000000000870}, {53, 0x0000000000000405}, 970 {52, 0x0000000000000870}, {53, 0x0000000000000405},
940 {54, 0x0000000000000203}, {55, 0x0000000000000101}, 971 {54, 0x0000000000000203}, {55, 0x0000000000000101},
941 {56, 0x0000000000000089}, {57, 0x0000000000000041}, 972 {56, 0x0000000000000089}, {57, 0x0000000000000041},
942 {58, 0x0000000000000022}, {59, 0x0000000000000013}, 973 {58, 0x0000000000000022}, {59, 0x0000000000000013},
943 {60, 0x0000000000000008}, {61, 0x0000000000000004}, 974 {60, 0x0000000000000008}, {61, 0x0000000000000004},
944 {62, 0x0000000000000002}, {63, 0x0000000000000001}, 975 {62, 0x0000000000000002}, {63, 0x0000000000000001},
945 {64, 0x0000000000000000}}; 976 {64, 0x0000000000000000}};
946 977
947 WasmRunner<int64_t> r(MachineType::Uint64()); 978 WasmRunner<int64_t> r(execution_mode, MachineType::Uint64());
948 BUILD(r, WASM_I64_CLZ(WASM_GET_LOCAL(0))); 979 BUILD(r, WASM_I64_CLZ(WASM_GET_LOCAL(0)));
949 for (size_t i = 0; i < arraysize(values); i++) { 980 for (size_t i = 0; i < arraysize(values); i++) {
950 CHECK_EQ(values[i].expected, r.Call(values[i].input)); 981 CHECK_EQ(values[i].expected, r.Call(values[i].input));
951 } 982 }
952 } 983 }
953 984
954 WASM_EXEC_TEST(I64Ctz) { 985 WASM_EXEC_TEST(I64Ctz) {
955 REQUIRE(I64Ctz); 986 REQUIRE(I64Ctz);
956 struct { 987 struct {
957 int64_t expected; 988 int64_t expected;
(...skipping 25 matching lines...) Expand all
983 {16, 0x00000000b8f10000}, {15, 0x000000003b9f8000}, 1014 {16, 0x00000000b8f10000}, {15, 0x000000003b9f8000},
984 {14, 0x00000000db4c4000}, {13, 0x00000000e9a32000}, 1015 {14, 0x00000000db4c4000}, {13, 0x00000000e9a32000},
985 {12, 0x00000000fca61000}, {11, 0x000000006c8a7800}, 1016 {12, 0x00000000fca61000}, {11, 0x000000006c8a7800},
986 {10, 0x000000008ce5a400}, {9, 0x00000000cb7d0200}, 1017 {10, 0x000000008ce5a400}, {9, 0x00000000cb7d0200},
987 {8, 0x00000000cb4dc100}, {7, 0x00000000dfbec580}, 1018 {8, 0x00000000cb4dc100}, {7, 0x00000000dfbec580},
988 {6, 0x0000000027a9db40}, {5, 0x00000000de3bcb20}, 1019 {6, 0x0000000027a9db40}, {5, 0x00000000de3bcb20},
989 {4, 0x00000000d7e8a610}, {3, 0x000000009afdbc88}, 1020 {4, 0x00000000d7e8a610}, {3, 0x000000009afdbc88},
990 {2, 0x000000009afdbc84}, {1, 0x000000009afdbc82}, 1021 {2, 0x000000009afdbc84}, {1, 0x000000009afdbc82},
991 {0, 0x000000009afdbc81}}; 1022 {0, 0x000000009afdbc81}};
992 1023
993 WasmRunner<int64_t> r(MachineType::Uint64()); 1024 WasmRunner<int64_t> r(execution_mode, MachineType::Uint64());
994 BUILD(r, WASM_I64_CTZ(WASM_GET_LOCAL(0))); 1025 BUILD(r, WASM_I64_CTZ(WASM_GET_LOCAL(0)));
995 for (size_t i = 0; i < arraysize(values); i++) { 1026 for (size_t i = 0; i < arraysize(values); i++) {
996 CHECK_EQ(values[i].expected, r.Call(values[i].input)); 1027 CHECK_EQ(values[i].expected, r.Call(values[i].input));
997 } 1028 }
998 } 1029 }
999 1030
1000 WASM_EXEC_TEST(I64Popcnt2) { 1031 WASM_EXEC_TEST(I64Popcnt2) {
1001 REQUIRE(I64Popcnt); 1032 REQUIRE(I64Popcnt);
1002 struct { 1033 struct {
1003 int64_t expected; 1034 int64_t expected;
1004 uint64_t input; 1035 uint64_t input;
1005 } values[] = {{64, 0xffffffffffffffff}, 1036 } values[] = {{64, 0xffffffffffffffff},
1006 {0, 0x0000000000000000}, 1037 {0, 0x0000000000000000},
1007 {2, 0x0000080000008000}, 1038 {2, 0x0000080000008000},
1008 {26, 0x1123456782345678}, 1039 {26, 0x1123456782345678},
1009 {38, 0xffedcba09edcba09}}; 1040 {38, 0xffedcba09edcba09}};
1010 1041
1011 WasmRunner<int64_t> r(MachineType::Uint64()); 1042 WasmRunner<int64_t> r(execution_mode, MachineType::Uint64());
1012 BUILD(r, WASM_I64_POPCNT(WASM_GET_LOCAL(0))); 1043 BUILD(r, WASM_I64_POPCNT(WASM_GET_LOCAL(0)));
1013 for (size_t i = 0; i < arraysize(values); i++) { 1044 for (size_t i = 0; i < arraysize(values); i++) {
1014 CHECK_EQ(values[i].expected, r.Call(values[i].input)); 1045 CHECK_EQ(values[i].expected, r.Call(values[i].input));
1015 } 1046 }
1016 } 1047 }
1017 1048
1018 // Test the WasmRunner with an Int64 return value and different numbers of 1049 // Test the WasmRunner with an Int64 return value and different numbers of
1019 // Int64 parameters. 1050 // Int64 parameters.
1020 TEST(Run_TestI64WasmRunner) { 1051 WASM_EXEC_TEST(I64WasmRunner) {
1021 REQUIRE(I64Param); 1052 REQUIRE(I64Param);
1022 REQUIRE(I64Xor); 1053 REQUIRE(I64Xor);
1023 {FOR_INT64_INPUTS(i){WasmRunner<int64_t> r; 1054 {FOR_INT64_INPUTS(i){WasmRunner<int64_t> r(execution_mode);
1024 BUILD(r, WASM_I64V(*i)); 1055 BUILD(r, WASM_I64V(*i));
1025 CHECK_EQ(*i, r.Call()); 1056 CHECK_EQ(*i, r.Call());
1026 } 1057 }
1027 } 1058 }
1028 { 1059 {
1029 WasmRunner<int64_t> r(MachineType::Int64()); 1060 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
1030 BUILD(r, WASM_GET_LOCAL(0)); 1061 BUILD(r, WASM_GET_LOCAL(0));
1031 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); } 1062 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); }
1032 } 1063 }
1033 { 1064 {
1034 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 1065 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
1066 MachineType::Int64());
1035 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1067 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1036 FOR_INT64_INPUTS(i) { 1068 FOR_INT64_INPUTS(i) {
1037 FOR_INT64_INPUTS(j) { CHECK_EQ(*i ^ *j, r.Call(*i, *j)); } 1069 FOR_INT64_INPUTS(j) { CHECK_EQ(*i ^ *j, r.Call(*i, *j)); }
1038 } 1070 }
1039 } 1071 }
1040 { 1072 {
1041 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64(), 1073 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
1042 MachineType::Int64()); 1074 MachineType::Int64(), MachineType::Int64());
1043 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), 1075 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0),
1044 WASM_I64_XOR(WASM_GET_LOCAL(1), WASM_GET_LOCAL(2)))); 1076 WASM_I64_XOR(WASM_GET_LOCAL(1), WASM_GET_LOCAL(2))));
1045 FOR_INT64_INPUTS(i) { 1077 FOR_INT64_INPUTS(i) {
1046 FOR_INT64_INPUTS(j) { 1078 FOR_INT64_INPUTS(j) {
1047 CHECK_EQ(*i ^ *j ^ *j, r.Call(*i, *j, *j)); 1079 CHECK_EQ(*i ^ *j ^ *j, r.Call(*i, *j, *j));
1048 CHECK_EQ(*j ^ *i ^ *j, r.Call(*j, *i, *j)); 1080 CHECK_EQ(*j ^ *i ^ *j, r.Call(*j, *i, *j));
1049 CHECK_EQ(*j ^ *j ^ *i, r.Call(*j, *j, *i)); 1081 CHECK_EQ(*j ^ *j ^ *i, r.Call(*j, *j, *i));
1050 } 1082 }
1051 } 1083 }
1052 } 1084 }
1053 { 1085 {
1054 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64(), 1086 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
1055 MachineType::Int64(), MachineType::Int64()); 1087 MachineType::Int64(), MachineType::Int64(),
1088 MachineType::Int64());
1056 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), 1089 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0),
1057 WASM_I64_XOR(WASM_GET_LOCAL(1), 1090 WASM_I64_XOR(WASM_GET_LOCAL(1),
1058 WASM_I64_XOR(WASM_GET_LOCAL(2), 1091 WASM_I64_XOR(WASM_GET_LOCAL(2),
1059 WASM_GET_LOCAL(3))))); 1092 WASM_GET_LOCAL(3)))));
1060 FOR_INT64_INPUTS(i) { 1093 FOR_INT64_INPUTS(i) {
1061 FOR_INT64_INPUTS(j) { 1094 FOR_INT64_INPUTS(j) {
1062 CHECK_EQ(*i ^ *j ^ *j ^ *j, r.Call(*i, *j, *j, *j)); 1095 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)); 1096 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)); 1097 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)); 1098 CHECK_EQ(*j ^ *j ^ *j ^ *i, r.Call(*j, *j, *j, *i));
1066 } 1099 }
1067 } 1100 }
1068 } 1101 }
1069 } 1102 }
1070 1103
1071 WASM_EXEC_TEST(Call_Int64Sub) { 1104 WASM_EXEC_TEST(Call_Int64Sub) {
1072 REQUIRE(I64Sub); 1105 REQUIRE(I64Sub);
1073 // Build the target function. 1106 // Build the target function.
1074 TestSignatures sigs; 1107 TestSignatures sigs;
1075 TestingModule module; 1108 TestingModule module(execution_mode);
1076 WasmFunctionCompiler t(sigs.l_ll(), &module); 1109 WasmFunctionCompiler t(sigs.l_ll(), &module);
1077 BUILD(t, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1110 BUILD(t, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1078 uint32_t index = t.CompileAndAdd(); 1111 uint32_t index = t.CompileAndAdd();
1079 1112
1080 // Build the caller function. 1113 // Build the caller function.
1081 WasmRunner<int64_t> r(&module, MachineType::Int64(), MachineType::Int64()); 1114 WasmRunner<int64_t> r(&module, MachineType::Int64(), MachineType::Int64());
1082 BUILD(r, WASM_CALL_FUNCTION2(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1115 BUILD(r, WASM_CALL_FUNCTION2(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1083 1116
1084 FOR_INT32_INPUTS(i) { 1117 FOR_INT32_INPUTS(i) {
1085 FOR_INT32_INPUTS(j) { 1118 FOR_INT32_INPUTS(j) {
1086 int64_t a = static_cast<int64_t>(*i) << 32 | 1119 int64_t a = static_cast<int64_t>(*i) << 32 |
1087 (static_cast<int64_t>(*j) | 0xFFFFFFFF); 1120 (static_cast<int64_t>(*j) | 0xFFFFFFFF);
1088 int64_t b = static_cast<int64_t>(*j) << 32 | 1121 int64_t b = static_cast<int64_t>(*j) << 32 |
1089 (static_cast<int64_t>(*i) | 0xFFFFFFFF); 1122 (static_cast<int64_t>(*i) | 0xFFFFFFFF);
1090 1123
1091 int64_t expected = static_cast<int64_t>(static_cast<uint64_t>(a) - 1124 int64_t expected = static_cast<int64_t>(static_cast<uint64_t>(a) -
1092 static_cast<uint64_t>(b)); 1125 static_cast<uint64_t>(b));
1093 CHECK_EQ(expected, r.Call(a, b)); 1126 CHECK_EQ(expected, r.Call(a, b));
1094 } 1127 }
1095 } 1128 }
1096 } 1129 }
1097 1130
1098 WASM_EXEC_TEST(LoadStoreI64_sx) { 1131 WASM_EXEC_TEST(LoadStoreI64_sx) {
1099 REQUIRE(I64LoadStore); 1132 REQUIRE(I64LoadStore);
1100 REQUIRE(DepthFirst); 1133 REQUIRE(DepthFirst);
1101 byte loads[] = {kExprI64LoadMem8S, kExprI64LoadMem16S, kExprI64LoadMem32S, 1134 byte loads[] = {kExprI64LoadMem8S, kExprI64LoadMem16S, kExprI64LoadMem32S,
1102 kExprI64LoadMem}; 1135 kExprI64LoadMem};
1103 1136
1104 for (size_t m = 0; m < arraysize(loads); m++) { 1137 for (size_t m = 0; m < arraysize(loads); m++) {
1105 TestingModule module; 1138 TestingModule module(execution_mode);
1106 byte* memory = module.AddMemoryElems<byte>(16); 1139 byte* memory = module.AddMemoryElems<byte>(16);
1107 WasmRunner<int64_t> r(&module); 1140 WasmRunner<int64_t> r(&module);
1108 1141
1109 byte code[] = { 1142 byte code[] = {
1110 kExprI8Const, 8, // -- 1143 kExprI8Const, 8, // --
1111 kExprI8Const, 0, // -- 1144 kExprI8Const, 0, // --
1112 loads[m], // -- 1145 loads[m], // --
1113 ZERO_ALIGNMENT, // -- 1146 ZERO_ALIGNMENT, // --
1114 ZERO_OFFSET, // -- 1147 ZERO_OFFSET, // --
1115 kExprI64StoreMem, // -- 1148 kExprI64StoreMem, // --
(...skipping 15 matching lines...) Expand all
1131 CHECK_EQ(static_cast<byte>(i), memory[8 + size - 1]); 1164 CHECK_EQ(static_cast<byte>(i), memory[8 + size - 1]);
1132 for (int j = size; j < 8; j++) { 1165 for (int j = size; j < 8; j++) {
1133 CHECK_EQ(255, memory[8 + j]); 1166 CHECK_EQ(255, memory[8 + j]);
1134 } 1167 }
1135 } 1168 }
1136 } 1169 }
1137 } 1170 }
1138 1171
1139 WASM_EXEC_TEST(I64SConvertF32b) { 1172 WASM_EXEC_TEST(I64SConvertF32b) {
1140 REQUIRE(I64SConvertF32); 1173 REQUIRE(I64SConvertF32);
1141 WasmRunner<int64_t> r(MachineType::Float32()); 1174 WasmRunner<int64_t> r(execution_mode, MachineType::Float32());
1142 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0))); 1175 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0)));
1143 1176
1144 FOR_FLOAT32_INPUTS(i) { 1177 FOR_FLOAT32_INPUTS(i) {
1145 if (*i < static_cast<float>(INT64_MAX) && 1178 if (*i < static_cast<float>(INT64_MAX) &&
1146 *i >= static_cast<float>(INT64_MIN)) { 1179 *i >= static_cast<float>(INT64_MIN)) {
1147 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 1180 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
1148 } else { 1181 } else {
1149 CHECK_TRAP64(r.Call(*i)); 1182 CHECK_TRAP64(r.Call(*i));
1150 } 1183 }
1151 } 1184 }
1152 } 1185 }
1153 1186
1154 WASM_EXEC_TEST(I64SConvertF64b) { 1187 WASM_EXEC_TEST(I64SConvertF64b) {
1155 REQUIRE(I64SConvertF64); 1188 REQUIRE(I64SConvertF64);
1156 WasmRunner<int64_t> r(MachineType::Float64()); 1189 WasmRunner<int64_t> r(execution_mode, MachineType::Float64());
1157 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))); 1190 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0)));
1158 1191
1159 FOR_FLOAT64_INPUTS(i) { 1192 FOR_FLOAT64_INPUTS(i) {
1160 if (*i < static_cast<double>(INT64_MAX) && 1193 if (*i < static_cast<double>(INT64_MAX) &&
1161 *i >= static_cast<double>(INT64_MIN)) { 1194 *i >= static_cast<double>(INT64_MIN)) {
1162 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 1195 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
1163 } else { 1196 } else {
1164 CHECK_TRAP64(r.Call(*i)); 1197 CHECK_TRAP64(r.Call(*i));
1165 } 1198 }
1166 } 1199 }
1167 } 1200 }
1168 1201
1169 WASM_EXEC_TEST(I64UConvertF32b) { 1202 WASM_EXEC_TEST(I64UConvertF32b) {
1170 REQUIRE(I64UConvertF32); 1203 REQUIRE(I64UConvertF32);
1171 WasmRunner<uint64_t> r(MachineType::Float32()); 1204 WasmRunner<uint64_t> r(execution_mode, MachineType::Float32());
1172 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0))); 1205 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0)));
1173 1206
1174 FOR_FLOAT32_INPUTS(i) { 1207 FOR_FLOAT32_INPUTS(i) {
1175 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) { 1208 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) {
1176 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 1209 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
1177 } else { 1210 } else {
1178 CHECK_TRAP64(r.Call(*i)); 1211 CHECK_TRAP64(r.Call(*i));
1179 } 1212 }
1180 } 1213 }
1181 } 1214 }
1182 1215
1183 WASM_EXEC_TEST(I64UConvertF64b) { 1216 WASM_EXEC_TEST(I64UConvertF64b) {
1184 REQUIRE(I64UConvertF64); 1217 REQUIRE(I64UConvertF64);
1185 WasmRunner<uint64_t> r(MachineType::Float64()); 1218 WasmRunner<uint64_t> r(execution_mode, MachineType::Float64());
1186 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0))); 1219 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0)));
1187 1220
1188 FOR_FLOAT64_INPUTS(i) { 1221 FOR_FLOAT64_INPUTS(i) {
1189 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) { 1222 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) {
1190 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 1223 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
1191 } else { 1224 } else {
1192 CHECK_TRAP64(r.Call(*i)); 1225 CHECK_TRAP64(r.Call(*i));
1193 } 1226 }
1194 } 1227 }
1195 } 1228 }
1196 1229
1197 WASM_EXEC_TEST(I64ReinterpretF64) { 1230 WASM_EXEC_TEST(I64ReinterpretF64) {
1198 REQUIRE(I64ReinterpretF64); 1231 REQUIRE(I64ReinterpretF64);
1199 TestingModule module; 1232 TestingModule module(execution_mode);
1200 int64_t* memory = module.AddMemoryElems<int64_t>(8); 1233 int64_t* memory = module.AddMemoryElems<int64_t>(8);
1201 WasmRunner<int64_t> r(&module); 1234 WasmRunner<int64_t> r(&module);
1202 1235
1203 BUILD(r, WASM_I64_REINTERPRET_F64( 1236 BUILD(r, WASM_I64_REINTERPRET_F64(
1204 WASM_LOAD_MEM(MachineType::Float64(), WASM_ZERO))); 1237 WASM_LOAD_MEM(MachineType::Float64(), WASM_ZERO)));
1205 1238
1206 FOR_INT32_INPUTS(i) { 1239 FOR_INT32_INPUTS(i) {
1207 int64_t expected = static_cast<int64_t>(*i) * 0x300010001; 1240 int64_t expected = static_cast<int64_t>(*i) * 0x300010001;
1208 memory[0] = expected; 1241 memory[0] = expected;
1209 CHECK_EQ(expected, r.Call()); 1242 CHECK_EQ(expected, r.Call());
1210 } 1243 }
1211 } 1244 }
1212 1245
1213 WASM_EXEC_TEST(F64ReinterpretI64) { 1246 WASM_EXEC_TEST(F64ReinterpretI64) {
1214 REQUIRE(F64ReinterpretI64); 1247 REQUIRE(F64ReinterpretI64);
1215 TestingModule module; 1248 TestingModule module(execution_mode);
1216 int64_t* memory = module.AddMemoryElems<int64_t>(8); 1249 int64_t* memory = module.AddMemoryElems<int64_t>(8);
1217 WasmRunner<int64_t> r(&module, MachineType::Int64()); 1250 WasmRunner<int64_t> r(&module, MachineType::Int64());
1218 1251
1219 BUILD(r, WASM_BLOCK( 1252 BUILD(r, WASM_BLOCK(
1220 2, WASM_STORE_MEM(MachineType::Float64(), WASM_ZERO, 1253 2, WASM_STORE_MEM(MachineType::Float64(), WASM_ZERO,
1221 WASM_F64_REINTERPRET_I64(WASM_GET_LOCAL(0))), 1254 WASM_F64_REINTERPRET_I64(WASM_GET_LOCAL(0))),
1222 WASM_GET_LOCAL(0))); 1255 WASM_GET_LOCAL(0)));
1223 1256
1224 FOR_INT32_INPUTS(i) { 1257 FOR_INT32_INPUTS(i) {
1225 int64_t expected = static_cast<int64_t>(*i) * 0x300010001; 1258 int64_t expected = static_cast<int64_t>(*i) * 0x300010001;
1226 CHECK_EQ(expected, r.Call(expected)); 1259 CHECK_EQ(expected, r.Call(expected));
1227 CHECK_EQ(expected, memory[0]); 1260 CHECK_EQ(expected, memory[0]);
1228 } 1261 }
1229 } 1262 }
1230 1263
1231 WASM_EXEC_TEST(LoadMemI64) { 1264 WASM_EXEC_TEST(LoadMemI64) {
1232 REQUIRE(I64LoadStore); 1265 REQUIRE(I64LoadStore);
1233 TestingModule module; 1266 TestingModule module(execution_mode);
1234 int64_t* memory = module.AddMemoryElems<int64_t>(8); 1267 int64_t* memory = module.AddMemoryElems<int64_t>(8);
1235 module.RandomizeMemory(1111); 1268 module.RandomizeMemory(1111);
1236 WasmRunner<int64_t> r(&module); 1269 WasmRunner<int64_t> r(&module);
1237 1270
1238 BUILD(r, WASM_LOAD_MEM(MachineType::Int64(), WASM_I8(0))); 1271 BUILD(r, WASM_LOAD_MEM(MachineType::Int64(), WASM_I8(0)));
1239 1272
1240 memory[0] = 0xaabbccdd00112233LL; 1273 memory[0] = 0xaabbccdd00112233LL;
1241 CHECK_EQ(0xaabbccdd00112233LL, r.Call()); 1274 CHECK_EQ(0xaabbccdd00112233LL, r.Call());
1242 1275
1243 memory[0] = 0x33aabbccdd001122LL; 1276 memory[0] = 0x33aabbccdd001122LL;
1244 CHECK_EQ(0x33aabbccdd001122LL, r.Call()); 1277 CHECK_EQ(0x33aabbccdd001122LL, r.Call());
1245 1278
1246 memory[0] = 77777777; 1279 memory[0] = 77777777;
1247 CHECK_EQ(77777777, r.Call()); 1280 CHECK_EQ(77777777, r.Call());
1248 } 1281 }
1249 1282
1250 WASM_EXEC_TEST(Run_Wasm_LoadMemI64_alignment) { 1283 WASM_EXEC_TEST(LoadMemI64_alignment) {
1251 REQUIRE(I64LoadStore); 1284 REQUIRE(I64LoadStore);
1252 TestingModule module; 1285 TestingModule module(execution_mode);
1253 int64_t* memory = module.AddMemoryElems<int64_t>(8); 1286 int64_t* memory = module.AddMemoryElems<int64_t>(8);
1254 for (byte alignment = 0; alignment <= 3; alignment++) { 1287 for (byte alignment = 0; alignment <= 3; alignment++) {
1255 module.RandomizeMemory(1111); 1288 module.RandomizeMemory(1111);
1256 WasmRunner<int64_t> r(&module); 1289 WasmRunner<int64_t> r(&module);
1257 1290
1258 BUILD(r, 1291 BUILD(r,
1259 WASM_LOAD_MEM_ALIGNMENT(MachineType::Int64(), WASM_I8(0), alignment)); 1292 WASM_LOAD_MEM_ALIGNMENT(MachineType::Int64(), WASM_I8(0), alignment));
1260 1293
1261 memory[0] = 0xaabbccdd00112233LL; 1294 memory[0] = 0xaabbccdd00112233LL;
1262 CHECK_EQ(0xaabbccdd00112233LL, r.Call()); 1295 CHECK_EQ(0xaabbccdd00112233LL, r.Call());
1263 1296
1264 memory[0] = 0x33aabbccdd001122LL; 1297 memory[0] = 0x33aabbccdd001122LL;
1265 CHECK_EQ(0x33aabbccdd001122LL, r.Call()); 1298 CHECK_EQ(0x33aabbccdd001122LL, r.Call());
1266 1299
1267 memory[0] = 77777777; 1300 memory[0] = 77777777;
1268 CHECK_EQ(77777777, r.Call()); 1301 CHECK_EQ(77777777, r.Call());
1269 } 1302 }
1270 } 1303 }
1271 1304
1272 WASM_EXEC_TEST(Run_Wasm_MemI64_Sum) { 1305 WASM_EXEC_TEST(MemI64_Sum) {
1273 REQUIRE(I64LoadStore); 1306 REQUIRE(I64LoadStore);
1274 REQUIRE(I64Add); 1307 REQUIRE(I64Add);
1275 REQUIRE(I64Sub); 1308 REQUIRE(I64Sub);
1276 REQUIRE(I64Phi); 1309 REQUIRE(I64Phi);
1277 const int kNumElems = 20; 1310 const int kNumElems = 20;
1278 TestingModule module; 1311 TestingModule module(execution_mode);
1279 uint64_t* memory = module.AddMemoryElems<uint64_t>(kNumElems); 1312 uint64_t* memory = module.AddMemoryElems<uint64_t>(kNumElems);
1280 WasmRunner<uint64_t> r(&module, MachineType::Int32()); 1313 WasmRunner<uint64_t> r(&module, MachineType::Int32());
1281 const byte kSum = r.AllocateLocal(kAstI64); 1314 const byte kSum = r.AllocateLocal(kAstI64);
1282 1315
1283 BUILD(r, WASM_BLOCK( 1316 BUILD(r, WASM_BLOCK(
1284 2, WASM_WHILE( 1317 2, WASM_WHILE(
1285 WASM_GET_LOCAL(0), 1318 WASM_GET_LOCAL(0),
1286 WASM_BLOCK( 1319 WASM_BLOCK(
1287 2, WASM_SET_LOCAL( 1320 2, WASM_SET_LOCAL(
1288 kSum, WASM_I64_ADD( 1321 kSum, WASM_I64_ADD(
1289 WASM_GET_LOCAL(kSum), 1322 WASM_GET_LOCAL(kSum),
1290 WASM_LOAD_MEM(MachineType::Int64(), 1323 WASM_LOAD_MEM(MachineType::Int64(),
1291 WASM_GET_LOCAL(0)))), 1324 WASM_GET_LOCAL(0)))),
1292 WASM_SET_LOCAL( 1325 WASM_SET_LOCAL(
1293 0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(8))))), 1326 0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(8))))),
1294 WASM_GET_LOCAL(1))); 1327 WASM_GET_LOCAL(1)));
1295 1328
1296 // Run 4 trials. 1329 // Run 4 trials.
1297 for (int i = 0; i < 3; i++) { 1330 for (int i = 0; i < 3; i++) {
1298 module.RandomizeMemory(i * 33); 1331 module.RandomizeMemory(i * 33);
1299 uint64_t expected = 0; 1332 uint64_t expected = 0;
1300 for (size_t j = kNumElems - 1; j > 0; j--) { 1333 for (size_t j = kNumElems - 1; j > 0; j--) {
1301 expected += memory[j]; 1334 expected += memory[j];
1302 } 1335 }
1303 uint64_t result = r.Call(8 * (kNumElems - 1)); 1336 uint64_t result = r.Call(8 * (kNumElems - 1));
1304 CHECK_EQ(expected, result); 1337 CHECK_EQ(expected, result);
1305 } 1338 }
1306 } 1339 }
1307 1340
1308 WASM_EXEC_TEST(Run_Wasm_StoreMemI64_alignment) { 1341 WASM_EXEC_TEST(StoreMemI64_alignment) {
1309 TestingModule module; 1342 TestingModule module(execution_mode);
1310 int64_t* memory = module.AddMemoryElems<int64_t>(4); 1343 int64_t* memory = module.AddMemoryElems<int64_t>(4);
1311 const int64_t kWritten = 0x12345678abcd0011ll; 1344 const int64_t kWritten = 0x12345678abcd0011ll;
1312 1345
1313 for (byte i = 0; i <= 3; i++) { 1346 for (byte i = 0; i <= 3; i++) {
1314 WasmRunner<int64_t> r(&module, MachineType::Int64()); 1347 WasmRunner<int64_t> r(&module, MachineType::Int64());
1315 BUILD(r, WASM_STORE_MEM_ALIGNMENT(MachineType::Int64(), WASM_ZERO, i, 1348 BUILD(r, WASM_STORE_MEM_ALIGNMENT(MachineType::Int64(), WASM_ZERO, i,
1316 WASM_GET_LOCAL(0))); 1349 WASM_GET_LOCAL(0)));
1317 module.RandomizeMemory(1111); 1350 module.RandomizeMemory(1111);
1318 memory[0] = 0; 1351 memory[0] = 0;
1319 1352
1320 CHECK_EQ(kWritten, r.Call(kWritten)); 1353 CHECK_EQ(kWritten, r.Call(kWritten));
1321 CHECK_EQ(kWritten, memory[0]); 1354 CHECK_EQ(kWritten, memory[0]);
1322 } 1355 }
1323 } 1356 }
1324 1357
1325 WASM_EXEC_TEST(Run_Wasm_I64Global) { 1358 WASM_EXEC_TEST(I64Global) {
1326 REQUIRE(I64LoadStore); 1359 REQUIRE(I64LoadStore);
1327 REQUIRE(I64SConvertI32); 1360 REQUIRE(I64SConvertI32);
1328 REQUIRE(I64And); 1361 REQUIRE(I64And);
1329 REQUIRE(DepthFirst); 1362 REQUIRE(DepthFirst);
1330 TestingModule module; 1363 TestingModule module(execution_mode);
1331 int64_t* global = module.AddGlobal<int64_t>(MachineType::Int64()); 1364 int64_t* global = module.AddGlobal<int64_t>(MachineType::Int64());
1332 WasmRunner<int32_t> r(&module, MachineType::Int32()); 1365 WasmRunner<int32_t> r(&module, MachineType::Int32());
1333 // global = global + p0 1366 // global = global + p0
1334 BUILD(r, B2(WASM_STORE_GLOBAL( 1367 BUILD(r, B2(WASM_STORE_GLOBAL(
1335 0, WASM_I64_AND(WASM_LOAD_GLOBAL(0), 1368 0, WASM_I64_AND(WASM_LOAD_GLOBAL(0),
1336 WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0)))), 1369 WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0)))),
1337 WASM_ZERO)); 1370 WASM_ZERO));
1338 1371
1339 *global = 0xFFFFFFFFFFFFFFFFLL; 1372 *global = 0xFFFFFFFFFFFFFFFFLL;
1340 for (int i = 9; i < 444444; i += 111111) { 1373 for (int i = 9; i < 444444; i += 111111) {
1341 int64_t expected = *global & i; 1374 int64_t expected = *global & i;
1342 r.Call(i); 1375 r.Call(i);
1343 CHECK_EQ(expected, *global); 1376 CHECK_EQ(expected, *global);
1344 } 1377 }
1345 } 1378 }
1346 1379
1347 WASM_EXEC_TEST(I64Eqz) { 1380 WASM_EXEC_TEST(I64Eqz) {
1348 REQUIRE(I64Eq); 1381 REQUIRE(I64Eq);
1349 1382
1350 WasmRunner<int32_t> r(MachineType::Int64()); 1383 WasmRunner<int32_t> r(execution_mode, MachineType::Int64());
1351 BUILD(r, WASM_I64_EQZ(WASM_GET_LOCAL(0))); 1384 BUILD(r, WASM_I64_EQZ(WASM_GET_LOCAL(0)));
1352 1385
1353 FOR_INT64_INPUTS(i) { 1386 FOR_INT64_INPUTS(i) {
1354 int32_t result = *i == 0 ? 1 : 0; 1387 int32_t result = *i == 0 ? 1 : 0;
1355 CHECK_EQ(result, r.Call(*i)); 1388 CHECK_EQ(result, r.Call(*i));
1356 } 1389 }
1357 } 1390 }
1358 1391
1359 WASM_EXEC_TEST(I64Ror) { 1392 WASM_EXEC_TEST(I64Ror) {
1360 REQUIRE(I64Ror); 1393 REQUIRE(I64Ror);
1361 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 1394 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
1395 MachineType::Int64());
1362 BUILD(r, WASM_I64_ROR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1396 BUILD(r, WASM_I64_ROR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1363 1397
1364 FOR_UINT64_INPUTS(i) { 1398 FOR_UINT64_INPUTS(i) {
1365 FOR_UINT64_INPUTS(j) { 1399 FOR_UINT64_INPUTS(j) {
1366 int64_t expected = bits::RotateRight64(*i, *j & 0x3f); 1400 int64_t expected = bits::RotateRight64(*i, *j & 0x3f);
1367 CHECK_EQ(expected, r.Call(*i, *j)); 1401 CHECK_EQ(expected, r.Call(*i, *j));
1368 } 1402 }
1369 } 1403 }
1370 } 1404 }
1371 1405
1372 WASM_EXEC_TEST(I64Rol) { 1406 WASM_EXEC_TEST(I64Rol) {
1373 REQUIRE(I64Rol); 1407 REQUIRE(I64Rol);
1374 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); 1408 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
1409 MachineType::Int64());
1375 BUILD(r, WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1410 BUILD(r, WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1376 1411
1377 FOR_UINT64_INPUTS(i) { 1412 FOR_UINT64_INPUTS(i) {
1378 FOR_UINT64_INPUTS(j) { 1413 FOR_UINT64_INPUTS(j) {
1379 int64_t expected = bits::RotateLeft64(*i, *j & 0x3f); 1414 int64_t expected = bits::RotateLeft64(*i, *j & 0x3f);
1380 CHECK_EQ(expected, r.Call(*i, *j)); 1415 CHECK_EQ(expected, r.Call(*i, *j));
1381 } 1416 }
1382 } 1417 }
1383 } 1418 }
OLDNEW
« no previous file with comments | « test/cctest/wasm/test-run-wasm.cc ('k') | test/cctest/wasm/test-run-wasm-asmjs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698