DeoptimizeIfZero(dividend, instr->environment());
}
- __ FlooringDiv(result, dividend, Abs(divisor));
- __ Add(result, result, Operand(dividend, LSR, 31));
+ __ TruncatingDiv(result, dividend, Abs(divisor));
if (divisor < 0) __ Neg(result, result);
if (!hdiv->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
DeoptimizeIf(eq, instr->environment());
}
- __ FlooringDiv(result, dividend, divisor);
+ // TODO(svenpanne) Add correction terms.
+ __ TruncatingDiv(result, dividend, divisor);
}
return;
}
- __ FlooringDiv(result, dividend, Abs(divisor));
- __ Add(result, result, Operand(dividend, LSR, 31));
+ __ TruncatingDiv(result, dividend, Abs(divisor));
__ Sxtw(dividend.X(), dividend);
__ Mov(temp, Abs(divisor));
__ Smsubl(result.X(), result, temp, dividend.X());
#endif
-void MacroAssembler::FlooringDiv(Register result,
- Register dividend,
- int32_t divisor) {
+void MacroAssembler::TruncatingDiv(Register result,
+ Register dividend,
+ int32_t divisor) {
ASSERT(!AreAliased(result, dividend));
ASSERT(result.Is32Bits() && dividend.Is32Bits());
MultiplierAndShift ms(divisor);
if (divisor > 0 && ms.multiplier() < 0) Add(result, result, dividend);
if (divisor < 0 && ms.multiplier() > 0) Sub(result, result, dividend);
if (ms.shift() > 0) Asr(result, result, ms.shift());
+ Add(result, result, Operand(dividend, LSR, 31));
}
void LoadContext(Register dst, int context_chain_length);
- // 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. 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
return;
}
- __ FlooringDiv(result, dividend, Abs(divisor));
- __ add(result, result, Operand(dividend, LSR, 31));
+ __ TruncatingDiv(result, dividend, Abs(divisor));
__ mov(ip, Operand(Abs(divisor)));
__ smull(result, ip, result, ip);
__ sub(result, dividend, result, SetCC);
DeoptimizeIf(eq, instr->environment());
}
- __ FlooringDiv(result, dividend, Abs(divisor));
- __ add(result, result, Operand(dividend, LSR, 31));
+ __ TruncatingDiv(result, dividend, Abs(divisor));
if (divisor < 0) __ rsb(result, result, Operand::Zero());
if (!hdiv->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
DeoptimizeIf(eq, instr->environment());
}
- __ 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(ip));
ASSERT(!result.is(ip));
sub(result, result, Operand(dividend));
}
if (ms.shift() > 0) mov(result, Operand(result, ASR, ms.shift()));
+ add(result, result, Operand(dividend, LSR, 31));
}
}
- // 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 ip 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
return;
}
- __ FlooringDiv(dividend, Abs(divisor));
- __ mov(eax, dividend);
- __ shr(eax, 31);
- __ add(edx, eax);
+ __ TruncatingDiv(dividend, Abs(divisor));
__ imul(edx, edx, Abs(divisor));
__ mov(eax, dividend);
__ sub(eax, edx);
DeoptimizeIf(zero, instr->environment());
}
- __ FlooringDiv(dividend, Abs(divisor));
- __ mov(eax, dividend);
- __ shr(eax, 31);
- __ add(edx, eax);
+ __ TruncatingDiv(dividend, Abs(divisor));
if (divisor < 0) __ neg(edx);
if (!hdiv->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
DeoptimizeIf(zero, instr->environment());
}
- __ FlooringDiv(dividend, divisor);
+ // TODO(svenpanne) Add correction terms.
+ __ TruncatingDiv(dividend, divisor);
}
}
-void MacroAssembler::FlooringDiv(Register dividend, int32_t divisor) {
+void MacroAssembler::TruncatingDiv(Register dividend, int32_t divisor) {
ASSERT(!dividend.is(eax));
ASSERT(!dividend.is(edx));
MultiplierAndShift ms(divisor);
if (divisor > 0 && ms.multiplier() < 0) add(edx, dividend);
if (divisor < 0 && ms.multiplier() > 0) sub(edx, dividend);
if (ms.shift() > 0) sar(edx, ms.shift());
+ mov(eax, dividend);
+ shr(eax, 31);
+ add(edx, eax);
}
// Insert code to verify that the x87 stack has the specified depth (0-7)
void VerifyX87StackDepth(uint32_t depth);
- // 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, the result is in edx, and eax gets clobbered.
- void FlooringDiv(Register dividend, int32_t divisor);
+ void TruncatingDiv(Register dividend, int32_t divisor);
// ---------------------------------------------------------------------------
// StatsCounter support
return;
}
- __ FlooringDiv(dividend, Abs(divisor));
- __ movl(rax, dividend);
- __ shrl(rax, Immediate(31));
- __ addl(rdx, rax);
+ __ TruncatingDiv(dividend, Abs(divisor));
__ imull(rdx, rdx, Immediate(Abs(divisor)));
__ movl(rax, dividend);
__ subl(rax, rdx);
DeoptimizeIf(zero, instr->environment());
}
- __ FlooringDiv(dividend, divisor);
+ // TODO(svenpanne) Add correction terms.
+ __ TruncatingDiv(dividend, divisor);
}
DeoptimizeIf(zero, instr->environment());
}
- __ FlooringDiv(dividend, Abs(divisor));
- __ movl(rax, dividend);
- __ shrl(rax, Immediate(31));
- __ addl(rdx, rax);
+ __ TruncatingDiv(dividend, Abs(divisor));
if (divisor < 0) __ neg(rdx);
if (!hdiv->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
}
-void MacroAssembler::FlooringDiv(Register dividend, int32_t divisor) {
+void MacroAssembler::TruncatingDiv(Register dividend, int32_t divisor) {
ASSERT(!dividend.is(rax));
ASSERT(!dividend.is(rdx));
MultiplierAndShift ms(divisor);
if (divisor > 0 && ms.multiplier() < 0) addl(rdx, dividend);
if (divisor < 0 && ms.multiplier() > 0) subl(rdx, dividend);
if (ms.shift() > 0) sarl(rdx, Immediate(ms.shift()));
+ movl(rax, dividend);
+ shrl(rax, Immediate(31));
+ addl(rdx, rax);
}
Register filler);
- // 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, the result is in rdx, and rax gets clobbered.
- void FlooringDiv(Register dividend, int32_t divisor);
+ void TruncatingDiv(Register dividend, int32_t divisor);
// ---------------------------------------------------------------------------
// StatsCounter support