Index: src/x64/full-codegen-x64.cc |
diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc |
index f3e5a5032397a99bd8005ed8f5b0d15d3620102f..c99351f8249a7005f58c5aa0c4d85be219b84b97 100644 |
--- a/src/x64/full-codegen-x64.cc |
+++ b/src/x64/full-codegen-x64.cc |
@@ -2286,7 +2286,7 @@ void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr, |
__ SmiShiftArithmeticRight(rax, rdx, rcx); |
break; |
case Token::SHL: |
- __ SmiShiftLeft(rax, rdx, rcx); |
+ __ SmiShiftLeft(rax, rdx, rcx, &stub_call); |
break; |
case Token::SHR: |
__ SmiShiftLogicalRight(rax, rdx, rcx, &stub_call); |
@@ -4451,10 +4451,22 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
if (ShouldInlineSmiCase(expr->op())) { |
if (expr->op() == Token::INC) { |
__ SmiAddConstant(rax, rax, Smi::FromInt(1)); |
+ if (kSmiValueSize == 31) { |
+ // positive overflow |
+ __ testl(rax, Immediate(0x80000000)); |
+ __ j(not_zero, &stub_call, Label::kNear); |
+ } |
} else { |
__ SmiSubConstant(rax, rax, Smi::FromInt(1)); |
+ if (kSmiValueSize == 31) { |
+ // negative overflow |
+ __ testl(rax, Immediate(0x80000000)); |
+ __ j(zero, &stub_call, Label::kNear); |
+ } |
+ } |
+ if (kSmiValueSize == 32) { |
+ __ j(overflow, &stub_call, Label::kNear); |
} |
- __ j(overflow, &stub_call, Label::kNear); |
// We could eliminate this smi check if we split the code at |
// the first smi check before calling ToNumber. |
patch_site.EmitJumpIfSmi(rax, &done, Label::kNear); |