| 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_);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| 
 |