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

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: Added tests, fixed off-by-one error in register indicies. 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 5401 matching lines...) Expand 10 before | Expand all | Expand 10 after
6893 for (size_t i = 0; i < arraysize(snippets); i++) { 6893 for (size_t i = 0; i < arraysize(snippets); i++) {
6894 std::string script = std::string(function_prologue) + 6894 std::string script = std::string(function_prologue) +
6895 std::string(snippets[i].code_snippet) + 6895 std::string(snippets[i].code_snippet) +
6896 std::string(function_epilogue); 6896 std::string(function_epilogue);
6897 Handle<BytecodeArray> bytecode_array = 6897 Handle<BytecodeArray> bytecode_array =
6898 helper.MakeBytecode(script.c_str(), "*", "f"); 6898 helper.MakeBytecode(script.c_str(), "*", "f");
6899 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 6899 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
6900 } 6900 }
6901 } 6901 }
6902 6902
6903
6904 TEST(WideRegisters) {
6905 InitializedHandleScope handle_scope;
6906 BytecodeGeneratorHelper helper;
6907
6908 // Prepare prologue that creates frame for lots of registers.
6909 std::ostringstream os;
6910 for (size_t i = 0; i < 157; ++i) {
6911 os << "var x" << i << ";\n";
6912 }
6913 std::string prologue(os.str());
6914
6915 ExpectedSnippet<int> snippets[] = {
6916 {"x0 = x127;\n"
6917 "return x0;\n",
6918 161 * kPointerSize,
6919 1,
6920 15,
6921 {
6922 B(MovWide), R16(131), R16(124), //
6923 B(Ldar), R(124), //
6924 B(MovWide), R16(124), R16(131), //
6925 B(Star), R(0), //
6926 B(Return), //
6927 }},
6928 {"x127 = x126;\n"
6929 "return x127;\n",
6930 161 * kPointerSize,
6931 1,
6932 37,
6933 {
6934 B(MovWide), R16(130), R16(124), //
6935 B(Ldar), R(124), //
6936 B(MovWide), R16(124), R16(130), //
6937 B(MovWide), R16(131), R16(124), //
6938 B(Star), R(124), //
6939 B(MovWide), R16(124), R16(131), //
6940 B(MovWide), R16(131), R16(124), //
6941 B(Ldar), R(124), //
6942 B(MovWide), R16(124), R16(131), //
6943 B(Return), //
6944 }},
6945 {"if (x2 > 3) { return x129; }\n"
6946 "return x128;\n",
6947 162 * kPointerSize,
6948 1,
6949 56,
6950 {
6951 B(Ldar), R(2), //
6952 B(MovWide), R16(161), R16(124), //
6953 B(Star), R(124), //
6954 B(MovWide), R16(124), R16(161), //
6955 B(LdaSmi8), U8(3), //
6956 B(MovWide), R16(161), R16(124), //
6957 B(TestGreaterThan), R(124), //
6958 B(MovWide), R16(124), R16(161), //
6959 B(JumpIfToBooleanFalse), U8(15), //
6960 B(MovWide), R16(133), R16(124), //
6961 B(Ldar), R(124), //
6962 B(MovWide), R16(124), R16(133), //
6963 B(Return), //
6964 B(MovWide), R16(132), R16(124), //
6965 B(Ldar), R(124), //
6966 B(MovWide), R16(124), R16(132), //
6967 B(Return), //
6968 }},
6969 {"var x0 = 0;\n"
6970 "if (x129 == 3) { var x129 = x0; }\n"
6971 "if (x2 > 3) { return x0; }\n"
6972 "return x129;\n",
6973 162 * kPointerSize,
6974 1,
6975 103,
6976 {
6977 B(LdaZero), //
6978 B(Star), R(0), //
6979 B(MovWide), R16(133), R16(124), //
6980 B(Ldar), R(124), //
6981 B(MovWide), R16(124), R16(133), //
6982 B(MovWide), R16(161), R16(124), //
6983 B(Star), R(124), //
6984 B(MovWide), R16(124), R16(161), //
6985 B(LdaSmi8), U8(3), //
6986 B(MovWide), R16(161), R16(124), //
6987 B(TestEqual), R(124), //
6988 B(MovWide), R16(124), R16(161), //
6989 B(JumpIfToBooleanFalse), U8(16), //
6990 B(Ldar), R(0), //
6991 B(MovWide), R16(133), R16(124), //
6992 B(Star), R(124), //
6993 B(MovWide), R16(124), R16(133), //
6994 B(Ldar), R(2), //
6995 B(MovWide), R16(161), R16(124), //
6996 B(Star), R(124), //
6997 B(MovWide), R16(124), R16(161), //
6998 B(LdaSmi8), U8(3), //
6999 B(MovWide), R16(161), R16(124), //
7000 B(TestGreaterThan), R(124), //
7001 B(MovWide), R16(124), R16(161), //
7002 B(JumpIfToBooleanFalse), U8(5), //
7003 B(Ldar), R(0), //
7004 B(Return), //
7005 B(MovWide), R16(133), R16(124), //
7006 B(Ldar), R(124), //
7007 B(MovWide), R16(124), R16(133), //
7008 B(Return), //
7009 }},
7010 {"var x0 = 0;\n"
7011 "var x1 = 0;\n"
7012 "for (x128 = 0; x128 < 64; x128++) {"
7013 " x1 += x128;"
7014 "}"
7015 "return x128;\n",
7016 162 * kPointerSize,
7017 1,
7018 152,
7019 {
7020 B(LdaZero), //
7021 B(Star), R(0), //
7022 B(LdaZero), //
7023 B(Star), R(1), //
7024 B(LdaZero), //
7025 B(MovWide), R16(132), R16(124), //
7026 B(Star), R(124), //
7027 B(MovWide), R16(124), R16(132), //
7028 B(MovWide), R16(132), R16(124), //
7029 B(Ldar), R(124), //
7030 B(MovWide), R16(124), R16(132), //
7031 B(MovWide), R16(161), R16(124), //
7032 B(Star), R(124), //
7033 B(MovWide), R16(124), R16(161), //
7034 B(LdaSmi8), U8(64), //
7035 B(MovWide), R16(161), R16(124), //
7036 B(TestLessThan), R(124), //
7037 B(MovWide), R16(124), R16(161), //
7038 B(JumpIfToBooleanFalse), U8(82), //
7039 B(Ldar), R(1), //
7040 B(MovWide), R16(161), R16(124), //
7041 B(Star), R(124), //
7042 B(MovWide), R16(124), R16(161), //
7043 B(MovWide), R16(132), R16(124), //
7044 B(Ldar), R(124), //
7045 B(MovWide), R16(124), R16(132), //
7046 B(MovWide), R16(161), R16(124), //
7047 B(Add), R(124), //
7048 B(MovWide), R16(124), R16(161), //
7049 B(Star), R(1), //
7050 B(MovWide), R16(132), R16(124), //
7051 B(Ldar), R(124), //
7052 B(MovWide), R16(124), R16(132), //
7053 B(ToNumber), //
7054 B(MovWide), R16(161), R16(124), //
7055 B(Star), R(124), //
7056 B(MovWide), R16(124), R16(161), //
7057 B(Inc), //
7058 B(MovWide), R16(132), R16(124), //
7059 B(Star), R(124), //
7060 B(MovWide), R16(124), R16(132), //
7061 B(Jump), U8(-118), //
7062 B(MovWide), R16(132), R16(124), //
7063 B(Ldar), R(124), //
7064 B(MovWide), R16(124), R16(132), //
7065 B(Return), //
7066 }},
7067 {"var x0 = 1234;\n"
7068 "var x1 = 0;\n"
7069 "for (x128 in x0) {"
7070 " x1 += x128;"
7071 "}"
7072 "return x1;\n",
7073 167 * kPointerSize,
7074 1,
7075 159,
7076 {
7077 B(LdaConstant), U8(0), //
7078 B(Star), R(0), //
7079 B(LdaZero), //
7080 B(Star), R(1), //
7081 B(Ldar), R(0), //
7082 B(JumpIfUndefinedConstant), U8(3), //
7083 B(JumpIfNullConstant), U8(2), //
7084 B(ToObject), //
7085 B(JumpIfNullConstant), U8(1), //
7086 B(MovWide), R16(161), R16(124), //
7087 B(Star), R(124), //
7088 B(MovWide), R16(124), R16(161), //
7089 B(ForInPrepareWide), R16(162), //
7090 B(LdaZero), //
7091 B(MovWide), R16(165), R16(124), //
7092 B(Star), R(124), //
7093 B(MovWide), R16(124), R16(165), //
7094 B(MovWide), R16(165), R16(124), //
7095 B(MovWide), R16(164), R16(125), //
7096 B(ForInDone), R(124), R(125), //
7097 B(MovWide), R16(125), R16(164), //
7098 B(MovWide), R16(124), R16(165), //
7099 B(JumpIfToBooleanTrue), U8(89), //
7100 B(ForInNextWide), R16(161), R16(165), R16(162), //
7101 B(JumpIfUndefined), U8(54), //
7102 B(MovWide), R16(132), R16(124), //
7103 B(Star), R(124), //
7104 B(MovWide), R16(124), R16(132), //
7105 B(Ldar), R(1), //
7106 B(MovWide), R16(166), R16(124), //
7107 B(Star), R(124), //
7108 B(MovWide), R16(124), R16(166), //
7109 B(MovWide), R16(132), R16(124), //
7110 B(Ldar), R(124), //
7111 B(MovWide), R16(124), R16(132), //
7112 B(MovWide), R16(166), R16(124), //
7113 B(Add), R(124), //
7114 B(MovWide), R16(124), R16(166), //
7115 B(Star), R(1), //
7116 B(MovWide), R16(165), R16(124), //
7117 B(ForInStep), R(124), //
7118 B(MovWide), R16(124), R16(165), //
7119 B(MovWide), R16(165), R16(124), //
7120 B(Star), R(124), //
7121 B(MovWide), R16(124), R16(165), //
7122 B(Jump), U8(-110), //
7123 B(Ldar), R(1), //
7124 B(Return), //
7125 },
7126 4,
7127 {1234, 142, 145, 147}},
7128 {"x0 = %Add(x64, x63);\n"
7129 "x1 = %Add(x27, x143);\n"
7130 "%TheHole();\n"
7131 "return x1;\n",
7132 163 * kPointerSize,
7133 1,
7134 90,
7135 {
7136 B(Ldar), R(64), //
7137 B(MovWide), R16(161), R16(124), //
7138 B(Star), R(124), //
7139 B(MovWide), R16(124), R16(161), //
7140 B(Ldar), R(63), //
7141 B(MovWide), R16(162), R16(124), //
7142 B(Star), R(124), //
7143 B(MovWide), R16(124), R16(162), //
7144 B(CallRuntimeWide), U16(Runtime::kAdd), R16(161), U8(2), //
7145 B(Star), R(0), //
7146 B(Ldar), R(27), //
7147 B(MovWide), R16(161), R16(124), //
7148 B(Star), R(124), //
7149 B(MovWide), R16(124), R16(161), //
7150 B(MovWide), R16(147), R16(124), //
7151 B(Ldar), R(124), //
7152 B(MovWide), R16(124), R16(147), //
7153 B(MovWide), R16(162), R16(124), //
7154 B(Star), R(124), //
7155 B(MovWide), R16(124), R16(162), //
7156 B(CallRuntimeWide), U16(Runtime::kAdd), R16(161), U8(2), //
7157 B(Star), R(1), //
7158 B(CallRuntime), U16(Runtime::kTheHole), R(0), U8(0), //
7159 B(Ldar), R(1), //
7160 B(Return), //
7161 }}};
7162
7163 for (size_t i = 0; i < arraysize(snippets); ++i) {
7164 std::string body = prologue + snippets[i].code_snippet;
7165 Handle<BytecodeArray> bytecode_array =
7166 helper.MakeBytecodeForFunctionBody(body.c_str());
7167 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
7168 }
7169 }
7170
6903 } // namespace interpreter 7171 } // namespace interpreter
6904 } // namespace internal 7172 } // namespace internal
6905 } // namespace v8 7173 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698