| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 #include "src/hydrogen-osr.h" | 9 #include "src/hydrogen-osr.h" |
| 10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" |
| (...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 translation.index(), | 762 translation.index(), |
| 763 (mode == Safepoint::kLazyDeopt) ? pc_offset : -1); | 763 (mode == Safepoint::kLazyDeopt) ? pc_offset : -1); |
| 764 deoptimizations_.Add(environment, zone()); | 764 deoptimizations_.Add(environment, zone()); |
| 765 } | 765 } |
| 766 } | 766 } |
| 767 | 767 |
| 768 | 768 |
| 769 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, | 769 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, |
| 770 Deoptimizer::BailoutType bailout_type, | 770 Deoptimizer::BailoutType bailout_type, |
| 771 Register src1, const Operand& src2, | 771 Register src1, const Operand& src2, |
| 772 const char* reason) { | 772 const char* detail) { |
| 773 LEnvironment* environment = instr->environment(); | 773 LEnvironment* environment = instr->environment(); |
| 774 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); | 774 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); |
| 775 DCHECK(environment->HasBeenRegistered()); | 775 DCHECK(environment->HasBeenRegistered()); |
| 776 int id = environment->deoptimization_index(); | 776 int id = environment->deoptimization_index(); |
| 777 DCHECK(info()->IsOptimizing() || info()->IsStub()); | 777 DCHECK(info()->IsOptimizing() || info()->IsStub()); |
| 778 Address entry = | 778 Address entry = |
| 779 Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type); | 779 Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type); |
| 780 if (entry == NULL) { | 780 if (entry == NULL) { |
| 781 Abort(kBailoutWasNotPrepared); | 781 Abort(kBailoutWasNotPrepared); |
| 782 return; | 782 return; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 803 | 803 |
| 804 if (info()->ShouldTrapOnDeopt()) { | 804 if (info()->ShouldTrapOnDeopt()) { |
| 805 Label skip; | 805 Label skip; |
| 806 if (condition != al) { | 806 if (condition != al) { |
| 807 __ Branch(&skip, NegateCondition(condition), src1, src2); | 807 __ Branch(&skip, NegateCondition(condition), src1, src2); |
| 808 } | 808 } |
| 809 __ stop("trap_on_deopt"); | 809 __ stop("trap_on_deopt"); |
| 810 __ bind(&skip); | 810 __ bind(&skip); |
| 811 } | 811 } |
| 812 | 812 |
| 813 Deoptimizer::Reason reason(instr->Mnemonic(), detail); |
| 813 DCHECK(info()->IsStub() || frame_is_built_); | 814 DCHECK(info()->IsStub() || frame_is_built_); |
| 814 // Go through jump table if we need to handle condition, build frame, or | 815 // Go through jump table if we need to handle condition, build frame, or |
| 815 // restore caller doubles. | 816 // restore caller doubles. |
| 816 if (condition == al && frame_is_built_ && | 817 if (condition == al && frame_is_built_ && |
| 817 !info()->saves_caller_doubles()) { | 818 !info()->saves_caller_doubles()) { |
| 818 DeoptComment(instr->Mnemonic(), reason); | 819 DeoptComment(reason); |
| 819 __ Call(entry, RelocInfo::RUNTIME_ENTRY, condition, src1, src2); | 820 __ Call(entry, RelocInfo::RUNTIME_ENTRY, condition, src1, src2); |
| 820 } else { | 821 } else { |
| 821 // We often have several deopts to the same entry, reuse the last | 822 // We often have several deopts to the same entry, reuse the last |
| 822 // jump entry if this is the case. | 823 // jump entry if this is the case. |
| 823 if (deopt_jump_table_.is_empty() || | 824 if (deopt_jump_table_.is_empty() || |
| 824 (deopt_jump_table_.last().address != entry) || | 825 (deopt_jump_table_.last().address != entry) || |
| 825 (deopt_jump_table_.last().bailout_type != bailout_type) || | 826 (deopt_jump_table_.last().bailout_type != bailout_type) || |
| 826 (deopt_jump_table_.last().needs_frame != !frame_is_built_)) { | 827 (deopt_jump_table_.last().needs_frame != !frame_is_built_)) { |
| 827 Deoptimizer::JumpTableEntry table_entry(entry, instr->Mnemonic(), reason, | 828 Deoptimizer::JumpTableEntry table_entry(entry, reason, bailout_type, |
| 828 bailout_type, !frame_is_built_); | 829 !frame_is_built_); |
| 829 deopt_jump_table_.Add(table_entry, zone()); | 830 deopt_jump_table_.Add(table_entry, zone()); |
| 830 } | 831 } |
| 831 __ Branch(&deopt_jump_table_.last().label, condition, src1, src2); | 832 __ Branch(&deopt_jump_table_.last().label, condition, src1, src2); |
| 832 } | 833 } |
| 833 } | 834 } |
| 834 | 835 |
| 835 | 836 |
| 836 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, | 837 void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr, |
| 837 Register src1, const Operand& src2, | 838 Register src1, const Operand& src2, |
| 838 const char* reason) { | 839 const char* detail) { |
| 839 Deoptimizer::BailoutType bailout_type = info()->IsStub() | 840 Deoptimizer::BailoutType bailout_type = info()->IsStub() |
| 840 ? Deoptimizer::LAZY | 841 ? Deoptimizer::LAZY |
| 841 : Deoptimizer::EAGER; | 842 : Deoptimizer::EAGER; |
| 842 DeoptimizeIf(condition, instr, bailout_type, src1, src2, reason); | 843 DeoptimizeIf(condition, instr, bailout_type, src1, src2, detail); |
| 843 } | 844 } |
| 844 | 845 |
| 845 | 846 |
| 846 void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) { | 847 void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) { |
| 847 int length = deoptimizations_.length(); | 848 int length = deoptimizations_.length(); |
| 848 if (length == 0) return; | 849 if (length == 0) return; |
| 849 Handle<DeoptimizationInputData> data = | 850 Handle<DeoptimizationInputData> data = |
| 850 DeoptimizationInputData::New(isolate(), length, TENURED); | 851 DeoptimizationInputData::New(isolate(), length, TENURED); |
| 851 | 852 |
| 852 Handle<ByteArray> translations = | 853 Handle<ByteArray> translations = |
| (...skipping 5092 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5945 __ li(at, scope_info); | 5946 __ li(at, scope_info); |
| 5946 __ Push(at, ToRegister(instr->function())); | 5947 __ Push(at, ToRegister(instr->function())); |
| 5947 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5948 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 5948 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5949 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 5949 } | 5950 } |
| 5950 | 5951 |
| 5951 | 5952 |
| 5952 #undef __ | 5953 #undef __ |
| 5953 | 5954 |
| 5954 } } // namespace v8::internal | 5955 } } // namespace v8::internal |
| OLD | NEW |