From 45fc19124fdcf2316ce89c71af712d1f67e363df Mon Sep 17 00:00:00 2001 From: "ulan@chromium.org" Date: Mon, 3 Dec 2012 13:40:37 +0000 Subject: [PATCH] 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 --- src/arm/codegen-arm.cc | 1 + src/arm/full-codegen-arm.cc | 20 ++++++++++++-------- src/arm/lithium-codegen-arm.cc | 19 ++++++++++++------- src/arm/macro-assembler-arm.cc | 3 ++- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc index af2f216..300772a 100644 --- a/src/arm/codegen-arm.cc +++ b/src/arm/codegen-arm.cc @@ -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)); diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc index 7cb402e..b0df846 100644 --- a/src/arm/full-codegen-arm.cc +++ b/src/arm/full-codegen-arm.cc @@ -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++) { diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index 39e239a..515a0d0 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -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(); diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index 7f6c60d..5c064c1 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -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 root(isolate()->heap()->roots_array_start()[index]); if (!isolate()->heap()->InNewSpace(*root)) { // The CPU supports fast immediate values, and this root will never -- 2.7.4