| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/machine-operator-reducer.h" | 5 #include "src/compiler/machine-operator-reducer.h" |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/base/division-by-constant.h" | 8 #include "src/base/division-by-constant.h" |
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/compiler/diamond.h" | 10 #include "src/compiler/diamond.h" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 if (divisor > 0 && bit_cast<int32_t>(mag.multiplier) < 0) { | 96 if (divisor > 0 && bit_cast<int32_t>(mag.multiplier) < 0) { |
| 97 quotient = Int32Add(quotient, dividend); | 97 quotient = Int32Add(quotient, dividend); |
| 98 } else if (divisor < 0 && bit_cast<int32_t>(mag.multiplier) > 0) { | 98 } else if (divisor < 0 && bit_cast<int32_t>(mag.multiplier) > 0) { |
| 99 quotient = Int32Sub(quotient, dividend); | 99 quotient = Int32Sub(quotient, dividend); |
| 100 } | 100 } |
| 101 return Int32Add(Word32Sar(quotient, mag.shift), Word32Shr(dividend, 31)); | 101 return Int32Add(Word32Sar(quotient, mag.shift), Word32Shr(dividend, 31)); |
| 102 } | 102 } |
| 103 | 103 |
| 104 | 104 |
| 105 Node* MachineOperatorReducer::Uint32Div(Node* dividend, uint32_t divisor) { | 105 Node* MachineOperatorReducer::Uint32Div(Node* dividend, uint32_t divisor) { |
| 106 DCHECK_LT(0, divisor); | 106 DCHECK_LT(0u, divisor); |
| 107 // If the divisor is even, we can avoid using the expensive fixup by shifting | 107 // If the divisor is even, we can avoid using the expensive fixup by shifting |
| 108 // the dividend upfront. | 108 // the dividend upfront. |
| 109 unsigned const shift = base::bits::CountTrailingZeros32(divisor); | 109 unsigned const shift = base::bits::CountTrailingZeros32(divisor); |
| 110 dividend = Word32Shr(dividend, shift); | 110 dividend = Word32Shr(dividend, shift); |
| 111 divisor >>= shift; | 111 divisor >>= shift; |
| 112 // Compute the magic number for the (shifted) divisor. | 112 // Compute the magic number for the (shifted) divisor. |
| 113 base::MagicNumbersForDivision<uint32_t> const mag = | 113 base::MagicNumbersForDivision<uint32_t> const mag = |
| 114 base::UnsignedDivisionByConstant(divisor, shift); | 114 base::UnsignedDivisionByConstant(divisor, shift); |
| 115 Node* quotient = graph()->NewNode(machine()->Uint32MulHigh(), dividend, | 115 Node* quotient = graph()->NewNode(machine()->Uint32MulHigh(), dividend, |
| 116 Uint32Constant(mag.multiplier)); | 116 Uint32Constant(mag.multiplier)); |
| 117 if (mag.add) { | 117 if (mag.add) { |
| 118 DCHECK_LE(1, mag.shift); | 118 DCHECK_LE(1u, mag.shift); |
| 119 quotient = Word32Shr( | 119 quotient = Word32Shr( |
| 120 Int32Add(Word32Shr(Int32Sub(dividend, quotient), 1), quotient), | 120 Int32Add(Word32Shr(Int32Sub(dividend, quotient), 1), quotient), |
| 121 mag.shift - 1); | 121 mag.shift - 1); |
| 122 } else { | 122 } else { |
| 123 quotient = Word32Shr(quotient, mag.shift); | 123 quotient = Word32Shr(quotient, mag.shift); |
| 124 } | 124 } |
| 125 return quotient; | 125 return quotient; |
| 126 } | 126 } |
| 127 | 127 |
| 128 | 128 |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 node->ReplaceInput(1, m.left().node()); | 513 node->ReplaceInput(1, m.left().node()); |
| 514 node->TrimInputCount(2); | 514 node->TrimInputCount(2); |
| 515 return Changed(node); | 515 return Changed(node); |
| 516 } | 516 } |
| 517 if (m.right().HasValue()) { | 517 if (m.right().HasValue()) { |
| 518 int32_t const divisor = m.right().Value(); | 518 int32_t const divisor = m.right().Value(); |
| 519 Node* const dividend = m.left().node(); | 519 Node* const dividend = m.left().node(); |
| 520 Node* quotient = dividend; | 520 Node* quotient = dividend; |
| 521 if (base::bits::IsPowerOfTwo32(Abs(divisor))) { | 521 if (base::bits::IsPowerOfTwo32(Abs(divisor))) { |
| 522 uint32_t const shift = WhichPowerOf2Abs(divisor); | 522 uint32_t const shift = WhichPowerOf2Abs(divisor); |
| 523 DCHECK_NE(0, shift); | 523 DCHECK_NE(0u, shift); |
| 524 if (shift > 1) { | 524 if (shift > 1) { |
| 525 quotient = Word32Sar(quotient, 31); | 525 quotient = Word32Sar(quotient, 31); |
| 526 } | 526 } |
| 527 quotient = Int32Add(Word32Shr(quotient, 32u - shift), dividend); | 527 quotient = Int32Add(Word32Shr(quotient, 32u - shift), dividend); |
| 528 quotient = Word32Sar(quotient, shift); | 528 quotient = Word32Sar(quotient, shift); |
| 529 } else { | 529 } else { |
| 530 quotient = Int32Div(quotient, Abs(divisor)); | 530 quotient = Int32Div(quotient, Abs(divisor)); |
| 531 } | 531 } |
| 532 if (divisor < 0) { | 532 if (divisor < 0) { |
| 533 node->set_op(machine()->Int32Sub()); | 533 node->set_op(machine()->Int32Sub()); |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 942 MachineOperatorBuilder* MachineOperatorReducer::machine() const { | 942 MachineOperatorBuilder* MachineOperatorReducer::machine() const { |
| 943 return jsgraph()->machine(); | 943 return jsgraph()->machine(); |
| 944 } | 944 } |
| 945 | 945 |
| 946 | 946 |
| 947 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } | 947 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } |
| 948 | 948 |
| 949 } // namespace compiler | 949 } // namespace compiler |
| 950 } // namespace internal | 950 } // namespace internal |
| 951 } // namespace v8 | 951 } // namespace v8 |
| OLD | NEW |