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..f9d878f5a3e49de290373c009bca36c111c5ff34 100644 |
--- a/src/x64/full-codegen-x64.cc |
+++ b/src/x64/full-codegen-x64.cc |
@@ -2281,21 +2281,22 @@ void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr, |
__ jmp(&done, Label::kNear); |
__ bind(&smi_case); |
+ MacroAssembler::StrictSmiInstructionWrapper wrapper(masm_, &stub_call); |
switch (op) { |
case Token::SAR: |
__ 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); |
break; |
case Token::ADD: |
- __ SmiAdd(rax, rdx, rcx, &stub_call); |
+ __ SmiAdd(rax, rdx, rcx, wrapper); |
break; |
case Token::SUB: |
- __ SmiSub(rax, rdx, rcx, &stub_call); |
+ __ SmiSub(rax, rdx, rcx, wrapper); |
break; |
case Token::MUL: |
__ SmiMul(rax, rdx, rcx, &stub_call); |
@@ -4451,10 +4452,22 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
if (ShouldInlineSmiCase(expr->op())) { |
if (expr->op() == Token::INC) { |
__ SmiAddConstant(rax, rax, Smi::FromInt(1)); |
danno
2013/08/19 21:47:44
Shouldn't overflow also be handled in SmiAddConsta
haitao.feng
2013/08/20 15:09:30
I will address this in https://codereview.chromium
|
+ if (SmiValuesAre31Bits()) { |
+ // positive overflow |
+ __ testl(rax, Immediate(0x80000000)); |
+ __ j(not_zero, &stub_call, Label::kNear); |
+ } |
} else { |
__ SmiSubConstant(rax, rax, Smi::FromInt(1)); |
+ if (SmiValuesAre31Bits()) { |
+ // negative overflow |
+ __ testl(rax, Immediate(0x80000000)); |
+ __ j(zero, &stub_call, Label::kNear); |
+ } |
+ } |
+ if (SmiValuesAre32Bits()) { |
+ __ 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); |