Chromium Code Reviews| Index: runtime/vm/intermediate_language_x64.cc |
| =================================================================== |
| --- runtime/vm/intermediate_language_x64.cc (revision 25734) |
| +++ runtime/vm/intermediate_language_x64.cc (working copy) |
| @@ -2152,13 +2152,15 @@ |
| static void EmitJavascriptOverflowCheck(FlowGraphCompiler* compiler, |
| + Range* range, |
| Label* overflow, |
| Register result) { |
| - if (FLAG_throw_on_javascript_int_overflow) { |
| + if (FLAG_throw_on_javascript_int_overflow && |
| + !range->IsWithin(-0x20000000000000LL, 0x20000000000000LL)) { |
|
srdjan
2013/08/02 18:07:22
Ditto for if (FLAG_throw_on_javascript_int_overflo
zra
2013/08/02 18:30:27
Done.
|
| ASSERT(overflow != NULL); |
| - __ cmpq(result, Immediate(-0x20000000000000)); |
| + __ cmpq(result, Immediate(-0x20000000000000LL)); |
| __ j(LESS, overflow); |
| - __ cmpq(result, Immediate(0x20000000000000)); |
| + __ cmpq(result, Immediate(0x20000000000000LL)); |
| __ j(GREATER, overflow); |
| } |
| } |
| @@ -2203,7 +2205,7 @@ |
| // Shift for result now we know there is no overflow. |
| __ shlq(left, Immediate(value)); |
| } |
| - EmitJavascriptOverflowCheck(compiler, deopt, result); |
| + EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result); |
| return; |
| } |
| @@ -2233,7 +2235,7 @@ |
| __ SmiUntag(right); |
| __ shlq(left, right); |
| } |
| - EmitJavascriptOverflowCheck(compiler, deopt, result); |
| + EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result); |
| return; |
| } |
| @@ -2284,7 +2286,7 @@ |
| // Shift for result now we know there is no overflow. |
| __ shlq(left, right); |
| } |
| - EmitJavascriptOverflowCheck(compiler, deopt, result); |
| + EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result); |
| } |
| @@ -2483,7 +2485,7 @@ |
| UNREACHABLE(); |
| break; |
| } |
| - EmitJavascriptOverflowCheck(compiler, deopt, result); |
| + EmitJavascriptOverflowCheck(compiler, range(), deopt, result); |
| return; |
| } // locs()->in(1).IsConstant(). |
| @@ -2526,7 +2528,7 @@ |
| UNREACHABLE(); |
| break; |
| } |
| - EmitJavascriptOverflowCheck(compiler, deopt, result); |
| + EmitJavascriptOverflowCheck(compiler, range(), deopt, result); |
| return; |
| } // locs()->in(1).IsStackSlot(). |
| @@ -2656,7 +2658,7 @@ |
| UNREACHABLE(); |
| break; |
| } |
| - EmitJavascriptOverflowCheck(compiler, deopt, result); |
| + EmitJavascriptOverflowCheck(compiler, range(), deopt, result); |
| } |
| @@ -3834,7 +3836,7 @@ |
| kDeoptUnaryOp); |
| __ negq(value); |
| __ j(OVERFLOW, deopt); |
| - EmitJavascriptOverflowCheck(compiler, deopt, value); |
| + EmitJavascriptOverflowCheck(compiler, range(), deopt, value); |
| break; |
| } |
| case Token::kBIT_NOT: |
| @@ -3895,7 +3897,7 @@ |
| __ shlq(temp, Immediate(1)); |
| __ j(OVERFLOW, &do_call, Assembler::kNearJump); |
| __ SmiTag(result); |
| - EmitJavascriptOverflowCheck(compiler, &do_call, result); |
| + EmitJavascriptOverflowCheck(compiler, range(), &do_call, result); |
| __ jmp(&done); |
| __ Bind(&do_call); |
| ASSERT(instance_call()->HasICData()); |
| @@ -3941,7 +3943,7 @@ |
| __ shlq(temp, Immediate(1)); |
| __ j(OVERFLOW, deopt); |
| __ SmiTag(result); |
| - EmitJavascriptOverflowCheck(compiler, deopt, result); |
| + EmitJavascriptOverflowCheck(compiler, range(), deopt, result); |
| } |