Commit ca741a0b authored by bmeurer's avatar bmeurer Committed by Commit bot

[turbofan] Avoid expensive fixup for Uint32Div if divisor is even.

R=dcarney@chromium.org

Review URL: https://codereview.chromium.org/840813008

Cr-Commit-Position: refs/heads/master@{#26036}
parent bcab9eac
...@@ -104,8 +104,14 @@ Node* MachineOperatorReducer::Int32Div(Node* dividend, int32_t divisor) { ...@@ -104,8 +104,14 @@ Node* MachineOperatorReducer::Int32Div(Node* dividend, int32_t divisor) {
Node* MachineOperatorReducer::Uint32Div(Node* dividend, uint32_t divisor) { Node* MachineOperatorReducer::Uint32Div(Node* dividend, uint32_t divisor) {
DCHECK_LT(0, 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::MagicNumbersForDivision<uint32_t> const mag =
base::UnsignedDivisionByConstant(bit_cast<uint32_t>(divisor)); base::UnsignedDivisionByConstant(divisor, shift);
Node* quotient = graph()->NewNode(machine()->Uint32MulHigh(), dividend, Node* quotient = graph()->NewNode(machine()->Uint32MulHigh(), dividend,
Uint32Constant(mag.multiplier)); Uint32Constant(mag.multiplier));
if (mag.add) { if (mag.add) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment