Index: src/x64/codegen-x64.cc |
diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc |
index 39f543df560cd9cdac25d75a9d5fa19ffc948bed..8c96bc739f7d2747c7639104e6d1a6b155fe0320 100644 |
--- a/src/x64/codegen-x64.cc |
+++ b/src/x64/codegen-x64.cc |
@@ -9860,12 +9860,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 |
@@ -9953,6 +9968,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); |