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

Unified Diff: src/interpreter/interpreter.cc

Issue 2151163002: [stubs] Improve code generation for ToBoolean. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE. Fix redness. Created 4 years, 5 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 | « src/interpreter/interpreter.h ('k') | src/objects.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/interpreter/interpreter.cc
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc
index 47a985729ed6ac0578f2786a62932f8b895717fc..4830f1dc72efa1f90dfece7c047bee278d960916 100644
--- a/src/interpreter/interpreter.cc
+++ b/src/interpreter/interpreter.cc
@@ -1052,19 +1052,18 @@ void Interpreter::DoDec(InterpreterAssembler* assembler) {
DoUnaryOp<DecStub>(assembler);
}
-Node* Interpreter::BuildToBoolean(Node* value,
- InterpreterAssembler* assembler) {
- Node* context = __ GetContext();
- return ToBooleanStub::Generate(assembler, value, context);
-}
-
-Node* Interpreter::BuildLogicalNot(Node* value,
- InterpreterAssembler* assembler) {
+// LogicalNot
+//
+// Perform logical-not on the accumulator, first casting the
+// accumulator to a boolean value if required.
+// ToBooleanLogicalNot
+void Interpreter::DoToBooleanLogicalNot(InterpreterAssembler* assembler) {
+ Node* value = __ GetAccumulator();
Variable result(assembler, MachineRepresentation::kTagged);
Label if_true(assembler), if_false(assembler), end(assembler);
Node* true_value = __ BooleanConstant(true);
Node* false_value = __ BooleanConstant(false);
- __ BranchIfWordEqual(value, true_value, &if_true, &if_false);
+ __ BranchIfToBooleanIsTrue(value, &if_true, &if_false);
__ Bind(&if_true);
{
result.Bind(false_value);
@@ -1072,27 +1071,11 @@ Node* Interpreter::BuildLogicalNot(Node* value,
}
__ Bind(&if_false);
{
- if (FLAG_debug_code) {
- __ AbortIfWordNotEqual(value, false_value,
- BailoutReason::kExpectedBooleanValue);
- }
result.Bind(true_value);
__ Goto(&end);
}
__ Bind(&end);
- return result.value();
-}
-
-// LogicalNot
-//
-// Perform logical-not on the accumulator, first casting the
-// accumulator to a boolean value if required.
-// ToBooleanLogicalNot
-void Interpreter::DoToBooleanLogicalNot(InterpreterAssembler* assembler) {
- Node* value = __ GetAccumulator();
- Node* to_boolean_value = BuildToBoolean(value, assembler);
- Node* result = BuildLogicalNot(to_boolean_value, assembler);
- __ SetAccumulator(result);
+ __ SetAccumulator(result.value());
__ Dispatch();
}
@@ -1102,8 +1085,27 @@ void Interpreter::DoToBooleanLogicalNot(InterpreterAssembler* assembler) {
// value.
void Interpreter::DoLogicalNot(InterpreterAssembler* assembler) {
Node* value = __ GetAccumulator();
- Node* result = BuildLogicalNot(value, assembler);
- __ SetAccumulator(result);
+ Variable result(assembler, MachineRepresentation::kTagged);
+ Label if_true(assembler), if_false(assembler), end(assembler);
+ Node* true_value = __ BooleanConstant(true);
+ Node* false_value = __ BooleanConstant(false);
+ __ BranchIfWordEqual(value, true_value, &if_true, &if_false);
+ __ Bind(&if_true);
+ {
+ result.Bind(false_value);
+ __ Goto(&end);
+ }
+ __ Bind(&if_false);
+ {
+ if (FLAG_debug_code) {
+ __ AbortIfWordNotEqual(value, false_value,
+ BailoutReason::kExpectedBooleanValue);
+ }
+ result.Bind(true_value);
+ __ Goto(&end);
+ }
+ __ Bind(&end);
+ __ SetAccumulator(result.value());
__ Dispatch();
}
@@ -1438,11 +1440,14 @@ void Interpreter::DoJumpIfFalseConstant(InterpreterAssembler* assembler) {
// Jump by number of bytes represented by an immediate operand if the object
// referenced by the accumulator is true when the object is cast to boolean.
void Interpreter::DoJumpIfToBooleanTrue(InterpreterAssembler* assembler) {
- Node* accumulator = __ GetAccumulator();
- Node* to_boolean_value = BuildToBoolean(accumulator, assembler);
+ Node* value = __ GetAccumulator();
Node* relative_jump = __ BytecodeOperandImm(0);
- Node* true_value = __ BooleanConstant(true);
- __ JumpIfWordEqual(to_boolean_value, true_value, relative_jump);
+ Label if_true(assembler), if_false(assembler);
+ __ BranchIfToBooleanIsTrue(value, &if_true, &if_false);
+ __ Bind(&if_true);
+ __ Jump(relative_jump);
+ __ Bind(&if_false);
+ __ Dispatch();
}
// JumpIfToBooleanTrueConstant <idx>
@@ -1452,13 +1457,16 @@ void Interpreter::DoJumpIfToBooleanTrue(InterpreterAssembler* assembler) {
// to boolean.
void Interpreter::DoJumpIfToBooleanTrueConstant(
InterpreterAssembler* assembler) {
- Node* accumulator = __ GetAccumulator();
- Node* to_boolean_value = BuildToBoolean(accumulator, assembler);
+ Node* value = __ GetAccumulator();
Node* index = __ BytecodeOperandIdx(0);
Node* constant = __ LoadConstantPoolEntry(index);
Node* relative_jump = __ SmiUntag(constant);
- Node* true_value = __ BooleanConstant(true);
- __ JumpIfWordEqual(to_boolean_value, true_value, relative_jump);
+ Label if_true(assembler), if_false(assembler);
+ __ BranchIfToBooleanIsTrue(value, &if_true, &if_false);
+ __ Bind(&if_true);
+ __ Jump(relative_jump);
+ __ Bind(&if_false);
+ __ Dispatch();
}
// JumpIfToBooleanFalse <imm>
@@ -1466,11 +1474,14 @@ void Interpreter::DoJumpIfToBooleanTrueConstant(
// Jump by number of bytes represented by an immediate operand if the object
// referenced by the accumulator is false when the object is cast to boolean.
void Interpreter::DoJumpIfToBooleanFalse(InterpreterAssembler* assembler) {
- Node* accumulator = __ GetAccumulator();
- Node* to_boolean_value = BuildToBoolean(accumulator, assembler);
+ Node* value = __ GetAccumulator();
Node* relative_jump = __ BytecodeOperandImm(0);
- Node* false_value = __ BooleanConstant(false);
- __ JumpIfWordEqual(to_boolean_value, false_value, relative_jump);
+ Label if_true(assembler), if_false(assembler);
+ __ BranchIfToBooleanIsTrue(value, &if_true, &if_false);
+ __ Bind(&if_true);
+ __ Dispatch();
+ __ Bind(&if_false);
+ __ Jump(relative_jump);
}
// JumpIfToBooleanFalseConstant <idx>
@@ -1480,13 +1491,16 @@ void Interpreter::DoJumpIfToBooleanFalse(InterpreterAssembler* assembler) {
// to boolean.
void Interpreter::DoJumpIfToBooleanFalseConstant(
InterpreterAssembler* assembler) {
- Node* accumulator = __ GetAccumulator();
- Node* to_boolean_value = BuildToBoolean(accumulator, assembler);
+ Node* value = __ GetAccumulator();
Node* index = __ BytecodeOperandIdx(0);
Node* constant = __ LoadConstantPoolEntry(index);
Node* relative_jump = __ SmiUntag(constant);
- Node* false_value = __ BooleanConstant(false);
- __ JumpIfWordEqual(to_boolean_value, false_value, relative_jump);
+ Label if_true(assembler), if_false(assembler);
+ __ BranchIfToBooleanIsTrue(value, &if_true, &if_false);
+ __ Bind(&if_true);
+ __ Dispatch();
+ __ Bind(&if_false);
+ __ Jump(relative_jump);
}
// JumpIfNull <imm>
« no previous file with comments | « src/interpreter/interpreter.h ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698