From ab041ee4ed34bc10d1781159b4a754c8affdf5d6 Mon Sep 17 00:00:00 2001 From: "whesse@chromium.org" Date: Mon, 17 Aug 2009 08:02:07 +0000 Subject: [PATCH] X64: Do not use an AllocateWithoutSpill register if it is invalid. Abandoned in favor of approach in http://codereview.chromium.org/165525/show (Issue 165526) Review URL: http://codereview.chromium.org/164480 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2693 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x64/codegen-x64.cc | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc index b3df929d78..8ed9817cd6 100644 --- a/src/x64/codegen-x64.cc +++ b/src/x64/codegen-x64.cc @@ -3084,26 +3084,36 @@ void CodeGenerator::VisitCountOperation(CountOperation* node) { is_increment); } + // If we have a free register, combine the smi and overflow checks. Result tmp = allocator_->AllocateWithoutSpilling(); ASSERT(kSmiTagMask == 1 && kSmiTag == 0); - __ movl(tmp.reg(), Immediate(kSmiTagMask)); - // Smi test. + if (tmp.is_valid()) { + __ movl(tmp.reg(), Immediate(kSmiTagMask)); + } + + // Try incrementing or decrementing the smi. __ movq(kScratchRegister, new_value.reg()); if (is_increment) { __ addl(kScratchRegister, Immediate(Smi::FromInt(1))); } else { __ subl(kScratchRegister, Immediate(Smi::FromInt(1))); } - // deferred->Branch(overflow); - __ cmovl(overflow, kScratchRegister, tmp.reg()); - __ testl(kScratchRegister, tmp.reg()); - tmp.Unuse(); - deferred->Branch(not_zero); + + // Go to the deferred case if the result overflows or is non-smi. + if (tmp.is_valid()){ + __ cmovl(overflow, kScratchRegister, tmp.reg()); + __ testl(kScratchRegister, tmp.reg()); + tmp.Unuse(); + deferred->Branch(not_zero); + } else { + deferred->Branch(overflow); + __ testl(kScratchRegister, Immediate(kSmiTagMask)); + deferred->Branch(not_zero); + } + __ movq(new_value.reg(), kScratchRegister); - deferred->BindExit(); - // Postfix: store the old value in the allocated slot under the // reference. if (is_postfix) frame_->SetElementAt(target.size(), &old_value);