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);
|
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");
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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");
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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");
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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");
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user