Tweaked FlooringDiv back to TruncatingDiv again.
authorsvenpanne@chromium.org <svenpanne@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 19 Mar 2014 07:01:08 +0000 (07:01 +0000)
committersvenpanne@chromium.org <svenpanne@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 19 Mar 2014 07:01:08 +0000 (07:01 +0000)
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

12 files changed:
src/a64/lithium-codegen-a64.cc
src/a64/macro-assembler-a64.cc
src/a64/macro-assembler-a64.h
src/arm/lithium-codegen-arm.cc
src/arm/macro-assembler-arm.cc
src/arm/macro-assembler-arm.h
src/ia32/lithium-codegen-ia32.cc
src/ia32/macro-assembler-ia32.cc
src/ia32/macro-assembler-ia32.h
src/x64/lithium-codegen-x64.cc
src/x64/macro-assembler-x64.cc
src/x64/macro-assembler-x64.h

index 18e353b..eabd0e2 100644 (file)
@@ -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());
index 8a9bd61..1fad909 100644 (file)
@@ -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));
 }
 
 
index c616dd8..ecc4a0c 100644 (file)
@@ -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
index 7b1c537..0ff60dc 100644 (file)
@@ -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 30ba6c2..f7d4dcd 100644 (file)
@@ -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 b80f96a..6b6ecd3 100644 (file)
@@ -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 7d62d5c..95fba8c 100644 (file)
@@ -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 ae6b50c..4682b37 100644 (file)
@@ -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 863d778..d2c5c7c 100644 (file)
@@ -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 10f8e0e..7d0d577 100644 (file)
@@ -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 6b84b0b..fe65f94 100644 (file)
@@ -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 90d9f52..d5a028c 100644 (file)
@@ -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