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:
yangguo@chromium.org 2014-05-15 12:10:00 +00:00
parent 743e07bad0
commit 7a5207803c
21 changed files with 144 additions and 114 deletions

View File

@ -171,8 +171,7 @@ void FullCodeGenerator::Generate() {
FrameScope frame_scope(masm_, StackFrame::MANUAL); FrameScope frame_scope(masm_, StackFrame::MANUAL);
info->set_prologue_offset(masm_->pc_offset()); info->set_prologue_offset(masm_->pc_offset());
ASSERT(!info->IsStub()); __ Prologue(info->IsCodePreAgingActive());
__ Prologue(info);
info->AddNoFrameRange(0, masm_->pc_offset()); info->AddNoFrameRange(0, masm_->pc_offset());
{ Comment cmnt(masm_, "[ Allocate locals"); { Comment cmnt(masm_, "[ Allocate locals");

View File

@ -140,7 +140,11 @@ bool LCodeGen::GeneratePrologue() {
info()->set_prologue_offset(masm_->pc_offset()); info()->set_prologue_offset(masm_->pc_offset());
if (NeedsEagerFrame()) { if (NeedsEagerFrame()) {
__ Prologue(info()); if (info()->IsStub()) {
__ StubPrologue();
} else {
__ Prologue(info()->IsCodePreAgingActive());
}
frame_is_built_ = true; frame_is_built_ = true;
info_->AddNoFrameRange(0, masm_->pc_offset()); info_->AddNoFrameRange(0, masm_->pc_offset());
} }

View File

@ -902,29 +902,34 @@ void MacroAssembler::LoadConstantPoolPointerRegister() {
} }
void MacroAssembler::Prologue(CompilationInfo* info) { void MacroAssembler::StubPrologue() {
if (info->IsStub()) { PushFixedFrame();
PushFixedFrame(); Push(Smi::FromInt(StackFrame::STUB));
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. // Adjust FP to point to saved FP.
add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); 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) { if (FLAG_enable_ool_constant_pool) {
LoadConstantPoolPointerRegister(); LoadConstantPoolPointerRegister();

View File

@ -519,7 +519,8 @@ class MacroAssembler: public Assembler {
Label* not_int32); Label* not_int32);
// Generates function and stub prologue code. // Generates function and stub prologue code.
void Prologue(CompilationInfo* info); void StubPrologue();
void Prologue(bool code_pre_aging);
// Enter exit frame. // Enter exit frame.
// stack_space - extra stack space, used for alignment before call to C. // stack_space - extra stack space, used for alignment before call to C.

View File

@ -170,8 +170,7 @@ void FullCodeGenerator::Generate() {
// Push(lr, fp, cp, x1); // Push(lr, fp, cp, x1);
// Add(fp, jssp, 2 * kPointerSize); // Add(fp, jssp, 2 * kPointerSize);
info->set_prologue_offset(masm_->pc_offset()); info->set_prologue_offset(masm_->pc_offset());
ASSERT(!info->IsStub()); __ Prologue(info->IsCodePreAgingActive());
__ Prologue(info);
info->AddNoFrameRange(0, masm_->pc_offset()); info->AddNoFrameRange(0, masm_->pc_offset());
// Reserve space on the stack for locals. // Reserve space on the stack for locals.

View File

@ -671,7 +671,11 @@ bool LCodeGen::GeneratePrologue() {
ASSERT(__ StackPointer().Is(jssp)); ASSERT(__ StackPointer().Is(jssp));
info()->set_prologue_offset(masm_->pc_offset()); info()->set_prologue_offset(masm_->pc_offset());
if (NeedsEagerFrame()) { if (NeedsEagerFrame()) {
__ Prologue(info()); if (info()->IsStub()) {
__ StubPrologue();
} else {
__ Prologue(info()->IsCodePreAgingActive());
}
frame_is_built_ = true; frame_is_built_ = true;
info_->AddNoFrameRange(0, masm_->pc_offset()); info_->AddNoFrameRange(0, masm_->pc_offset());
} }

View File

@ -2992,23 +2992,24 @@ void MacroAssembler::TruncateHeapNumberToI(Register result,
} }
void MacroAssembler::Prologue(CompilationInfo* info) { void MacroAssembler::StubPrologue() {
if (info->IsStub()) { ASSERT(StackPointer().Is(jssp));
ASSERT(StackPointer().Is(jssp)); UseScratchRegisterScope temps(this);
UseScratchRegisterScope temps(this); Register temp = temps.AcquireX();
Register temp = temps.AcquireX(); __ Mov(temp, Smi::FromInt(StackFrame::STUB));
__ Mov(temp, Smi::FromInt(StackFrame::STUB)); // Compiled stubs don't age, and so they don't need the predictable code
// Compiled stubs don't age, and so they don't need the predictable code // ageing sequence.
// ageing sequence. __ Push(lr, fp, cp, temp);
__ Push(lr, fp, cp, temp); __ Add(fp, jssp, StandardFrameConstants::kFixedFrameSizeFromFp);
__ Add(fp, jssp, StandardFrameConstants::kFixedFrameSizeFromFp); }
void MacroAssembler::Prologue(bool code_pre_aging) {
if (code_pre_aging) {
Code* stub = Code::GetPreAgedCodeAgeStub(isolate());
__ EmitCodeAgeSequence(stub);
} else { } else {
if (info->IsCodePreAgingActive()) { __ EmitFrameSetupForCodeAgePatching();
Code* stub = Code::GetPreAgedCodeAgeStub(isolate());
__ EmitCodeAgeSequence(stub);
} else {
__ EmitFrameSetupForCodeAgePatching();
}
} }
} }

View File

@ -1652,7 +1652,8 @@ class MacroAssembler : public Assembler {
void ExitFrameRestoreFPRegs(); void ExitFrameRestoreFPRegs();
// Generates function and stub prologue code. // 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 // Enter exit frame. Exit frames are used when calling C code from generated
// (JavaScript) code. // (JavaScript) code.

View File

@ -74,6 +74,7 @@ class FullCodeGenerator: public AstVisitor {
info->zone()), info->zone()),
back_edges_(2, info->zone()), back_edges_(2, info->zone()),
ic_total_count_(0) { ic_total_count_(0) {
ASSERT(!info->IsStub());
Initialize(); Initialize();
} }

View File

@ -157,8 +157,7 @@ void FullCodeGenerator::Generate() {
FrameScope frame_scope(masm_, StackFrame::MANUAL); FrameScope frame_scope(masm_, StackFrame::MANUAL);
info->set_prologue_offset(masm_->pc_offset()); info->set_prologue_offset(masm_->pc_offset());
ASSERT(!info->IsStub()); __ Prologue(info->IsCodePreAgingActive());
__ Prologue(info);
info->AddNoFrameRange(0, masm_->pc_offset()); info->AddNoFrameRange(0, masm_->pc_offset());
{ Comment cmnt(masm_, "[ Allocate locals"); { Comment cmnt(masm_, "[ Allocate locals");

View File

@ -188,7 +188,11 @@ bool LCodeGen::GeneratePrologue() {
if (NeedsEagerFrame()) { if (NeedsEagerFrame()) {
ASSERT(!frame_is_built_); ASSERT(!frame_is_built_);
frame_is_built_ = true; frame_is_built_ = true;
__ Prologue(info()); if (info()->IsStub()) {
__ StubPrologue();
} else {
__ Prologue(info()->IsCodePreAgingActive());
}
info()->AddNoFrameRange(0, masm_->pc_offset()); info()->AddNoFrameRange(0, masm_->pc_offset());
} }

View File

@ -900,26 +900,27 @@ void MacroAssembler::AssertNotSmi(Register object) {
} }
void MacroAssembler::Prologue(CompilationInfo* info) { void MacroAssembler::StubPrologue() {
if (info->IsStub()) { 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. push(ebp); // Caller's frame pointer.
mov(ebp, esp); mov(ebp, esp);
push(esi); // Callee's context. push(esi); // Callee's context.
push(Immediate(Smi::FromInt(StackFrame::STUB))); push(edi); // Callee's JS function.
} 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.
}
} }
} }

View File

@ -204,7 +204,8 @@ class MacroAssembler: public Assembler {
void DebugBreak(); void DebugBreak();
// Generates function and stub prologue code. // 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 // Enter specific kind of exit frame. Expects the number of
// arguments in register eax and sets up the number of arguments in // arguments in register eax and sets up the number of arguments in

View File

@ -176,8 +176,7 @@ void FullCodeGenerator::Generate() {
FrameScope frame_scope(masm_, StackFrame::MANUAL); FrameScope frame_scope(masm_, StackFrame::MANUAL);
info->set_prologue_offset(masm_->pc_offset()); info->set_prologue_offset(masm_->pc_offset());
ASSERT(!info->IsStub()); __ Prologue(info->IsCodePreAgingActive());
__ Prologue(info);
info->AddNoFrameRange(0, masm_->pc_offset()); info->AddNoFrameRange(0, masm_->pc_offset());
{ Comment cmnt(masm_, "[ Allocate locals"); { Comment cmnt(masm_, "[ Allocate locals");

View File

@ -162,7 +162,11 @@ bool LCodeGen::GeneratePrologue() {
info()->set_prologue_offset(masm_->pc_offset()); info()->set_prologue_offset(masm_->pc_offset());
if (NeedsEagerFrame()) { if (NeedsEagerFrame()) {
__ Prologue(info()); if (info()->IsStub()) {
__ StubPrologue();
} else {
__ Prologue(info()->IsCodePreAgingActive());
}
frame_is_built_ = true; frame_is_built_ = true;
info_->AddNoFrameRange(0, masm_->pc_offset()); info_->AddNoFrameRange(0, masm_->pc_offset());
} }

View File

@ -4452,36 +4452,37 @@ void MacroAssembler::LoadGlobalFunctionInitialMap(Register function,
} }
void MacroAssembler::Prologue(CompilationInfo* info) { void MacroAssembler::StubPrologue() {
if (info->IsStub()) {
Push(ra, fp, cp); Push(ra, fp, cp);
Push(Smi::FromInt(StackFrame::STUB)); Push(Smi::FromInt(StackFrame::STUB));
// Adjust FP to point to saved FP. // Adjust FP to point to saved FP.
Addu(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); 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); this, kNoCodeAgeSequenceLength);
// The following three instructions must remain together and unmodified // The following three instructions must remain together and unmodified
// for code aging to work properly. // for code aging to work properly.
if (info->IsCodePreAgingActive()) { if (code_pre_aging) {
// Pre-age the code. // Pre-age the code.
Code* stub = Code::GetPreAgedCodeAgeStub(isolate()); Code* stub = Code::GetPreAgedCodeAgeStub(isolate());
nop(Assembler::CODE_AGE_MARKER_NOP); nop(Assembler::CODE_AGE_MARKER_NOP);
// Load the stub address to t9 and call it, // Load the stub address to t9 and call it,
// GetCodeAgeAndParity() extracts the stub address from this instruction. // GetCodeAgeAndParity() extracts the stub address from this instruction.
li(t9, li(t9,
Operand(reinterpret_cast<uint32_t>(stub->instruction_start())), Operand(reinterpret_cast<uint32_t>(stub->instruction_start())),
CONSTANT_SIZE); CONSTANT_SIZE);
nop(); // Prevent jalr to jal optimization. nop(); // Prevent jalr to jal optimization.
jalr(t9, a0); jalr(t9, a0);
nop(); // Branch delay slot nop. nop(); // Branch delay slot nop.
nop(); // Pad the empty space. nop(); // Pad the empty space.
} else { } else {
Push(ra, fp, cp, a1); Push(ra, fp, cp, a1);
nop(Assembler::CODE_AGE_SEQUENCE_NOP); nop(Assembler::CODE_AGE_SEQUENCE_NOP);
// Adjust fp to point to caller's fp. // Adjust fp to point to caller's fp.
Addu(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); Addu(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
}
} }
} }

View File

@ -1492,7 +1492,8 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT
} }
// Generates function and stub prologue code. // Generates function and stub prologue code.
void Prologue(CompilationInfo* info); void StubPrologue();
void Prologue(bool code_pre_aging);
// Activation support. // Activation support.
void EnterFrame(StackFrame::Type type); void EnterFrame(StackFrame::Type type);

View File

@ -157,8 +157,7 @@ void FullCodeGenerator::Generate() {
FrameScope frame_scope(masm_, StackFrame::MANUAL); FrameScope frame_scope(masm_, StackFrame::MANUAL);
info->set_prologue_offset(masm_->pc_offset()); info->set_prologue_offset(masm_->pc_offset());
ASSERT(!info->IsStub()); __ Prologue(info->IsCodePreAgingActive());
__ Prologue(info);
info->AddNoFrameRange(0, masm_->pc_offset()); info->AddNoFrameRange(0, masm_->pc_offset());
{ Comment cmnt(masm_, "[ Allocate locals"); { Comment cmnt(masm_, "[ Allocate locals");

View File

@ -149,7 +149,11 @@ bool LCodeGen::GeneratePrologue() {
if (NeedsEagerFrame()) { if (NeedsEagerFrame()) {
ASSERT(!frame_is_built_); ASSERT(!frame_is_built_);
frame_is_built_ = true; frame_is_built_ = true;
__ Prologue(info()); if (info()->IsStub()) {
__ StubPrologue();
} else {
__ Prologue(info()->IsCodePreAgingActive());
}
info()->AddNoFrameRange(0, masm_->pc_offset()); info()->AddNoFrameRange(0, masm_->pc_offset());
} }

View File

@ -3889,26 +3889,27 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
} }
void MacroAssembler::Prologue(CompilationInfo* info) { void MacroAssembler::StubPrologue() {
if (info->IsStub()) {
pushq(rbp); // Caller's frame pointer. pushq(rbp); // Caller's frame pointer.
movp(rbp, rsp); movp(rbp, rsp);
Push(rsi); // Callee's context. Push(rsi); // Callee's context.
Push(Smi::FromInt(StackFrame::STUB)); 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 { } else {
PredictableCodeSizeScope predictible_code_size_scope(this, pushq(rbp); // Caller's frame pointer.
kNoCodeAgeSequenceLength); movp(rbp, rsp);
if (info->IsCodePreAgingActive()) { Push(rsi); // Callee's context.
// Pre-age the code. Push(rdi); // Callee's JS function.
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.
}
} }
} }

View File

@ -274,7 +274,8 @@ class MacroAssembler: public Assembler {
void DebugBreak(); void DebugBreak();
// Generates function and stub prologue code. // 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 // Enter specific kind of exit frame; either in normal or
// debug mode. Expects the number of arguments in register rax and // debug mode. Expects the number of arguments in register rax and