From: deanm@chromium.org Date: Sun, 28 Sep 2008 09:38:09 +0000 (+0000) Subject: Remove ComparisonDeferred and inline the non-smi case. ARM is doing it's own thing... X-Git-Tag: upstream/4.7.83~25303 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5aa049e98de094107597b222e39daaf4eb73bb0e;p=platform%2Fupstream%2Fv8.git 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. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@390 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/codegen-ia32.cc b/src/codegen-ia32.cc index 1c6fc5b..3beef5f 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,27 @@ void Ia32CodeGenerator::Comparison(Condition cc, bool strict) { __ pop(eax); __ pop(edx); } - ComparisonDeferred* deferred = new ComparisonDeferred(this, cc, strict); + + Label is_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 and "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; }