Index: src/arm/macro-assembler-arm.cc |
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
index 65962e7fb7f50c3b6da96de139dcc9d26c13f523..8804aea078474c5f938649eb694b72bd312a6cfe 100644 |
--- a/src/arm/macro-assembler-arm.cc |
+++ b/src/arm/macro-assembler-arm.cc |
@@ -602,6 +602,22 @@ void MacroAssembler::RememberedSetHelper(Register object, // For debug tests. |
} |
+void MacroAssembler::PushFixedFrame(Register marker_reg) { |
+ ASSERT(!marker_reg.is_valid() || marker_reg.code() < pp.code()); |
+ stm(db_w, sp, (marker_reg.is_valid() ? marker_reg.bit() : 0) | |
+ (FLAG_enable_ool_constant_pool ? pp.bit() : 0) | |
+ cp.bit() | fp.bit() | lr.bit()); |
+} |
+ |
+ |
+void MacroAssembler::PopFixedFrame(Register marker_reg) { |
+ ASSERT(!marker_reg.is_valid() || marker_reg.code() < pp.code()); |
+ ldm(ia_w, sp, (marker_reg.is_valid() ? marker_reg.bit() : 0) | |
+ (FLAG_enable_ool_constant_pool ? pp.bit() : 0) | |
+ cp.bit() | 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 +886,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 +902,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)); |
@@ -897,7 +913,7 @@ void MacroAssembler::Prologue(PrologueFrameMode frame_mode) { |
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())); |
@@ -1034,6 +1050,20 @@ void MacroAssembler::LeaveExitFrame(bool save_doubles, |
} |
+void MacroAssembler::RestoreConstantPoolPointer() { |
+ if (FLAG_enable_ool_constant_pool) { |
+ ldr(pp, MemOperand(fp, StandardFrameConstants::kConstantPoolOffset)); |
+ } |
+} |
+ |
+ |
+void MacroAssembler::LoadConstantPoolPointer(Register js_function) { |
+ if (FLAG_enable_ool_constant_pool) { |
+ ldr(pp, FieldMemOperand(js_function, JSFunction::kConstantPoolOffset)); |
+ } |
+} |
+ |
+ |
void MacroAssembler::GetCFunctionDoubleResult(const DwVfpRegister dst) { |
if (use_eabi_hardfloat()) { |
Move(dst, d0); |
@@ -1217,6 +1247,7 @@ void MacroAssembler::InvokeFunction(Register fun, |
ldr(code_reg, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); |
ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); |
+ LoadConstantPoolPointer(r1); |
ldr(expected_reg, |
FieldMemOperand(code_reg, |
SharedFunctionInfo::kFormalParameterCountOffset)); |
@@ -1241,6 +1272,7 @@ void MacroAssembler::InvokeFunction(Handle<JSFunction> function, |
// Get the function and setup the context. |
Move(r1, function); |
ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); |
+ LoadConstantPoolPointer(r1); |
// We call indirectly through the code field in the function to |
// allow recompilation to take effect without changing any of the |