Chromium Code Reviews| Index: src/arm/macro-assembler-arm.cc |
| diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
| index 66894ddeb0c6323b3d1303d80a58f8b0a1a1166d..accc31471b00e6ece6a6e2dd5b1b6702881b7a5d 100644 |
| --- a/src/arm/macro-assembler-arm.cc |
| +++ b/src/arm/macro-assembler-arm.cc |
| @@ -602,6 +602,26 @@ void MacroAssembler::RememberedSetHelper(Register object, // For debug tests. |
| } |
| +void MacroAssembler::PushFixedFrame(Register marker_reg) { |
| + ASSERT(!marker_reg.is_valid() || marker_reg.code() < cp.code()); |
| + stm(db_w, sp, (marker_reg.is_valid() ? marker_reg.bit() : 0) | |
| + cp.bit() | |
| + (FLAG_enable_ool_constant_pool ? pp.bit() : 0) | |
| + fp.bit() | |
| + lr.bit()); |
| +} |
| + |
| + |
| +void MacroAssembler::PopFixedFrame(Register marker_reg) { |
| + ASSERT(!marker_reg.is_valid() || marker_reg.code() < cp.code()); |
| + ldm(ia_w, sp, (marker_reg.is_valid() ? marker_reg.bit() : 0) | |
| + cp.bit() | |
| + (FLAG_enable_ool_constant_pool ? pp.bit() : 0) | |
| + fp.bit() | |
| + lr.bit()); |
| +} |
| + |
| + |
| // Push and pop all registers that can hold pointers. |
| void MacroAssembler::PushSafepointRegisters() { |
| // Safepoints expect a block of contiguous register values starting with r0: |
| @@ -870,7 +890,7 @@ void MacroAssembler::VmovLow(DwVfpRegister dst, Register src) { |
| void MacroAssembler::Prologue(PrologueFrameMode frame_mode) { |
| if (frame_mode == BUILD_STUB_FRAME) { |
| - stm(db_w, sp, cp.bit() | fp.bit() | lr.bit()); |
| + PushFixedFrame(); |
| Push(Smi::FromInt(StackFrame::STUB)); |
| // Adjust FP to point to saved FP. |
| add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); |
| @@ -886,7 +906,7 @@ void MacroAssembler::Prologue(PrologueFrameMode frame_mode) { |
| ldr(pc, MemOperand(pc, -4)); |
| emit_code_stub_address(stub); |
| } else { |
| - stm(db_w, sp, r1.bit() | cp.bit() | fp.bit() | lr.bit()); |
| + PushFixedFrame(r1); |
| nop(ip.code()); |
| // Adjust FP to point to saved FP. |
| add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); |
| @@ -895,9 +915,17 @@ void MacroAssembler::Prologue(PrologueFrameMode frame_mode) { |
| } |
| +void MacroAssembler::LoadConstantPoolPointerRegister() { |
| + if (FLAG_enable_ool_constant_pool) { |
| + ldr(pp, MemOperand(pc, Code::kConstantPoolOffset - Code::kHeaderSize - |
|
ulan
2013/12/18 15:06:56
Ensure that the offset doesn't require constant po
rmcilroy
2013/12/19 11:08:25
Done.
|
| + pc_offset() - 8)); |
| + } |
| +} |
| + |
| + |
| void MacroAssembler::EnterFrame(StackFrame::Type type) { |
| // r0-r3: preserved |
| - stm(db_w, sp, cp.bit() | fp.bit() | lr.bit()); |
| + PushFixedFrame(); |
| mov(ip, Operand(Smi::FromInt(type))); |
| push(ip); |
| mov(ip, Operand(CodeObject())); |
| @@ -908,15 +936,25 @@ void MacroAssembler::EnterFrame(StackFrame::Type type) { |
| } |
| -void MacroAssembler::LeaveFrame(StackFrame::Type type) { |
| +int MacroAssembler::LeaveFrame(StackFrame::Type type) { |
| // r0: preserved |
| // r1: preserved |
| // r2: preserved |
| // Drop the execution stack down to the frame pointer and restore |
| - // the caller frame pointer and return address. |
| - mov(sp, fp); |
| - ldm(ia_w, sp, fp.bit() | lr.bit()); |
| + // the caller frame pointer, return address and constant pool pointer |
| + // (if FLAG_enable_ool_constant_pool). |
| + int frame_ends; |
| + if (FLAG_enable_ool_constant_pool) { |
| + add(sp, fp, Operand(StandardFrameConstants::kConstantPoolOffset)); |
| + frame_ends = pc_offset(); |
| + ldm(ia_w, sp, pp.bit() | fp.bit() | lr.bit()); |
| + } else { |
| + mov(sp, fp); |
| + frame_ends = pc_offset(); |
| + ldm(ia_w, sp, fp.bit() | lr.bit()); |
| + } |
| + return frame_ends; |
| } |