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

Unified Diff: src/x64/assembler-x64-inl.h

Issue 11574027: Use direct jump and call instruction for X64 when the deoptimization entries are in the code range (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 8 years 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
Index: src/x64/assembler-x64-inl.h
===================================================================
--- src/x64/assembler-x64-inl.h (revision 13219)
+++ src/x64/assembler-x64-inl.h (working copy)
@@ -86,6 +86,20 @@
}
+void Assembler::emit_deopt_entry(Address entry, RelocInfo::Mode rmode) {
+ ASSERT(RelocInfo::IsDeoptEntry(rmode));
+ RecordRelocInfo(rmode);
+ int current = deopt_entries_.length();
+ if (current > 0 && deopt_entries_.last() == entry) {
+ // Optimization if we keep jumping to the same entry.
+ emitl(current - 1);
+ } else {
+ deopt_entries_.Add(entry);
+ emitl(current);
+ }
+}
+
+
void Assembler::emit_rex_64(Register reg, Register rm_reg) {
emit(0x48 | reg.high_bit() << 2 | rm_reg.high_bit());
}
@@ -208,6 +222,11 @@
return code_targets_[Memory::int32_at(pc)];
}
+
+Address Assembler::deopt_entry_at(Address pc) {
+ return deopt_entries_[Memory::int32_at(pc)];
+}
+
// -----------------------------------------------------------------------------
// Implementation of RelocInfo
@@ -217,7 +236,7 @@
// absolute code pointer inside code object moves with the code object.
Memory::Address_at(pc_) += static_cast<int32_t>(delta);
CPU::FlushICache(pc_, sizeof(Address));
- } else if (IsCodeTarget(rmode_)) {
+ } else if (IsCodeTarget(rmode_) || IsDeoptEntry(rmode_)) {
Memory::int32_at(pc_) -= static_cast<int32_t>(delta);
CPU::FlushICache(pc_, sizeof(int32_t));
} else if (rmode_ == CODE_AGE_SEQUENCE) {
@@ -231,8 +250,9 @@
Address RelocInfo::target_address() {
- ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY);
- if (IsCodeTarget(rmode_)) {
+ ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY
+ || IsDeoptEntry(rmode_));
+ if (IsCodeTarget(rmode_) || (IsDeoptEntry(rmode_))) {
return Assembler::target_address_at(pc_);
} else {
return Memory::Address_at(pc_);
@@ -242,6 +262,7 @@
Address RelocInfo::target_address_address() {
ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY
+ || IsDeoptEntry(rmode_)
|| rmode_ == EMBEDDED_OBJECT
|| rmode_ == EXTERNAL_REFERENCE);
return reinterpret_cast<Address>(pc_);
@@ -258,11 +279,13 @@
void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) {
- ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY);
- if (IsCodeTarget(rmode_)) {
+ ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY
+ || IsDeoptEntry(rmode_));
+ if (IsCodeTarget(rmode_) || IsDeoptEntry(rmode_)) {
Assembler::set_target_address_at(pc_, target);
- Object* target_code = Code::GetCodeFromTargetAddress(target);
- if (mode == UPDATE_WRITE_BARRIER && host() != NULL) {
+ if (mode == UPDATE_WRITE_BARRIER && host() != NULL
+ && IsCodeTarget(rmode_)) {
+ Object* target_code = Code::GetCodeFromTargetAddress(target);
host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(
host(), this, HeapObject::cast(target_code));
}
@@ -289,6 +312,12 @@
}
+Address RelocInfo::target_deopt_entry(Assembler* origin) {
+ ASSERT(IsDeoptEntry(rmode_));
+ return origin->deopt_entry_at(pc_);
+}
+
+
Object** RelocInfo::target_object_address() {
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
return reinterpret_cast<Object**>(pc_);

Powered by Google App Engine
This is Rietveld 408576698