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 "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/interpreter/bytecode-array-iterator.h" | 8 #include "src/interpreter/bytecode-array-iterator.h" |
9 #include "src/interpreter/bytecode-generator.h" | 9 #include "src/interpreter/bytecode-generator.h" |
10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
(...skipping 1441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1452 B(Add), R(3), // | 1452 B(Add), R(3), // |
1453 B(Star), R(2), // | 1453 B(Star), R(2), // |
1454 B(Ldar), A(2, 3), // | 1454 B(Ldar), A(2, 3), // |
1455 B(Star), R(3), // | 1455 B(Star), R(3), // |
1456 B(Call), R(0), R(1), U8(2), U8(vector->GetIndex(slot1)), // | 1456 B(Call), R(0), R(1), U8(2), U8(vector->GetIndex(slot1)), // |
1457 B(Return), // | 1457 B(Return), // |
1458 }, | 1458 }, |
1459 1, | 1459 1, |
1460 {"func"}}, | 1460 {"func"}}, |
1461 {"function f(a) {\n" | 1461 {"function f(a) {\n" |
1462 " a.func;\n" | 1462 " a.func;\n" REPEAT_127( |
1463 REPEAT_127(SPACE, " a.func;\n") | 1463 SPACE, " a.func;\n") " return a.func(); }\nf(" FUNC_ARG ")", |
1464 " return a.func(); }\nf(" FUNC_ARG ")", | |
1465 2 * kPointerSize, | 1464 2 * kPointerSize, |
1466 2, | 1465 2, |
1467 1046, | 1466 1046, |
1468 { | 1467 { |
1469 B(Ldar), A(1, 2), // | 1468 B(Ldar), A(1, 2), // |
1470 B(Star), R(0), // | 1469 B(Star), R(0), // |
1471 B(LoadICSloppy), R(0), U8(0), U8(wide_idx += 2), // | 1470 B(LoadICSloppy), R(0), U8(0), U8(wide_idx += 2), // |
1472 REPEAT_127(COMMA, // | 1471 REPEAT_127(COMMA, // |
1473 B(Ldar), A(1, 2), // | 1472 B(Ldar), A(1, 2), // |
1474 B(Star), R(0), // | 1473 B(Star), R(0), // |
1475 B(LoadICSloppy), R(0), U8(0), U8((wide_idx += 2))), // | 1474 B(LoadICSloppy), R(0), U8(0), U8((wide_idx += 2))), // |
1476 B(Ldar), A(1, 2), // | 1475 B(Ldar), |
1477 B(Star), R(1), // | 1476 A(1, 2), // |
1478 B(LoadICSloppyWide), R(1), U16(0), U16(wide_idx + 4), // | 1477 B(Star), R(1), // |
1479 B(Star), R(0), // | 1478 B(LoadICSloppyWide), R(1), U16(0), U16(wide_idx + 4), // |
1480 B(CallWide), R16(0), R16(1), U16(0), U16(wide_idx + 2), // | 1479 B(Star), R(0), // |
1481 B(Return), // | 1480 B(CallWide), R16(0), R16(1), U16(0), U16(wide_idx + 2), // |
| 1481 B(Return), // |
1482 }, | 1482 }, |
1483 1, | 1483 1, |
1484 {"func"}}, | 1484 {"func"}}, |
1485 }; | 1485 }; |
1486 for (size_t i = 0; i < arraysize(snippets); i++) { | 1486 for (size_t i = 0; i < arraysize(snippets); i++) { |
1487 Handle<BytecodeArray> bytecode_array = | 1487 Handle<BytecodeArray> bytecode_array = |
1488 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); | 1488 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); |
1489 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1489 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1490 } | 1490 } |
1491 } | 1491 } |
(...skipping 5784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7276 for (size_t i = 0; i < arraysize(snippets); i++) { | 7276 for (size_t i = 0; i < arraysize(snippets); i++) { |
7277 std::string script = std::string(function_prologue) + | 7277 std::string script = std::string(function_prologue) + |
7278 std::string(snippets[i].code_snippet) + | 7278 std::string(snippets[i].code_snippet) + |
7279 std::string(function_epilogue); | 7279 std::string(function_epilogue); |
7280 Handle<BytecodeArray> bytecode_array = | 7280 Handle<BytecodeArray> bytecode_array = |
7281 helper.MakeBytecode(script.c_str(), "*", "f"); | 7281 helper.MakeBytecode(script.c_str(), "*", "f"); |
7282 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 7282 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
7283 } | 7283 } |
7284 } | 7284 } |
7285 | 7285 |
| 7286 |
| 7287 TEST(WideRegisters) { |
| 7288 InitializedHandleScope handle_scope; |
| 7289 BytecodeGeneratorHelper helper; |
| 7290 |
| 7291 // Prepare prologue that creates frame for lots of registers. |
| 7292 std::ostringstream os; |
| 7293 for (size_t i = 0; i < 157; ++i) { |
| 7294 os << "var x" << i << ";\n"; |
| 7295 } |
| 7296 std::string prologue(os.str()); |
| 7297 |
| 7298 ExpectedSnippet<int> snippets[] = { |
| 7299 {"x0 = x127;\n" |
| 7300 "return x0;\n", |
| 7301 161 * kPointerSize, |
| 7302 1, |
| 7303 15, |
| 7304 { |
| 7305 B(MovWide), R16(131), R16(125), // |
| 7306 B(Ldar), R(125), // |
| 7307 B(MovWide), R16(125), R16(131), // |
| 7308 B(Star), R(0), // |
| 7309 B(Return), // |
| 7310 }}, |
| 7311 {"x127 = x126;\n" |
| 7312 "return x127;\n", |
| 7313 161 * kPointerSize, |
| 7314 1, |
| 7315 37, |
| 7316 { |
| 7317 B(MovWide), R16(130), R16(125), // |
| 7318 B(Ldar), R(125), // |
| 7319 B(MovWide), R16(125), R16(130), // |
| 7320 B(MovWide), R16(131), R16(125), // |
| 7321 B(Star), R(125), // |
| 7322 B(MovWide), R16(125), R16(131), // |
| 7323 B(MovWide), R16(131), R16(125), // |
| 7324 B(Ldar), R(125), // |
| 7325 B(MovWide), R16(125), R16(131), // |
| 7326 B(Return), // |
| 7327 }}, |
| 7328 {"if (x2 > 3) { return x129; }\n" |
| 7329 "return x128;\n", |
| 7330 162 * kPointerSize, |
| 7331 1, |
| 7332 56, |
| 7333 { |
| 7334 B(Ldar), R(2), // |
| 7335 B(MovWide), R16(161), R16(125), // |
| 7336 B(Star), R(125), // |
| 7337 B(MovWide), R16(125), R16(161), // |
| 7338 B(LdaSmi8), U8(3), // |
| 7339 B(MovWide), R16(161), R16(125), // |
| 7340 B(TestGreaterThan), R(125), // |
| 7341 B(MovWide), R16(125), R16(161), // |
| 7342 B(JumpIfToBooleanFalse), U8(15), // |
| 7343 B(MovWide), R16(133), R16(125), // |
| 7344 B(Ldar), R(125), // |
| 7345 B(MovWide), R16(125), R16(133), // |
| 7346 B(Return), // |
| 7347 B(MovWide), R16(132), R16(125), // |
| 7348 B(Ldar), R(125), // |
| 7349 B(MovWide), R16(125), R16(132), // |
| 7350 B(Return), // |
| 7351 }}, |
| 7352 {"var x0 = 0;\n" |
| 7353 "if (x129 == 3) { var x129 = x0; }\n" |
| 7354 "if (x2 > 3) { return x0; }\n" |
| 7355 "return x129;\n", |
| 7356 162 * kPointerSize, |
| 7357 1, |
| 7358 103, |
| 7359 { |
| 7360 B(LdaZero), // |
| 7361 B(Star), R(0), // |
| 7362 B(MovWide), R16(133), R16(125), // |
| 7363 B(Ldar), R(125), // |
| 7364 B(MovWide), R16(125), R16(133), // |
| 7365 B(MovWide), R16(161), R16(125), // |
| 7366 B(Star), R(125), // |
| 7367 B(MovWide), R16(125), R16(161), // |
| 7368 B(LdaSmi8), U8(3), // |
| 7369 B(MovWide), R16(161), R16(125), // |
| 7370 B(TestEqual), R(125), // |
| 7371 B(MovWide), R16(125), R16(161), // |
| 7372 B(JumpIfToBooleanFalse), U8(16), // |
| 7373 B(Ldar), R(0), // |
| 7374 B(MovWide), R16(133), R16(125), // |
| 7375 B(Star), R(125), // |
| 7376 B(MovWide), R16(125), R16(133), // |
| 7377 B(Ldar), R(2), // |
| 7378 B(MovWide), R16(161), R16(125), // |
| 7379 B(Star), R(125), // |
| 7380 B(MovWide), R16(125), R16(161), // |
| 7381 B(LdaSmi8), U8(3), // |
| 7382 B(MovWide), R16(161), R16(125), // |
| 7383 B(TestGreaterThan), R(125), // |
| 7384 B(MovWide), R16(125), R16(161), // |
| 7385 B(JumpIfToBooleanFalse), U8(5), // |
| 7386 B(Ldar), R(0), // |
| 7387 B(Return), // |
| 7388 B(MovWide), R16(133), R16(125), // |
| 7389 B(Ldar), R(125), // |
| 7390 B(MovWide), R16(125), R16(133), // |
| 7391 B(Return), // |
| 7392 }}, |
| 7393 {"var x0 = 0;\n" |
| 7394 "var x1 = 0;\n" |
| 7395 "for (x128 = 0; x128 < 64; x128++) {" |
| 7396 " x1 += x128;" |
| 7397 "}" |
| 7398 "return x128;\n", |
| 7399 162 * kPointerSize, |
| 7400 1, |
| 7401 152, |
| 7402 { |
| 7403 B(LdaZero), // |
| 7404 B(Star), R(0), // |
| 7405 B(LdaZero), // |
| 7406 B(Star), R(1), // |
| 7407 B(LdaZero), // |
| 7408 B(MovWide), R16(132), R16(125), // |
| 7409 B(Star), R(125), // |
| 7410 B(MovWide), R16(125), R16(132), // |
| 7411 B(MovWide), R16(132), R16(125), // |
| 7412 B(Ldar), R(125), // |
| 7413 B(MovWide), R16(125), R16(132), // |
| 7414 B(MovWide), R16(161), R16(125), // |
| 7415 B(Star), R(125), // |
| 7416 B(MovWide), R16(125), R16(161), // |
| 7417 B(LdaSmi8), U8(64), // |
| 7418 B(MovWide), R16(161), R16(125), // |
| 7419 B(TestLessThan), R(125), // |
| 7420 B(MovWide), R16(125), R16(161), // |
| 7421 B(JumpIfToBooleanFalse), U8(82), // |
| 7422 B(Ldar), R(1), // |
| 7423 B(MovWide), R16(161), R16(125), // |
| 7424 B(Star), R(125), // |
| 7425 B(MovWide), R16(125), R16(161), // |
| 7426 B(MovWide), R16(132), R16(125), // |
| 7427 B(Ldar), R(125), // |
| 7428 B(MovWide), R16(125), R16(132), // |
| 7429 B(MovWide), R16(161), R16(125), // |
| 7430 B(Add), R(125), // |
| 7431 B(MovWide), R16(125), R16(161), // |
| 7432 B(Star), R(1), // |
| 7433 B(MovWide), R16(132), R16(125), // |
| 7434 B(Ldar), R(125), // |
| 7435 B(MovWide), R16(125), R16(132), // |
| 7436 B(ToNumber), // |
| 7437 B(MovWide), R16(161), R16(125), // |
| 7438 B(Star), R(125), // |
| 7439 B(MovWide), R16(125), R16(161), // |
| 7440 B(Inc), // |
| 7441 B(MovWide), R16(132), R16(125), // |
| 7442 B(Star), R(125), // |
| 7443 B(MovWide), R16(125), R16(132), // |
| 7444 B(Jump), U8(-118), // |
| 7445 B(MovWide), R16(132), R16(125), // |
| 7446 B(Ldar), R(125), // |
| 7447 B(MovWide), R16(125), R16(132), // |
| 7448 B(Return), // |
| 7449 }}, |
| 7450 {"var x0 = 1234;\n" |
| 7451 "var x1 = 0;\n" |
| 7452 "for (x128 in x0) {" |
| 7453 " x1 += x128;" |
| 7454 "}" |
| 7455 "return x1;\n", |
| 7456 167 * kPointerSize, |
| 7457 1, |
| 7458 159, |
| 7459 { |
| 7460 B(LdaConstant), U8(0), // |
| 7461 B(Star), R(0), // |
| 7462 B(LdaZero), // |
| 7463 B(Star), R(1), // |
| 7464 B(Ldar), R(0), // |
| 7465 B(JumpIfUndefinedConstant), U8(3), // |
| 7466 B(JumpIfNullConstant), U8(2), // |
| 7467 B(ToObject), // |
| 7468 B(JumpIfNullConstant), U8(1), // |
| 7469 B(MovWide), R16(161), R16(125), // |
| 7470 B(Star), R(125), // |
| 7471 B(MovWide), R16(125), R16(161), // |
| 7472 B(ForInPrepareWide), R16(162), // |
| 7473 B(LdaZero), // |
| 7474 B(MovWide), R16(165), R16(125), // |
| 7475 B(Star), R(125), // |
| 7476 B(MovWide), R16(125), R16(165), // |
| 7477 B(MovWide), R16(165), R16(125), // |
| 7478 B(MovWide), R16(164), R16(126), // |
| 7479 B(ForInDone), R(125), R(126), // |
| 7480 B(MovWide), R16(126), R16(164), // |
| 7481 B(MovWide), R16(125), R16(165), // |
| 7482 B(JumpIfToBooleanTrue), U8(89), // |
| 7483 B(ForInNextWide), R16(161), R16(165), R16(162), // |
| 7484 B(JumpIfUndefined), U8(54), // |
| 7485 B(MovWide), R16(132), R16(125), // |
| 7486 B(Star), R(125), // |
| 7487 B(MovWide), R16(125), R16(132), // |
| 7488 B(Ldar), R(1), // |
| 7489 B(MovWide), R16(166), R16(125), // |
| 7490 B(Star), R(125), // |
| 7491 B(MovWide), R16(125), R16(166), // |
| 7492 B(MovWide), R16(132), R16(125), // |
| 7493 B(Ldar), R(125), // |
| 7494 B(MovWide), R16(125), R16(132), // |
| 7495 B(MovWide), R16(166), R16(125), // |
| 7496 B(Add), R(125), // |
| 7497 B(MovWide), R16(125), R16(166), // |
| 7498 B(Star), R(1), // |
| 7499 B(MovWide), R16(165), R16(125), // |
| 7500 B(ForInStep), R(125), // |
| 7501 B(MovWide), R16(125), R16(165), // |
| 7502 B(MovWide), R16(165), R16(125), // |
| 7503 B(Star), R(125), // |
| 7504 B(MovWide), R16(125), R16(165), // |
| 7505 B(Jump), U8(-110), // |
| 7506 B(Ldar), R(1), // |
| 7507 B(Return), // |
| 7508 }, |
| 7509 4, |
| 7510 {1234, 142, 145, 147}}, |
| 7511 {"x0 = %Add(x64, x63);\n" |
| 7512 "x1 = %Add(x27, x143);\n" |
| 7513 "%TheHole();\n" |
| 7514 "return x1;\n", |
| 7515 163 * kPointerSize, |
| 7516 1, |
| 7517 90, |
| 7518 { |
| 7519 B(Ldar), R(64), // |
| 7520 B(MovWide), R16(161), R16(125), // |
| 7521 B(Star), R(125), // |
| 7522 B(MovWide), R16(125), R16(161), // |
| 7523 B(Ldar), R(63), // |
| 7524 B(MovWide), R16(162), R16(125), // |
| 7525 B(Star), R(125), // |
| 7526 B(MovWide), R16(125), R16(162), // |
| 7527 B(CallRuntimeWide), U16(Runtime::kAdd), R16(161), U8(2), // |
| 7528 B(Star), R(0), // |
| 7529 B(Ldar), R(27), // |
| 7530 B(MovWide), R16(161), R16(125), // |
| 7531 B(Star), R(125), // |
| 7532 B(MovWide), R16(125), R16(161), // |
| 7533 B(MovWide), R16(147), R16(125), // |
| 7534 B(Ldar), R(125), // |
| 7535 B(MovWide), R16(125), R16(147), // |
| 7536 B(MovWide), R16(162), R16(125), // |
| 7537 B(Star), R(125), // |
| 7538 B(MovWide), R16(125), R16(162), // |
| 7539 B(CallRuntimeWide), U16(Runtime::kAdd), R16(161), U8(2), // |
| 7540 B(Star), R(1), // |
| 7541 B(CallRuntime), U16(Runtime::kTheHole), R(0), U8(0), // |
| 7542 B(Ldar), R(1), // |
| 7543 B(Return), // |
| 7544 }}}; |
| 7545 |
| 7546 for (size_t i = 0; i < arraysize(snippets); ++i) { |
| 7547 std::string body = prologue + snippets[i].code_snippet; |
| 7548 Handle<BytecodeArray> bytecode_array = |
| 7549 helper.MakeBytecodeForFunctionBody(body.c_str()); |
| 7550 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 7551 } |
| 7552 } |
| 7553 |
7286 } // namespace interpreter | 7554 } // namespace interpreter |
7287 } // namespace internal | 7555 } // namespace internal |
7288 } // namespace v8 | 7556 } // namespace v8 |
OLD | NEW |