ARM: make MacroAssembler::LoadRoot emit exactly one instruction when in predictable code size scope.
BUG=v8:2439 R=danno@chromium.org Review URL: https://chromiumcodereview.appspot.com/11280276 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13113 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
06038fb6a5
commit
45fc19124f
@ -606,6 +606,7 @@ static byte* GetNoCodeAgeSequence(uint32_t* length) {
|
||||
*length = kNoCodeAgeSequenceLength * Assembler::kInstrSize;
|
||||
if (!initialized) {
|
||||
CodePatcher patcher(byte_sequence, kNoCodeAgeSequenceLength);
|
||||
PredictableCodeSizeScope scope(patcher.masm(), *length);
|
||||
patcher.masm()->stm(db_w, sp, r1.bit() | cp.bit() | fp.bit() | lr.bit());
|
||||
patcher.masm()->LoadRoot(ip, Heap::kUndefinedValueRootIndex);
|
||||
patcher.masm()->add(fp, sp, Operand(2 * kPointerSize));
|
||||
|
@ -165,14 +165,18 @@ void FullCodeGenerator::Generate() {
|
||||
int locals_count = info->scope()->num_stack_slots();
|
||||
|
||||
info->set_prologue_offset(masm_->pc_offset());
|
||||
// The following four instructions must remain together and unmodified for
|
||||
// code aging to work properly.
|
||||
__ stm(db_w, sp, r1.bit() | cp.bit() | fp.bit() | lr.bit());
|
||||
// Load undefined value here, so the value is ready for the loop
|
||||
// below.
|
||||
__ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
|
||||
// Adjust fp to point to caller's fp.
|
||||
__ add(fp, sp, Operand(2 * kPointerSize));
|
||||
{
|
||||
PredictableCodeSizeScope predictible_code_size_scope(
|
||||
masm_, kNoCodeAgeSequenceLength * Assembler::kInstrSize);
|
||||
// The following three instructions must remain together and unmodified
|
||||
// for code aging to work properly.
|
||||
__ stm(db_w, sp, r1.bit() | cp.bit() | fp.bit() | lr.bit());
|
||||
// Load undefined value here, so the value is ready for the loop
|
||||
// below.
|
||||
__ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
|
||||
// Adjust FP to point to saved FP.
|
||||
__ add(fp, sp, Operand(2 * kPointerSize));
|
||||
}
|
||||
|
||||
{ Comment cmnt(masm_, "[ Allocate locals");
|
||||
for (int i = 0; i < locals_count; i++) {
|
||||
|
@ -148,13 +148,18 @@ bool LCodeGen::GeneratePrologue() {
|
||||
|
||||
|
||||
info()->set_prologue_offset(masm_->pc_offset());
|
||||
// The following three instructions must remain together and unmodified for
|
||||
// code aging to work properly.
|
||||
__ stm(db_w, sp, r1.bit() | cp.bit() | fp.bit() | lr.bit());
|
||||
// Add unused load of ip to ensure prologue sequence is identical for
|
||||
// full-codegen and lithium-codegen.
|
||||
__ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
|
||||
__ add(fp, sp, Operand(2 * kPointerSize)); // Adjust FP to point to saved FP.
|
||||
{
|
||||
PredictableCodeSizeScope predictible_code_size_scope(
|
||||
masm_, kNoCodeAgeSequenceLength * Assembler::kInstrSize);
|
||||
// The following three instructions must remain together and unmodified
|
||||
// for code aging to work properly.
|
||||
__ stm(db_w, sp, r1.bit() | cp.bit() | fp.bit() | lr.bit());
|
||||
// Load undefined value here, so the value is ready for the loop
|
||||
// below.
|
||||
__ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
|
||||
// Adjust FP to point to saved FP.
|
||||
__ add(fp, sp, Operand(2 * kPointerSize));
|
||||
}
|
||||
|
||||
// Reserve space for the stack slots needed by the code.
|
||||
int slots = GetStackSlotCount();
|
||||
|
@ -423,7 +423,8 @@ void MacroAssembler::LoadRoot(Register destination,
|
||||
Heap::RootListIndex index,
|
||||
Condition cond) {
|
||||
if (CpuFeatures::IsSupported(MOVW_MOVT_IMMEDIATE_LOADS) &&
|
||||
!Heap::RootCanBeWrittenAfterInitialization(index)) {
|
||||
!Heap::RootCanBeWrittenAfterInitialization(index) &&
|
||||
!predictable_code_size()) {
|
||||
Handle<Object> root(isolate()->heap()->roots_array_start()[index]);
|
||||
if (!isolate()->heap()->InNewSpace(*root)) {
|
||||
// The CPU supports fast immediate values, and this root will never
|
||||
|
Loading…
Reference in New Issue
Block a user