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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64.
6 #if defined(TARGET_ARCH_X64) 6 #if defined(TARGET_ARCH_X64)
7 7
8 #include "vm/intermediate_language.h" 8 #include "vm/intermediate_language.h"
9 9
10 #include "lib/error.h" 10 #include "lib/error.h"
(...skipping 1494 matching lines...) Expand 10 before | Expand all | Expand 10 after
1505 return summary; 1505 return summary;
1506 } 1506 }
1507 } 1507 }
1508 1508
1509 1509
1510 void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 1510 void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1511 Register left = locs()->in(0).reg(); 1511 Register left = locs()->in(0).reg();
1512 Register result = locs()->out().reg(); 1512 Register result = locs()->out().reg();
1513 ASSERT(left == result); 1513 ASSERT(left == result);
1514 Label* deopt = NULL; 1514 Label* deopt = NULL;
1515 switch (op_kind()) { 1515 if (CanDeoptimize()) {
1516 case Token::kBIT_AND: 1516 deopt = compiler->AddDeoptStub(instance_call()->deopt_id(),
1517 case Token::kBIT_OR: 1517 kDeoptBinarySmiOp);
1518 case Token::kBIT_XOR:
1519 // Can't deoptimize. Arguments are already checked for smi.
1520 break;
1521 default:
1522 deopt = compiler->AddDeoptStub(instance_call()->deopt_id(),
1523 kDeoptBinarySmiOp);
1524 } 1518 }
1525 1519
1526 if (locs()->in(1).IsConstant()) { 1520 if (locs()->in(1).IsConstant()) {
1527 const Object& constant = locs()->in(1).constant(); 1521 const Object& constant = locs()->in(1).constant();
1528 ASSERT(constant.IsSmi()); 1522 ASSERT(constant.IsSmi());
1529 const int64_t imm = 1523 const int64_t imm =
1530 reinterpret_cast<int64_t>(constant.raw()); 1524 reinterpret_cast<int64_t>(constant.raw());
1531 switch (op_kind()) { 1525 switch (op_kind()) {
1532 case Token::kADD: { 1526 case Token::kADD: {
1533 __ addq(left, Immediate(imm)); 1527 __ addq(left, Immediate(imm));
1534 __ j(OVERFLOW, deopt); 1528 if (deopt != NULL) __ j(OVERFLOW, deopt);
1535 break; 1529 break;
1536 } 1530 }
1537 case Token::kSUB: { 1531 case Token::kSUB: {
1538 __ subq(left, Immediate(imm)); 1532 __ subq(left, Immediate(imm));
1539 __ j(OVERFLOW, deopt); 1533 if (deopt != NULL) __ j(OVERFLOW, deopt);
1540 break; 1534 break;
1541 } 1535 }
1542 case Token::kBIT_AND: { 1536 case Token::kBIT_AND: {
1543 // No overflow check. 1537 // No overflow check.
1544 __ andq(left, Immediate(imm)); 1538 __ andq(left, Immediate(imm));
1545 break; 1539 break;
1546 } 1540 }
1547 case Token::kBIT_OR: { 1541 case Token::kBIT_OR: {
1548 // No overflow check. 1542 // No overflow check.
1549 __ orq(left, Immediate(imm)); 1543 __ orq(left, Immediate(imm));
(...skipping 30 matching lines...) Expand all
1580 UNREACHABLE(); 1574 UNREACHABLE();
1581 break; 1575 break;
1582 } 1576 }
1583 return; 1577 return;
1584 } 1578 }
1585 1579
1586 Register right = locs()->in(1).reg(); 1580 Register right = locs()->in(1).reg();
1587 switch (op_kind()) { 1581 switch (op_kind()) {
1588 case Token::kADD: { 1582 case Token::kADD: {
1589 __ addq(left, right); 1583 __ addq(left, right);
1590 __ j(OVERFLOW, deopt); 1584 if (deopt != NULL) __ j(OVERFLOW, deopt);
1591 break; 1585 break;
1592 } 1586 }
1593 case Token::kSUB: { 1587 case Token::kSUB: {
1594 __ subq(left, right); 1588 __ subq(left, right);
1595 __ j(OVERFLOW, deopt); 1589 if (deopt != NULL) __ j(OVERFLOW, deopt);
1596 break; 1590 break;
1597 } 1591 }
1598 case Token::kMUL: { 1592 case Token::kMUL: {
1599 __ SmiUntag(left); 1593 __ SmiUntag(left);
1600 __ imulq(left, right); 1594 __ imulq(left, right);
1601 __ j(OVERFLOW, deopt); 1595 if (deopt != NULL) __ j(OVERFLOW, deopt);
1602 break; 1596 break;
1603 } 1597 }
1604 case Token::kBIT_AND: { 1598 case Token::kBIT_AND: {
1605 // No overflow check. 1599 // No overflow check.
1606 __ andq(left, right); 1600 __ andq(left, right);
1607 break; 1601 break;
1608 } 1602 }
1609 case Token::kBIT_OR: { 1603 case Token::kBIT_OR: {
1610 // No overflow check. 1604 // No overflow check.
1611 __ orq(left, right); 1605 __ orq(left, right);
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
2250 __ j(ABOVE_EQUAL, deopt); 2244 __ j(ABOVE_EQUAL, deopt);
2251 } 2245 }
2252 } 2246 }
2253 2247
2254 2248
2255 } // namespace dart 2249 } // namespace dart
2256 2250
2257 #undef __ 2251 #undef __
2258 2252
2259 #endif // defined TARGET_ARCH_X64 2253 #endif // defined TARGET_ARCH_X64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698