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

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

Issue 1426913002: [Interpreter] Merges ToBoolean and JumpIfTrue/False bytecodes (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Last patch was not complete. Forgot few changes. Created 5 years, 1 month 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 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 1 * kPointerSize, 378 1 * kPointerSize,
379 1, 379 1,
380 10, 380 10,
381 {B(LdaZero), // 381 {B(LdaZero), //
382 B(Star), R(0), // 382 B(Star), R(0), //
383 B(Ldar), R(0), // 383 B(Ldar), R(0), //
384 B(JumpIfToBooleanTrue), U8(4), // 384 B(JumpIfToBooleanTrue), U8(4), //
385 B(LdaSmi8), U8(3), // 385 B(LdaSmi8), U8(3), //
386 B(Return)}, 386 B(Return)},
387 0}, 387 0},
388 {"var x = 0; return (x == 1) || 3;",
389 1 * kPointerSize,
390 1,
391 12,
392 {B(LdaZero), //
393 B(Star), R(0), //
394 B(LdaSmi8), U8(1), //
395 B(TestEqual), R(0), //
396 B(JumpIfTrue), U8(4), //
397 B(LdaSmi8), U8(3), //
398 B(Return)},
399 0},
388 {"var x = 0; return x && 3;", 400 {"var x = 0; return x && 3;",
389 1 * kPointerSize, 401 1 * kPointerSize,
390 1, 402 1,
391 10, 403 10,
392 {B(LdaZero), // 404 {B(LdaZero), //
393 B(Star), R(0), // 405 B(Star), R(0), //
394 B(Ldar), R(0), // 406 B(Ldar), R(0), //
395 B(JumpIfToBooleanFalse), U8(4), // 407 B(JumpIfToBooleanFalse), U8(4), //
396 B(LdaSmi8), U8(3), // 408 B(LdaSmi8), U8(3), //
397 B(Return)}, 409 B(Return)},
398 0}, 410 0},
411 {"var x = 0; return (x == 0) && 3;",
412 1 * kPointerSize,
413 1,
414 11,
415 {B(LdaZero), //
416 B(Star), R(0), //
417 B(LdaZero), //
418 B(TestEqual), R(0), //
419 B(JumpIfFalse), U8(4), //
420 B(LdaSmi8), U8(3), //
421 B(Return)},
422 0},
399 {"var x = 0; return x || (1, 2, 3);", 423 {"var x = 0; return x || (1, 2, 3);",
400 1 * kPointerSize, 424 1 * kPointerSize,
401 1, 425 1,
402 10, 426 10,
403 {B(LdaZero), // 427 {B(LdaZero), //
404 B(Star), R(0), // 428 B(Star), R(0), //
405 B(Ldar), R(0), // 429 B(Ldar), R(0), //
406 B(JumpIfToBooleanTrue), U8(4), // 430 B(JumpIfToBooleanTrue), U8(4), //
407 B(LdaSmi8), U8(3), // 431 B(LdaSmi8), U8(3), //
408 B(Return)}, 432 B(Return)},
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 B(Star), R(0), // 483 B(Star), R(0), //
460 B(LdaSmi8), U8(2), // 484 B(LdaSmi8), U8(2), //
461 B(Star), R(1), // 485 B(Star), R(1), //
462 B(LdaSmi8), U8(3), // 486 B(LdaSmi8), U8(3), //
463 B(Star), R(2), // 487 B(Star), R(2), //
464 B(Ldar), R(0), // 488 B(Ldar), R(0), //
465 B(JumpIfToBooleanFalseConstant), U8(0), // 489 B(JumpIfToBooleanFalseConstant), U8(0), //
466 #define X B(LdaSmi8), U8(1), B(Star), R(1), B(LdaSmi8), U8(2), B(Star), R(2), 490 #define X B(LdaSmi8), U8(1), B(Star), R(1), B(LdaSmi8), U8(2), B(Star), R(2),
467 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 491 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
468 #undef X 492 #undef X
469 B(LdaSmi8), U8(3), // 493 B(LdaSmi8), U8(3), //
470 B(Return)}, 494 B(Return)},
471 1, 495 1,
472 {268, 0, 0, 0}}, 496 {268, 0, 0, 0}},
497 {"var x = 1; var a = 2, b = 3; return (x > 3) || ("
498 #define X "a = 1, b = 2, "
499 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
rmcilroy 2015/10/30 10:50:06 Now that https://codereview.chromium.org/141386301
rmcilroy 2015/10/30 12:09:53 Still this please.
500 #undef X
501 "3);",
502 3 * kPointerSize,
503 1,
504 285,
505 {B(LdaSmi8), U8(1), //
506 B(Star), R(0), //
507 B(LdaSmi8), U8(2), //
508 B(Star), R(1), //
509 B(LdaSmi8), U8(3), //
510 B(Star), R(2), //
511 B(LdaSmi8), U8(3), //
512 B(TestGreaterThan), R(0), //
513 B(JumpIfTrueConstant), U8(0), //
514 #define X B(LdaSmi8), U8(1), B(Star), R(1), B(LdaSmi8), U8(2), B(Star), R(2),
515 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
516 #undef X
517 B(LdaSmi8), U8(3), //
518 B(Return)},
519 1,
520 {268, 0, 0, 0}},
521 {"var x = 0; var a = 2, b = 3; return (x < 5) && ("
522 #define X "a = 1, b = 2, "
523 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
524 #undef X
525 "3);",
526 3 * kPointerSize,
527 1,
528 284,
529 {B(LdaZero), //
530 B(Star), R(0), //
531 B(LdaSmi8), U8(2), //
532 B(Star), R(1), //
533 B(LdaSmi8), U8(3), //
534 B(Star), R(2), //
535 B(LdaSmi8), U8(5), //
536 B(TestLessThan), R(0), //
537 B(JumpIfFalseConstant), U8(0), //
538 #define X B(LdaSmi8), U8(1), B(Star), R(1), B(LdaSmi8), U8(2), B(Star), R(2),
539 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
540 #undef X
541 B(LdaSmi8), U8(3), //
542 B(Return)},
543 1,
544 {268, 0, 0, 0}},
473 {"return 0 && 3;", 545 {"return 0 && 3;",
474 0 * kPointerSize, 546 0 * kPointerSize,
475 1, 547 1,
476 2, 548 2,
477 {B(LdaZero), // 549 {B(LdaZero), //
478 B(Return)}, 550 B(Return)},
479 0}, 551 0},
480 {"return 1 || 3;", 552 {"return 1 || 3;",
481 0 * kPointerSize, 553 0 * kPointerSize,
482 1, 554 1,
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after
1247 TEST(IfConditions) { 1319 TEST(IfConditions) {
1248 InitializedHandleScope handle_scope; 1320 InitializedHandleScope handle_scope;
1249 BytecodeGeneratorHelper helper; 1321 BytecodeGeneratorHelper helper;
1250 1322
1251 Handle<Object> unused = helper.factory()->undefined_value(); 1323 Handle<Object> unused = helper.factory()->undefined_value();
1252 1324
1253 ExpectedSnippet<Handle<Object>> snippets[] = { 1325 ExpectedSnippet<Handle<Object>> snippets[] = {
1254 {"function f() { if (0) { return 1; } else { return -1; } } f()", 1326 {"function f() { if (0) { return 1; } else { return -1; } } f()",
1255 0, 1327 0,
1256 1, 1328 1,
1257 14, 1329 13,
1258 {B(LdaZero), // 1330 {B(LdaZero), //
1259 B(ToBoolean), // 1331 B(JumpIfToBooleanFalse), U8(7), //
1260 B(JumpIfFalse), U8(7), // 1332 B(LdaSmi8), U8(1), //
1261 B(LdaSmi8), U8(1), // 1333 B(Return), //
1262 B(Return), // 1334 B(Jump), U8(5), //
1263 B(Jump), U8(5), // 1335 B(LdaSmi8), U8(-1), //
1264 B(LdaSmi8), U8(-1), // 1336 B(Return), //
1265 B(Return), // 1337 B(LdaUndefined), //
1266 B(LdaUndefined), // 1338 B(Return)}, //
1267 B(Return)}, //
1268 0, 1339 0,
1269 {unused, unused, unused, unused, unused, unused}}, 1340 {unused, unused, unused, unused, unused, unused}},
1270 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();", 1341 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();",
1271 0, 1342 0,
1272 1, 1343 1,
1273 15, 1344 14,
1274 {B(LdaConstant), U8(0), // 1345 {B(LdaConstant), U8(0), //
1275 B(ToBoolean), // 1346 B(JumpIfToBooleanFalse), U8(7), //
1276 B(JumpIfFalse), U8(7), // 1347 B(LdaSmi8), U8(1), //
1277 B(LdaSmi8), U8(1), // 1348 B(Return), //
1278 B(Return), // 1349 B(Jump), U8(5), //
1279 B(Jump), U8(5), // 1350 B(LdaSmi8), U8(-1), //
1280 B(LdaSmi8), U8(-1), // 1351 B(Return), //
1281 B(Return), // 1352 B(LdaUndefined), //
1282 B(LdaUndefined), // 1353 B(Return)}, //
1283 B(Return)}, //
1284 1, 1354 1,
1285 {helper.factory()->NewStringFromStaticChars("lucky"), unused, unused, 1355 {helper.factory()->NewStringFromStaticChars("lucky"), unused, unused,
1286 unused, unused, unused}}, 1356 unused, unused, unused}},
1287 {"function f() { if (false) { return 1; } else { return -1; } } f();", 1357 {"function f() { if (false) { return 1; } else { return -1; } } f();",
1288 0, 1358 0,
1289 1, 1359 1,
1290 13, 1360 13,
1291 {B(LdaFalse), // 1361 {B(LdaFalse), //
1292 B(JumpIfFalse), U8(7), // 1362 B(JumpIfFalse), U8(7), //
1293 B(LdaSmi8), U8(1), // 1363 B(LdaSmi8), U8(1), //
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1359 B(LdaConstant), U8(3), // 1429 B(LdaConstant), U8(3), //
1360 B(Return), // 1430 B(Return), //
1361 B(LdaUndefined), // 1431 B(LdaUndefined), //
1362 B(Return)}, // 1432 B(Return)}, //
1363 #undef X 1433 #undef X
1364 4, 1434 4,
1365 {helper.factory()->NewHeapNumber(0.01), 1435 {helper.factory()->NewHeapNumber(0.01),
1366 helper.factory()->NewNumberFromInt(200), 1436 helper.factory()->NewNumberFromInt(200),
1367 helper.factory()->NewNumberFromInt(199), 1437 helper.factory()->NewNumberFromInt(199),
1368 helper.factory()->NewNumberFromInt(-200), unused, unused}}, 1438 helper.factory()->NewNumberFromInt(-200), unused, unused}},
1439 {"function f() { var a = 0; var b = 0; if (a) { "
1440 #define X "b = a; a = b; "
1441 X X X X X X X X X X X X X X X X X X X X X X X X
1442 #undef X
1443 " return 200; } else { return -200; } } f()",
1444 2 * kPointerSize,
1445 1,
1446 212,
1447 {
1448 #define X B(Ldar), R(0), B(Star), R(1), B(Ldar), R(1), B(Star), R(0)
1449 B(LdaZero), //
1450 B(Star), R(0), //
1451 B(LdaZero), //
1452 B(Star), R(1), //
1453 B(Ldar), R(0), //
1454 B(JumpIfToBooleanFalseConstant), U8(1), //
1455 X, X, X, X, X, X, X, X, X, X, //
1456 X, X, X, X, X, X, X, X, X, X, //
1457 X, X, X, X, //
1458 B(LdaConstant), U8(0), //
1459 B(Return), //
1460 B(Jump), U8(5), //
1461 B(LdaConstant), U8(2), //
1462 B(Return), //
1463 B(LdaUndefined), //
1464 B(Return)}, //
1465 #undef X
1466 3,
1467 {helper.factory()->NewNumberFromInt(200),
1468 helper.factory()->NewNumberFromInt(199),
1469 helper.factory()->NewNumberFromInt(-200), unused, unused, unused}},
1470
1369 {"function f(a, b) {\n" 1471 {"function f(a, b) {\n"
1370 " if (a == b) { return 1; }\n" 1472 " if (a == b) { return 1; }\n"
1371 " if (a === b) { return 1; }\n" 1473 " if (a === b) { return 1; }\n"
1372 " if (a < b) { return 1; }\n" 1474 " if (a < b) { return 1; }\n"
1373 " if (a > b) { return 1; }\n" 1475 " if (a > b) { return 1; }\n"
1374 " if (a <= b) { return 1; }\n" 1476 " if (a <= b) { return 1; }\n"
1375 " if (a >= b) { return 1; }\n" 1477 " if (a >= b) { return 1; }\n"
1376 " if (a in b) { return 1; }\n" 1478 " if (a in b) { return 1; }\n"
1377 " if (a instanceof b) { return 1; }\n" 1479 " if (a instanceof b) { return 1; }\n"
1378 " return 0;\n" 1480 " return 0;\n"
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
1728 B(LdaSmi8), U8(1), // 1830 B(LdaSmi8), U8(1), //
1729 B(Add), R(0), // 1831 B(Add), R(0), //
1730 B(Star), R(0), // 1832 B(Star), R(0), //
1731 B(Jump), U8(5), // 1833 B(Jump), U8(5), //
1732 B(LdaTrue), // 1834 B(LdaTrue), //
1733 B(JumpIfTrue), U8(-31), // 1835 B(JumpIfTrue), U8(-31), //
1734 B(Ldar), R(0), // 1836 B(Ldar), R(0), //
1735 B(Return), // 1837 B(Return), //
1736 }, 1838 },
1737 0}, 1839 0},
1738 }; 1840 {"var x = 10;"
1841 "var y = 1;"
1842 "while (x) {"
1843 " y = y * 12;"
1844 " x = x - 1;"
1845 "}"
1846 "return y;",
1847 2 * kPointerSize,
1848 1,
1849 29,
1850 {
1851 B(LdaSmi8), U8(10), //
1852 B(Star), R(0), //
1853 B(LdaSmi8), U8(1), //
1854 B(Star), R(1), //
1855 B(Jump), U8(14), //
1856 B(LdaSmi8), U8(12), //
1857 B(Mul), R(1), //
1858 B(Star), R(1), //
1859 B(LdaSmi8), U8(1), //
1860 B(Sub), R(0), //
1861 B(Star), R(0), //
1862 B(Ldar), R(0), //
1863 B(JumpIfToBooleanTrue), U8(-14), //
1864 B(Ldar), R(1), //
1865 B(Return), //
1866 },
1867 0},
1868 {"var x = 10;"
1869 "var y = 1;"
1870 "do {"
1871 " y = y * 12;"
1872 " x = x - 1;"
1873 "} while(x);"
1874 "return y;",
1875 2 * kPointerSize,
1876 1,
1877 27,
1878 {
1879 B(LdaSmi8), U8(10), //
1880 B(Star), R(0), //
1881 B(LdaSmi8), U8(1), //
1882 B(Star), R(1), //
1883 B(LdaSmi8), U8(12), //
1884 B(Mul), R(1), //
1885 B(Star), R(1), //
1886 B(LdaSmi8), U8(1), //
1887 B(Sub), R(0), //
1888 B(Star), R(0), //
1889 B(Ldar), R(0), //
1890 B(JumpIfToBooleanTrue), U8(-14), //
1891 B(Ldar), R(1), //
1892 B(Return), //
1893 },
1894 0},
1895 {"var y = 1;"
1896 "for (var x = 10; x; --x) {"
1897 " y = y * 12;"
1898 "}"
1899 "return y;",
1900 2 * kPointerSize,
1901 1,
1902 29,
1903 {
1904 B(LdaSmi8), U8(1), //
1905 B(Star), R(0), //
1906 B(LdaSmi8), U8(10), //
1907 B(Star), R(1), //
1908 B(Jump), U8(14), //
1909 B(LdaSmi8), U8(12), //
1910 B(Mul), R(0), //
1911 B(Star), R(0), //
1912 B(Ldar), R(1), //
1913 B(ToNumber), //
1914 B(Dec), //
1915 B(Star), R(1), //
1916 B(Ldar), R(1), //
1917 B(JumpIfToBooleanTrue), U8(-14), //
1918 B(Ldar), R(0), //
1919 B(Return), //
1920 },
1921 0}};
1739 1922
1740 for (size_t i = 0; i < arraysize(snippets); i++) { 1923 for (size_t i = 0; i < arraysize(snippets); i++) {
1741 Handle<BytecodeArray> bytecode_array = 1924 Handle<BytecodeArray> bytecode_array =
1742 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 1925 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
1743 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 1926 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
1744 } 1927 }
1745 } 1928 }
1746 1929
1747 1930
1748 TEST(UnaryOperators) { 1931 TEST(UnaryOperators) {
(...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after
2829 3, 3012 3,
2830 { 3013 {
2831 B(LdaConstant), U8(0), // 3014 B(LdaConstant), U8(0), //
2832 B(Throw), // 3015 B(Throw), //
2833 }, 3016 },
2834 1, 3017 1,
2835 {"Error"}}, 3018 {"Error"}},
2836 {"if ('test') { throw 'Error'; };", 3019 {"if ('test') { throw 'Error'; };",
2837 0, 3020 0,
2838 1, 3021 1,
2839 10, 3022 9,
2840 { 3023 {
2841 B(LdaConstant), U8(0), // 3024 B(LdaConstant), U8(0), //
2842 B(ToBoolean), // 3025 B(JumpIfToBooleanFalse), U8(5), //
2843 B(JumpIfFalse), U8(5), // 3026 B(LdaConstant), U8(1), //
2844 B(LdaConstant), U8(1), // 3027 B(Throw), //
2845 B(Throw), // 3028 B(LdaUndefined), //
2846 B(LdaUndefined), // 3029 B(Return), //
2847 B(Return), //
2848 }, 3030 },
2849 2, 3031 2,
2850 {"test", "Error"}}, 3032 {"test", "Error"}},
2851 }; 3033 };
2852 3034
2853 for (size_t i = 0; i < arraysize(snippets); i++) { 3035 for (size_t i = 0; i < arraysize(snippets); i++) {
2854 Handle<BytecodeArray> bytecode_array = 3036 Handle<BytecodeArray> bytecode_array =
2855 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 3037 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
2856 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 3038 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2857 } 3039 }
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after
3818 4000
3819 4001
3820 TEST(Conditional) { 4002 TEST(Conditional) {
3821 InitializedHandleScope handle_scope; 4003 InitializedHandleScope handle_scope;
3822 BytecodeGeneratorHelper helper; 4004 BytecodeGeneratorHelper helper;
3823 4005
3824 ExpectedSnippet<int> snippets[] = { 4006 ExpectedSnippet<int> snippets[] = {
3825 {"return 1 ? 2 : 3;", 4007 {"return 1 ? 2 : 3;",
3826 0, 4008 0,
3827 1, 4009 1,
3828 12, 4010 11,
3829 { 4011 {
3830 B(LdaSmi8), U8(1), // 4012 B(LdaSmi8), U8(1), //
3831 B(ToBoolean), // 4013 B(JumpIfToBooleanFalse), U8(6), //
3832 B(JumpIfFalse), U8(6), // 4014 B(LdaSmi8), U8(2), //
3833 B(LdaSmi8), U8(2), // 4015 B(Jump), U8(4), //
3834 B(Jump), U8(4), // 4016 B(LdaSmi8), U8(3), //
3835 B(LdaSmi8), U8(3), // 4017 B(Return), //
3836 B(Return), //
3837 }}, 4018 }},
3838 {"return 1 ? 2 ? 3 : 4 : 5;", 4019 {"return 1 ? 2 ? 3 : 4 : 5;",
3839 0, 4020 0,
3840 1, 4021 1,
3841 21, 4022 19,
3842 { 4023 {
3843 B(LdaSmi8), U8(1), // 4024 B(LdaSmi8), U8(1), //
3844 B(ToBoolean), // 4025 B(JumpIfToBooleanFalse), U8(14), //
3845 B(JumpIfFalse), U8(15), // 4026 B(LdaSmi8), U8(2), //
3846 B(LdaSmi8), U8(2), // 4027 B(JumpIfToBooleanFalse), U8(6), //
3847 B(ToBoolean), // 4028 B(LdaSmi8), U8(3), //
3848 B(JumpIfFalse), U8(6), // 4029 B(Jump), U8(4), //
3849 B(LdaSmi8), U8(3), // 4030 B(LdaSmi8), U8(4), //
3850 B(Jump), U8(4), // 4031 B(Jump), U8(4), //
3851 B(LdaSmi8), U8(4), // 4032 B(LdaSmi8), U8(5), //
3852 B(Jump), U8(4), // 4033 B(Return), //
3853 B(LdaSmi8), U8(5), //
3854 B(Return), //
3855 }}, 4034 }},
3856 }; 4035 };
3857 4036
3858 for (size_t i = 0; i < arraysize(snippets); i++) { 4037 for (size_t i = 0; i < arraysize(snippets); i++) {
3859 Handle<BytecodeArray> bytecode_array = 4038 Handle<BytecodeArray> bytecode_array =
3860 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 4039 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
3861 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 4040 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
3862 } 4041 }
3863 } 4042 }
3864 4043
3865 } // namespace interpreter 4044 } // namespace interpreter
3866 } // namespace internal 4045 } // namespace internal
3867 } // namespace v8 4046 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698