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

Unified Diff: test/unittests/interpreter/bytecode-array-builder-unittest.cc

Issue 1426913002: [Interpreter] Merges ToBoolean and JumpIfTrue/False bytecodes (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebased the patch and used the new Repeat_32 macro for tests Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/cctest/interpreter/test-interpreter.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 20c4e38a788d00c923428f406e7f68c711d686cf..7dc602b8273e01a493d5fb34c73c48e56dbe42b3 100644
--- a/test/unittests/interpreter/bytecode-array-builder-unittest.cc
+++ b/test/unittests/interpreter/bytecode-array-builder-unittest.cc
@@ -150,25 +150,40 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
builder.Bind(&start);
// Short jumps with Imm8 operands
builder.Jump(&start)
- .JumpIfTrue(&start)
- .JumpIfFalse(&start)
- .JumpIfToBooleanTrue(&start)
- .JumpIfToBooleanFalse(&start)
.JumpIfNull(&start)
.JumpIfUndefined(&start);
-
+ // Perform an operation that returns boolean value to
+ // generate JumpIfTrue/False
+ builder.CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
+ .JumpIfTrue(&start)
+ .CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
+ .JumpIfFalse(&start);
+ // Perform an operation that returns a non-boolean operation to
+ // generate JumpIfToBooleanTrue/False.
+ builder.BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .JumpIfTrue(&start)
+ .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .JumpIfFalse(&start);
// Insert dummy ops to force longer jumps
for (int i = 0; i < 128; i++) {
builder.LoadTrue();
}
// Longer jumps requiring Constant operand
builder.Jump(&start)
- .JumpIfTrue(&start)
- .JumpIfFalse(&start)
- .JumpIfToBooleanTrue(&start)
- .JumpIfToBooleanFalse(&start)
.JumpIfNull(&start)
.JumpIfUndefined(&start);
+ // Perform an operation that returns boolean value to
+ // generate JumpIfTrue/False
+ builder.CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
+ .JumpIfTrue(&start)
+ .CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
+ .JumpIfFalse(&start);
+ // Perform an operation that returns a non-boolean operation to
+ // generate JumpIfToBooleanTrue/False.
+ builder.BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .JumpIfTrue(&start)
+ .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .JumpIfFalse(&start);
builder.EnterBlock()
.Throw()
@@ -345,68 +360,115 @@ TEST_F(BytecodeArrayBuilderTest, ForwardJumps) {
BytecodeArrayBuilder builder(isolate(), zone());
builder.set_parameter_count(0);
- builder.set_locals_count(0);
+ builder.set_locals_count(1);
builder.set_context_count(0);
- BytecodeLabel far0, far1, far2;
- BytecodeLabel near0, near1, near2;
+ Register reg(0);
+ BytecodeLabel far0, far1, far2, far3, far4;
+ BytecodeLabel near0, near1, near2, near3, near4;
builder.Jump(&near0)
+ .CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
.JumpIfTrue(&near1)
+ .CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
.JumpIfFalse(&near2)
+ .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .JumpIfTrue(&near3)
+ .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .JumpIfFalse(&near4)
.Bind(&near0)
.Bind(&near1)
.Bind(&near2)
+ .Bind(&near3)
+ .Bind(&near4)
.Jump(&far0)
+ .CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
.JumpIfTrue(&far1)
- .JumpIfFalse(&far2);
- for (int i = 0; i < kFarJumpDistance - 6; i++) {
+ .CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
+ .JumpIfFalse(&far2)
+ .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .JumpIfTrue(&far3)
+ .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .JumpIfFalse(&far4);
+ for (int i = 0; i < kFarJumpDistance - 18; i++) {
builder.LoadUndefined();
}
- builder.Bind(&far0).Bind(&far1).Bind(&far2);
+ builder.Bind(&far0).Bind(&far1).Bind(&far2).Bind(&far3).Bind(&far4);
builder.Return();
Handle<BytecodeArray> array = builder.ToBytecodeArray();
- DCHECK_EQ(array->length(), 12 + kFarJumpDistance - 6 + 1);
+ DCHECK_EQ(array->length(), 36 + kFarJumpDistance - 18 + 1);
BytecodeArrayIterator iterator(array);
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump);
- CHECK_EQ(iterator.GetImmediateOperand(0), 6);
+ CHECK_EQ(iterator.GetImmediateOperand(0), 18);
+ iterator.Advance();
+
+ // Ignore compare operation.
iterator.Advance();
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfTrue);
- CHECK_EQ(iterator.GetImmediateOperand(0), 4);
+ CHECK_EQ(iterator.GetImmediateOperand(0), 14);
+ iterator.Advance();
+
+ // Ignore compare operation.
iterator.Advance();
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfFalse);
+ CHECK_EQ(iterator.GetImmediateOperand(0), 10);
+ iterator.Advance();
+
+ // Ignore add operation.
+ iterator.Advance();
+
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfToBooleanTrue);
+ CHECK_EQ(iterator.GetImmediateOperand(0), 6);
+ iterator.Advance();
+
+ // Ignore add operation.
+ iterator.Advance();
+
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfToBooleanFalse);
CHECK_EQ(iterator.GetImmediateOperand(0), 2);
iterator.Advance();
+
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpConstant);
CHECK_EQ(*iterator.GetConstantForIndexOperand(0),
Smi::FromInt(kFarJumpDistance));
- CHECK_EQ(
- array->get(iterator.current_offset() +
- Smi::cast(*iterator.GetConstantForIndexOperand(0))->value()),
- Bytecodes::ToByte(Bytecode::kReturn));
+ iterator.Advance();
+
+ // Ignore compare operation.
iterator.Advance();
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfTrueConstant);
CHECK_EQ(*iterator.GetConstantForIndexOperand(0),
- Smi::FromInt(kFarJumpDistance - 2));
- CHECK_EQ(
- array->get(iterator.current_offset() +
- Smi::cast(*iterator.GetConstantForIndexOperand(0))->value()),
- Bytecodes::ToByte(Bytecode::kReturn));
+ Smi::FromInt(kFarJumpDistance - 4));
+ iterator.Advance();
+
+ // Ignore compare operation.
iterator.Advance();
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfFalseConstant);
CHECK_EQ(*iterator.GetConstantForIndexOperand(0),
- Smi::FromInt(kFarJumpDistance - 4));
- CHECK_EQ(
- array->get(iterator.current_offset() +
- Smi::cast(*iterator.GetConstantForIndexOperand(0))->value()),
- Bytecodes::ToByte(Bytecode::kReturn));
+ Smi::FromInt(kFarJumpDistance - 8));
+ iterator.Advance();
+
+ // Ignore add operation.
+ iterator.Advance();
+
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfToBooleanTrueConstant);
+ CHECK_EQ(*iterator.GetConstantForIndexOperand(0),
+ Smi::FromInt(kFarJumpDistance - 12));
+ iterator.Advance();
+
+ // Ignore add operation.
+ iterator.Advance();
+
+ CHECK_EQ(iterator.current_bytecode(),
+ Bytecode::kJumpIfToBooleanFalseConstant);
+ CHECK_EQ(*iterator.GetConstantForIndexOperand(0),
+ Smi::FromInt(kFarJumpDistance - 16));
iterator.Advance();
}
@@ -414,21 +476,36 @@ TEST_F(BytecodeArrayBuilderTest, ForwardJumps) {
TEST_F(BytecodeArrayBuilderTest, BackwardJumps) {
BytecodeArrayBuilder builder(isolate(), zone());
builder.set_parameter_count(0);
- builder.set_locals_count(0);
+ builder.set_locals_count(1);
builder.set_context_count(0);
+ Register reg(0);
- BytecodeLabel label0, label1, label2;
+ BytecodeLabel label0, label1, label2, label3, label4;
builder.Bind(&label0)
.Jump(&label0)
+ .CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
.Bind(&label1)
.JumpIfTrue(&label1)
+ .CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
.Bind(&label2)
- .JumpIfFalse(&label2);
+ .JumpIfFalse(&label2)
+ .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .Bind(&label3)
+ .JumpIfTrue(&label3)
+ .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .Bind(&label4)
+ .JumpIfFalse(&label4);
for (int i = 0; i < 64; i++) {
- builder.Jump(&label2);
+ builder.Jump(&label4);
}
- builder.JumpIfFalse(&label2);
- builder.JumpIfTrue(&label1);
+ builder.BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .JumpIfFalse(&label4);
+ builder.BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
+ .JumpIfTrue(&label3);
+ builder.CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
+ .JumpIfFalse(&label2);
+ builder.CompareOperation(Token::Value::EQ, reg, Strength::WEAK)
+ .JumpIfTrue(&label1);
builder.Jump(&label0);
builder.Return();
@@ -437,25 +514,54 @@ TEST_F(BytecodeArrayBuilderTest, BackwardJumps) {
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump);
CHECK_EQ(iterator.GetImmediateOperand(0), 0);
iterator.Advance();
+ // Ignore compare operation.
+ iterator.Advance();
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfTrue);
CHECK_EQ(iterator.GetImmediateOperand(0), 0);
iterator.Advance();
+ // Ignore compare operation.
+ iterator.Advance();
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfFalse);
CHECK_EQ(iterator.GetImmediateOperand(0), 0);
iterator.Advance();
+ // Ignore binary operation.
+ iterator.Advance();
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfToBooleanTrue);
+ CHECK_EQ(iterator.GetImmediateOperand(0), 0);
+ iterator.Advance();
+ // Ignore binary operation.
+ iterator.Advance();
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfToBooleanFalse);
+ CHECK_EQ(iterator.GetImmediateOperand(0), 0);
+ iterator.Advance();
for (int i = 0; i < 64; i++) {
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump);
CHECK_EQ(iterator.GetImmediateOperand(0), -i * 2 - 2);
iterator.Advance();
}
+ // Ignore binary operation.
+ iterator.Advance();
+ CHECK_EQ(iterator.current_bytecode(),
+ Bytecode::kJumpIfToBooleanFalseConstant);
+ CHECK_EQ(Smi::cast(*iterator.GetConstantForIndexOperand(0))->value(), -132);
+ iterator.Advance();
+ // Ignore binary operation.
+ iterator.Advance();
+ CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfToBooleanTrueConstant);
+ CHECK_EQ(Smi::cast(*iterator.GetConstantForIndexOperand(0))->value(), -140);
+ iterator.Advance();
+ // Ignore compare operation.
+ iterator.Advance();
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfFalseConstant);
- CHECK_EQ(Smi::cast(*iterator.GetConstantForIndexOperand(0))->value(), -130);
+ CHECK_EQ(Smi::cast(*iterator.GetConstantForIndexOperand(0))->value(), -148);
+ iterator.Advance();
+ // Ignore compare operation.
iterator.Advance();
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpIfTrueConstant);
- CHECK_EQ(Smi::cast(*iterator.GetConstantForIndexOperand(0))->value(), -134);
+ CHECK_EQ(Smi::cast(*iterator.GetConstantForIndexOperand(0))->value(), -156);
iterator.Advance();
CHECK_EQ(iterator.current_bytecode(), Bytecode::kJumpConstant);
- CHECK_EQ(Smi::cast(*iterator.GetConstantForIndexOperand(0))->value(), -138);
+ CHECK_EQ(Smi::cast(*iterator.GetConstantForIndexOperand(0))->value(), -162);
iterator.Advance();
CHECK_EQ(iterator.current_bytecode(), Bytecode::kReturn);
iterator.Advance();
« no previous file with comments | « test/cctest/interpreter/test-interpreter.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698