Index: src/arm/macro-assembler-arm.cc |
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
index d705c90bd2edf62c953e2ea39449ada558b277e6..5ea6438a9fceb8aa0d4430422e92a3e889f56b85 100644 |
--- a/src/arm/macro-assembler-arm.cc |
+++ b/src/arm/macro-assembler-arm.cc |
@@ -4032,6 +4032,22 @@ void CodePatcher::EmitCondition(Condition cond) { |
} |
+void MacroAssembler::FlooringDiv(Register result, |
+ Register dividend, |
+ int32_t divisor) { |
+ ASSERT(!dividend.is(result)); |
+ ASSERT(!dividend.is(ip)); |
+ ASSERT(!result.is(ip)); |
+ MultiplierAndShift ms(divisor); |
+ mov(ip, Operand(ms.multiplier())); |
+ smull(result, ip, dividend, ip); |
+ if (divisor > 0 && ms.multiplier() < 0) add(ip, ip, Operand(dividend)); |
+ if (divisor < 0 && ms.multiplier() > 0) sub(ip, ip, Operand(dividend)); |
+ if (ms.shift() > 0) mov(ip, Operand(ip, ASR, ms.shift())); |
+ add(result, ip, Operand(dividend, LSR, 31)); |
+} |
+ |
+ |
} } // namespace v8::internal |
#endif // V8_TARGET_ARCH_ARM |