Reviewers: Benedikt Meurer,
Description:
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).
Please review this at https://codereview.chromium.org/197873029/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+40, -44 lines):
M src/a64/lithium-codegen-a64.cc
M src/a64/macro-assembler-a64.h
M src/a64/macro-assembler-a64.cc
M src/arm/lithium-codegen-arm.cc
M src/arm/macro-assembler-arm.h
M src/arm/macro-assembler-arm.cc
M src/ia32/lithium-codegen-ia32.cc
M src/ia32/macro-assembler-ia32.h
M src/ia32/macro-assembler-ia32.cc
M src/x64/lithium-codegen-x64.cc
M src/x64/macro-assembler-x64.h
M src/x64/macro-assembler-x64.cc
Index: src/a64/lithium-codegen-a64.cc
diff --git a/src/a64/lithium-codegen-a64.cc b/src/a64/lithium-codegen-a64.cc
index
6c29abdcff467eaf2cfa923d92ce7438ae20195d..bd714939564fedd839ee198279ba81066af07b63
100644
--- a/src/a64/lithium-codegen-a64.cc
+++ b/src/a64/lithium-codegen-a64.cc
@@ -2675,8 +2675,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)) {
@@ -3891,7 +3890,8 @@ void
LCodeGen::DoFlooringDivByConstI(LFlooringDivByConstI* instr) {
DeoptimizeIf(eq, instr->environment());
}
- __ FlooringDiv(result, dividend, divisor);
+ // TODO(svenpanne) Add correction terms.
+ __ TruncatingDiv(result, dividend, divisor);
}
@@ -4164,8 +4164,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());
Index: src/a64/macro-assembler-a64.cc
diff --git a/src/a64/macro-assembler-a64.cc b/src/a64/macro-assembler-a64.cc
index
ca61b491632fa523ee997f33c90e577d908bfe7f..e501f74f5831d63a79421e44c97fdca3026c8854
100644
--- a/src/a64/macro-assembler-a64.cc
+++ b/src/a64/macro-assembler-a64.cc
@@ -5051,9 +5051,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);
@@ -5063,6 +5063,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));
}
Index: src/a64/macro-assembler-a64.h
diff --git a/src/a64/macro-assembler-a64.h b/src/a64/macro-assembler-a64.h
index
bbc573aad866ed5c09b3e7cc7e598c600d35f066..1d5d8ecf8ed5c55ae8bab68ed3053c476503670f
100644
--- a/src/a64/macro-assembler-a64.h
+++ b/src/a64/macro-assembler-a64.h
@@ -1700,9 +1700,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
Index: src/arm/lithium-codegen-arm.cc
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc
index
2a1525810ee8eb14801d27301f96dde9cbc5dd15..7e145382d16b4cd8780d3ed0e7fe170a826e4de0
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);
}
Index: src/arm/macro-assembler-arm.cc
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc
index
30ba6c2085c5d3bf950685238dd9eee6ff835e6e..f7d4dcd566eb066812681fe9f206168910d156e4
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));
}
Index: src/arm/macro-assembler-arm.h
diff --git a/src/arm/macro-assembler-arm.h b/src/arm/macro-assembler-arm.h
index
b80f96a4581478bb754a40f9136a66452a336724..6b6ecd32da13d12610a5edbfb7a3ff21e2f06c96
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
Index: src/ia32/lithium-codegen-ia32.cc
diff --git a/src/ia32/lithium-codegen-ia32.cc
b/src/ia32/lithium-codegen-ia32.cc
index
36e876dc22c19841d27f87bdadb9adf8df6c2f14..87f1ab70cf643f01b964513204474ba4e9b6cfdd
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);
}
Index: src/ia32/macro-assembler-ia32.cc
diff --git a/src/ia32/macro-assembler-ia32.cc
b/src/ia32/macro-assembler-ia32.cc
index
ae6b50c92fdde011c547a5c37e0ad15dc6723dc1..4682b37b16e409c23b9e962f326198fd66d183a8
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);
}
Index: src/ia32/macro-assembler-ia32.h
diff --git a/src/ia32/macro-assembler-ia32.h
b/src/ia32/macro-assembler-ia32.h
index
863d778c9ced359b4bffb24d0ef138eab5fe08f9..d2c5c7c78ffb4c1fe7cbfae342849e75bd91b69a
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
Index: src/x64/lithium-codegen-x64.cc
diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
index
332c2ee31f027d8a0b78b9085b733c14942a796c..c868b9d2251112cff76785c9e904d4f4ca7a6e5a
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)) {
Index: src/x64/macro-assembler-x64.cc
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
index
6b84b0bc1aad2a8377890cc09140d7e0eec7fca9..fe65f9454232aa4c17ab9f936206a454d4b68d8f
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);
}
Index: src/x64/macro-assembler-x64.h
diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h
index
90d9f52850eb5b0c35dc41982dae02736c593f9f..d5a028c8409d088c260783ff50bd022d3829a11e
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
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.