| OLD | NEW |
| 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 <stdio.h> | 6 #include <stdio.h> |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include "src/wasm/wasm-macro-gen.h" | 10 #include "src/wasm/wasm-macro-gen.h" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 void EXPECT_CALL(double expected, Handle<JSFunction> jsfunc, double a, | 90 void EXPECT_CALL(double expected, Handle<JSFunction> jsfunc, double a, |
| 91 double b) { | 91 double b) { |
| 92 Isolate* isolate = jsfunc->GetIsolate(); | 92 Isolate* isolate = jsfunc->GetIsolate(); |
| 93 Handle<Object> buffer[] = {isolate->factory()->NewNumber(a), | 93 Handle<Object> buffer[] = {isolate->factory()->NewNumber(a), |
| 94 isolate->factory()->NewNumber(b)}; | 94 isolate->factory()->NewNumber(b)}; |
| 95 EXPECT_CALL(expected, jsfunc, buffer, 2); | 95 EXPECT_CALL(expected, jsfunc, buffer, 2); |
| 96 } | 96 } |
| 97 } // namespace | 97 } // namespace |
| 98 | 98 |
| 99 TEST(Run_Int32Sub_jswrapped) { | 99 TEST(Run_Int32Sub_jswrapped) { |
| 100 CcTest::InitializeVM(); | 100 WasmRunner<int, int, int> r(kExecuteCompiled); |
| 101 TestSignatures sigs; | 101 BUILD(r, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 102 TestingModule module; | 102 Handle<JSFunction> jsfunc = r.module().WrapCode(r.function()->func_index); |
| 103 WasmFunctionCompiler t(sigs.i_ii(), &module); | |
| 104 BUILD(t, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | |
| 105 Handle<JSFunction> jsfunc = module.WrapCode(t.CompileAndAdd()); | |
| 106 | 103 |
| 107 EXPECT_CALL(33, jsfunc, 44, 11); | 104 EXPECT_CALL(33, jsfunc, 44, 11); |
| 108 EXPECT_CALL(-8723487, jsfunc, -8000000, 723487); | 105 EXPECT_CALL(-8723487, jsfunc, -8000000, 723487); |
| 109 } | 106 } |
| 110 | 107 |
| 111 TEST(Run_Float32Div_jswrapped) { | 108 TEST(Run_Float32Div_jswrapped) { |
| 112 CcTest::InitializeVM(); | 109 WasmRunner<float, float, float> r(kExecuteCompiled); |
| 113 TestSignatures sigs; | 110 BUILD(r, WASM_F32_DIV(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 114 TestingModule module; | 111 Handle<JSFunction> jsfunc = r.module().WrapCode(r.function()->func_index); |
| 115 WasmFunctionCompiler t(sigs.f_ff(), &module); | |
| 116 BUILD(t, WASM_F32_DIV(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | |
| 117 Handle<JSFunction> jsfunc = module.WrapCode(t.CompileAndAdd()); | |
| 118 | 112 |
| 119 EXPECT_CALL(92, jsfunc, 46, 0.5); | 113 EXPECT_CALL(92, jsfunc, 46, 0.5); |
| 120 EXPECT_CALL(64, jsfunc, -16, -0.25); | 114 EXPECT_CALL(64, jsfunc, -16, -0.25); |
| 121 } | 115 } |
| 122 | 116 |
| 123 TEST(Run_Float64Add_jswrapped) { | 117 TEST(Run_Float64Add_jswrapped) { |
| 124 CcTest::InitializeVM(); | 118 WasmRunner<double, double, double> r(kExecuteCompiled); |
| 125 TestSignatures sigs; | 119 BUILD(r, WASM_F64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 126 TestingModule module; | 120 Handle<JSFunction> jsfunc = r.module().WrapCode(r.function()->func_index); |
| 127 WasmFunctionCompiler t(sigs.d_dd(), &module); | |
| 128 BUILD(t, WASM_F64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | |
| 129 Handle<JSFunction> jsfunc = module.WrapCode(t.CompileAndAdd()); | |
| 130 | 121 |
| 131 EXPECT_CALL(3, jsfunc, 2, 1); | 122 EXPECT_CALL(3, jsfunc, 2, 1); |
| 132 EXPECT_CALL(-5.5, jsfunc, -5.25, -0.25); | 123 EXPECT_CALL(-5.5, jsfunc, -5.25, -0.25); |
| 133 } | 124 } |
| 134 | 125 |
| 135 TEST(Run_I32Popcount_jswrapped) { | 126 TEST(Run_I32Popcount_jswrapped) { |
| 136 CcTest::InitializeVM(); | 127 WasmRunner<int, int> r(kExecuteCompiled); |
| 137 TestSignatures sigs; | 128 BUILD(r, WASM_I32_POPCNT(WASM_GET_LOCAL(0))); |
| 138 TestingModule module; | 129 Handle<JSFunction> jsfunc = r.module().WrapCode(r.function()->func_index); |
| 139 WasmFunctionCompiler t(sigs.i_i(), &module); | |
| 140 BUILD(t, WASM_I32_POPCNT(WASM_GET_LOCAL(0))); | |
| 141 Handle<JSFunction> jsfunc = module.WrapCode(t.CompileAndAdd()); | |
| 142 | 130 |
| 143 EXPECT_CALL(2, jsfunc, 9, 0); | 131 EXPECT_CALL(2, jsfunc, 9, 0); |
| 144 EXPECT_CALL(3, jsfunc, 11, 0); | 132 EXPECT_CALL(3, jsfunc, 11, 0); |
| 145 EXPECT_CALL(6, jsfunc, 0x3F, 0); | 133 EXPECT_CALL(6, jsfunc, 0x3F, 0); |
| 146 } | 134 } |
| 147 | 135 |
| 148 TEST(Run_CallJS_Add_jswrapped) { | 136 TEST(Run_CallJS_Add_jswrapped) { |
| 149 CcTest::InitializeVM(); | 137 WasmRunner<int, int> r(kExecuteCompiled); |
| 150 TestSignatures sigs; | 138 TestSignatures sigs; |
| 151 TestingModule module; | |
| 152 WasmFunctionCompiler t(sigs.i_i(), &module); | |
| 153 uint32_t js_index = | 139 uint32_t js_index = |
| 154 module.AddJsFunction(sigs.i_i(), "(function(a) { return a + 99; })"); | 140 r.module().AddJsFunction(sigs.i_i(), "(function(a) { return a + 99; })"); |
| 155 BUILD(t, WASM_CALL_FUNCTION(js_index, WASM_GET_LOCAL(0))); | 141 BUILD(r, WASM_CALL_FUNCTION(js_index, WASM_GET_LOCAL(0))); |
| 156 | 142 |
| 157 Handle<JSFunction> jsfunc = module.WrapCode(t.CompileAndAdd()); | 143 Handle<JSFunction> jsfunc = r.module().WrapCode(r.function()->func_index); |
| 158 | 144 |
| 159 EXPECT_CALL(101, jsfunc, 2, -8); | 145 EXPECT_CALL(101, jsfunc, 2, -8); |
| 160 EXPECT_CALL(199, jsfunc, 100, -1); | 146 EXPECT_CALL(199, jsfunc, 100, -1); |
| 161 EXPECT_CALL(-666666801, jsfunc, -666666900, -1); | 147 EXPECT_CALL(-666666801, jsfunc, -666666900, -1); |
| 162 } | 148 } |
| 163 | 149 |
| 164 void RunJSSelectTest(int which) { | 150 void RunJSSelectTest(int which) { |
| 165 const int kMaxParams = 8; | 151 const int kMaxParams = 8; |
| 166 PredictableInputValues inputs(0x100); | 152 PredictableInputValues inputs(0x100); |
| 167 LocalType type = kAstF64; | 153 LocalType type = kAstF64; |
| 168 LocalType types[kMaxParams + 1] = {type, type, type, type, type, | 154 LocalType types[kMaxParams + 1] = {type, type, type, type, type, |
| 169 type, type, type, type}; | 155 type, type, type, type}; |
| 170 for (int num_params = which + 1; num_params < kMaxParams; num_params++) { | 156 for (int num_params = which + 1; num_params < kMaxParams; num_params++) { |
| 171 HandleScope scope(CcTest::InitIsolateOnce()); | 157 HandleScope scope(CcTest::InitIsolateOnce()); |
| 172 FunctionSig sig(1, num_params, types); | 158 FunctionSig sig(1, num_params, types); |
| 173 | 159 |
| 174 TestingModule module; | 160 WasmRunner<void> r(kExecuteCompiled); |
| 175 uint32_t js_index = AddJSSelector(&module, &sig, which); | 161 uint32_t js_index = AddJSSelector(&r.module(), &sig, which); |
| 176 WasmFunctionCompiler t(&sig, &module); | 162 WasmFunctionCompiler& t = r.NewFunction(&sig); |
| 177 | 163 |
| 178 { | 164 { |
| 179 std::vector<byte> code; | 165 std::vector<byte> code; |
| 180 | 166 |
| 181 for (int i = 0; i < num_params; i++) { | 167 for (int i = 0; i < num_params; i++) { |
| 182 ADD_CODE(code, WASM_F64(inputs.arg_d(i))); | 168 ADD_CODE(code, WASM_F64(inputs.arg_d(i))); |
| 183 } | 169 } |
| 184 | 170 |
| 185 ADD_CODE(code, kExprCallFunction, static_cast<byte>(js_index)); | 171 ADD_CODE(code, kExprCallFunction, static_cast<byte>(js_index)); |
| 186 | 172 |
| 187 size_t end = code.size(); | 173 size_t end = code.size(); |
| 188 code.push_back(0); | 174 code.push_back(0); |
| 189 t.Build(&code[0], &code[end]); | 175 t.Build(&code[0], &code[end]); |
| 190 } | 176 } |
| 191 | 177 |
| 192 Handle<JSFunction> jsfunc = module.WrapCode(t.CompileAndAdd()); | 178 Handle<JSFunction> jsfunc = r.module().WrapCode(t.function_index()); |
| 193 double expected = inputs.arg_d(which); | 179 double expected = inputs.arg_d(which); |
| 194 EXPECT_CALL(expected, jsfunc, 0.0, 0.0); | 180 EXPECT_CALL(expected, jsfunc, 0.0, 0.0); |
| 195 } | 181 } |
| 196 } | 182 } |
| 197 | 183 |
| 198 TEST(Run_JSSelect_0) { | 184 TEST(Run_JSSelect_0) { |
| 199 CcTest::InitializeVM(); | 185 CcTest::InitializeVM(); |
| 200 RunJSSelectTest(0); | 186 RunJSSelectTest(0); |
| 201 } | 187 } |
| 202 | 188 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 void RunWASMSelectTest(int which) { | 224 void RunWASMSelectTest(int which) { |
| 239 PredictableInputValues inputs(0x200); | 225 PredictableInputValues inputs(0x200); |
| 240 Isolate* isolate = CcTest::InitIsolateOnce(); | 226 Isolate* isolate = CcTest::InitIsolateOnce(); |
| 241 const int kMaxParams = 8; | 227 const int kMaxParams = 8; |
| 242 for (int num_params = which + 1; num_params < kMaxParams; num_params++) { | 228 for (int num_params = which + 1; num_params < kMaxParams; num_params++) { |
| 243 LocalType type = kAstF64; | 229 LocalType type = kAstF64; |
| 244 LocalType types[kMaxParams + 1] = {type, type, type, type, type, | 230 LocalType types[kMaxParams + 1] = {type, type, type, type, type, |
| 245 type, type, type, type}; | 231 type, type, type, type}; |
| 246 FunctionSig sig(1, num_params, types); | 232 FunctionSig sig(1, num_params, types); |
| 247 | 233 |
| 248 TestingModule module; | 234 WasmRunner<void> r(kExecuteCompiled); |
| 249 WasmFunctionCompiler t(&sig, &module); | 235 WasmFunctionCompiler& t = r.NewFunction(&sig); |
| 250 BUILD(t, WASM_GET_LOCAL(which)); | 236 BUILD(t, WASM_GET_LOCAL(which)); |
| 251 Handle<JSFunction> jsfunc = module.WrapCode(t.CompileAndAdd()); | 237 Handle<JSFunction> jsfunc = r.module().WrapCode(t.function_index()); |
| 252 | 238 |
| 253 Handle<Object> args[] = { | 239 Handle<Object> args[] = { |
| 254 isolate->factory()->NewNumber(inputs.arg_d(0)), | 240 isolate->factory()->NewNumber(inputs.arg_d(0)), |
| 255 isolate->factory()->NewNumber(inputs.arg_d(1)), | 241 isolate->factory()->NewNumber(inputs.arg_d(1)), |
| 256 isolate->factory()->NewNumber(inputs.arg_d(2)), | 242 isolate->factory()->NewNumber(inputs.arg_d(2)), |
| 257 isolate->factory()->NewNumber(inputs.arg_d(3)), | 243 isolate->factory()->NewNumber(inputs.arg_d(3)), |
| 258 isolate->factory()->NewNumber(inputs.arg_d(4)), | 244 isolate->factory()->NewNumber(inputs.arg_d(4)), |
| 259 isolate->factory()->NewNumber(inputs.arg_d(5)), | 245 isolate->factory()->NewNumber(inputs.arg_d(5)), |
| 260 isolate->factory()->NewNumber(inputs.arg_d(6)), | 246 isolate->factory()->NewNumber(inputs.arg_d(6)), |
| 261 isolate->factory()->NewNumber(inputs.arg_d(7)), | 247 isolate->factory()->NewNumber(inputs.arg_d(7)), |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 PredictableInputValues inputs(0x300); | 296 PredictableInputValues inputs(0x300); |
| 311 Isolate* isolate = CcTest::InitIsolateOnce(); | 297 Isolate* isolate = CcTest::InitIsolateOnce(); |
| 312 const int kMaxParams = 10; | 298 const int kMaxParams = 10; |
| 313 DCHECK_LE(num_args, kMaxParams); | 299 DCHECK_LE(num_args, kMaxParams); |
| 314 LocalType type = kAstF64; | 300 LocalType type = kAstF64; |
| 315 LocalType types[kMaxParams + 1] = {type, type, type, type, type, type, | 301 LocalType types[kMaxParams + 1] = {type, type, type, type, type, type, |
| 316 type, type, type, type, type}; | 302 type, type, type, type, type}; |
| 317 FunctionSig sig(1, num_params, types); | 303 FunctionSig sig(1, num_params, types); |
| 318 | 304 |
| 319 for (int which = 0; which < num_params; which++) { | 305 for (int which = 0; which < num_params; which++) { |
| 320 TestingModule module; | 306 WasmRunner<void> r(kExecuteCompiled); |
| 321 WasmFunctionCompiler t(&sig, &module); | 307 WasmFunctionCompiler& t = r.NewFunction(&sig); |
| 322 BUILD(t, WASM_GET_LOCAL(which)); | 308 BUILD(t, WASM_GET_LOCAL(which)); |
| 323 Handle<JSFunction> jsfunc = module.WrapCode(t.CompileAndAdd()); | 309 Handle<JSFunction> jsfunc = r.module().WrapCode(t.function_index()); |
| 324 | 310 |
| 325 Handle<Object> args[] = {isolate->factory()->NewNumber(inputs.arg_d(0)), | 311 Handle<Object> args[] = {isolate->factory()->NewNumber(inputs.arg_d(0)), |
| 326 isolate->factory()->NewNumber(inputs.arg_d(1)), | 312 isolate->factory()->NewNumber(inputs.arg_d(1)), |
| 327 isolate->factory()->NewNumber(inputs.arg_d(2)), | 313 isolate->factory()->NewNumber(inputs.arg_d(2)), |
| 328 isolate->factory()->NewNumber(inputs.arg_d(3)), | 314 isolate->factory()->NewNumber(inputs.arg_d(3)), |
| 329 isolate->factory()->NewNumber(inputs.arg_d(4)), | 315 isolate->factory()->NewNumber(inputs.arg_d(4)), |
| 330 isolate->factory()->NewNumber(inputs.arg_d(5)), | 316 isolate->factory()->NewNumber(inputs.arg_d(5)), |
| 331 isolate->factory()->NewNumber(inputs.arg_d(6)), | 317 isolate->factory()->NewNumber(inputs.arg_d(6)), |
| 332 isolate->factory()->NewNumber(inputs.arg_d(7)), | 318 isolate->factory()->NewNumber(inputs.arg_d(7)), |
| 333 isolate->factory()->NewNumber(inputs.arg_d(8)), | 319 isolate->factory()->NewNumber(inputs.arg_d(8)), |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 PredictableInputValues inputs(0x400); | 390 PredictableInputValues inputs(0x400); |
| 405 Isolate* isolate = CcTest::InitIsolateOnce(); | 391 Isolate* isolate = CcTest::InitIsolateOnce(); |
| 406 Factory* factory = isolate->factory(); | 392 Factory* factory = isolate->factory(); |
| 407 const int kMaxParams = 10; | 393 const int kMaxParams = 10; |
| 408 CHECK_LE(num_args, kMaxParams); | 394 CHECK_LE(num_args, kMaxParams); |
| 409 CHECK_LE(num_params, kMaxParams); | 395 CHECK_LE(num_params, kMaxParams); |
| 410 LocalType type = kAstF64; | 396 LocalType type = kAstF64; |
| 411 LocalType types[kMaxParams + 1] = {type, type, type, type, type, type, | 397 LocalType types[kMaxParams + 1] = {type, type, type, type, type, type, |
| 412 type, type, type, type, type}; | 398 type, type, type, type, type}; |
| 413 FunctionSig sig(1, num_params, types); | 399 FunctionSig sig(1, num_params, types); |
| 400 i::AccountingAllocator allocator; |
| 401 Zone zone(&allocator, ZONE_NAME); |
| 414 | 402 |
| 415 // Build the calling code. | 403 // Build the calling code. |
| 416 std::vector<byte> code; | 404 std::vector<byte> code; |
| 417 | 405 |
| 418 for (int i = 0; i < num_params; i++) { | 406 for (int i = 0; i < num_params; i++) { |
| 419 ADD_CODE(code, WASM_GET_LOCAL(i)); | 407 ADD_CODE(code, WASM_GET_LOCAL(i)); |
| 420 } | 408 } |
| 421 | 409 |
| 422 ADD_CODE(code, kExprCallFunction, 0); | 410 uint8_t predicted_js_index = 1; |
| 411 ADD_CODE(code, kExprCallFunction, predicted_js_index); |
| 423 | 412 |
| 424 size_t end = code.size(); | 413 size_t end = code.size(); |
| 425 code.push_back(0); | 414 code.push_back(0); |
| 426 | 415 |
| 427 // Call different select JS functions. | 416 // Call different select JS functions. |
| 428 for (int which = 0; which < num_params; which++) { | 417 for (int which = 0; which < num_params; which++) { |
| 429 HandleScope scope(isolate); | 418 WasmRunner<void> r(kExecuteCompiled); |
| 430 TestingModule module; | 419 uint32_t js_index = AddJSSelector(&r.module(), &sig, which); |
| 431 uint32_t js_index = AddJSSelector(&module, &sig, which); | 420 CHECK_EQ(predicted_js_index, js_index); |
| 432 CHECK_EQ(0u, js_index); | 421 WasmFunctionCompiler& t = r.NewFunction(&sig); |
| 433 WasmFunctionCompiler t(&sig, &module); | |
| 434 t.Build(&code[0], &code[end]); | 422 t.Build(&code[0], &code[end]); |
| 435 | 423 |
| 436 Handle<JSFunction> jsfunc = module.WrapCode(t.CompileAndAdd()); | 424 Handle<JSFunction> jsfunc = r.module().WrapCode(t.function_index()); |
| 437 | 425 |
| 438 Handle<Object> args[] = { | 426 Handle<Object> args[] = { |
| 439 factory->NewNumber(inputs.arg_d(0)), | 427 factory->NewNumber(inputs.arg_d(0)), |
| 440 factory->NewNumber(inputs.arg_d(1)), | 428 factory->NewNumber(inputs.arg_d(1)), |
| 441 factory->NewNumber(inputs.arg_d(2)), | 429 factory->NewNumber(inputs.arg_d(2)), |
| 442 factory->NewNumber(inputs.arg_d(3)), | 430 factory->NewNumber(inputs.arg_d(3)), |
| 443 factory->NewNumber(inputs.arg_d(4)), | 431 factory->NewNumber(inputs.arg_d(4)), |
| 444 factory->NewNumber(inputs.arg_d(5)), | 432 factory->NewNumber(inputs.arg_d(5)), |
| 445 factory->NewNumber(inputs.arg_d(6)), | 433 factory->NewNumber(inputs.arg_d(6)), |
| 446 factory->NewNumber(inputs.arg_d(7)), | 434 factory->NewNumber(inputs.arg_d(7)), |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 RunJSSelectAlignTest(9, 9); | 496 RunJSSelectAlignTest(9, 9); |
| 509 } | 497 } |
| 510 | 498 |
| 511 TEST(Run_JSSelectAlign_10) { | 499 TEST(Run_JSSelectAlign_10) { |
| 512 CcTest::InitializeVM(); | 500 CcTest::InitializeVM(); |
| 513 RunJSSelectAlignTest(10, 7); | 501 RunJSSelectAlignTest(10, 7); |
| 514 RunJSSelectAlignTest(10, 8); | 502 RunJSSelectAlignTest(10, 8); |
| 515 RunJSSelectAlignTest(10, 9); | 503 RunJSSelectAlignTest(10, 9); |
| 516 RunJSSelectAlignTest(10, 10); | 504 RunJSSelectAlignTest(10, 10); |
| 517 } | 505 } |
| OLD | NEW |