Index: test/cctest/interpreter/test-bytecode-generator.cc |
diff --git a/test/cctest/interpreter/test-bytecode-generator.cc b/test/cctest/interpreter/test-bytecode-generator.cc |
index ead1fa1672bfb5c5b83295667419be7d003195d2..61b8c36b1f28478dead596ea5b9af2d727352666 100644 |
--- a/test/cctest/interpreter/test-bytecode-generator.cc |
+++ b/test/cctest/interpreter/test-bytecode-generator.cc |
@@ -1973,37 +1973,72 @@ TEST(BasicLoops) { |
BytecodeGeneratorHelper helper; |
ExpectedSnippet<int> snippets[] = { |
+ {"var x = 0;\n" |
+ "while (false) { x = 99; break; continue; }\n" |
+ "return x;", |
+ 1 * kPointerSize, |
+ 1, |
+ 4, |
+ { |
+ B(LdaZero), // |
+ B(Star), R(0), // |
+ B(Return) // |
+ }}, |
+ {"var x = 0;" |
+ "while (false) {" |
+ " x = x + 1;" |
+ "};" |
+ "return x;", |
+ 1 * kPointerSize, |
+ 1, |
+ 4, |
+ { |
+ B(LdaZero), // |
+ B(Star), R(0), // |
+ B(Return), // |
+ }, |
+ 0}, |
{"var x = 0;" |
"var y = 1;" |
"while (x < 10) {" |
" y = y * 12;" |
" x = x + 1;" |
+ " if (x == 3) continue;" |
+ " if (x == 4) break;" |
"}" |
"return y;", |
2 * kPointerSize, |
1, |
- 30, |
+ 46, |
{ |
B(LdaZero), // |
B(Star), R(0), // |
B(LdaSmi8), U8(1), // |
B(Star), R(1), // |
- B(Jump), U8(14), // |
+ B(LdaSmi8), U8(10), // |
+ B(TestLessThan), R(0), // |
+ B(JumpIfFalse), U8(32), // |
B(LdaSmi8), U8(12), // |
B(Mul), R(1), // |
B(Star), R(1), // |
B(LdaSmi8), U8(1), // |
B(Add), R(0), // |
B(Star), R(0), // |
- B(LdaSmi8), U8(10), // |
- B(TestLessThan), R(0), // |
- B(JumpIfTrue), U8(-16), // |
+ B(LdaSmi8), U8(3), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(-24), // |
+ B(LdaSmi8), U8(4), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(4), // |
+ B(Jump), U8(-34), // |
B(Ldar), R(1), // |
B(Return), // |
}, |
0}, |
{"var i = 0;" |
- "while(true) {" |
+ "while (true) {" |
" if (i < 0) continue;" |
" if (i == 3) break;" |
" if (i == 4) break;" |
@@ -2021,7 +2056,7 @@ TEST(BasicLoops) { |
B(LdaZero), // |
B(TestLessThan), R(0), // |
B(JumpIfFalse), U8(4), // |
- B(Jump), U8(40), // |
+ B(Jump), U8(-5), // |
B(LdaSmi8), U8(3), // |
B(TestEqual), R(0), // |
B(JumpIfFalse), U8(4), // |
@@ -2033,7 +2068,7 @@ TEST(BasicLoops) { |
B(LdaSmi8), U8(10), // |
B(TestEqual), R(0), // |
B(JumpIfFalse), U8(4), // |
- B(Jump), U8(16), // |
+ B(Jump), U8(-29), // |
B(LdaSmi8), U8(5), // |
B(TestEqual), R(0), // |
B(JumpIfFalse), U8(4), // |
@@ -2046,96 +2081,8 @@ TEST(BasicLoops) { |
B(Return), // |
}, |
0}, |
- {"var x = 0; var y = 1;" |
- "do {" |
- " y = y * 10;" |
- " if (x == 5) break;" |
- " if (x == 6) continue;" |
- " x = x + 1;" |
- "} while (x < 10);" |
- "return y;", |
- 2 * kPointerSize, |
- 1, |
- 44, |
- { |
- B(LdaZero), // |
- B(Star), R(0), // |
- B(LdaSmi8), U8(1), // |
- B(Star), R(1), // |
- B(LdaSmi8), U8(10), // |
- B(Mul), R(1), // |
- B(Star), R(1), // |
- B(LdaSmi8), U8(5), // |
- B(TestEqual), R(0), // |
- B(JumpIfFalse), U8(4), // |
- B(Jump), U8(22), // |
- B(LdaSmi8), U8(6), // |
- B(TestEqual), R(0), // |
- B(JumpIfFalse), U8(4), // |
- B(Jump), U8(8), // |
- B(LdaSmi8), U8(1), // |
- B(Add), R(0), // |
- B(Star), R(0), // |
- B(LdaSmi8), U8(10), // |
- B(TestLessThan), R(0), // |
- B(JumpIfTrue), U8(-32), // |
- B(Ldar), R(1), // |
- B(Return), // |
- }, |
- 0}, |
- {"var x = 0; " |
- "for(;;) {" |
- " if (x == 1) break;" |
- " x = x + 1;" |
- "}", |
- 1 * kPointerSize, |
- 1, |
- 21, |
- { |
- B(LdaZero), // |
- B(Star), R(0), // |
- B(LdaSmi8), U8(1), // |
- B(TestEqual), R(0), // |
- B(JumpIfFalse), U8(4), // |
- B(Jump), U8(10), // |
- B(LdaSmi8), U8(1), // |
- B(Add), R(0), // |
- B(Star), R(0), // |
- B(Jump), U8(-14), // |
- B(LdaUndefined), // |
- B(Return), // |
- }, |
- 0}, |
- {"var u = 0;" |
- "for(var i = 0; i < 100; i = i + 1) {" |
- " u = u + 1;" |
- " continue;" |
- "}", |
- 2 * kPointerSize, |
- 1, |
- 30, |
- { |
- B(LdaZero), // |
- B(Star), R(0), // |
- B(LdaZero), // |
- B(Star), R(1), // |
- B(Jump), U8(16), // |
- B(LdaSmi8), U8(1), // |
- B(Add), R(0), // |
- B(Star), R(0), // |
- B(Jump), U8(2), // |
- B(LdaSmi8), U8(1), // |
- B(Add), R(1), // |
- B(Star), R(1), // |
- B(LdaSmi8), U8(100), // |
- B(TestLessThan), R(1), // |
- B(JumpIfTrue), U8(-18), // |
- B(LdaUndefined), // |
- B(Return), // |
- }, |
- 0}, |
{"var i = 0;" |
- "while(true) {" |
+ "while (true) {" |
" while (i < 3) {" |
" if (i == 2) break;" |
" i = i + 1;" |
@@ -2150,17 +2097,17 @@ TEST(BasicLoops) { |
{ |
B(LdaZero), // |
B(Star), R(0), // |
- B(Jump), U8(16), // |
+ B(LdaSmi8), U8(3), // |
+ B(TestLessThan), R(0), // |
+ B(JumpIfFalse), U8(18), // |
B(LdaSmi8), U8(2), // |
B(TestEqual), R(0), // |
B(JumpIfFalse), U8(4), // |
- B(Jump), U8(14), // |
+ B(Jump), U8(10), // |
B(LdaSmi8), U8(1), // |
B(Add), R(0), // |
B(Star), R(0), // |
- B(LdaSmi8), U8(3), // |
- B(TestLessThan), R(0), // |
- B(JumpIfTrue), U8(-18), // |
+ B(Jump), U8(-20), // |
B(LdaSmi8), U8(1), // |
B(Add), R(0), // |
B(Star), R(0), // |
@@ -2185,25 +2132,62 @@ TEST(BasicLoops) { |
B(Star), R(0), // |
B(LdaSmi8), U8(1), // |
B(Star), R(1), // |
- B(Jump), U8(14), // |
+ B(Ldar), R(0), // |
+ B(JumpIfToBooleanFalse), U8(16), // |
B(LdaSmi8), U8(12), // |
B(Mul), R(1), // |
B(Star), R(1), // |
B(LdaSmi8), U8(1), // |
B(Sub), R(0), // |
B(Star), R(0), // |
- B(Ldar), R(0), // |
- B(JumpIfToBooleanTrue), U8(-14), // |
+ B(Jump), U8(-16), // |
B(Ldar), R(1), // |
B(Return), // |
- }, |
+ }, |
+ 0}, |
+ {"var x = 0; var y = 1;" |
+ "do {" |
+ " y = y * 10;" |
+ " if (x == 5) break;" |
+ " if (x == 6) continue;" |
+ " x = x + 1;" |
+ "} while (x < 10);" |
+ "return y;", |
+ 2 * kPointerSize, |
+ 1, |
+ 44, |
+ { |
+ B(LdaZero), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(10), // |
+ B(Mul), R(1), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(5), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(22), // |
+ B(LdaSmi8), U8(6), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(8), // |
+ B(LdaSmi8), U8(1), // |
+ B(Add), R(0), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(10), // |
+ B(TestLessThan), R(0), // |
+ B(JumpIfTrue), U8(-32), // |
+ B(Ldar), R(1), // |
+ B(Return), // |
+ }, |
0}, |
{"var x = 10;" |
"var y = 1;" |
"do {" |
" y = y * 12;" |
" x = x - 1;" |
- "} while(x);" |
+ "} while (x);" |
"return y;", |
2 * kPointerSize, |
1, |
@@ -2225,33 +2209,6 @@ TEST(BasicLoops) { |
B(Return), // |
}, |
0}, |
- {"var y = 1;" |
- "for (var x = 10; x; --x) {" |
- " y = y * 12;" |
- "}" |
- "return y;", |
- 2 * kPointerSize, |
- 1, |
- 29, |
- { |
- B(LdaSmi8), U8(1), // |
- B(Star), R(0), // |
- B(LdaSmi8), U8(10), // |
- B(Star), R(1), // |
- B(Jump), U8(14), // |
- B(LdaSmi8), U8(12), // |
- B(Mul), R(0), // |
- B(Star), R(0), // |
- B(Ldar), R(1), // |
- B(ToNumber), // |
- B(Dec), // |
- B(Star), R(1), // |
- B(Ldar), R(1), // |
- B(JumpIfToBooleanTrue), U8(-14), // |
- B(Ldar), R(0), // |
- B(Return), // |
- }, |
- 0}, |
{"var x = 0; var y = 1;" |
"do {" |
" y = y * 10;" |
@@ -2315,28 +2272,177 @@ TEST(BasicLoops) { |
B(LdaSmi8), U8(6), // |
B(TestEqual), R(0), // |
B(JumpIfFalse), U8(4), // |
- B(Jump), U8(2), // |
+ B(Jump), U8(-26), // |
B(Jump), U8(-28), // |
B(Ldar), R(1), // |
B(Return), // |
}, |
0}, |
- {"var x = 0;" |
- "while(false) {" |
+ {"var x = 0; " |
+ "for (;;) {" |
+ " if (x == 1) break;" |
+ " if (x == 2) continue;" |
" x = x + 1;" |
- "};" |
- "return x;", |
+ "}", |
1 * kPointerSize, |
1, |
- 4, |
+ 29, |
{ |
- B(LdaZero), // |
- B(Star), R(0), // |
- B(Return), // |
+ B(LdaZero), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(1), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(18), // |
+ B(LdaSmi8), U8(2), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(-14), // |
+ B(LdaSmi8), U8(1), // |
+ B(Add), R(0), // |
+ B(Star), R(0), // |
+ B(Jump), U8(-22), // |
+ B(LdaUndefined), // |
+ B(Return), // |
+ }, |
+ 0}, |
+ {"for (var x = 0;;) {" |
+ " if (x == 1) break;" |
+ " if (x == 2) continue;" |
+ " x = x + 1;" |
+ "}", |
+ 1 * kPointerSize, |
+ 1, |
+ 29, |
+ { |
+ B(LdaZero), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(1), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(18), // |
+ B(LdaSmi8), U8(2), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(-14), // |
+ B(LdaSmi8), U8(1), // |
+ B(Add), R(0), // |
+ B(Star), R(0), // |
+ B(Jump), U8(-22), // |
+ B(LdaUndefined), // |
+ B(Return), // |
+ }, |
+ 0}, |
+ {"var x = 0; " |
+ "for (;; x = x + 1) {" |
+ " if (x == 1) break;" |
+ " if (x == 2) continue;" |
+ "}", |
+ 1 * kPointerSize, |
+ 1, |
+ 29, |
+ { |
+ B(LdaZero), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(1), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(18), // |
+ B(LdaSmi8), U8(2), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(2), // |
+ B(LdaSmi8), U8(1), // |
+ B(Add), R(0), // |
+ B(Star), R(0), // |
+ B(Jump), U8(-22), // |
+ B(LdaUndefined), // |
+ B(Return), // |
+ }, |
+ 0}, |
+ {"for (var x = 0;; x = x + 1) {" |
+ " if (x == 1) break;" |
+ " if (x == 2) continue;" |
+ "}", |
+ 1 * kPointerSize, |
+ 1, |
+ 29, |
+ { |
+ B(LdaZero), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(1), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(18), // |
+ B(LdaSmi8), U8(2), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(2), // |
+ B(LdaSmi8), U8(1), // |
+ B(Add), R(0), // |
+ B(Star), R(0), // |
+ B(Jump), U8(-22), // |
+ B(LdaUndefined), // |
+ B(Return), // |
+ }, |
+ 0}, |
+ {"var u = 0;" |
+ "for (var i = 0; i < 100; i = i + 1) {" |
+ " u = u + 1;" |
+ " continue;" |
+ "}", |
+ 2 * kPointerSize, |
+ 1, |
+ 30, |
+ { |
+ B(LdaZero), // |
+ B(Star), R(0), // |
+ B(LdaZero), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(100), // |
+ B(TestLessThan), R(1), // |
+ B(JumpIfFalse), U8(18), // |
+ B(LdaSmi8), U8(1), // |
+ B(Add), R(0), // |
+ B(Star), R(0), // |
+ B(Jump), U8(2), // |
+ B(LdaSmi8), U8(1), // |
+ B(Add), R(1), // |
+ B(Star), R(1), // |
+ B(Jump), U8(-20), // |
+ B(LdaUndefined), // |
+ B(Return), // |
+ }, |
+ 0}, |
+ {"var y = 1;" |
+ "for (var x = 10; x; --x) {" |
+ " y = y * 12;" |
+ "}" |
+ "return y;", |
+ 2 * kPointerSize, |
+ 1, |
+ 29, |
+ { |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(10), // |
+ B(Star), R(1), // |
+ B(Ldar), R(1), // |
+ B(JumpIfToBooleanFalse), U8(16), // |
+ B(LdaSmi8), U8(12), // |
+ B(Mul), R(0), // |
+ B(Star), R(0), // |
+ B(Ldar), R(1), // |
+ B(ToNumber), // |
+ B(Dec), // |
+ B(Star), R(1), // |
+ B(Jump), U8(-16), // |
+ B(Ldar), R(0), // |
+ B(Return), // |
}, |
0}, |
{"var x = 0;" |
- "for( var i = 0; false; i++) {" |
+ "for (var i = 0; false; i++) {" |
" x = x + 1;" |
"};" |
"return x;", |
@@ -2353,7 +2459,7 @@ TEST(BasicLoops) { |
}, |
0}, |
{"var x = 0;" |
- "for( var i = 0; true; ++i) {" |
+ "for (var i = 0; true; ++i) {" |
" x = x + 1;" |
" if (x == 20) break;" |
"};" |
@@ -2408,14 +2514,14 @@ TEST(UnaryOperators) { |
{ |
B(LdaZero), // |
B(Star), R(0), // |
- B(Jump), U8(8), // |
- B(LdaSmi8), U8(10), // |
- B(Add), R(0), // |
- B(Star), R(0), // |
B(LdaSmi8), U8(10), // |
B(TestEqual), R(0), // |
B(LogicalNot), // |
- B(JumpIfTrue), U8(-11), // |
+ B(JumpIfFalse), U8(10), // |
+ B(LdaSmi8), U8(10), // |
+ B(Add), R(0), // |
+ B(Star), R(0), // |
+ B(Jump), U8(-13), // |
B(Ldar), R(0), // |
B(Return), // |
}, |
@@ -5246,29 +5352,27 @@ TEST(RemoveRedundantLdar) { |
BytecodeGeneratorHelper helper; |
ExpectedSnippet<int> snippets[] = { |
- {"var ld_a = 1;\n" // This test is to check Ldar does not |
- "while(true) {\n" // get removed if the preceding Star is |
- " ld_a = ld_a + ld_a;\n" // in a different basicblock. |
+ {"var ld_a = 1;\n" // This test is to check Ldar does not |
+ "while(true) {\n" // get removed if the preceding Star is |
+ " ld_a = ld_a + ld_a;\n" // in a different basicblock. |
" if (ld_a > 10) break;\n" |
"}\n" |
"return ld_a;", |
1 * kPointerSize, |
1, |
23, |
- { |
- B(LdaSmi8), U8(1), // |
- B(Star), R(0), // |
- B(Ldar), R(0), // This load should not be removed as it |
- B(Add), R(0), // is the target of the branch. |
- B(Star), R(0), // |
- B(LdaSmi8), U8(10), // |
- B(TestGreaterThan), R(0), // |
- B(JumpIfFalse), U8(4), // |
- B(Jump), U8(4), // |
- B(Jump), U8(-14), // |
- B(Ldar), R(0), // |
- B(Return) |
- }}, |
+ {B(LdaSmi8), U8(1), // |
+ B(Star), R(0), // |
+ B(Ldar), R(0), // This load should not be removed as it |
+ B(Add), R(0), // is the target of the branch. |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(10), // |
+ B(TestGreaterThan), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(4), // |
+ B(Jump), U8(-14), // |
+ B(Ldar), R(0), // |
+ B(Return)}}, |
{"var ld_a = 1;\n" |
"do {\n" |
" ld_a = ld_a + ld_a;\n" |
@@ -5277,18 +5381,30 @@ TEST(RemoveRedundantLdar) { |
"return ld_a;", |
1 * kPointerSize, |
1, |
- 19, |
+ 21, |
+ {B(LdaSmi8), U8(1), // |
+ B(Star), R(0), // |
+ B(Ldar), R(0), // |
+ B(Add), R(0), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(10), // |
+ B(TestGreaterThan), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(Jump), U8(2), // |
+ B(Ldar), R(0), // |
+ B(Return)}}, |
+ {"var ld_a = 1;\n" |
+ " ld_a = ld_a + ld_a;\n" |
+ " return ld_a;", |
+ 1 * kPointerSize, |
+ 1, |
+ 9, |
{ |
- B(LdaSmi8), U8(1), // |
- B(Star), R(0), // |
- B(Add), R(0), // |
- B(Star), R(0), // |
- B(LdaSmi8), U8(10), // |
- B(TestGreaterThan), R(0), // |
- B(JumpIfFalse), U8(4), // |
- B(Jump), U8(2), // |
- B(Ldar), R(0), // |
- B(Return) |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(0), // |
+ B(Add), R(0), // |
+ B(Star), R(0), // |
+ B(Return) // |
}}, |
}; |