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
This commit is contained in:
whesse@chromium.org 2010-07-01 15:18:07 +00:00
parent 5a54b7030d
commit 94ae008739
2 changed files with 15 additions and 15 deletions

View File

@ -11689,15 +11689,15 @@ void CompareStub::Generate(MacroAssembler* masm) {
Label heap_number;
__ cmp(FieldOperand(edx, HeapObject::kMapOffset),
Immediate(Factory::heap_number_map()));
if (cc_ == equal) {
__ j(equal, &heap_number);
// Identical objects are equal for operators ==, !=, and ===.
__ Set(eax, Immediate(Smi::FromInt(EQUAL)));
__ ret(0);
} else {
// Identical objects must call ToPrimitive for <, <=, >, and >=.
__ j(not_equal, &not_identical);
__ j(equal, &heap_number);
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)));
__ ret(0);
__ bind(&heap_number);
// It is a heap number, so return non-equal if it's NaN and equal if
// it's not NaN.

View File

@ -9077,14 +9077,14 @@ void CompareStub::Generate(MacroAssembler* masm) {
// If it's not a heap number, then return equal for (in)equality operator.
__ Cmp(FieldOperand(rdx, HeapObject::kMapOffset),
Factory::heap_number_map());
if (cc_ == equal) {
__ j(equal, &heap_number);
__ Set(rax, EQUAL);
__ ret(0);
} else {
// Identical objects must still be converted to primitive for < and >.
__ j(not_equal, &not_identical);
__ 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);
__ ret(0);
__ bind(&heap_number);
// It is a heap number, so return equal if it's not NaN.