| Index: src/compiler/machine-operator-reducer.cc
|
| diff --git a/src/compiler/machine-operator-reducer.cc b/src/compiler/machine-operator-reducer.cc
|
| index 9b0c2b2f34222dc9c4da0928bf6b04b784224518..b7142a5f509d52907430928c226cedfdd468ed20 100644
|
| --- a/src/compiler/machine-operator-reducer.cc
|
| +++ b/src/compiler/machine-operator-reducer.cc
|
| @@ -104,8 +104,14 @@ Node* MachineOperatorReducer::Int32Div(Node* dividend, int32_t divisor) {
|
|
|
| Node* MachineOperatorReducer::Uint32Div(Node* dividend, uint32_t divisor) {
|
| DCHECK_LT(0, divisor);
|
| + // If the divisor is even, we can avoid using the expensive fixup by shifting
|
| + // the dividend upfront.
|
| + unsigned const shift = base::bits::CountTrailingZeros32(divisor);
|
| + dividend = Word32Shr(dividend, shift);
|
| + divisor >>= shift;
|
| + // Compute the magic number for the (shifted) divisor.
|
| base::MagicNumbersForDivision<uint32_t> const mag =
|
| - base::UnsignedDivisionByConstant(bit_cast<uint32_t>(divisor));
|
| + base::UnsignedDivisionByConstant(divisor, shift);
|
| Node* quotient = graph()->NewNode(machine()->Uint32MulHigh(), dividend,
|
| Uint32Constant(mag.multiplier));
|
| if (mag.add) {
|
|
|