Reviewers: Kasper Lund,

Description:
Remove ComparisonDeferred and inline the non-smi case.  ARM is doing
it's own thing here.  This should cut down on code size, and open up two
possiblities for short jump encoding.

Please review this at http://codereview.chromium.org/4084

Affected files:
   M src/codegen-ia32.cc


Index: src/codegen-ia32.cc
diff --git a/src/codegen-ia32.cc b/src/codegen-ia32.cc
index  
1c6fc5b2c696007bd7426d562871a9cd896d1b28..b5cda756aa2e2a734adf1c01695d11974aef6e21
  
100644
--- a/src/codegen-ia32.cc
+++ b/src/codegen-ia32.cc
@@ -2484,29 +2484,6 @@ void StackCheckStub::Generate(MacroAssembler* masm) {
  #define __  masm_->


-class ComparisonDeferred: public DeferredCode {
- public:
-  ComparisonDeferred(CodeGenerator* generator, Condition cc, bool strict) :
-      DeferredCode(generator), cc_(cc), strict_(strict) {
-    set_comment("[ ComparisonDeferred");
-  }
-  virtual void Generate();
-
- private:
-  Condition cc_;
-  bool strict_;
-};
-
-
-void ComparisonDeferred::Generate() {
-  CompareStub stub(cc_, strict_);
-  // "parameters" setup by calling code in edx and eax
-  __ CallStub(&stub);
-  __ cmp(eax, 0);
-  // "result" is returned in the flags
-}
-
-
  void Ia32CodeGenerator::Comparison(Condition cc, bool strict) {
    // Strict only makes sense for equality comparisons.
    ASSERT(!strict || cc == equal);
@@ -2520,14 +2497,28 @@ void Ia32CodeGenerator::Comparison(Condition cc,  
bool strict) {
      __ pop(eax);
      __ pop(edx);
    }
-  ComparisonDeferred* deferred = new ComparisonDeferred(this, cc, strict);
+
+  Label is_not_smi, done;
+  CompareStub stub(cc, strict);
+
    __ mov(ecx, Operand(eax));
    __ or_(ecx, Operand(edx));
    __ test(ecx, Immediate(kSmiTagMask));
-  __ j(not_zero, deferred->enter(), not_taken);
+  __ j(zero, is_smi, taken);
+
+  // When non-smi, call out to the compare stub
+  // "parameters" setup by calling code in edx and eax
+  // "result" is returned in the flags
+  __ CallStub(&stub);
+  __ cmp(eax, 0);
+  __ jmp(&done);
+
    // Test smi equality by pointer comparison.
+  __ bind(is_smi)
    __ cmp(edx, Operand(eax));
-  __ bind(deferred->exit());
+  // Fall through to |done|.
+
+  __ bind(&done);
    cc_reg_ = cc;
  }




--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to