Commit 94ae0087 authored by whesse@chromium.org's avatar whesse@chromium.org

Let relational comparison operators quickly compare a string with itself.

Review URL: http://codereview.chromium.org/2802028

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5000 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 5a54b703
...@@ -11689,15 +11689,15 @@ void CompareStub::Generate(MacroAssembler* masm) { ...@@ -11689,15 +11689,15 @@ void CompareStub::Generate(MacroAssembler* masm) {
Label heap_number; Label heap_number;
__ cmp(FieldOperand(edx, HeapObject::kMapOffset), __ cmp(FieldOperand(edx, HeapObject::kMapOffset),
Immediate(Factory::heap_number_map())); Immediate(Factory::heap_number_map()));
if (cc_ == equal) {
__ j(equal, &heap_number); __ j(equal, &heap_number);
// Identical objects are equal for operators ==, !=, and ===. if (cc_ != equal) {
// Call runtime on identical JSObjects. Otherwise return equal.
__ CmpObjectType(eax, FIRST_JS_OBJECT_TYPE, ecx);
__ j(above_equal, &not_identical);
}
__ Set(eax, Immediate(Smi::FromInt(EQUAL))); __ Set(eax, Immediate(Smi::FromInt(EQUAL)));
__ ret(0); __ ret(0);
} else {
// Identical objects must call ToPrimitive for <, <=, >, and >=.
__ j(not_equal, &not_identical);
}
__ bind(&heap_number); __ bind(&heap_number);
// It is a heap number, so return non-equal if it's NaN and equal if // It is a heap number, so return non-equal if it's NaN and equal if
// it's not NaN. // it's not NaN.
......
...@@ -9077,14 +9077,14 @@ void CompareStub::Generate(MacroAssembler* masm) { ...@@ -9077,14 +9077,14 @@ void CompareStub::Generate(MacroAssembler* masm) {
// If it's not a heap number, then return equal for (in)equality operator. // If it's not a heap number, then return equal for (in)equality operator.
__ Cmp(FieldOperand(rdx, HeapObject::kMapOffset), __ Cmp(FieldOperand(rdx, HeapObject::kMapOffset),
Factory::heap_number_map()); Factory::heap_number_map());
if (cc_ == equal) {
__ j(equal, &heap_number); __ j(equal, &heap_number);
if (cc_ != equal) {
// Call runtime on identical JSObjects. Otherwise return equal.
__ CmpObjectType(rax, FIRST_JS_OBJECT_TYPE, rcx);
__ j(above_equal, &not_identical);
}
__ Set(rax, EQUAL); __ Set(rax, EQUAL);
__ ret(0); __ ret(0);
} else {
// Identical objects must still be converted to primitive for < and >.
__ j(not_equal, &not_identical);
}
__ bind(&heap_number); __ bind(&heap_number);
// It is a heap number, so return equal if it's not NaN. // It is a heap number, so return equal if it's not NaN.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment