| Index: src/mips/lithium-codegen-mips.cc
 | 
| diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc
 | 
| index c7e2a43af276e9d0d04f0f5219e0fec8d453512a..b5102a4a1a73a184d6a44dcbc34f6a5ed1e61d4e 100644
 | 
| --- a/src/mips/lithium-codegen-mips.cc
 | 
| +++ b/src/mips/lithium-codegen-mips.cc
 | 
| @@ -1132,108 +1132,6 @@ void LCodeGen::DoModI(LModI* instr) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void LCodeGen::EmitSignedIntegerDivisionByConstant(
 | 
| -    Register result,
 | 
| -    Register dividend,
 | 
| -    int32_t divisor,
 | 
| -    Register remainder,
 | 
| -    Register scratch,
 | 
| -    LEnvironment* environment) {
 | 
| -  ASSERT(!AreAliased(dividend, scratch, at, no_reg));
 | 
| -
 | 
| -  uint32_t divisor_abs = abs(divisor);
 | 
| -
 | 
| -  int32_t power_of_2_factor =
 | 
| -    CompilerIntrinsics::CountTrailingZeros(divisor_abs);
 | 
| -
 | 
| -  switch (divisor_abs) {
 | 
| -    case 0:
 | 
| -      DeoptimizeIf(al, environment);
 | 
| -      return;
 | 
| -
 | 
| -    case 1:
 | 
| -      if (divisor > 0) {
 | 
| -        __ Move(result, dividend);
 | 
| -      } else {
 | 
| -        __ SubuAndCheckForOverflow(result, zero_reg, dividend, scratch);
 | 
| -        DeoptimizeIf(lt, environment, scratch, Operand(zero_reg));
 | 
| -      }
 | 
| -      // Compute the remainder.
 | 
| -      __ Move(remainder, zero_reg);
 | 
| -      return;
 | 
| -
 | 
| -    default:
 | 
| -      if (IsPowerOf2(divisor_abs)) {
 | 
| -        // Branch and condition free code for integer division by a power
 | 
| -        // of two.
 | 
| -        int32_t power = WhichPowerOf2(divisor_abs);
 | 
| -        if (power > 1) {
 | 
| -          __ sra(scratch, dividend, power - 1);
 | 
| -        }
 | 
| -        __ srl(scratch, scratch, 32 - power);
 | 
| -        __ Addu(scratch, dividend, Operand(scratch));
 | 
| -        __ sra(result, scratch,  power);
 | 
| -        // Negate if necessary.
 | 
| -        // We don't need to check for overflow because the case '-1' is
 | 
| -        // handled separately.
 | 
| -        if (divisor < 0) {
 | 
| -          ASSERT(divisor != -1);
 | 
| -          __ Subu(result, zero_reg, Operand(result));
 | 
| -        }
 | 
| -        // Compute the remainder.
 | 
| -        if (divisor > 0) {
 | 
| -          __ sll(scratch, result, power);
 | 
| -          __ Subu(remainder, dividend, Operand(scratch));
 | 
| -        } else {
 | 
| -          __ sll(scratch, result, power);
 | 
| -          __ Addu(remainder, dividend, Operand(scratch));
 | 
| -        }
 | 
| -        return;
 | 
| -      } else if (LChunkBuilder::HasMagicNumberForDivisor(divisor)) {
 | 
| -        // Use magic numbers for a few specific divisors.
 | 
| -        // Details and proofs can be found in:
 | 
| -        // - Hacker's Delight, Henry S. Warren, Jr.
 | 
| -        // - The PowerPC Compiler Writer's Guide
 | 
| -        // and probably many others.
 | 
| -        //
 | 
| -        // We handle
 | 
| -        //   <divisor with magic numbers> * <power of 2>
 | 
| -        // but not
 | 
| -        //   <divisor with magic numbers> * <other divisor with magic numbers>
 | 
| -        DivMagicNumbers magic_numbers =
 | 
| -          DivMagicNumberFor(divisor_abs >> power_of_2_factor);
 | 
| -        // Branch and condition free code for integer division by a power
 | 
| -        // of two.
 | 
| -        const int32_t M = magic_numbers.M;
 | 
| -        const int32_t s = magic_numbers.s + power_of_2_factor;
 | 
| -
 | 
| -        __ li(scratch, Operand(M));
 | 
| -        __ mult(dividend, scratch);
 | 
| -        __ mfhi(scratch);
 | 
| -        if (M < 0) {
 | 
| -          __ Addu(scratch, scratch, Operand(dividend));
 | 
| -        }
 | 
| -        if (s > 0) {
 | 
| -          __ sra(scratch, scratch, s);
 | 
| -          __ mov(scratch, scratch);
 | 
| -        }
 | 
| -        __ srl(at, dividend, 31);
 | 
| -        __ Addu(result, scratch, Operand(at));
 | 
| -        if (divisor < 0) __ Subu(result, zero_reg, Operand(result));
 | 
| -        // Compute the remainder.
 | 
| -        __ li(scratch, Operand(divisor));
 | 
| -        __ Mul(scratch, result, Operand(scratch));
 | 
| -        __ Subu(remainder, dividend, Operand(scratch));
 | 
| -      } else {
 | 
| -        __ li(scratch, Operand(divisor));
 | 
| -        __ div(dividend, scratch);
 | 
| -        __ mfhi(remainder);
 | 
| -        __ mflo(result);
 | 
| -      }
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -
 | 
|  void LCodeGen::DoDivI(LDivI* instr) {
 | 
|    const Register left = ToRegister(instr->left());
 | 
|    const Register right = ToRegister(instr->right());
 | 
| @@ -1284,33 +1182,66 @@ void LCodeGen::DoMultiplyAddD(LMultiplyAddD* instr) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void LCodeGen::DoFlooringDivByConstI(LFlooringDivByConstI* instr) {
 | 
| -  Register left = ToRegister(instr->dividend());
 | 
| -  Register remainder = ToRegister(instr->temp());
 | 
| +void LCodeGen::DoFlooringDivByPowerOf2I(LFlooringDivByPowerOf2I* instr) {
 | 
| +  Register dividend = ToRegister(instr->dividend());
 | 
| +  int32_t divisor = instr->divisor();
 | 
| +  ASSERT(dividend.is(ToRegister(instr->result())));
 | 
|    Register scratch = scratch0();
 | 
| -  Register result = ToRegister(instr->result());
 | 
|  
 | 
| -  ASSERT(instr->divisor()->IsConstantOperand());
 | 
| -  Label done;
 | 
| -  int32_t divisor = ToInteger32(LConstantOperand::cast(instr->divisor()));
 | 
| -  if (divisor < 0) {
 | 
| -    DeoptimizeIf(eq, instr->environment(), left, Operand(zero_reg));
 | 
| -  }
 | 
| -  EmitSignedIntegerDivisionByConstant(result,
 | 
| -                                      left,
 | 
| -                                      divisor,
 | 
| -                                      remainder,
 | 
| -                                      scratch,
 | 
| -                                      instr->environment());
 | 
| -  // We performed a truncating division. Correct the result if necessary.
 | 
| -  __ Branch(&done, eq, remainder, Operand(zero_reg), USE_DELAY_SLOT);
 | 
| -  __ Xor(scratch , remainder, Operand(divisor));
 | 
| -  __ Branch(&done, ge, scratch, Operand(zero_reg));
 | 
| -  __ Subu(result, result, Operand(1));
 | 
| +  // If the divisor is positive, things are easy: There can be no deopts and we
 | 
| +  // can simply do an arithmetic right shift.
 | 
| +  if (divisor == 1) return;
 | 
| +  uint16_t shift = WhichPowerOf2Abs(divisor);
 | 
| +  if (divisor > 1) {
 | 
| +    __ sra(dividend, dividend, shift);
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  // If the divisor is negative, we have to negate and handle edge cases.
 | 
| +  Label not_kmin_int, done;
 | 
| +  __ Subu(scratch, zero_reg, dividend);
 | 
| +  if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) {
 | 
| +    DeoptimizeIf(eq, instr->environment(), scratch, Operand(zero_reg));
 | 
| +  }
 | 
| +  if (instr->hydrogen()->left()->RangeCanInclude(kMinInt)) {
 | 
| +    // Note that we could emit branch-free code, but that would need one more
 | 
| +    // register.
 | 
| +    __ Branch(¬_kmin_int, ne, dividend, Operand(kMinInt));
 | 
| +    if (divisor == -1) {
 | 
| +      DeoptimizeIf(al, instr->environment());
 | 
| +    } else {
 | 
| +      __ li(dividend, Operand(kMinInt / divisor));
 | 
| +      __ Branch(&done);
 | 
| +    }
 | 
| +  }
 | 
| +  __ bind(¬_kmin_int);
 | 
| +  __ sra(dividend, scratch, shift);
 | 
|    __ bind(&done);
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void LCodeGen::DoFlooringDivByConstI(LFlooringDivByConstI* instr) {
 | 
| +  Register dividend = ToRegister(instr->dividend());
 | 
| +  int32_t divisor = instr->divisor();
 | 
| +  Register result = ToRegister(instr->result());
 | 
| +  ASSERT(!dividend.is(result));
 | 
| +
 | 
| +  if (divisor == 0) {
 | 
| +    DeoptimizeIf(al, instr->environment());
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  // Check for (0 / -x) that will produce negative zero.
 | 
| +  HMathFloorOfDiv* hdiv = instr->hydrogen();
 | 
| +  if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) &&
 | 
| +      hdiv->left()->RangeCanInclude(0) && divisor < 0) {
 | 
| +    DeoptimizeIf(eq, instr->environment(), dividend, Operand(zero_reg));
 | 
| +  }
 | 
| +
 | 
| +  __ FlooringDiv(result, dividend, divisor);
 | 
| +}
 | 
| +
 | 
| +
 | 
|  void LCodeGen::DoMathFloorOfDiv(LMathFloorOfDiv* instr) {
 | 
|    const Register result = ToRegister(instr->result());
 | 
|    const Register left = ToRegister(instr->left());
 | 
| 
 |