| 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( | 
|  |