| 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 #if V8_TARGET_ARCH_ARM | 5 #if V8_TARGET_ARCH_ARM |
| 6 | 6 |
| 7 #include "src/assembler-inl.h" | 7 #include "src/assembler-inl.h" |
| 8 #include "src/ast/compile-time-value.h" | 8 #include "src/ast/compile-time-value.h" |
| 9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
| 10 #include "src/builtins/builtins-constructor.h" | 10 #include "src/builtins/builtins-constructor.h" |
| (...skipping 2742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2753 } | 2753 } |
| 2754 PushOperand(ip); | 2754 PushOperand(ip); |
| 2755 } | 2755 } |
| 2756 | 2756 |
| 2757 | 2757 |
| 2758 #undef __ | 2758 #undef __ |
| 2759 | 2759 |
| 2760 | 2760 |
| 2761 static Address GetInterruptImmediateLoadAddress(Address pc) { | 2761 static Address GetInterruptImmediateLoadAddress(Address pc) { |
| 2762 Address load_address = pc - 2 * Assembler::kInstrSize; | 2762 Address load_address = pc - 2 * Assembler::kInstrSize; |
| 2763 if (!FLAG_enable_embedded_constant_pool) { | 2763 DCHECK(Assembler::IsLdrPcImmediateOffset(Memory::int32_at(load_address))); |
| 2764 DCHECK(Assembler::IsLdrPcImmediateOffset(Memory::int32_at(load_address))); | |
| 2765 } else if (Assembler::IsLdrPpRegOffset(Memory::int32_at(load_address))) { | |
| 2766 // This is an extended constant pool lookup. | |
| 2767 if (CpuFeatures::IsSupported(ARMv7)) { | |
| 2768 load_address -= 2 * Assembler::kInstrSize; | |
| 2769 DCHECK(Assembler::IsMovW(Memory::int32_at(load_address))); | |
| 2770 DCHECK(Assembler::IsMovT( | |
| 2771 Memory::int32_at(load_address + Assembler::kInstrSize))); | |
| 2772 } else { | |
| 2773 load_address -= 4 * Assembler::kInstrSize; | |
| 2774 DCHECK(Assembler::IsMovImmed(Memory::int32_at(load_address))); | |
| 2775 DCHECK(Assembler::IsOrrImmed( | |
| 2776 Memory::int32_at(load_address + Assembler::kInstrSize))); | |
| 2777 DCHECK(Assembler::IsOrrImmed( | |
| 2778 Memory::int32_at(load_address + 2 * Assembler::kInstrSize))); | |
| 2779 DCHECK(Assembler::IsOrrImmed( | |
| 2780 Memory::int32_at(load_address + 3 * Assembler::kInstrSize))); | |
| 2781 } | |
| 2782 } else if (CpuFeatures::IsSupported(ARMv7) && | |
| 2783 Assembler::IsMovT(Memory::int32_at(load_address))) { | |
| 2784 // This is a movw / movt immediate load. | |
| 2785 load_address -= Assembler::kInstrSize; | |
| 2786 DCHECK(Assembler::IsMovW(Memory::int32_at(load_address))); | |
| 2787 } else if (!CpuFeatures::IsSupported(ARMv7) && | |
| 2788 Assembler::IsOrrImmed(Memory::int32_at(load_address))) { | |
| 2789 // This is a mov / orr immediate load. | |
| 2790 load_address -= 3 * Assembler::kInstrSize; | |
| 2791 DCHECK(Assembler::IsMovImmed(Memory::int32_at(load_address))); | |
| 2792 DCHECK(Assembler::IsOrrImmed( | |
| 2793 Memory::int32_at(load_address + Assembler::kInstrSize))); | |
| 2794 DCHECK(Assembler::IsOrrImmed( | |
| 2795 Memory::int32_at(load_address + 2 * Assembler::kInstrSize))); | |
| 2796 } else { | |
| 2797 // This is a small constant pool lookup. | |
| 2798 DCHECK(Assembler::IsLdrPpImmediateOffset(Memory::int32_at(load_address))); | |
| 2799 } | |
| 2800 return load_address; | 2764 return load_address; |
| 2801 } | 2765 } |
| 2802 | 2766 |
| 2803 | 2767 |
| 2804 void BackEdgeTable::PatchAt(Code* unoptimized_code, | 2768 void BackEdgeTable::PatchAt(Code* unoptimized_code, |
| 2805 Address pc, | 2769 Address pc, |
| 2806 BackEdgeState target_state, | 2770 BackEdgeState target_state, |
| 2807 Code* replacement_code) { | 2771 Code* replacement_code) { |
| 2808 Address pc_immediate_load_address = GetInterruptImmediateLoadAddress(pc); | 2772 Address pc_immediate_load_address = GetInterruptImmediateLoadAddress(pc); |
| 2809 Address branch_address = pc_immediate_load_address - Assembler::kInstrSize; | 2773 Address branch_address = pc_immediate_load_address - Assembler::kInstrSize; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2891 DCHECK(interrupt_address == | 2855 DCHECK(interrupt_address == |
| 2892 isolate->builtins()->OnStackReplacement()->entry()); | 2856 isolate->builtins()->OnStackReplacement()->entry()); |
| 2893 return ON_STACK_REPLACEMENT; | 2857 return ON_STACK_REPLACEMENT; |
| 2894 } | 2858 } |
| 2895 | 2859 |
| 2896 | 2860 |
| 2897 } // namespace internal | 2861 } // namespace internal |
| 2898 } // namespace v8 | 2862 } // namespace v8 |
| 2899 | 2863 |
| 2900 #endif // V8_TARGET_ARCH_ARM | 2864 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |