Chromium Code Reviews| 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_IA32. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
| 6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
| 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 1460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1471 return summary; | 1471 return summary; |
| 1472 } | 1472 } |
| 1473 } | 1473 } |
| 1474 | 1474 |
| 1475 | 1475 |
| 1476 void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1476 void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 1477 Register left = locs()->in(0).reg(); | 1477 Register left = locs()->in(0).reg(); |
| 1478 Register result = locs()->out().reg(); | 1478 Register result = locs()->out().reg(); |
| 1479 ASSERT(left == result); | 1479 ASSERT(left == result); |
| 1480 Label* deopt = NULL; | 1480 Label* deopt = NULL; |
| 1481 switch (op_kind()) { | 1481 if (CanDeoptimize()) { |
| 1482 case Token::kBIT_AND: | |
| 1483 case Token::kBIT_OR: | |
| 1484 case Token::kBIT_XOR: | |
| 1485 // Can't deoptimize. Arguments are already checked for smi. | |
| 1486 break; | |
| 1487 default: | |
| 1488 deopt = compiler->AddDeoptStub(instance_call()->deopt_id(), | 1482 deopt = compiler->AddDeoptStub(instance_call()->deopt_id(), |
| 1489 kDeoptBinarySmiOp); | 1483 kDeoptBinarySmiOp); |
| 1490 } | 1484 } |
| 1491 | 1485 |
| 1492 if (locs()->in(1).IsConstant()) { | 1486 if (locs()->in(1).IsConstant()) { |
| 1493 const Object& constant = locs()->in(1).constant(); | 1487 const Object& constant = locs()->in(1).constant(); |
| 1494 ASSERT(constant.IsSmi()); | 1488 ASSERT(constant.IsSmi()); |
| 1495 const int32_t imm = | 1489 const int32_t imm = |
| 1496 reinterpret_cast<int32_t>(constant.raw()); | 1490 reinterpret_cast<int32_t>(constant.raw()); |
| 1497 switch (op_kind()) { | 1491 switch (op_kind()) { |
| 1498 case Token::kADD: | 1492 case Token::kADD: |
| 1499 __ addl(left, Immediate(imm)); | 1493 __ addl(left, Immediate(imm)); |
| 1500 __ j(OVERFLOW, deopt); | 1494 if (deopt != NULL) __ j(OVERFLOW, deopt); |
| 1501 break; | 1495 break; |
| 1502 case Token::kSUB: { | 1496 case Token::kSUB: { |
| 1503 __ subl(left, Immediate(imm)); | 1497 __ subl(left, Immediate(imm)); |
| 1504 __ j(OVERFLOW, deopt); | 1498 if (deopt != NULL) __ j(OVERFLOW, deopt); |
| 1505 break; | 1499 break; |
| 1506 } | 1500 } |
| 1507 case Token::kMUL: { | 1501 case Token::kMUL: { |
| 1508 // Keep left value tagged and untag right value. | 1502 // Keep left value tagged and untag right value. |
| 1509 const intptr_t value = Smi::Cast(constant).Value(); | 1503 const intptr_t value = Smi::Cast(constant).Value(); |
| 1510 __ imull(left, Immediate(value)); | 1504 __ imull(left, Immediate(value)); |
| 1511 __ j(OVERFLOW, deopt); | 1505 if (deopt != NULL) __ j(OVERFLOW, deopt); |
| 1512 break; | 1506 break; |
| 1513 } | 1507 } |
| 1514 case Token::kBIT_AND: { | 1508 case Token::kBIT_AND: { |
| 1515 // No overflow check. | 1509 // No overflow check. |
| 1516 __ andl(left, Immediate(imm)); | 1510 __ andl(left, Immediate(imm)); |
| 1517 break; | 1511 break; |
| 1518 } | 1512 } |
| 1519 case Token::kBIT_OR: { | 1513 case Token::kBIT_OR: { |
| 1520 // No overflow check. | 1514 // No overflow check. |
| 1521 __ orl(left, Immediate(imm)); | 1515 __ orl(left, Immediate(imm)); |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 1552 UNREACHABLE(); | 1546 UNREACHABLE(); |
| 1553 break; | 1547 break; |
| 1554 } | 1548 } |
| 1555 return; | 1549 return; |
| 1556 } | 1550 } |
| 1557 | 1551 |
| 1558 Register right = locs()->in(1).reg(); | 1552 Register right = locs()->in(1).reg(); |
| 1559 switch (op_kind()) { | 1553 switch (op_kind()) { |
| 1560 case Token::kADD: { | 1554 case Token::kADD: { |
| 1561 __ addl(left, right); | 1555 __ addl(left, right); |
| 1562 __ j(OVERFLOW, deopt); | 1556 if (deopt != NULL) __ j(OVERFLOW, deopt); |
| 1563 break; | 1557 break; |
| 1564 } | 1558 } |
| 1565 case Token::kSUB: { | 1559 case Token::kSUB: { |
| 1566 __ subl(left, right); | 1560 __ subl(left, right); |
| 1567 __ j(OVERFLOW, deopt); | 1561 if (deopt != NULL) __ j(OVERFLOW, deopt); |
| 1568 break; | 1562 break; |
| 1569 } | 1563 } |
| 1570 case Token::kMUL: { | 1564 case Token::kMUL: { |
| 1571 __ SmiUntag(left); | 1565 __ SmiUntag(left); |
| 1572 __ imull(left, right); | 1566 __ imull(left, right); |
| 1573 __ j(OVERFLOW, deopt); | 1567 __ j(OVERFLOW, deopt); |
|
Florian Schneider
2012/09/21 08:56:44
if (deopt != NULL) __ j(OVERFLOW, deopt);
Vyacheslav Egorov (Google)
2012/09/21 20:08:07
Done.
| |
| 1574 break; | 1568 break; |
| 1575 } | 1569 } |
| 1576 case Token::kBIT_AND: { | 1570 case Token::kBIT_AND: { |
| 1577 // No overflow check. | 1571 // No overflow check. |
| 1578 __ andl(left, right); | 1572 __ andl(left, right); |
| 1579 break; | 1573 break; |
| 1580 } | 1574 } |
| 1581 case Token::kBIT_OR: { | 1575 case Token::kBIT_OR: { |
| 1582 // No overflow check. | 1576 // No overflow check. |
| 1583 __ orl(left, right); | 1577 __ orl(left, right); |
| (...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2225 __ j(ABOVE_EQUAL, deopt); | 2219 __ j(ABOVE_EQUAL, deopt); |
| 2226 } | 2220 } |
| 2227 } | 2221 } |
| 2228 | 2222 |
| 2229 | 2223 |
| 2230 } // namespace dart | 2224 } // namespace dart |
| 2231 | 2225 |
| 2232 #undef __ | 2226 #undef __ |
| 2233 | 2227 |
| 2234 #endif // defined TARGET_ARCH_X64 | 2228 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |