Index: src/x64/assembler-x64.cc |
=================================================================== |
--- src/x64/assembler-x64.cc (revision 5449) |
+++ src/x64/assembler-x64.cc (working copy) |
@@ -418,6 +418,20 @@ |
} |
+void Assembler::bind(NearLabel* L) { |
+ ASSERT(!L->is_bound()); |
+ last_pc_ = NULL; |
+ while (L->unresolved_branches_ > 0) { |
+ int branch_pos = L->unresolved_positions_[L->unresolved_branches_ - 1]; |
+ int disp = pc_offset() - branch_pos; |
+ ASSERT(is_int8(disp)); |
+ set_byte_at(branch_pos - sizeof(int8_t), disp); |
+ L->unresolved_branches_--; |
+ } |
+ L->bind_to(pc_offset()); |
+} |
+ |
+ |
void Assembler::GrowBuffer() { |
ASSERT(buffer_overflow()); |
if (!own_buffer_) FATAL("external code buffer is too small"); |
@@ -1227,6 +1241,27 @@ |
} |
+void Assembler::j(Condition cc, NearLabel* L, Hint hint) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ ASSERT(0 <= cc && cc < 16); |
+ if (FLAG_emit_branch_hints && hint != no_hint) emit(hint); |
+ if (L->is_bound()) { |
+ const int short_size = 2; |
+ int offs = L->pos() - pc_offset(); |
+ ASSERT(offs <= 0); |
+ ASSERT(is_int8(offs - short_size)); |
+ // 0111 tttn #8-bit disp |
+ emit(0x70 | cc); |
+ emit((offs - short_size) & 0xFF); |
+ } else { |
+ emit(0x70 | cc); |
+ emit(0x00); // The displacement will be resolved later. |
+ L->link_to(pc_offset()); |
+ } |
+} |
+ |
+ |
void Assembler::jmp(Label* L) { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
@@ -1269,6 +1304,25 @@ |
} |
+void Assembler::jmp(NearLabel* L) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ if (L->is_bound()) { |
+ const int short_size = sizeof(int8_t); |
+ int offs = L->pos() - pc_offset(); |
+ ASSERT(offs <= 0); |
+ ASSERT(is_int8(offs - short_size)); |
+ // 1110 1011 #8-bit disp. |
+ emit(0xEB); |
+ emit((offs - short_size) & 0xFF); |
+ } else { |
+ emit(0xEB); |
+ emit(0x00); // The displacement will be resolved later. |
+ L->link_to(pc_offset()); |
+ } |
+} |
+ |
+ |
void Assembler::jmp(Register target) { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |