| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |