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 5401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 |
OLD | NEW |