Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1642 ASSERT(right->IsRegister() || right->IsConstantOperand()); | 1642 ASSERT(right->IsRegister() || right->IsConstantOperand()); |
| 1643 __ add(ToRegister(result), ToRegister(left), ToOperand(right), set_cond); | 1643 __ add(ToRegister(result), ToRegister(left), ToOperand(right), set_cond); |
| 1644 } | 1644 } |
| 1645 | 1645 |
| 1646 if (can_overflow) { | 1646 if (can_overflow) { |
| 1647 DeoptimizeIf(vs, instr->environment()); | 1647 DeoptimizeIf(vs, instr->environment()); |
| 1648 } | 1648 } |
| 1649 } | 1649 } |
| 1650 | 1650 |
| 1651 | 1651 |
| 1652 void LCodeGen::DoMathMinMax(LMathMinMax* instr) { | |
| 1653 LOperand* left = instr->InputAt(0); | |
| 1654 LOperand* right = instr->InputAt(1); | |
| 1655 HMathMinMax::Operation operation = instr->hydrogen()->operation(); | |
| 1656 Condition condition = (operation == HMathMinMax::kMathMin) ? le : ge; | |
| 1657 if (instr->hydrogen()->representation().IsInteger32()) { | |
| 1658 Register left_reg = ToRegister(left); | |
| 1659 Operand right_op = (right->IsRegister() || right->IsConstantOperand()) | |
| 1660 ? ToOperand(right) | |
| 1661 : Operand(EmitLoadRegister(right, ip)); | |
| 1662 Register result_reg = ToRegister(instr->result()); | |
| 1663 __ cmp(left_reg, right_op); | |
| 1664 if (!result_reg.is(left_reg)) { | |
| 1665 __ mov(result_reg, left_reg, LeaveCC, condition); | |
| 1666 } | |
| 1667 __ mov(result_reg, right_op, LeaveCC, NegateCondition(condition)); | |
| 1668 } else { | |
| 1669 ASSERT(instr->hydrogen()->representation().IsDouble()); | |
| 1670 DoubleRegister left_reg = ToDoubleRegister(left); | |
| 1671 DoubleRegister right_reg = ToDoubleRegister(right); | |
| 1672 DoubleRegister result_reg = ToDoubleRegister(instr->result()); | |
| 1673 Label check_nan_left, check_zero, return_left, return_right, done; | |
| 1674 __ VFPCompareAndSetFlags(left_reg, right_reg); | |
| 1675 __ b(vs, &check_nan_left); | |
| 1676 __ b(eq, &check_zero); | |
| 1677 __ b(condition, &return_left); | |
| 1678 __ b(al, &return_right); | |
| 1679 | |
| 1680 __ bind(&check_zero); | |
| 1681 __ VFPCompareAndSetFlags(left_reg, 0.0); | |
| 1682 __ b(ne, &return_left); // left == right != 0. | |
| 1683 // At this point, both left and right are either 0 or -0. | |
| 1684 if (operation == HMathMinMax::kMathMin) { | |
| 1685 __ vorr(result_reg, left_reg, right_reg); | |
| 1686 } else { | |
| 1687 __ vadd(result_reg, left_reg, right_reg); | |
|
Erik Corry
2012/08/06 10:44:40
Should this be vand?
Yang
2012/08/06 10:50:41
I think vadd would work equally well here:
-0 + -0
Jakob Kummerow
2012/08/06 14:08:43
Added a comment explaining why "vadd" is not a typ
| |
| 1688 } | |
| 1689 __ b(al, &done); | |
| 1690 | |
| 1691 __ bind(&check_nan_left); | |
| 1692 __ VFPCompareAndSetFlags(left_reg, left_reg); | |
| 1693 __ b(vs, &return_left); // left == NaN. | |
| 1694 __ bind(&return_right); | |
| 1695 if (!right_reg.is(result_reg)) { | |
| 1696 __ vmov(result_reg, right_reg); | |
| 1697 } | |
| 1698 __ b(al, &done); | |
| 1699 | |
| 1700 __ bind(&return_left); | |
| 1701 if (!left_reg.is(result_reg)) { | |
| 1702 __ vmov(result_reg, left_reg); | |
| 1703 } | |
| 1704 __ bind(&done); | |
| 1705 } | |
| 1706 } | |
| 1707 | |
| 1708 | |
| 1652 void LCodeGen::DoArithmeticD(LArithmeticD* instr) { | 1709 void LCodeGen::DoArithmeticD(LArithmeticD* instr) { |
| 1653 DoubleRegister left = ToDoubleRegister(instr->InputAt(0)); | 1710 DoubleRegister left = ToDoubleRegister(instr->InputAt(0)); |
| 1654 DoubleRegister right = ToDoubleRegister(instr->InputAt(1)); | 1711 DoubleRegister right = ToDoubleRegister(instr->InputAt(1)); |
| 1655 DoubleRegister result = ToDoubleRegister(instr->result()); | 1712 DoubleRegister result = ToDoubleRegister(instr->result()); |
| 1656 switch (instr->op()) { | 1713 switch (instr->op()) { |
| 1657 case Token::ADD: | 1714 case Token::ADD: |
| 1658 __ vadd(result, left, right); | 1715 __ vadd(result, left, right); |
| 1659 break; | 1716 break; |
| 1660 case Token::SUB: | 1717 case Token::SUB: |
| 1661 __ vsub(result, left, right); | 1718 __ vsub(result, left, right); |
| (...skipping 3802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5464 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); | 5521 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); |
| 5465 __ ldr(result, FieldMemOperand(scratch, | 5522 __ ldr(result, FieldMemOperand(scratch, |
| 5466 FixedArray::kHeaderSize - kPointerSize)); | 5523 FixedArray::kHeaderSize - kPointerSize)); |
| 5467 __ bind(&done); | 5524 __ bind(&done); |
| 5468 } | 5525 } |
| 5469 | 5526 |
| 5470 | 5527 |
| 5471 #undef __ | 5528 #undef __ |
| 5472 | 5529 |
| 5473 } } // namespace v8::internal | 5530 } } // namespace v8::internal |
| OLD | NEW |