A64: Force emission of the veneer pool emission when required.

R=ulan@chromium.org

Review URL: https://codereview.chromium.org/203443003

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20036 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 18104111
...@@ -1207,7 +1207,7 @@ inline void Assembler::CheckBuffer() { ...@@ -1207,7 +1207,7 @@ inline void Assembler::CheckBuffer() {
GrowBuffer(); GrowBuffer();
} }
if (pc_offset() >= next_veneer_pool_check_) { if (pc_offset() >= next_veneer_pool_check_) {
CheckVeneerPool(true); CheckVeneerPool(false, true);
} }
if (pc_offset() >= next_constant_pool_check_) { if (pc_offset() >= next_constant_pool_check_) {
CheckConstPool(false, true); CheckConstPool(false, true);
......
...@@ -2566,7 +2566,7 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) { ...@@ -2566,7 +2566,7 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) {
// Emit veneers for branches that would go out of range during emission of the // Emit veneers for branches that would go out of range during emission of the
// constant pool. // constant pool.
CheckVeneerPool(require_jump, kVeneerDistanceMargin + pool_size); CheckVeneerPool(false, require_jump, kVeneerDistanceMargin + pool_size);
Label size_check; Label size_check;
bind(&size_check); bind(&size_check);
...@@ -2659,7 +2659,7 @@ void Assembler::RecordVeneerPool(int location_offset, int size) { ...@@ -2659,7 +2659,7 @@ void Assembler::RecordVeneerPool(int location_offset, int size) {
} }
void Assembler::EmitVeneers(bool need_protection, int margin) { void Assembler::EmitVeneers(bool force_emit, bool need_protection, int margin) {
BlockPoolsScope scope(this); BlockPoolsScope scope(this);
RecordComment("[ Veneers"); RecordComment("[ Veneers");
...@@ -2685,7 +2685,7 @@ void Assembler::EmitVeneers(bool need_protection, int margin) { ...@@ -2685,7 +2685,7 @@ void Assembler::EmitVeneers(bool need_protection, int margin) {
it = unresolved_branches_.begin(); it = unresolved_branches_.begin();
while (it != unresolved_branches_.end()) { while (it != unresolved_branches_.end()) {
if (ShouldEmitVeneer(it->first, margin)) { if (force_emit || ShouldEmitVeneer(it->first, margin)) {
Instruction* branch = InstructionAt(it->second.pc_offset_); Instruction* branch = InstructionAt(it->second.pc_offset_);
Label* label = it->second.label_; Label* label = it->second.label_;
...@@ -2728,7 +2728,7 @@ void Assembler::EmitVeneers(bool need_protection, int margin) { ...@@ -2728,7 +2728,7 @@ void Assembler::EmitVeneers(bool need_protection, int margin) {
} }
void Assembler::CheckVeneerPool(bool require_jump, void Assembler::CheckVeneerPool(bool force_emit, bool require_jump,
int margin) { int margin) {
// There is nothing to do if there are no pending veneer pool entries. // There is nothing to do if there are no pending veneer pool entries.
if (unresolved_branches_.empty()) { if (unresolved_branches_.empty()) {
...@@ -2742,6 +2742,7 @@ void Assembler::CheckVeneerPool(bool require_jump, ...@@ -2742,6 +2742,7 @@ void Assembler::CheckVeneerPool(bool require_jump,
// emission, such sequences are protected by calls to BlockVeneerPoolFor and // emission, such sequences are protected by calls to BlockVeneerPoolFor and
// BlockVeneerPoolScope. // BlockVeneerPoolScope.
if (is_veneer_pool_blocked()) { if (is_veneer_pool_blocked()) {
ASSERT(!force_emit);
return; return;
} }
...@@ -2749,8 +2750,8 @@ void Assembler::CheckVeneerPool(bool require_jump, ...@@ -2749,8 +2750,8 @@ void Assembler::CheckVeneerPool(bool require_jump,
// Prefer emitting veneers protected by an existing instruction. // Prefer emitting veneers protected by an existing instruction.
margin *= kVeneerNoProtectionFactor; margin *= kVeneerNoProtectionFactor;
} }
if (ShouldEmitVeneers(margin)) { if (force_emit || ShouldEmitVeneers(margin)) {
EmitVeneers(require_jump, margin); EmitVeneers(force_emit, require_jump, margin);
} else { } else {
next_veneer_pool_check_ = next_veneer_pool_check_ =
unresolved_branches_first_limit() - kVeneerDistanceCheckMargin; unresolved_branches_first_limit() - kVeneerDistanceCheckMargin;
......
...@@ -1808,10 +1808,13 @@ class Assembler : public AssemblerBase { ...@@ -1808,10 +1808,13 @@ class Assembler : public AssemblerBase {
// Emits veneers for branches that are approaching their maximum range. // Emits veneers for branches that are approaching their maximum range.
// If need_protection is true, the veneers are protected by a branch jumping // If need_protection is true, the veneers are protected by a branch jumping
// over the code. // over the code.
void EmitVeneers(bool need_protection, int margin = kVeneerDistanceMargin); void EmitVeneers(bool force_emit, bool need_protection,
int margin = kVeneerDistanceMargin);
void EmitVeneersGuard() { EmitPoolGuard(); } void EmitVeneersGuard() { EmitPoolGuard(); }
// Checks whether veneers need to be emitted at this point. // Checks whether veneers need to be emitted at this point.
void CheckVeneerPool(bool require_jump, int margin = kVeneerDistanceMargin); // If force_emit is set, a veneer is generated for *all* unresolved branches.
void CheckVeneerPool(bool force_emit, bool require_jump,
int margin = kVeneerDistanceMargin);
class BlockPoolsScope { class BlockPoolsScope {
......
...@@ -314,8 +314,9 @@ void FullCodeGenerator::Generate() { ...@@ -314,8 +314,9 @@ void FullCodeGenerator::Generate() {
} }
EmitReturnSequence(); EmitReturnSequence();
// Force emit the constant pool, so it doesn't get emitted in the middle // Force emission of the pools, so they don't get emitted in the middle
// of the back edge table. // of the back edge table.
masm()->CheckVeneerPool(true, false);
masm()->CheckConstPool(true, false); masm()->CheckConstPool(true, false);
} }
......
...@@ -895,6 +895,9 @@ bool LCodeGen::GenerateDeoptJumpTable() { ...@@ -895,6 +895,9 @@ bool LCodeGen::GenerateDeoptJumpTable() {
bool LCodeGen::GenerateSafepointTable() { bool LCodeGen::GenerateSafepointTable() {
ASSERT(is_done()); ASSERT(is_done());
// We do not know how much data will be emitted for the safepoint table, so
// force emission of the veneer pool.
masm()->CheckVeneerPool(true, true);
safepoints_.Emit(masm(), GetStackSlotCount()); safepoints_.Emit(masm(), GetStackSlotCount());
return !is_aborted(); return !is_aborted();
} }
......
...@@ -346,7 +346,7 @@ void MacroAssembler::Asr(const Register& rd, ...@@ -346,7 +346,7 @@ void MacroAssembler::Asr(const Register& rd,
void MacroAssembler::B(Label* label) { void MacroAssembler::B(Label* label) {
b(label); b(label);
CheckVeneerPool(false); CheckVeneerPool(false, false);
} }
...@@ -1036,7 +1036,7 @@ void MacroAssembler::Ret(const Register& xn) { ...@@ -1036,7 +1036,7 @@ void MacroAssembler::Ret(const Register& xn) {
ASSERT(allow_macro_instructions_); ASSERT(allow_macro_instructions_);
ASSERT(!xn.IsZero()); ASSERT(!xn.IsZero());
ret(xn); ret(xn);
CheckVeneerPool(false); CheckVeneerPool(false, false);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment