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
This commit is contained in:
parent
0ddacf3966
commit
61f3a82506
@ -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,7 +465,8 @@ void Assembler::bind_to(Label* L, int pos) {
|
||||
}
|
||||
L->bind_to(pos);
|
||||
|
||||
// do not eliminate jump instructions before the last bound position
|
||||
// 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<cond>, but not bl<cond>
|
||||
// Previous instruction is b<cond> 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());
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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")
|
||||
|
Loading…
Reference in New Issue
Block a user