| 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..61f963fb1a745b1d5fceaa9eee3458033e81062e 100644
|
| --- a/src/arm/macro-assembler-arm.cc
|
| +++ b/src/arm/macro-assembler-arm.cc
|
| @@ -888,6 +888,16 @@ void MacroAssembler::VmovLow(DwVfpRegister dst, Register src) {
|
| }
|
|
|
|
|
| +void MacroAssembler::LoadConstantPoolPointerRegister() {
|
| + if (FLAG_enable_ool_constant_pool) {
|
| + int constant_pool_offset = Code::kConstantPoolOffset - Code::kHeaderSize -
|
| + pc_offset() - Instruction::kPCReadOffset;
|
| + ASSERT(ImmediateFitsAddrMode2Instruction(constant_pool_offset));
|
| + ldr(pp, MemOperand(pc, constant_pool_offset));
|
| + }
|
| +}
|
| +
|
| +
|
| void MacroAssembler::Prologue(PrologueFrameMode frame_mode) {
|
| if (frame_mode == BUILD_STUB_FRAME) {
|
| PushFixedFrame();
|
| @@ -912,22 +922,20 @@ void MacroAssembler::Prologue(PrologueFrameMode frame_mode) {
|
| add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
|
| }
|
| }
|
| -}
|
| -
|
| -
|
| -void MacroAssembler::LoadConstantPoolPointerRegister() {
|
| if (FLAG_enable_ool_constant_pool) {
|
| - int constant_pool_offset =
|
| - Code::kConstantPoolOffset - Code::kHeaderSize - pc_offset() - 8;
|
| - ASSERT(ImmediateFitsAddrMode2Instruction(constant_pool_offset));
|
| - ldr(pp, MemOperand(pc, constant_pool_offset));
|
| + LoadConstantPoolPointerRegister();
|
| + set_constant_pool_available(true);
|
| }
|
| }
|
|
|
|
|
| -void MacroAssembler::EnterFrame(StackFrame::Type type) {
|
| +void MacroAssembler::EnterFrame(StackFrame::Type type,
|
| + bool load_constant_pool) {
|
| // r0-r3: preserved
|
| PushFixedFrame();
|
| + if (FLAG_enable_ool_constant_pool && load_constant_pool) {
|
| + LoadConstantPoolPointerRegister();
|
| + }
|
| mov(ip, Operand(Smi::FromInt(type)));
|
| push(ip);
|
| mov(ip, Operand(CodeObject()));
|
| @@ -975,6 +983,7 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space) {
|
| }
|
| if (FLAG_enable_ool_constant_pool) {
|
| str(pp, MemOperand(fp, ExitFrameConstants::kConstantPoolOffset));
|
| + LoadConstantPoolPointerRegister();
|
| }
|
| mov(ip, Operand(CodeObject()));
|
| str(ip, MemOperand(fp, ExitFrameConstants::kCodeOffset));
|
| @@ -4032,6 +4041,25 @@ 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(ip, result, dividend, ip);
|
| + if (divisor > 0 && ms.multiplier() < 0) {
|
| + add(result, result, Operand(dividend));
|
| + }
|
| + if (divisor < 0 && ms.multiplier() > 0) {
|
| + sub(result, result, Operand(dividend));
|
| + }
|
| + if (ms.shift() > 0) mov(result, Operand(result, ASR, ms.shift()));
|
| +}
|
| +
|
| +
|
| } } // namespace v8::internal
|
|
|
| #endif // V8_TARGET_ARCH_ARM
|
|
|