| Index: src/code-stubs.cc
|
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc
|
| index c5f7fb4fa1273f945115eae0e3bd9d48d60fb191..11e3fafa49ed74aba7cee4ba820c3e3f271a8f3d 100644
|
| --- a/src/code-stubs.cc
|
| +++ b/src/code-stubs.cc
|
| @@ -473,9 +473,14 @@ void StringLengthStub::GenerateAssembly(
|
| assembler->Return(result);
|
| }
|
|
|
| -void StrictEqualStub::GenerateAssembly(
|
| - compiler::CodeStubAssembler* assembler) const {
|
| - // Here's pseudo-code for the algorithm below:
|
| +namespace {
|
| +
|
| +enum StrictEqualMode { kStrictEqual, kStrictNotEqual };
|
| +
|
| +void GenerateStrictEqual(compiler::CodeStubAssembler* assembler,
|
| + StrictEqualMode mode) {
|
| + // Here's pseudo-code for the algorithm below in case of kStrictEqual mode;
|
| + // for kStrictNotEqual mode we properly negate the result.
|
| //
|
| // if (lhs == rhs) {
|
| // if (lhs->IsHeapNumber()) return HeapNumber::cast(lhs)->value() != NaN;
|
| @@ -529,7 +534,7 @@ void StrictEqualStub::GenerateAssembly(
|
| Node* rhs = assembler->Parameter(1);
|
| Node* context = assembler->Parameter(2);
|
|
|
| - Label if_true(assembler), if_false(assembler);
|
| + Label if_equal(assembler), if_notequal(assembler);
|
|
|
| // Check if {lhs} and {rhs} refer to the same object.
|
| Label if_same(assembler), if_notsame(assembler);
|
| @@ -563,15 +568,15 @@ void StrictEqualStub::GenerateAssembly(
|
| Node* lhs_value = assembler->LoadHeapNumberValue(lhs);
|
|
|
| // Check if the HeapNumber value is a NaN.
|
| - assembler->BranchIfFloat64IsNaN(lhs_value, &if_false, &if_true);
|
| + assembler->BranchIfFloat64IsNaN(lhs_value, &if_notequal, &if_equal);
|
| }
|
|
|
| assembler->Bind(&if_lhsisnotnumber);
|
| - assembler->Goto(&if_true);
|
| + assembler->Goto(&if_equal);
|
| }
|
|
|
| assembler->Bind(&if_lhsissmi);
|
| - assembler->Goto(&if_true);
|
| + assembler->Goto(&if_equal);
|
| }
|
|
|
| assembler->Bind(&if_notsame);
|
| @@ -608,8 +613,8 @@ void StrictEqualStub::GenerateAssembly(
|
| Node* rhs_value = assembler->SmiToFloat64(rhs);
|
|
|
| // Perform a floating point comparison of {lhs} and {rhs}.
|
| - assembler->BranchIfFloat64Equal(lhs_value, rhs_value, &if_true,
|
| - &if_false);
|
| + assembler->BranchIfFloat64Equal(lhs_value, rhs_value, &if_equal,
|
| + &if_notequal);
|
| }
|
|
|
| assembler->Bind(&if_rhsisnotsmi);
|
| @@ -630,12 +635,12 @@ void StrictEqualStub::GenerateAssembly(
|
| Node* rhs_value = assembler->LoadHeapNumberValue(rhs);
|
|
|
| // Perform a floating point comparison of {lhs} and {rhs}.
|
| - assembler->BranchIfFloat64Equal(lhs_value, rhs_value, &if_true,
|
| - &if_false);
|
| + assembler->BranchIfFloat64Equal(lhs_value, rhs_value, &if_equal,
|
| + &if_notequal);
|
| }
|
|
|
| assembler->Bind(&if_rhsisnotnumber);
|
| - assembler->Goto(&if_false);
|
| + assembler->Goto(&if_notequal);
|
| }
|
| }
|
|
|
| @@ -647,7 +652,7 @@ void StrictEqualStub::GenerateAssembly(
|
| &if_rhsisnotsmi);
|
|
|
| assembler->Bind(&if_rhsissmi);
|
| - assembler->Goto(&if_false);
|
| + assembler->Goto(&if_notequal);
|
|
|
| assembler->Bind(&if_rhsisnotsmi);
|
| {
|
| @@ -677,12 +682,14 @@ void StrictEqualStub::GenerateAssembly(
|
| {
|
| // TODO(bmeurer): Optimize this further once the StringEqual
|
| // functionality is available in TurboFan land.
|
| - assembler->TailCallRuntime(Runtime::kStringEqual, context, lhs,
|
| - rhs);
|
| + Runtime::FunctionId function_id = (mode == kStrictEqual)
|
| + ? Runtime::kStringEqual
|
| + : Runtime::kStringNotEqual;
|
| + assembler->TailCallRuntime(function_id, context, lhs, rhs);
|
| }
|
|
|
| assembler->Bind(&if_rhsisnotstring);
|
| - assembler->Goto(&if_false);
|
| + assembler->Goto(&if_notequal);
|
| }
|
|
|
| assembler->Bind(&if_lhsisnotstring);
|
| @@ -698,12 +705,14 @@ void StrictEqualStub::GenerateAssembly(
|
| assembler->Bind(&if_lhsissimd128value);
|
| {
|
| // TODO(bmeurer): Inline the Simd128Value equality check.
|
| - assembler->TailCallRuntime(Runtime::kStrictEqual, context, lhs,
|
| - rhs);
|
| + Runtime::FunctionId function_id = (mode == kStrictEqual)
|
| + ? Runtime::kStrictEqual
|
| + : Runtime::kStrictNotEqual;
|
| + assembler->TailCallRuntime(function_id, context, lhs, rhs);
|
| }
|
|
|
| assembler->Bind(&if_lhsisnotsimd128value);
|
| - assembler->Goto(&if_false);
|
| + assembler->Goto(&if_notequal);
|
| }
|
| }
|
| }
|
| @@ -721,7 +730,7 @@ void StrictEqualStub::GenerateAssembly(
|
| &if_rhsisnotsmi);
|
|
|
| assembler->Bind(&if_rhsissmi);
|
| - assembler->Goto(&if_false);
|
| + assembler->Goto(&if_notequal);
|
|
|
| assembler->Bind(&if_rhsisnotsmi);
|
| {
|
| @@ -740,21 +749,33 @@ void StrictEqualStub::GenerateAssembly(
|
| Node* rhs_value = assembler->LoadHeapNumberValue(rhs);
|
|
|
| // Perform a floating point comparison of {lhs} and {rhs}.
|
| - assembler->BranchIfFloat64Equal(lhs_value, rhs_value, &if_true,
|
| - &if_false);
|
| + assembler->BranchIfFloat64Equal(lhs_value, rhs_value, &if_equal,
|
| + &if_notequal);
|
| }
|
|
|
| assembler->Bind(&if_rhsisnotnumber);
|
| - assembler->Goto(&if_false);
|
| + assembler->Goto(&if_notequal);
|
| }
|
| }
|
| }
|
|
|
| - assembler->Bind(&if_true);
|
| - assembler->Return(assembler->BooleanConstant(true));
|
| + assembler->Bind(&if_equal);
|
| + assembler->Return(assembler->BooleanConstant(mode == kStrictEqual));
|
| +
|
| + assembler->Bind(&if_notequal);
|
| + assembler->Return(assembler->BooleanConstant(mode == kStrictNotEqual));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +void StrictEqualStub::GenerateAssembly(
|
| + compiler::CodeStubAssembler* assembler) const {
|
| + GenerateStrictEqual(assembler, kStrictEqual);
|
| +}
|
|
|
| - assembler->Bind(&if_false);
|
| - assembler->Return(assembler->BooleanConstant(false));
|
| +void StrictNotEqualStub::GenerateAssembly(
|
| + compiler::CodeStubAssembler* assembler) const {
|
| + GenerateStrictEqual(assembler, kStrictNotEqual);
|
| }
|
|
|
| void ToBooleanStub::GenerateAssembly(
|
|
|