Let relational comparison operators quickly compare a string with itself.
authorwhesse@chromium.org <whesse@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 1 Jul 2010 15:18:07 +0000 (15:18 +0000)
committerwhesse@chromium.org <whesse@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 1 Jul 2010 15:18:07 +0000 (15:18 +0000)
Review URL: http://codereview.chromium.org/2802028

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5000 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/ia32/codegen-ia32.cc
src/x64/codegen-x64.cc

index d01b939..fa09dd8 100644 (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.
index 2c65dc7..e7f3a44 100644 (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.