Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(283)

Unified Diff: runtime/vm/intermediate_language_x64.cc

Issue 10960014: Implement range analysis for smi values. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: addressed majority of comments Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/intermediate_language_x64.cc
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 2f622dbd32d64b6fbc6523a627cdcfd56ace92cf..5e489593a14d9846571bf04d1dc3eddfb68c80b3 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -1512,15 +1512,9 @@ void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
Register result = locs()->out().reg();
ASSERT(left == result);
Label* deopt = NULL;
- switch (op_kind()) {
- case Token::kBIT_AND:
- case Token::kBIT_OR:
- case Token::kBIT_XOR:
- // Can't deoptimize. Arguments are already checked for smi.
- break;
- default:
- deopt = compiler->AddDeoptStub(instance_call()->deopt_id(),
- kDeoptBinarySmiOp);
+ if (CanDeoptimize()) {
+ deopt = compiler->AddDeoptStub(instance_call()->deopt_id(),
+ kDeoptBinarySmiOp);
}
if (locs()->in(1).IsConstant()) {
@@ -1531,12 +1525,12 @@ void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
switch (op_kind()) {
case Token::kADD: {
__ addq(left, Immediate(imm));
- __ j(OVERFLOW, deopt);
+ if (deopt != NULL) __ j(OVERFLOW, deopt);
break;
}
case Token::kSUB: {
__ subq(left, Immediate(imm));
- __ j(OVERFLOW, deopt);
+ if (deopt != NULL) __ j(OVERFLOW, deopt);
break;
}
case Token::kBIT_AND: {
@@ -1587,18 +1581,18 @@ void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
switch (op_kind()) {
case Token::kADD: {
__ addq(left, right);
- __ j(OVERFLOW, deopt);
+ if (deopt != NULL) __ j(OVERFLOW, deopt);
break;
}
case Token::kSUB: {
__ subq(left, right);
- __ j(OVERFLOW, deopt);
+ if (deopt != NULL) __ j(OVERFLOW, deopt);
break;
}
case Token::kMUL: {
__ SmiUntag(left);
__ imulq(left, right);
- __ j(OVERFLOW, deopt);
+ if (deopt != NULL) __ j(OVERFLOW, deopt);
break;
}
case Token::kBIT_AND: {

Powered by Google App Engine
This is Rietveld 408576698