Refactor MacroAssembler::Prologue.
R=titzer@chromium.org Review URL: https://codereview.chromium.org/288213002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21329 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
743e07bad0
commit
7a5207803c
@ -171,8 +171,7 @@ void FullCodeGenerator::Generate() {
|
||||
FrameScope frame_scope(masm_, StackFrame::MANUAL);
|
||||
|
||||
info->set_prologue_offset(masm_->pc_offset());
|
||||
ASSERT(!info->IsStub());
|
||||
__ Prologue(info);
|
||||
__ Prologue(info->IsCodePreAgingActive());
|
||||
info->AddNoFrameRange(0, masm_->pc_offset());
|
||||
|
||||
{ Comment cmnt(masm_, "[ Allocate locals");
|
||||
|
@ -140,7 +140,11 @@ bool LCodeGen::GeneratePrologue() {
|
||||
|
||||
info()->set_prologue_offset(masm_->pc_offset());
|
||||
if (NeedsEagerFrame()) {
|
||||
__ Prologue(info());
|
||||
if (info()->IsStub()) {
|
||||
__ StubPrologue();
|
||||
} else {
|
||||
__ Prologue(info()->IsCodePreAgingActive());
|
||||
}
|
||||
frame_is_built_ = true;
|
||||
info_->AddNoFrameRange(0, masm_->pc_offset());
|
||||
}
|
||||
|
@ -902,29 +902,34 @@ void MacroAssembler::LoadConstantPoolPointerRegister() {
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::Prologue(CompilationInfo* info) {
|
||||
if (info->IsStub()) {
|
||||
PushFixedFrame();
|
||||
Push(Smi::FromInt(StackFrame::STUB));
|
||||
void MacroAssembler::StubPrologue() {
|
||||
PushFixedFrame();
|
||||
Push(Smi::FromInt(StackFrame::STUB));
|
||||
// Adjust FP to point to saved FP.
|
||||
add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
|
||||
if (FLAG_enable_ool_constant_pool) {
|
||||
LoadConstantPoolPointerRegister();
|
||||
set_constant_pool_available(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::Prologue(bool code_pre_aging) {
|
||||
PredictableCodeSizeScope predictible_code_size_scope(
|
||||
this, kNoCodeAgeSequenceLength);
|
||||
// The following three instructions must remain together and unmodified
|
||||
// for code aging to work properly.
|
||||
if (code_pre_aging) {
|
||||
// Pre-age the code.
|
||||
Code* stub = Code::GetPreAgedCodeAgeStub(isolate());
|
||||
add(r0, pc, Operand(-8));
|
||||
ldr(pc, MemOperand(pc, -4));
|
||||
emit_code_stub_address(stub);
|
||||
} else {
|
||||
PushFixedFrame(r1);
|
||||
nop(ip.code());
|
||||
// Adjust FP to point to saved FP.
|
||||
add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
|
||||
} else {
|
||||
PredictableCodeSizeScope predictible_code_size_scope(
|
||||
this, kNoCodeAgeSequenceLength);
|
||||
// The following three instructions must remain together and unmodified
|
||||
// for code aging to work properly.
|
||||
if (info->IsCodePreAgingActive()) {
|
||||
// Pre-age the code.
|
||||
Code* stub = Code::GetPreAgedCodeAgeStub(isolate());
|
||||
add(r0, pc, Operand(-8));
|
||||
ldr(pc, MemOperand(pc, -4));
|
||||
emit_code_stub_address(stub);
|
||||
} else {
|
||||
PushFixedFrame(r1);
|
||||
nop(ip.code());
|
||||
// Adjust FP to point to saved FP.
|
||||
add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
|
||||
}
|
||||
}
|
||||
if (FLAG_enable_ool_constant_pool) {
|
||||
LoadConstantPoolPointerRegister();
|
||||
|
@ -519,7 +519,8 @@ class MacroAssembler: public Assembler {
|
||||
Label* not_int32);
|
||||
|
||||
// Generates function and stub prologue code.
|
||||
void Prologue(CompilationInfo* info);
|
||||
void StubPrologue();
|
||||
void Prologue(bool code_pre_aging);
|
||||
|
||||
// Enter exit frame.
|
||||
// stack_space - extra stack space, used for alignment before call to C.
|
||||
|
@ -170,8 +170,7 @@ void FullCodeGenerator::Generate() {
|
||||
// Push(lr, fp, cp, x1);
|
||||
// Add(fp, jssp, 2 * kPointerSize);
|
||||
info->set_prologue_offset(masm_->pc_offset());
|
||||
ASSERT(!info->IsStub());
|
||||
__ Prologue(info);
|
||||
__ Prologue(info->IsCodePreAgingActive());
|
||||
info->AddNoFrameRange(0, masm_->pc_offset());
|
||||
|
||||
// Reserve space on the stack for locals.
|
||||
|
@ -671,7 +671,11 @@ bool LCodeGen::GeneratePrologue() {
|
||||
ASSERT(__ StackPointer().Is(jssp));
|
||||
info()->set_prologue_offset(masm_->pc_offset());
|
||||
if (NeedsEagerFrame()) {
|
||||
__ Prologue(info());
|
||||
if (info()->IsStub()) {
|
||||
__ StubPrologue();
|
||||
} else {
|
||||
__ Prologue(info()->IsCodePreAgingActive());
|
||||
}
|
||||
frame_is_built_ = true;
|
||||
info_->AddNoFrameRange(0, masm_->pc_offset());
|
||||
}
|
||||
|
@ -2992,23 +2992,24 @@ void MacroAssembler::TruncateHeapNumberToI(Register result,
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::Prologue(CompilationInfo* info) {
|
||||
if (info->IsStub()) {
|
||||
ASSERT(StackPointer().Is(jssp));
|
||||
UseScratchRegisterScope temps(this);
|
||||
Register temp = temps.AcquireX();
|
||||
__ Mov(temp, Smi::FromInt(StackFrame::STUB));
|
||||
// Compiled stubs don't age, and so they don't need the predictable code
|
||||
// ageing sequence.
|
||||
__ Push(lr, fp, cp, temp);
|
||||
__ Add(fp, jssp, StandardFrameConstants::kFixedFrameSizeFromFp);
|
||||
void MacroAssembler::StubPrologue() {
|
||||
ASSERT(StackPointer().Is(jssp));
|
||||
UseScratchRegisterScope temps(this);
|
||||
Register temp = temps.AcquireX();
|
||||
__ Mov(temp, Smi::FromInt(StackFrame::STUB));
|
||||
// Compiled stubs don't age, and so they don't need the predictable code
|
||||
// ageing sequence.
|
||||
__ Push(lr, fp, cp, temp);
|
||||
__ Add(fp, jssp, StandardFrameConstants::kFixedFrameSizeFromFp);
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::Prologue(bool code_pre_aging) {
|
||||
if (code_pre_aging) {
|
||||
Code* stub = Code::GetPreAgedCodeAgeStub(isolate());
|
||||
__ EmitCodeAgeSequence(stub);
|
||||
} else {
|
||||
if (info->IsCodePreAgingActive()) {
|
||||
Code* stub = Code::GetPreAgedCodeAgeStub(isolate());
|
||||
__ EmitCodeAgeSequence(stub);
|
||||
} else {
|
||||
__ EmitFrameSetupForCodeAgePatching();
|
||||
}
|
||||
__ EmitFrameSetupForCodeAgePatching();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1652,7 +1652,8 @@ class MacroAssembler : public Assembler {
|
||||
void ExitFrameRestoreFPRegs();
|
||||
|
||||
// Generates function and stub prologue code.
|
||||
void Prologue(CompilationInfo* info);
|
||||
void StubPrologue();
|
||||
void Prologue(bool code_pre_aging);
|
||||
|
||||
// Enter exit frame. Exit frames are used when calling C code from generated
|
||||
// (JavaScript) code.
|
||||
|
@ -74,6 +74,7 @@ class FullCodeGenerator: public AstVisitor {
|
||||
info->zone()),
|
||||
back_edges_(2, info->zone()),
|
||||
ic_total_count_(0) {
|
||||
ASSERT(!info->IsStub());
|
||||
Initialize();
|
||||
}
|
||||
|
||||
|
@ -157,8 +157,7 @@ void FullCodeGenerator::Generate() {
|
||||
FrameScope frame_scope(masm_, StackFrame::MANUAL);
|
||||
|
||||
info->set_prologue_offset(masm_->pc_offset());
|
||||
ASSERT(!info->IsStub());
|
||||
__ Prologue(info);
|
||||
__ Prologue(info->IsCodePreAgingActive());
|
||||
info->AddNoFrameRange(0, masm_->pc_offset());
|
||||
|
||||
{ Comment cmnt(masm_, "[ Allocate locals");
|
||||
|
@ -188,7 +188,11 @@ bool LCodeGen::GeneratePrologue() {
|
||||
if (NeedsEagerFrame()) {
|
||||
ASSERT(!frame_is_built_);
|
||||
frame_is_built_ = true;
|
||||
__ Prologue(info());
|
||||
if (info()->IsStub()) {
|
||||
__ StubPrologue();
|
||||
} else {
|
||||
__ Prologue(info()->IsCodePreAgingActive());
|
||||
}
|
||||
info()->AddNoFrameRange(0, masm_->pc_offset());
|
||||
}
|
||||
|
||||
|
@ -900,26 +900,27 @@ void MacroAssembler::AssertNotSmi(Register object) {
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::Prologue(CompilationInfo* info) {
|
||||
if (info->IsStub()) {
|
||||
void MacroAssembler::StubPrologue() {
|
||||
push(ebp); // Caller's frame pointer.
|
||||
mov(ebp, esp);
|
||||
push(esi); // Callee's context.
|
||||
push(Immediate(Smi::FromInt(StackFrame::STUB)));
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::Prologue(bool code_pre_aging) {
|
||||
PredictableCodeSizeScope predictible_code_size_scope(this,
|
||||
kNoCodeAgeSequenceLength);
|
||||
if (code_pre_aging) {
|
||||
// Pre-age the code.
|
||||
call(isolate()->builtins()->MarkCodeAsExecutedOnce(),
|
||||
RelocInfo::CODE_AGE_SEQUENCE);
|
||||
Nop(kNoCodeAgeSequenceLength - Assembler::kCallInstructionLength);
|
||||
} else {
|
||||
push(ebp); // Caller's frame pointer.
|
||||
mov(ebp, esp);
|
||||
push(esi); // Callee's context.
|
||||
push(Immediate(Smi::FromInt(StackFrame::STUB)));
|
||||
} else {
|
||||
PredictableCodeSizeScope predictible_code_size_scope(this,
|
||||
kNoCodeAgeSequenceLength);
|
||||
if (info->IsCodePreAgingActive()) {
|
||||
// Pre-age the code.
|
||||
call(isolate()->builtins()->MarkCodeAsExecutedOnce(),
|
||||
RelocInfo::CODE_AGE_SEQUENCE);
|
||||
Nop(kNoCodeAgeSequenceLength - Assembler::kCallInstructionLength);
|
||||
} else {
|
||||
push(ebp); // Caller's frame pointer.
|
||||
mov(ebp, esp);
|
||||
push(esi); // Callee's context.
|
||||
push(edi); // Callee's JS function.
|
||||
}
|
||||
push(edi); // Callee's JS function.
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -204,7 +204,8 @@ class MacroAssembler: public Assembler {
|
||||
void DebugBreak();
|
||||
|
||||
// Generates function and stub prologue code.
|
||||
void Prologue(CompilationInfo* info);
|
||||
void StubPrologue();
|
||||
void Prologue(bool code_pre_aging);
|
||||
|
||||
// Enter specific kind of exit frame. Expects the number of
|
||||
// arguments in register eax and sets up the number of arguments in
|
||||
|
@ -176,8 +176,7 @@ void FullCodeGenerator::Generate() {
|
||||
FrameScope frame_scope(masm_, StackFrame::MANUAL);
|
||||
|
||||
info->set_prologue_offset(masm_->pc_offset());
|
||||
ASSERT(!info->IsStub());
|
||||
__ Prologue(info);
|
||||
__ Prologue(info->IsCodePreAgingActive());
|
||||
info->AddNoFrameRange(0, masm_->pc_offset());
|
||||
|
||||
{ Comment cmnt(masm_, "[ Allocate locals");
|
||||
|
@ -162,7 +162,11 @@ bool LCodeGen::GeneratePrologue() {
|
||||
|
||||
info()->set_prologue_offset(masm_->pc_offset());
|
||||
if (NeedsEagerFrame()) {
|
||||
__ Prologue(info());
|
||||
if (info()->IsStub()) {
|
||||
__ StubPrologue();
|
||||
} else {
|
||||
__ Prologue(info()->IsCodePreAgingActive());
|
||||
}
|
||||
frame_is_built_ = true;
|
||||
info_->AddNoFrameRange(0, masm_->pc_offset());
|
||||
}
|
||||
|
@ -4452,36 +4452,37 @@ void MacroAssembler::LoadGlobalFunctionInitialMap(Register function,
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::Prologue(CompilationInfo* info) {
|
||||
if (info->IsStub()) {
|
||||
void MacroAssembler::StubPrologue() {
|
||||
Push(ra, fp, cp);
|
||||
Push(Smi::FromInt(StackFrame::STUB));
|
||||
// Adjust FP to point to saved FP.
|
||||
Addu(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
|
||||
} else {
|
||||
PredictableCodeSizeScope predictible_code_size_scope(
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::Prologue(bool code_pre_aging) {
|
||||
PredictableCodeSizeScope predictible_code_size_scope(
|
||||
this, kNoCodeAgeSequenceLength);
|
||||
// The following three instructions must remain together and unmodified
|
||||
// for code aging to work properly.
|
||||
if (info->IsCodePreAgingActive()) {
|
||||
// Pre-age the code.
|
||||
Code* stub = Code::GetPreAgedCodeAgeStub(isolate());
|
||||
nop(Assembler::CODE_AGE_MARKER_NOP);
|
||||
// Load the stub address to t9 and call it,
|
||||
// GetCodeAgeAndParity() extracts the stub address from this instruction.
|
||||
li(t9,
|
||||
Operand(reinterpret_cast<uint32_t>(stub->instruction_start())),
|
||||
CONSTANT_SIZE);
|
||||
nop(); // Prevent jalr to jal optimization.
|
||||
jalr(t9, a0);
|
||||
nop(); // Branch delay slot nop.
|
||||
nop(); // Pad the empty space.
|
||||
} else {
|
||||
Push(ra, fp, cp, a1);
|
||||
nop(Assembler::CODE_AGE_SEQUENCE_NOP);
|
||||
// Adjust fp to point to caller's fp.
|
||||
Addu(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
|
||||
}
|
||||
// The following three instructions must remain together and unmodified
|
||||
// for code aging to work properly.
|
||||
if (code_pre_aging) {
|
||||
// Pre-age the code.
|
||||
Code* stub = Code::GetPreAgedCodeAgeStub(isolate());
|
||||
nop(Assembler::CODE_AGE_MARKER_NOP);
|
||||
// Load the stub address to t9 and call it,
|
||||
// GetCodeAgeAndParity() extracts the stub address from this instruction.
|
||||
li(t9,
|
||||
Operand(reinterpret_cast<uint32_t>(stub->instruction_start())),
|
||||
CONSTANT_SIZE);
|
||||
nop(); // Prevent jalr to jal optimization.
|
||||
jalr(t9, a0);
|
||||
nop(); // Branch delay slot nop.
|
||||
nop(); // Pad the empty space.
|
||||
} else {
|
||||
Push(ra, fp, cp, a1);
|
||||
nop(Assembler::CODE_AGE_SEQUENCE_NOP);
|
||||
// Adjust fp to point to caller's fp.
|
||||
Addu(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1492,7 +1492,8 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT
|
||||
}
|
||||
|
||||
// Generates function and stub prologue code.
|
||||
void Prologue(CompilationInfo* info);
|
||||
void StubPrologue();
|
||||
void Prologue(bool code_pre_aging);
|
||||
|
||||
// Activation support.
|
||||
void EnterFrame(StackFrame::Type type);
|
||||
|
@ -157,8 +157,7 @@ void FullCodeGenerator::Generate() {
|
||||
FrameScope frame_scope(masm_, StackFrame::MANUAL);
|
||||
|
||||
info->set_prologue_offset(masm_->pc_offset());
|
||||
ASSERT(!info->IsStub());
|
||||
__ Prologue(info);
|
||||
__ Prologue(info->IsCodePreAgingActive());
|
||||
info->AddNoFrameRange(0, masm_->pc_offset());
|
||||
|
||||
{ Comment cmnt(masm_, "[ Allocate locals");
|
||||
|
@ -149,7 +149,11 @@ bool LCodeGen::GeneratePrologue() {
|
||||
if (NeedsEagerFrame()) {
|
||||
ASSERT(!frame_is_built_);
|
||||
frame_is_built_ = true;
|
||||
__ Prologue(info());
|
||||
if (info()->IsStub()) {
|
||||
__ StubPrologue();
|
||||
} else {
|
||||
__ Prologue(info()->IsCodePreAgingActive());
|
||||
}
|
||||
info()->AddNoFrameRange(0, masm_->pc_offset());
|
||||
}
|
||||
|
||||
|
@ -3889,26 +3889,27 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::Prologue(CompilationInfo* info) {
|
||||
if (info->IsStub()) {
|
||||
void MacroAssembler::StubPrologue() {
|
||||
pushq(rbp); // Caller's frame pointer.
|
||||
movp(rbp, rsp);
|
||||
Push(rsi); // Callee's context.
|
||||
Push(Smi::FromInt(StackFrame::STUB));
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::Prologue(bool code_pre_aging) {
|
||||
PredictableCodeSizeScope predictible_code_size_scope(this,
|
||||
kNoCodeAgeSequenceLength);
|
||||
if (code_pre_aging) {
|
||||
// Pre-age the code.
|
||||
Call(isolate()->builtins()->MarkCodeAsExecutedOnce(),
|
||||
RelocInfo::CODE_AGE_SEQUENCE);
|
||||
Nop(kNoCodeAgeSequenceLength - Assembler::kShortCallInstructionLength);
|
||||
} else {
|
||||
PredictableCodeSizeScope predictible_code_size_scope(this,
|
||||
kNoCodeAgeSequenceLength);
|
||||
if (info->IsCodePreAgingActive()) {
|
||||
// Pre-age the code.
|
||||
Call(isolate()->builtins()->MarkCodeAsExecutedOnce(),
|
||||
RelocInfo::CODE_AGE_SEQUENCE);
|
||||
Nop(kNoCodeAgeSequenceLength - Assembler::kShortCallInstructionLength);
|
||||
} else {
|
||||
pushq(rbp); // Caller's frame pointer.
|
||||
movp(rbp, rsp);
|
||||
Push(rsi); // Callee's context.
|
||||
Push(rdi); // Callee's JS function.
|
||||
}
|
||||
pushq(rbp); // Caller's frame pointer.
|
||||
movp(rbp, rsp);
|
||||
Push(rsi); // Callee's context.
|
||||
Push(rdi); // Callee's JS function.
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -274,7 +274,8 @@ class MacroAssembler: public Assembler {
|
||||
void DebugBreak();
|
||||
|
||||
// Generates function and stub prologue code.
|
||||
void Prologue(CompilationInfo* info);
|
||||
void StubPrologue();
|
||||
void Prologue(bool code_pre_aging);
|
||||
|
||||
// Enter specific kind of exit frame; either in normal or
|
||||
// debug mode. Expects the number of arguments in register rax and
|
||||
|
Loading…
Reference in New Issue
Block a user