| Index: src/arm/macro-assembler-arm.cc
|
| diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc
|
| index 67a36bc4bdee166d1f283b73e28d225359831f01..907548d4588bdc2123a943a8da9755ef44a8eed7 100644
|
| --- a/src/arm/macro-assembler-arm.cc
|
| +++ b/src/arm/macro-assembler-arm.cc
|
| @@ -755,20 +755,65 @@ void MacroAssembler::RememberedSetHelper(Register object, // For debug tests.
|
| }
|
| }
|
|
|
| -
|
| -void MacroAssembler::PushFixedFrame(Register marker_reg) {
|
| - DCHECK(!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_embedded_constant_pool ? pp.bit() : 0) |
|
| - fp.bit() | lr.bit());
|
| +void MacroAssembler::PushCommonFrame(Register marker_reg) {
|
| + if (marker_reg.is_valid()) {
|
| + if (FLAG_enable_embedded_constant_pool) {
|
| + if (marker_reg.code() > pp.code()) {
|
| + stm(db_w, sp, pp.bit() | fp.bit() | lr.bit());
|
| + add(fp, sp, Operand(kPointerSize));
|
| + Push(marker_reg);
|
| + } else {
|
| + stm(db_w, sp, marker_reg.bit() | pp.bit() | fp.bit() | lr.bit());
|
| + add(fp, sp, Operand(2 * kPointerSize));
|
| + }
|
| + } else {
|
| + if (marker_reg.code() > fp.code()) {
|
| + stm(db_w, sp, fp.bit() | lr.bit());
|
| + mov(fp, Operand(sp));
|
| + Push(marker_reg);
|
| + } else {
|
| + stm(db_w, sp, marker_reg.bit() | fp.bit() | lr.bit());
|
| + add(fp, sp, Operand(kPointerSize));
|
| + }
|
| + }
|
| + } else {
|
| + stm(db_w, sp, (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) |
|
| + fp.bit() | lr.bit());
|
| + add(fp, sp, Operand(FLAG_enable_embedded_constant_pool ? kPointerSize : 0));
|
| + }
|
| }
|
|
|
| +void MacroAssembler::PopCommonFrame(Register marker_reg) {
|
| + if (marker_reg.is_valid()) {
|
| + if (FLAG_enable_embedded_constant_pool) {
|
| + if (marker_reg.code() > pp.code()) {
|
| + pop(marker_reg);
|
| + ldm(ia_w, sp, pp.bit() | fp.bit() | lr.bit());
|
| + } else {
|
| + ldm(ia_w, sp, marker_reg.bit() | pp.bit() | fp.bit() | lr.bit());
|
| + }
|
| + } else {
|
| + if (marker_reg.code() > fp.code()) {
|
| + pop(marker_reg);
|
| + ldm(ia_w, sp, fp.bit() | lr.bit());
|
| + } else {
|
| + ldm(ia_w, sp, marker_reg.bit() | fp.bit() | lr.bit());
|
| + }
|
| + }
|
| + } else {
|
| + ldm(ia_w, sp, (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) |
|
| + fp.bit() | lr.bit());
|
| + }
|
| +}
|
|
|
| -void MacroAssembler::PopFixedFrame(Register marker_reg) {
|
| - DCHECK(!marker_reg.is_valid() || marker_reg.code() < cp.code());
|
| - ldm(ia_w, sp, (marker_reg.is_valid() ? marker_reg.bit() : 0) | cp.bit() |
|
| +void MacroAssembler::PushStandardFrame(Register function_reg) {
|
| + DCHECK(!function_reg.is_valid() || function_reg.code() < cp.code());
|
| + stm(db_w, sp, (function_reg.is_valid() ? function_reg.bit() : 0) | cp.bit() |
|
| (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) |
|
| fp.bit() | lr.bit());
|
| + int offset = -StandardFrameConstants::kContextOffset;
|
| + offset += function_reg.is_valid() ? kPointerSize : 0;
|
| + add(fp, sp, Operand(offset));
|
| }
|
|
|
|
|
| @@ -1116,19 +1161,15 @@ void MacroAssembler::LoadConstantPoolPointerRegister() {
|
| LoadConstantPoolPointerRegisterFromCodeTargetAddress(ip);
|
| }
|
|
|
| -
|
| -void MacroAssembler::StubPrologue() {
|
| - PushFixedFrame();
|
| - Push(Smi::FromInt(StackFrame::STUB));
|
| - // Adjust FP to point to saved FP.
|
| - add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
|
| +void MacroAssembler::StubPrologue(StackFrame::Type type) {
|
| + mov(ip, Operand(Smi::FromInt(type)));
|
| + PushCommonFrame(ip);
|
| if (FLAG_enable_embedded_constant_pool) {
|
| LoadConstantPoolPointerRegister();
|
| set_constant_pool_available(true);
|
| }
|
| }
|
|
|
| -
|
| void MacroAssembler::Prologue(bool code_pre_aging) {
|
| { PredictableCodeSizeScope predictible_code_size_scope(
|
| this, kNoCodeAgeSequenceLength);
|
| @@ -1141,10 +1182,8 @@ void MacroAssembler::Prologue(bool code_pre_aging) {
|
| ldr(pc, MemOperand(pc, -4));
|
| emit_code_stub_address(stub);
|
| } else {
|
| - PushFixedFrame(r1);
|
| + PushStandardFrame(r1);
|
| nop(ip.code());
|
| - // Adjust FP to point to saved FP.
|
| - add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
|
| }
|
| }
|
| if (FLAG_enable_embedded_constant_pool) {
|
| @@ -1165,17 +1204,15 @@ void MacroAssembler::EmitLoadTypeFeedbackVector(Register vector) {
|
| void MacroAssembler::EnterFrame(StackFrame::Type type,
|
| bool load_constant_pool_pointer_reg) {
|
| // r0-r3: preserved
|
| - PushFixedFrame();
|
| + mov(ip, Operand(Smi::FromInt(type)));
|
| + PushCommonFrame(ip);
|
| if (FLAG_enable_embedded_constant_pool && load_constant_pool_pointer_reg) {
|
| LoadConstantPoolPointerRegister();
|
| }
|
| - mov(ip, Operand(Smi::FromInt(type)));
|
| - push(ip);
|
| - mov(ip, Operand(CodeObject()));
|
| - push(ip);
|
| - // Adjust FP to point to saved FP.
|
| - add(fp, sp,
|
| - Operand(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize));
|
| + if (type == StackFrame::INTERNAL) {
|
| + mov(ip, Operand(CodeObject()));
|
| + push(ip);
|
| + }
|
| }
|
|
|
|
|
| @@ -1206,10 +1243,10 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space) {
|
| DCHECK_EQ(2 * kPointerSize, ExitFrameConstants::kCallerSPDisplacement);
|
| DCHECK_EQ(1 * kPointerSize, ExitFrameConstants::kCallerPCOffset);
|
| DCHECK_EQ(0 * kPointerSize, ExitFrameConstants::kCallerFPOffset);
|
| - Push(lr, fp);
|
| - mov(fp, Operand(sp)); // Set up new frame pointer.
|
| + mov(ip, Operand(Smi::FromInt(StackFrame::EXIT)));
|
| + PushCommonFrame(ip);
|
| // Reserve room for saved entry sp and code object.
|
| - sub(sp, sp, Operand(ExitFrameConstants::kFrameSize));
|
| + sub(sp, fp, Operand(ExitFrameConstants::kFixedFrameSizeFromFp));
|
| if (emit_debug_code()) {
|
| mov(ip, Operand::Zero());
|
| str(ip, MemOperand(fp, ExitFrameConstants::kSPOffset));
|
| @@ -1291,7 +1328,7 @@ void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count,
|
| // Optionally restore all double registers.
|
| if (save_doubles) {
|
| // Calculate the stack location of the saved doubles and restore them.
|
| - const int offset = ExitFrameConstants::kFrameSize;
|
| + const int offset = ExitFrameConstants::kFixedFrameSizeFromFp;
|
| sub(r3, fp,
|
| Operand(offset + DwVfpRegister::kMaxNumRegisters * kDoubleSize));
|
| RestoreFPRegs(r3, ip);
|
| @@ -1678,8 +1715,19 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
|
| DCHECK(!holder_reg.is(ip));
|
| DCHECK(!scratch.is(ip));
|
|
|
| - // Load current lexical context from the stack frame.
|
| - ldr(scratch, MemOperand(fp, StandardFrameConstants::kContextOffset));
|
| + // Load current lexical context from the active StandardFrame, which
|
| + // may require crawling past STUB frames.
|
| + Label load_context;
|
| + Label has_context;
|
| + DCHECK(!ip.is(scratch));
|
| + mov(ip, fp);
|
| + bind(&load_context);
|
| + ldr(scratch, MemOperand(ip, CommonFrameConstants::kContextOrFrameTypeOffset));
|
| + JumpIfNotSmi(scratch, &has_context);
|
| + ldr(ip, MemOperand(ip, CommonFrameConstants::kCallerFPOffset));
|
| + b(&load_context);
|
| + bind(&has_context);
|
| +
|
| // In debug mode, make sure the lexical context is set.
|
| #ifdef DEBUG
|
| cmp(scratch, Operand::Zero());
|
|
|