Index: src/x64/lithium-codegen-x64.cc |
=================================================================== |
--- src/x64/lithium-codegen-x64.cc (revision 6957) |
+++ src/x64/lithium-codegen-x64.cc (working copy) |
@@ -77,6 +77,7 @@ |
return GeneratePrologue() && |
GenerateBody() && |
GenerateDeferredCode() && |
+ GenerateJumpTable() && |
GenerateSafepointTable(); |
} |
@@ -240,6 +241,16 @@ |
} |
+bool LCodeGen::GenerateJumpTable() { |
+ for (int i = 0; i < jump_table_.length(); i++) { |
+ JumpTableEntry* info = jump_table_[i]; |
+ __ bind(&(info->label_)); |
+ __ Jump(info->address_, RelocInfo::RUNTIME_ENTRY); |
+ } |
+ return !is_aborted(); |
+} |
+ |
+ |
bool LCodeGen::GenerateDeferredCode() { |
ASSERT(is_generating()); |
for (int i = 0; !is_aborted() && i < deferred_.length(); i++) { |
@@ -512,10 +523,17 @@ |
if (cc == no_condition) { |
__ Jump(entry, RelocInfo::RUNTIME_ENTRY); |
} else { |
- NearLabel done; |
- __ j(NegateCondition(cc), &done); |
- __ Jump(entry, RelocInfo::RUNTIME_ENTRY); |
- __ bind(&done); |
+ JumpTableEntry* jump_info = NULL; |
+ // We often have several deopts to the same entry, reuse the last |
+ // jump entry if this is the case. |
+ if (jump_table_.length() > 0 && |
+ jump_table_[jump_table_.length() - 1]->address_ == entry) { |
+ jump_info = jump_table_[jump_table_.length() - 1]; |
+ } else { |
+ jump_info = new JumpTableEntry(entry); |
+ jump_table_.Add(jump_info); |
+ } |
+ __ j(cc, &jump_info->label_); |
} |
} |