From: svenpanne@chromium.org Date: Wed, 19 Mar 2014 07:01:08 +0000 (+0000) Subject: Tweaked FlooringDiv back to TruncatingDiv again. X-Git-Tag: upstream/4.7.83~10184 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1a6f977d6aadc16a1a204371fa36bfe19a1cb313;p=platform%2Fupstream%2Fv8.git Tweaked FlooringDiv back to TruncatingDiv again. This is a first step towards getting the flooring division by a constant working again (which will be a separate CL). R=bmeurer@chromium.org Review URL: https://codereview.chromium.org/197873029 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20048 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/a64/lithium-codegen-a64.cc b/src/a64/lithium-codegen-a64.cc index 18e353b..eabd0e2 100644 --- a/src/a64/lithium-codegen-a64.cc +++ b/src/a64/lithium-codegen-a64.cc @@ -2679,8 +2679,7 @@ void LCodeGen::DoDivByConstI(LDivByConstI* instr) { 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)) { @@ -3895,7 +3894,8 @@ void LCodeGen::DoFlooringDivByConstI(LFlooringDivByConstI* instr) { DeoptimizeIf(eq, instr->environment()); } - __ FlooringDiv(result, dividend, divisor); + // TODO(svenpanne) Add correction terms. + __ TruncatingDiv(result, dividend, divisor); } @@ -4168,8 +4168,7 @@ void LCodeGen::DoModByConstI(LModByConstI* instr) { 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()); diff --git a/src/a64/macro-assembler-a64.cc b/src/a64/macro-assembler-a64.cc index 8a9bd61..1fad909 100644 --- a/src/a64/macro-assembler-a64.cc +++ b/src/a64/macro-assembler-a64.cc @@ -5072,9 +5072,9 @@ bool MacroAssembler::IsCodeAgeSequence(byte* sequence) { #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); @@ -5084,6 +5084,7 @@ void MacroAssembler::FlooringDiv(Register result, 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)); } diff --git a/src/a64/macro-assembler-a64.h b/src/a64/macro-assembler-a64.h index c616dd8..ecc4a0c 100644 --- a/src/a64/macro-assembler-a64.h +++ b/src/a64/macro-assembler-a64.h @@ -1692,9 +1692,9 @@ class MacroAssembler : public Assembler { 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 diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index 7b1c537..0ff60dc 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -1161,8 +1161,7 @@ void LCodeGen::DoModByConstI(LModByConstI* instr) { 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); @@ -1349,8 +1348,7 @@ void LCodeGen::DoDivByConstI(LDivByConstI* instr) { 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)) { @@ -1509,7 +1507,8 @@ void LCodeGen::DoFlooringDivByConstI(LFlooringDivByConstI* instr) { DeoptimizeIf(eq, instr->environment()); } - __ FlooringDiv(result, dividend, divisor); + // TODO(svenpanne) Add correction terms. + __ TruncatingDiv(result, dividend, divisor); } diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index 30ba6c2..f7d4dcd 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -4055,9 +4055,9 @@ void CodePatcher::EmitCondition(Condition cond) { } -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)); @@ -4071,6 +4071,7 @@ void MacroAssembler::FlooringDiv(Register result, sub(result, result, Operand(dividend)); } if (ms.shift() > 0) mov(result, Operand(result, ASR, ms.shift())); + add(result, result, Operand(dividend, LSR, 31)); } diff --git a/src/arm/macro-assembler-arm.h b/src/arm/macro-assembler-arm.h index b80f96a..6b6ecd3 100644 --- a/src/arm/macro-assembler-arm.h +++ b/src/arm/macro-assembler-arm.h @@ -1152,9 +1152,9 @@ class MacroAssembler: public Assembler { } - // 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 diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc index 7d62d5c..95fba8c 100644 --- a/src/ia32/lithium-codegen-ia32.cc +++ b/src/ia32/lithium-codegen-ia32.cc @@ -1414,10 +1414,7 @@ void LCodeGen::DoModByConstI(LModByConstI* instr) { 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); @@ -1544,10 +1541,7 @@ void LCodeGen::DoDivByConstI(LDivByConstI* instr) { 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)) { @@ -1671,7 +1665,8 @@ void LCodeGen::DoFlooringDivByConstI(LFlooringDivByConstI* instr) { DeoptimizeIf(zero, instr->environment()); } - __ FlooringDiv(dividend, divisor); + // TODO(svenpanne) Add correction terms. + __ TruncatingDiv(dividend, divisor); } diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc index ae6b50c..4682b37 100644 --- a/src/ia32/macro-assembler-ia32.cc +++ b/src/ia32/macro-assembler-ia32.cc @@ -3627,7 +3627,7 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain( } -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); @@ -3636,6 +3636,9 @@ void MacroAssembler::FlooringDiv(Register dividend, int32_t 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); } diff --git a/src/ia32/macro-assembler-ia32.h b/src/ia32/macro-assembler-ia32.h index 863d778..d2c5c7c 100644 --- a/src/ia32/macro-assembler-ia32.h +++ b/src/ia32/macro-assembler-ia32.h @@ -862,9 +862,9 @@ class MacroAssembler: public Assembler { // 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 diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index 10f8e0e..7d0d577 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -1033,10 +1033,7 @@ void LCodeGen::DoModByConstI(LModByConstI* instr) { 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); @@ -1163,7 +1160,8 @@ void LCodeGen::DoFlooringDivByConstI(LFlooringDivByConstI* instr) { DeoptimizeIf(zero, instr->environment()); } - __ FlooringDiv(dividend, divisor); + // TODO(svenpanne) Add correction terms. + __ TruncatingDiv(dividend, divisor); } @@ -1222,10 +1220,7 @@ void LCodeGen::DoDivByConstI(LDivByConstI* instr) { 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)) { diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc index 6b84b0b..fe65f94 100644 --- a/src/x64/macro-assembler-x64.cc +++ b/src/x64/macro-assembler-x64.cc @@ -4992,7 +4992,7 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain( } -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); @@ -5001,6 +5001,9 @@ void MacroAssembler::FlooringDiv(Register dividend, int32_t 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); } diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h index 90d9f52..d5a028c 100644 --- a/src/x64/macro-assembler-x64.h +++ b/src/x64/macro-assembler-x64.h @@ -1367,9 +1367,9 @@ class MacroAssembler: public Assembler { 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