From 61f3a82506667b026ca59c53e9f0d985730632aa Mon Sep 17 00:00:00 2001 From: "deanm@chromium.org" Date: Tue, 30 Sep 2008 09:42:08 +0000 Subject: [PATCH] Remove the ARM jump elimination. This completely removes jump elimination. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@394 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/assembler-arm.cc | 69 +++++--------------------------------------------- src/assembler-arm.h | 7 +---- src/flag-definitions.h | 3 --- 3 files changed, 7 insertions(+), 72 deletions(-) diff --git a/src/assembler-arm.cc b/src/assembler-arm.cc index 71894e5..cc8227e 100644 --- a/src/assembler-arm.cc +++ b/src/assembler-arm.cc @@ -337,10 +337,6 @@ Assembler::~Assembler() { void Assembler::GetCode(CodeDesc* desc) { - // finalize code - if (unbound_label_.is_linked()) - bind_to(&unbound_label_, binding_pos_); - // emit constant pool if necessary CheckConstPool(true, false); ASSERT(num_prinfo_ == 0); @@ -469,8 +465,9 @@ void Assembler::bind_to(Label* L, int pos) { } L->bind_to(pos); - // do not eliminate jump instructions before the last bound position - if (pos > last_bound_pos_) + // Keep track of the last bound label so we don't eliminate any instructions + // before a bound label. + if (pos > last_bound_pos_) last_bound_pos_ = pos; } @@ -498,45 +495,6 @@ void Assembler::link_to(Label* L, Label* appendix) { void Assembler::bind(Label* L) { ASSERT(!L->is_bound()); // label can only be bound once - if (FLAG_eliminate_jumps) { - // Resolve unbound label. - if (unbound_label_.is_linked()) { - // Unbound label exists => link it with L if same binding - // position, otherwise fix it. - if (binding_pos_ == pc_offset()) { - // Link it to L's list. - link_to(L, &unbound_label_); - } else { - // Otherwise bind unbound label. - ASSERT(binding_pos_ < pc_offset()); - bind_to(&unbound_label_, binding_pos_); - } - } - ASSERT(!unbound_label_.is_linked()); - // Try to eliminate jumps to next instruction. - Instr instr; - // Do not remove an already bound jump target. - while (last_bound_pos_ < pc_offset() && - reloc_info_writer.last_pc() <= pc_ - kInstrSize && - L->is_linked() && L->pos() == pc_offset() - kInstrSize && - (((instr = instr_at(L->pos())) & CondMask) != nv && // not blx - (instr & 15*B24) == 10*B24)) { // b, but not bl - // Previous instruction is b jumping immediately after it - // => eliminate it - if (FLAG_print_jump_elimination) - PrintF("@ %d jump to next eliminated\n", L->pos()); - // Remove first entry from label list. - next(L); - // Eliminate instruction (set code pointers back). - pc_ -= kInstrSize; - // Make sure not to skip relocation information when rewinding. - ASSERT(reloc_info_writer.last_pc() <= pc_); - } - // delay fixup of L => store it as unbound label - unbound_label_ = *L; - binding_pos_ = pc_offset(); - L->Unuse(); - } bind_to(L, pc_offset()); } @@ -728,30 +686,15 @@ void Assembler::addrmod5(Instr instr, CRegister crd, const MemOperand& x) { int Assembler::branch_offset(Label* L, bool jump_elimination_allowed) { - // if we emit an unconditional jump/call and if the current position is the - // target of the unbound label, we can change the binding position of the - // unbound label, thereby eliminating an unnecessary jump - bool can_eliminate = false; - if (jump_elimination_allowed && FLAG_eliminate_jumps && - unbound_label_.is_linked() && binding_pos_ == pc_offset()) { - can_eliminate = true; - if (FLAG_print_jump_elimination) { - PrintF("eliminated jumps/calls to %d from ", binding_pos_); - print(&unbound_label_); - } - } int target_pos; if (L->is_bound()) { target_pos = L->pos(); - if (can_eliminate) - binding_pos_ = target_pos; } else { - if (can_eliminate) - link_to(L, &unbound_label_); // may modify L's link - if (L->is_linked()) + if (L->is_linked()) { target_pos = L->pos(); // L's link - else + } else { target_pos = kEndOfChain; + } L->link_to(pc_offset()); } diff --git a/src/assembler-arm.h b/src/assembler-arm.h index 351ce3d..1aebc42 100644 --- a/src/assembler-arm.h +++ b/src/assembler-arm.h @@ -742,12 +742,7 @@ class Assembler : public Malloced { RelocInfo prinfo_[kMaxNumPRInfo]; // the buffer of pending relocation info int num_prinfo_; // number of pending reloc info entries in the buffer - // Jump-to-jump elimination: - // The last label to be bound to _binding_pos, if unbound. - Label unbound_label_; - // The position to which _unbound_label has to be bound, if present. - int binding_pos_; - // The position before which jumps cannot be eliminated. + // The bound position, before this we cannot do instruction elimination. int last_bound_pos_; // source position information diff --git a/src/flag-definitions.h b/src/flag-definitions.h index 52c2847..6508c77 100644 --- a/src/flag-definitions.h +++ b/src/flag-definitions.h @@ -87,9 +87,6 @@ DEFINE_bool(push_pop_elimination, true, "eliminate redundant push/pops in assembly code") DEFINE_bool(print_push_pop_elimination, false, "print elimination of redundant push/pops in assembly code") -DEFINE_bool(eliminate_jumps, true, "eliminate jumps to jumps in assembly code") -DEFINE_bool(print_jump_elimination, false, - "print elimination of jumps to jumps in assembly code") // bootstrapper.cc DEFINE_string(expose_natives_as, NULL, "expose natives in global object") -- 2.7.4