| 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..aec5df1407d54ea3d2125c79541521128a59736c 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,19 @@ void MacroAssembler::Prologue(PrologueFrameMode frame_mode) {
|
| }
|
|
|
|
|
| +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));
|
| + }
|
| +}
|
| +
|
| +
|
| 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 +938,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;
|
| }
|
|
|
|
|
|
|