| 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 #if V8_TARGET_ARCH_ARM | 7 #if V8_TARGET_ARCH_ARM |
| 8 | 8 |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 4743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4754 ASSERT(Assembler::IsLdrPpImmediateOffset(Memory::int32_at(load_address))); | 4754 ASSERT(Assembler::IsLdrPpImmediateOffset(Memory::int32_at(load_address))); |
| 4755 } | 4755 } |
| 4756 return load_address; | 4756 return load_address; |
| 4757 } | 4757 } |
| 4758 | 4758 |
| 4759 | 4759 |
| 4760 void BackEdgeTable::PatchAt(Code* unoptimized_code, | 4760 void BackEdgeTable::PatchAt(Code* unoptimized_code, |
| 4761 Address pc, | 4761 Address pc, |
| 4762 BackEdgeState target_state, | 4762 BackEdgeState target_state, |
| 4763 Code* replacement_code) { | 4763 Code* replacement_code) { |
| 4764 static const int kInstrSize = Assembler::kInstrSize; | |
| 4765 Address pc_immediate_load_address = GetInterruptImmediateLoadAddress(pc); | 4764 Address pc_immediate_load_address = GetInterruptImmediateLoadAddress(pc); |
| 4766 Address branch_address = pc_immediate_load_address - kInstrSize; | 4765 Address branch_address = pc_immediate_load_address - Assembler::kInstrSize; |
| 4767 CodePatcher patcher(branch_address, 1); | 4766 CodePatcher patcher(branch_address, 1); |
| 4768 switch (target_state) { | 4767 switch (target_state) { |
| 4769 case INTERRUPT: | 4768 case INTERRUPT: |
| 4770 { | 4769 { |
| 4771 // <decrement profiling counter> | 4770 // <decrement profiling counter> |
| 4772 // bpl ok | 4771 // bpl ok |
| 4773 // ; load interrupt stub address into ip - either of: | 4772 // ; load interrupt stub address into ip - either of: |
| 4774 // ldr ip, [pc/pp, <constant pool offset>] | movw ip, <immed low> | 4773 // ldr ip, [pc/pp, <constant pool offset>] | movw ip, <immed low> |
| 4775 // | movt ip, <immed high> | 4774 // | movt ip, <immed high> |
| 4776 // blx ip | 4775 // blx ip |
| 4777 // ok-label | 4776 // ok-label |
| 4778 | 4777 |
| 4779 // Calculate branch offet to the ok-label - this is the difference between | 4778 // Calculate branch offet to the ok-label - this is the difference between |
| 4780 // the branch address and |pc| (which points at <blx ip>) plus one instr. | 4779 // the branch address and |pc| (which points at <blx ip>) plus one instr. |
| 4781 int branch_offset = pc + kInstrSize - branch_address; | 4780 int branch_offset = pc + Assembler::kInstrSize - branch_address; |
| 4782 patcher.masm()->b(branch_offset, pl); | 4781 patcher.masm()->b(branch_offset, pl); |
| 4783 break; | 4782 break; |
| 4784 } | 4783 } |
| 4785 case ON_STACK_REPLACEMENT: | 4784 case ON_STACK_REPLACEMENT: |
| 4786 case OSR_AFTER_STACK_CHECK: | 4785 case OSR_AFTER_STACK_CHECK: |
| 4787 // <decrement profiling counter> | 4786 // <decrement profiling counter> |
| 4788 // mov r0, r0 (NOP) | 4787 // mov r0, r0 (NOP) |
| 4789 // ; load on-stack replacement address into ip - either of: | 4788 // ; load on-stack replacement address into ip - either of: |
| 4790 // ldr ip, [pc/pp, <constant pool offset>] | movw ip, <immed low> | 4789 // ldr ip, [pc/pp, <constant pool offset>] | movw ip, <immed low> |
| 4791 // | movt ip, <immed high> | 4790 // | movt ip, <immed high> |
| 4792 // blx ip | 4791 // blx ip |
| 4793 // ok-label | 4792 // ok-label |
| 4794 patcher.masm()->nop(); | 4793 patcher.masm()->nop(); |
| 4795 break; | 4794 break; |
| 4796 } | 4795 } |
| 4797 | 4796 |
| 4798 // Replace the call address. | 4797 // Replace the call address. |
| 4799 Assembler::set_target_address_at(pc_immediate_load_address, unoptimized_code, | 4798 Assembler::set_target_address_at(pc_immediate_load_address, unoptimized_code, |
| 4800 replacement_code->entry()); | 4799 replacement_code->entry()); |
| 4801 | 4800 |
| 4802 unoptimized_code->GetHeap()->incremental_marking()->RecordCodeTargetPatch( | 4801 unoptimized_code->GetHeap()->incremental_marking()->RecordCodeTargetPatch( |
| 4803 unoptimized_code, pc_immediate_load_address, replacement_code); | 4802 unoptimized_code, pc_immediate_load_address, replacement_code); |
| 4804 } | 4803 } |
| 4805 | 4804 |
| 4806 | 4805 |
| 4807 BackEdgeTable::BackEdgeState BackEdgeTable::GetBackEdgeState( | 4806 BackEdgeTable::BackEdgeState BackEdgeTable::GetBackEdgeState( |
| 4808 Isolate* isolate, | 4807 Isolate* isolate, |
| 4809 Code* unoptimized_code, | 4808 Code* unoptimized_code, |
| 4810 Address pc) { | 4809 Address pc) { |
| 4811 static const int kInstrSize = Assembler::kInstrSize; | 4810 ASSERT(Assembler::IsBlxIp(Memory::int32_at(pc - Assembler::kInstrSize))); |
| 4812 ASSERT(Memory::int32_at(pc - kInstrSize) == kBlxIp); | |
| 4813 | 4811 |
| 4814 Address pc_immediate_load_address = GetInterruptImmediateLoadAddress(pc); | 4812 Address pc_immediate_load_address = GetInterruptImmediateLoadAddress(pc); |
| 4815 Address branch_address = pc_immediate_load_address - kInstrSize; | 4813 Address branch_address = pc_immediate_load_address - Assembler::kInstrSize; |
| 4816 Address interrupt_address = Assembler::target_address_at( | 4814 Address interrupt_address = Assembler::target_address_at( |
| 4817 pc_immediate_load_address, unoptimized_code); | 4815 pc_immediate_load_address, unoptimized_code); |
| 4818 | 4816 |
| 4819 if (Assembler::IsBranch(Assembler::instr_at(branch_address))) { | 4817 if (Assembler::IsBranch(Assembler::instr_at(branch_address))) { |
| 4820 ASSERT(interrupt_address == | 4818 ASSERT(interrupt_address == |
| 4821 isolate->builtins()->InterruptCheck()->entry()); | 4819 isolate->builtins()->InterruptCheck()->entry()); |
| 4822 return INTERRUPT; | 4820 return INTERRUPT; |
| 4823 } | 4821 } |
| 4824 | 4822 |
| 4825 ASSERT(Assembler::IsNop(Assembler::instr_at(branch_address))); | 4823 ASSERT(Assembler::IsNop(Assembler::instr_at(branch_address))); |
| 4826 | 4824 |
| 4827 if (interrupt_address == | 4825 if (interrupt_address == |
| 4828 isolate->builtins()->OnStackReplacement()->entry()) { | 4826 isolate->builtins()->OnStackReplacement()->entry()) { |
| 4829 return ON_STACK_REPLACEMENT; | 4827 return ON_STACK_REPLACEMENT; |
| 4830 } | 4828 } |
| 4831 | 4829 |
| 4832 ASSERT(interrupt_address == | 4830 ASSERT(interrupt_address == |
| 4833 isolate->builtins()->OsrAfterStackCheck()->entry()); | 4831 isolate->builtins()->OsrAfterStackCheck()->entry()); |
| 4834 return OSR_AFTER_STACK_CHECK; | 4832 return OSR_AFTER_STACK_CHECK; |
| 4835 } | 4833 } |
| 4836 | 4834 |
| 4837 | 4835 |
| 4838 } } // namespace v8::internal | 4836 } } // namespace v8::internal |
| 4839 | 4837 |
| 4840 #endif // V8_TARGET_ARCH_ARM | 4838 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |