From 23064a1b283583c5c7faa80a007a45d1b3e4975a Mon Sep 17 00:00:00 2001 From: "lrn@chromium.org" Date: Thu, 6 May 2010 10:31:34 +0000 Subject: [PATCH] X64: Skip smi-test on GenericBinaryOpStub if static type test says we have smis. Review URL: http://codereview.chromium.org/2032001 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4600 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x64/codegen-x64.cc | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc index 08d20ab..5b6f878 100644 --- a/src/x64/codegen-x64.cc +++ b/src/x64/codegen-x64.cc @@ -9884,12 +9884,27 @@ void GenericBinaryOpStub::GenerateSmiCode(MacroAssembler* masm, Label* slow) { __ movq(left, Operand(rsp, 2 * kPointerSize)); } - // 2. Smi check both operands. Skip the check for OR as it is better combined - // with the actual operation. Label not_smis; - if (op_ != Token::BIT_OR) { - Comment smi_check_comment(masm, "-- Smi check arguments"); - __ JumpIfNotBothSmi(left, right, ¬_smis); + // 2. Smi check both operands. + if (static_operands_type_.IsSmi()) { + // Skip smi check if we know that both arguments are smis. + if (FLAG_debug_code) { + __ AbortIfNotSmi(left, "Static type check claimed non-smi is smi."); + __ AbortIfNotSmi(right, "Static type check claimed non-smi is smi."); + } + if (op_ == Token::BIT_OR) { + // Handle OR here, since we do extra smi-checking in the or code below. + __ SmiOr(right, right, left); + GenerateReturn(masm); + return; + } + } else { + if (op_ != Token::BIT_OR) { + // Skip the check for OR as it is better combined with the + // actual operation. + Comment smi_check_comment(masm, "-- Smi check arguments"); + __ JumpIfNotBothSmi(left, right, ¬_smis); + } } // 3. Operands are both smis (except for OR), perform the operation leaving @@ -9977,6 +9992,7 @@ void GenericBinaryOpStub::GenerateSmiCode(MacroAssembler* masm, Label* slow) { case Token::SUB: case Token::MUL: case Token::DIV: { + ASSERT(use_fp_on_smis.is_linked()); __ bind(&use_fp_on_smis); if (op_ == Token::DIV) { __ movq(rdx, rax); -- 2.7.4