Index: src/arm/lithium-codegen-arm.h |
diff --git a/src/arm/lithium-codegen-arm.h b/src/arm/lithium-codegen-arm.h |
index d0bfcbbb94e102d44f0bde49ffa3464b5b3e5496..e5688dd00939f35ddfd8f0a5f67a3fbcff13bcd7 100644 |
--- a/src/arm/lithium-codegen-arm.h |
+++ b/src/arm/lithium-codegen-arm.h |
@@ -64,6 +64,7 @@ class LCodeGen BASE_EMBEDDED { |
osr_pc_offset_(-1), |
last_lazy_deopt_pc_(0), |
frame_is_built_(false), |
+ fp_sp_delta_(-1), |
safepoints_(info->zone()), |
resolver_(this), |
expected_safepoint_kind_(Safepoint::kSimple), |
@@ -232,15 +233,28 @@ class LCodeGen BASE_EMBEDDED { |
RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS |
}; |
+ void SetFpSpDelta(int argument_count); |
+ |
+ void Push(Register src1); |
+ void Push(Register src1, Register src2); |
+ void Push(Register src1, Register src2, Register src3); |
+ void Push(Register src1, Register src2, Register src3, Register src4); |
+ |
+#ifdef DEBUG |
+ void CheckFpSpDelta(LInstruction* instr); |
+#endif // DEBUG |
+ |
void CallCode( |
Handle<Code> code, |
RelocInfo::Mode mode, |
+ int num_arguments, |
LInstruction* instr, |
TargetAddressStorageMode storage_mode = CAN_INLINE_TARGET_ADDRESS); |
void CallCodeGeneric( |
Handle<Code> code, |
RelocInfo::Mode mode, |
+ int num_arguments, |
LInstruction* instr, |
SafepointMode safepoint_mode, |
TargetAddressStorageMode storage_mode = CAN_INLINE_TARGET_ADDRESS); |
@@ -408,6 +422,7 @@ class LCodeGen BASE_EMBEDDED { |
int osr_pc_offset_; |
int last_lazy_deopt_pc_; |
bool frame_is_built_; |
+ int fp_sp_delta_; |
// Builder that keeps track of safepoints in the code. The table |
// itself is emitted at the end of the generated code. |
@@ -432,9 +447,12 @@ class LCodeGen BASE_EMBEDDED { |
switch (codegen_->expected_safepoint_kind_) { |
case Safepoint::kWithRegisters: |
codegen_->masm_->PushSafepointRegisters(); |
- break; |
+ codegen_->fp_sp_delta_ += kNumSafepointSavedRegisters * kPointerSize; |
+ break; |
case Safepoint::kWithRegistersAndDoubles: |
codegen_->masm_->PushSafepointRegistersAndDoubles(); |
+ codegen_->fp_sp_delta_ += kNumSafepointSavedRegisters * kPointerSize |
+ + DwVfpRegister::NumAllocatableRegisters() * kDoubleSize; |
break; |
default: |
UNREACHABLE(); |
@@ -447,9 +465,12 @@ class LCodeGen BASE_EMBEDDED { |
switch (kind) { |
case Safepoint::kWithRegisters: |
codegen_->masm_->PopSafepointRegisters(); |
+ codegen_->fp_sp_delta_ -= kNumSafepointRegisters * kPointerSize; |
break; |
case Safepoint::kWithRegistersAndDoubles: |
codegen_->masm_->PopSafepointRegistersAndDoubles(); |
+ codegen_->fp_sp_delta_ -= kNumSafepointSavedRegisters * kPointerSize |
+ + DwVfpRegister::NumAllocatableRegisters() * kDoubleSize; |
break; |
default: |
UNREACHABLE(); |