Index: test/unittests/interpreter/bytecode-array-builder-unittest.cc |
diff --git a/test/unittests/interpreter/bytecode-array-builder-unittest.cc b/test/unittests/interpreter/bytecode-array-builder-unittest.cc |
index ce55ab99a3aabb48680b3f5b8e842aa234d0cc5e..d32a75245ebfeacac236073799e0027766d34e4f 100644 |
--- a/test/unittests/interpreter/bytecode-array-builder-unittest.cc |
+++ b/test/unittests/interpreter/bytecode-array-builder-unittest.cc |
@@ -190,17 +190,19 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) { |
.ConvertAccumulatorToObject(reg) |
.ConvertAccumulatorToName(reg); |
- // Emit control flow. Return must be the last instruction. |
- BytecodeLabel start; |
- builder.Bind(&start); |
+ // Short jumps with Imm8 operands |
{ |
- // Short jumps with Imm8 operands |
- BytecodeLabel after_jump; |
- builder.Jump(&start) |
- .Bind(&after_jump) |
- .JumpIfNull(&start) |
- .JumpIfUndefined(&start) |
- .JumpIfNotHole(&start); |
+ BytecodeLabel start, after_jump1, after_jump2, after_jump3, after_jump4; |
+ builder.Bind(&start) |
+ .Jump(&after_jump1) |
+ .Bind(&after_jump1) |
+ .JumpIfNull(&after_jump2) |
+ .Bind(&after_jump2) |
+ .JumpIfUndefined(&after_jump3) |
+ .Bind(&after_jump3) |
+ .JumpIfNotHole(&after_jump4) |
+ .Bind(&after_jump4) |
+ .JumpLoop(&start, 0); |
} |
// Longer jumps with constant operands |
@@ -224,48 +226,31 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) { |
// Perform an operation that returns boolean value to |
// generate JumpIfTrue/False |
- builder.CompareOperation(Token::Value::EQ, reg, 1) |
- .JumpIfTrue(&start) |
- .CompareOperation(Token::Value::EQ, reg, 2) |
- .JumpIfFalse(&start); |
- // Perform an operation that returns a non-boolean operation to |
- // generate JumpIfToBooleanTrue/False. |
- builder.BinaryOperation(Token::Value::ADD, reg, 1) |
- .JumpIfTrue(&start) |
- .BinaryOperation(Token::Value::ADD, reg, 2) |
- .JumpIfFalse(&start); |
- // Insert dummy ops to force longer jumps |
- for (int i = 0; i < 128; i++) { |
- builder.LoadTrue(); |
- } |
- // Longer jumps requiring Constant operand |
{ |
- BytecodeLabel after_jump; |
- builder.Jump(&start) |
- .Bind(&after_jump) |
- .JumpIfNull(&start) |
- .JumpIfUndefined(&start) |
- .JumpIfNotHole(&start); |
- // Perform an operation that returns boolean value to |
- // generate JumpIfTrue/False |
+ BytecodeLabel after_jump1, after_jump2; |
builder.CompareOperation(Token::Value::EQ, reg, 1) |
- .JumpIfTrue(&start) |
+ .JumpIfTrue(&after_jump1) |
+ .Bind(&after_jump1) |
.CompareOperation(Token::Value::EQ, reg, 2) |
- .JumpIfFalse(&start); |
- // Perform an operation that returns a non-boolean operation to |
- // generate JumpIfToBooleanTrue/False. |
+ .JumpIfFalse(&after_jump2) |
+ .Bind(&after_jump2); |
+ } |
+ |
+ // Perform an operation that returns a non-boolean operation to |
+ // generate JumpIfToBooleanTrue/False. |
+ { |
+ BytecodeLabel after_jump1, after_jump2; |
builder.BinaryOperation(Token::Value::ADD, reg, 1) |
- .JumpIfTrue(&start) |
+ .JumpIfTrue(&after_jump1) |
+ .Bind(&after_jump1) |
.BinaryOperation(Token::Value::ADD, reg, 2) |
- .JumpIfFalse(&start); |
+ .JumpIfFalse(&after_jump2) |
+ .Bind(&after_jump2); |
} |
// Emit stack check bytecode. |
builder.StackCheck(0); |
- // Emit an OSR poll bytecode. |
- builder.OsrPoll(1); |
- |
// Emit throw and re-throw in it's own basic block so that the rest of the |
// code isn't omitted due to being dead. |
BytecodeLabel after_throw; |
@@ -339,30 +324,6 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) { |
.CreateArrayLiteral(factory->NewFixedArray(2), 0, 0) |
.CreateObjectLiteral(factory->NewFixedArray(2), 0, 0, reg); |
- // Longer jumps requiring ConstantWide operand |
- { |
- BytecodeLabel after_jump; |
- builder.Jump(&start) |
- .Bind(&after_jump) |
- .JumpIfNull(&start) |
- .JumpIfUndefined(&start) |
- .JumpIfNotHole(&start); |
- } |
- |
- // Perform an operation that returns boolean value to |
- // generate JumpIfTrue/False |
- builder.CompareOperation(Token::Value::EQ, reg, 1) |
- .JumpIfTrue(&start) |
- .CompareOperation(Token::Value::EQ, reg, 2) |
- .JumpIfFalse(&start); |
- |
- // Perform an operation that returns a non-boolean operation to |
- // generate JumpIfToBooleanTrue/False. |
- builder.BinaryOperation(Token::Value::ADD, reg, 1) |
- .JumpIfTrue(&start) |
- .BinaryOperation(Token::Value::ADD, reg, 2) |
- .JumpIfFalse(&start); |
- |
// Emit generator operations |
builder.SuspendGenerator(reg) |
.ResumeGenerator(reg); |
@@ -371,10 +332,20 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) { |
builder.CallRuntime(Runtime::kInlineIsArray, reg, 1) |
.CallRuntime(Runtime::kInlineIsArray, wide, 1); |
+ // Emit debugger bytecode. |
builder.Debugger(); |
+ |
+ // Insert dummy ops to force longer jumps. |
+ for (int i = 0; i < 128; i++) { |
+ builder.LoadTrue(); |
+ } |
+ |
+ // Bind labels for long jumps at the very end. |
for (size_t i = 0; i < arraysize(end); i++) { |
builder.Bind(&end[i]); |
} |
+ |
+ // Return must be the last instruction. |
builder.Return(); |
// Generate BytecodeArray. |
@@ -679,24 +650,11 @@ TEST_F(BytecodeArrayBuilderTest, BackwardJumps) { |
Register reg(0); |
- BytecodeLabel label0, label1, label2, label3, label4; |
- builder.Bind(&label0) |
- .Jump(&label0) |
- .Bind(&label1) |
- .CompareOperation(Token::Value::EQ, reg, 1) |
- .JumpIfTrue(&label1) |
- .Bind(&label2) |
- .CompareOperation(Token::Value::EQ, reg, 2) |
- .JumpIfFalse(&label2) |
- .Bind(&label3) |
- .BinaryOperation(Token::Value::ADD, reg, 1) |
- .JumpIfTrue(&label3) |
- .Bind(&label4) |
- .BinaryOperation(Token::Value::ADD, reg, 2) |
- .JumpIfFalse(&label4); |
- for (int i = 0; i < 62; i++) { |
+ BytecodeLabel label0; |
+ builder.Bind(&label0).JumpLoop(&label0, 0); |
+ for (int i = 0; i < 42; i++) { |
BytecodeLabel after_jump; |
- builder.Jump(&label4).Bind(&after_jump); |
+ builder.JumpLoop(&label0, 0).Bind(&after_jump); |
} |
// Add padding to force wide backwards jumps. |
@@ -704,51 +662,21 @@ TEST_F(BytecodeArrayBuilderTest, BackwardJumps) { |
builder.Debugger(); |
} |
- builder.BinaryOperation(Token::Value::ADD, reg, 1).JumpIfFalse(&label4); |
- builder.BinaryOperation(Token::Value::ADD, reg, 2).JumpIfTrue(&label3); |
- builder.CompareOperation(Token::Value::EQ, reg, 1).JumpIfFalse(&label2); |
- builder.CompareOperation(Token::Value::EQ, reg, 2).JumpIfTrue(&label1); |
- builder.Jump(&label0); |
+ builder.JumpLoop(&label0, 0); |
BytecodeLabel end; |
builder.Bind(&end); |
builder.Return(); |
Handle<BytecodeArray> array = builder.ToBytecodeArray(isolate()); |
BytecodeArrayIterator iterator(array); |
- CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpLoop); |
CHECK_EQ(iterator.GetImmediateOperand(0), 0); |
iterator.Advance(); |
- // Ignore compare operation. |
- iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), |
- PeepholeToBoolean(Bytecode::kJumpIfToBooleanTrue)); |
- CHECK_EQ(iterator.current_operand_scale(), OperandScale::kSingle); |
- CHECK_EQ(iterator.GetImmediateOperand(0), -3); |
- iterator.Advance(); |
- // Ignore compare operation. |
- iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), |
- PeepholeToBoolean(Bytecode::kJumpIfToBooleanFalse)); |
- CHECK_EQ(iterator.current_operand_scale(), OperandScale::kSingle); |
- CHECK_EQ(iterator.GetImmediateOperand(0), -3); |
- iterator.Advance(); |
- // Ignore binary operation. |
- iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfToBooleanTrue); |
- CHECK_EQ(iterator.current_operand_scale(), OperandScale::kSingle); |
- CHECK_EQ(iterator.GetImmediateOperand(0), -3); |
- iterator.Advance(); |
- // Ignore binary operation. |
- iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfToBooleanFalse); |
- CHECK_EQ(iterator.current_operand_scale(), OperandScale::kSingle); |
- CHECK_EQ(iterator.GetImmediateOperand(0), -3); |
- iterator.Advance(); |
- for (int i = 0; i < 62; i++) { |
- CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
+ for (int i = 0; i < 42; i++) { |
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpLoop); |
CHECK_EQ(iterator.current_operand_scale(), OperandScale::kSingle); |
- // offset of 5 (3 for binary operation and 2 for jump) |
- CHECK_EQ(iterator.GetImmediateOperand(0), -i * 2 - 5); |
+ // offset of 3 (because kJumpLoop takes two immediate operands) |
+ CHECK_EQ(iterator.GetImmediateOperand(0), -i * 3 - 3); |
iterator.Advance(); |
} |
// Check padding to force wide backwards jumps. |
@@ -756,35 +684,9 @@ TEST_F(BytecodeArrayBuilderTest, BackwardJumps) { |
CHECK_EQ(iterator.current_bytecode(), Bytecode::kDebugger); |
iterator.Advance(); |
} |
- // Ignore binary operation. |
- iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfToBooleanFalse); |
- CHECK_EQ(iterator.current_operand_scale(), OperandScale::kDouble); |
- CHECK_EQ(iterator.GetImmediateOperand(0), -389); |
- iterator.Advance(); |
- // Ignore binary operation. |
- iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfToBooleanTrue); |
- CHECK_EQ(iterator.current_operand_scale(), OperandScale::kDouble); |
- CHECK_EQ(iterator.GetImmediateOperand(0), -401); |
- iterator.Advance(); |
- // Ignore compare operation. |
- iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), |
- PeepholeToBoolean(Bytecode::kJumpIfToBooleanFalse)); |
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpLoop); |
CHECK_EQ(iterator.current_operand_scale(), OperandScale::kDouble); |
- CHECK_EQ(iterator.GetImmediateOperand(0), -413); |
- iterator.Advance(); |
- // Ignore compare operation. |
- iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), |
- PeepholeToBoolean(Bytecode::kJumpIfToBooleanTrue)); |
- CHECK_EQ(iterator.current_operand_scale(), OperandScale::kDouble); |
- CHECK_EQ(iterator.GetImmediateOperand(0), -425); |
- iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
- CHECK_EQ(iterator.current_operand_scale(), OperandScale::kDouble); |
- CHECK_EQ(iterator.GetImmediateOperand(0), -431); |
+ CHECK_EQ(iterator.GetImmediateOperand(0), -386); |
iterator.Advance(); |
CHECK_EQ(iterator.current_bytecode(), Bytecode::kReturn); |
iterator.Advance(); |
@@ -802,9 +704,9 @@ TEST_F(BytecodeArrayBuilderTest, LabelReuse) { |
builder.Jump(&label) |
.Bind(&label) |
- .Jump(&label) |
+ .JumpLoop(&label, 0) |
.Bind(&after_jump0) |
- .Jump(&label) |
+ .JumpLoop(&label, 0) |
.Bind(&after_jump1) |
.Return(); |
@@ -813,11 +715,11 @@ TEST_F(BytecodeArrayBuilderTest, LabelReuse) { |
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
CHECK_EQ(iterator.GetImmediateOperand(0), 2); |
iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpLoop); |
CHECK_EQ(iterator.GetImmediateOperand(0), 0); |
iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
- CHECK_EQ(iterator.GetImmediateOperand(0), -2); |
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpLoop); |
+ CHECK_EQ(iterator.GetImmediateOperand(0), -3); |
iterator.Advance(); |
CHECK_EQ(iterator.current_bytecode(), Bytecode::kReturn); |
iterator.Advance(); |
@@ -834,9 +736,9 @@ TEST_F(BytecodeArrayBuilderTest, LabelAddressReuse) { |
BytecodeLabel label, after_jump0, after_jump1; |
builder.Jump(&label) |
.Bind(&label) |
- .Jump(&label) |
+ .JumpLoop(&label, 0) |
.Bind(&after_jump0) |
- .Jump(&label) |
+ .JumpLoop(&label, 0) |
.Bind(&after_jump1); |
} |
builder.Return(); |
@@ -847,11 +749,11 @@ TEST_F(BytecodeArrayBuilderTest, LabelAddressReuse) { |
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
CHECK_EQ(iterator.GetImmediateOperand(0), 2); |
iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpLoop); |
CHECK_EQ(iterator.GetImmediateOperand(0), 0); |
iterator.Advance(); |
- CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
- CHECK_EQ(iterator.GetImmediateOperand(0), -2); |
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpLoop); |
+ CHECK_EQ(iterator.GetImmediateOperand(0), -3); |
iterator.Advance(); |
} |
CHECK_EQ(iterator.current_bytecode(), Bytecode::kReturn); |