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

Side by Side Diff: test/cctest/interpreter/test-bytecode-generator.cc

Issue 1613163002: [interpreter] Wide register support. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Compilation fixes for gcc/msvc. Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698