Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Unified Diff: src/a64/macro-assembler-a64.cc

Issue 181873002: A64: Move veneer emission checking in the Assembler. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Remove the force_emit parameter in CheckVeneerPool Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/a64/macro-assembler-a64.h ('k') | src/a64/macro-assembler-a64-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/a64/macro-assembler-a64.cc
diff --git a/src/a64/macro-assembler-a64.cc b/src/a64/macro-assembler-a64.cc
index 5b979c2b31ed496463018ce49d4c69ac73ceabb2..f637b2bd6a1a374745ff94c36ee2eeb910de736f 100644
--- a/src/a64/macro-assembler-a64.cc
+++ b/src/a64/macro-assembler-a64.cc
@@ -558,92 +558,6 @@ void MacroAssembler::Store(const Register& rt,
}
-bool MacroAssembler::ShouldEmitVeneer(int max_reachable_pc, int margin) {
- // Account for the branch around the veneers and the guard.
- int protection_offset = 2 * kInstructionSize;
- return pc_offset() > max_reachable_pc - margin - protection_offset -
- static_cast<int>(unresolved_branches_.size() * kMaxVeneerCodeSize);
-}
-
-
-void MacroAssembler::EmitVeneers(bool need_protection) {
- RecordComment("[ Veneers");
-
- Label end;
- if (need_protection) {
- B(&end);
- }
-
- EmitVeneersGuard();
-
- {
- InstructionAccurateScope scope(this);
- Label size_check;
-
- std::multimap<int, FarBranchInfo>::iterator it, it_to_delete;
-
- it = unresolved_branches_.begin();
- while (it != unresolved_branches_.end()) {
- if (ShouldEmitVeneer(it->first)) {
- Instruction* branch = InstructionAt(it->second.pc_offset_);
- Label* label = it->second.label_;
-
-#ifdef DEBUG
- __ bind(&size_check);
-#endif
- // Patch the branch to point to the current position, and emit a branch
- // to the label.
- Instruction* veneer = reinterpret_cast<Instruction*>(pc_);
- RemoveBranchFromLabelLinkChain(branch, label, veneer);
- branch->SetImmPCOffsetTarget(veneer);
- b(label);
-#ifdef DEBUG
- ASSERT(SizeOfCodeGeneratedSince(&size_check) <=
- static_cast<uint64_t>(kMaxVeneerCodeSize));
- size_check.Unuse();
-#endif
-
- it_to_delete = it++;
- unresolved_branches_.erase(it_to_delete);
- } else {
- ++it;
- }
- }
- }
-
- Bind(&end);
-
- RecordComment("]");
-}
-
-
-void MacroAssembler::EmitVeneersGuard() {
- if (emit_debug_code()) {
- Unreachable();
- }
-}
-
-
-void MacroAssembler::CheckVeneers(bool need_protection) {
- if (unresolved_branches_.empty()) {
- return;
- }
-
- CHECK(pc_offset() < unresolved_branches_first_limit());
- int margin = kVeneerDistanceMargin;
- if (!need_protection) {
- // Prefer emitting veneers protected by an existing instruction.
- // The 4 divisor is a finger in the air guess. With a default margin of 2KB,
- // that leaves 512B = 128 instructions of extra margin to avoid requiring a
- // protective branch.
- margin += margin / 4;
- }
- if (ShouldEmitVeneer(unresolved_branches_first_limit(), margin)) {
- EmitVeneers(need_protection);
- }
-}
-
-
bool MacroAssembler::NeedExtraInstructionsOrRegisterBranch(
Label *label, ImmBranchType b_type) {
bool need_longer_range = false;
@@ -661,6 +575,10 @@ bool MacroAssembler::NeedExtraInstructionsOrRegisterBranch(
unresolved_branches_.insert(
std::pair<int, FarBranchInfo>(max_reachable_pc,
FarBranchInfo(pc_offset(), label)));
+ // Also maintain the next pool check.
+ next_veneer_pool_check_ =
+ Min(next_veneer_pool_check_,
+ max_reachable_pc - kVeneerDistanceCheckMargin);
}
return need_longer_range;
}
@@ -696,11 +614,10 @@ void MacroAssembler::B(Label* label, Condition cond) {
if (need_extra_instructions) {
b(&done, InvertCondition(cond));
- b(label);
+ B(label);
} else {
b(label, cond);
}
- CheckVeneers(!need_extra_instructions);
bind(&done);
}
@@ -714,11 +631,10 @@ void MacroAssembler::Tbnz(const Register& rt, unsigned bit_pos, Label* label) {
if (need_extra_instructions) {
tbz(rt, bit_pos, &done);
- b(label);
+ B(label);
} else {
tbnz(rt, bit_pos, label);
}
- CheckVeneers(!need_extra_instructions);
bind(&done);
}
@@ -732,11 +648,10 @@ void MacroAssembler::Tbz(const Register& rt, unsigned bit_pos, Label* label) {
if (need_extra_instructions) {
tbnz(rt, bit_pos, &done);
- b(label);
+ B(label);
} else {
tbz(rt, bit_pos, label);
}
- CheckVeneers(!need_extra_instructions);
bind(&done);
}
@@ -750,11 +665,10 @@ void MacroAssembler::Cbnz(const Register& rt, Label* label) {
if (need_extra_instructions) {
cbz(rt, &done);
- b(label);
+ B(label);
} else {
cbnz(rt, label);
}
- CheckVeneers(!need_extra_instructions);
bind(&done);
}
@@ -768,11 +682,10 @@ void MacroAssembler::Cbz(const Register& rt, Label* label) {
if (need_extra_instructions) {
cbnz(rt, &done);
- b(label);
+ B(label);
} else {
cbz(rt, label);
}
- CheckVeneers(!need_extra_instructions);
bind(&done);
}
@@ -2009,7 +1922,7 @@ void MacroAssembler::Jump(Handle<Code> code, RelocInfo::Mode rmode) {
void MacroAssembler::Call(Register target) {
- BlockConstPoolScope scope(this);
+ BlockPoolsScope scope(this);
#ifdef DEBUG
Label start_call;
Bind(&start_call);
@@ -2024,7 +1937,7 @@ void MacroAssembler::Call(Register target) {
void MacroAssembler::Call(Label* target) {
- BlockConstPoolScope scope(this);
+ BlockPoolsScope scope(this);
#ifdef DEBUG
Label start_call;
Bind(&start_call);
@@ -2041,7 +1954,7 @@ void MacroAssembler::Call(Label* target) {
// MacroAssembler::CallSize is sensitive to changes in this function, as it
// requires to know how many instructions are used to branch to the target.
void MacroAssembler::Call(Address target, RelocInfo::Mode rmode) {
- BlockConstPoolScope scope(this);
+ BlockPoolsScope scope(this);
#ifdef DEBUG
Label start_call;
Bind(&start_call);
@@ -4679,7 +4592,7 @@ void MacroAssembler::Abort(BailoutReason reason) {
// Emit the message string directly in the instruction stream.
{
- BlockConstPoolScope scope(this);
+ BlockPoolsScope scope(this);
Bind(&msg_address);
EmitStringData(GetBailoutReason(reason));
}
@@ -4871,7 +4784,7 @@ void MacroAssembler::PrintfNoPreserve(const char * format,
Adr(x0, &format_address);
// Emit the format string directly in the instruction stream.
- { BlockConstPoolScope scope(this);
+ { BlockPoolsScope scope(this);
Label after_data;
B(&after_data);
Bind(&format_address);
@@ -5036,7 +4949,7 @@ bool MacroAssembler::IsCodeAgeSequence(byte* sequence) {
void InlineSmiCheckInfo::Emit(MacroAssembler* masm, const Register& reg,
const Label* smi_check) {
- Assembler::BlockConstPoolScope scope(masm);
+ Assembler::BlockPoolsScope scope(masm);
if (reg.IsValid()) {
ASSERT(smi_check->is_bound());
ASSERT(reg.Is64Bits());
« no previous file with comments | « src/a64/macro-assembler-a64.h ('k') | src/a64/macro-assembler-a64-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698