return;
}
- __ FlooringDiv(result, dividend, Abs(divisor));
- __ srl(at, dividend, 31);
- __ Addu(result, result, at);
+ __ TruncatingDiv(result, dividend, Abs(divisor));
__ Mul(result, result, Operand(Abs(divisor)));
__ Subu(result, dividend, Operand(result));
DeoptimizeIf(eq, instr->environment(), dividend, Operand(zero_reg));
}
- __ FlooringDiv(result, dividend, Abs(divisor));
- __ srl(at, dividend, 31);
- __ Addu(result, result, Operand(at));
+ __ TruncatingDiv(result, dividend, Abs(divisor));
if (divisor < 0) __ Subu(result, zero_reg, result);
if (!hdiv->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
DeoptimizeIf(eq, instr->environment(), dividend, Operand(zero_reg));
}
- __ FlooringDiv(result, dividend, divisor);
+ // TODO(svenpanne) Add correction terms.
+ __ TruncatingDiv(result, dividend, divisor);
}
}
-void MacroAssembler::FlooringDiv(Register result,
- Register dividend,
- int32_t divisor) {
+void MacroAssembler::TruncatingDiv(Register result,
+ Register dividend,
+ int32_t divisor) {
ASSERT(!dividend.is(result));
ASSERT(!dividend.is(at));
ASSERT(!result.is(at));
if (divisor < 0 && ms.multiplier() > 0) {
Subu(result, result, Operand(dividend));
}
- if (ms.shift() > 0) {
- sra(result, result, ms.shift());
- }
+ if (ms.shift() > 0) sra(result, result, ms.shift());
+ srl(at, dividend, 31);
+ Addu(result, result, Operand(at));
}
return code_object_;
}
- // Emit code for a flooring division by a constant. The dividend register is
+ // Emit code for a truncating division by a constant. The dividend register is
// unchanged and at gets clobbered. Dividend and result must be different.
- void FlooringDiv(Register result, Register dividend, int32_t divisor);
+ void TruncatingDiv(Register result, Register dividend, int32_t divisor);
// -------------------------------------------------------------------------
// StatsCounter support.