| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
| 6 // are met: | 6 // are met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 841 | 841 |
| 842 | 842 |
| 843 void Assembler::target_at_put(int pos, int target_pos) { | 843 void Assembler::target_at_put(int pos, int target_pos) { |
| 844 Instr instr = instr_at(pos); | 844 Instr instr = instr_at(pos); |
| 845 if (is_uint24(instr)) { | 845 if (is_uint24(instr)) { |
| 846 DCHECK(target_pos == pos || target_pos >= 0); | 846 DCHECK(target_pos == pos || target_pos >= 0); |
| 847 // Emitted link to a label, not part of a branch. | 847 // Emitted link to a label, not part of a branch. |
| 848 // Load the position of the label relative to the generated code object | 848 // Load the position of the label relative to the generated code object |
| 849 // pointer in a register. | 849 // pointer in a register. |
| 850 | 850 |
| 851 // The existing code must be a single 24-bit label chain link, followed by |
| 852 // nops encoding the destination register. See mov_label_offset. |
| 853 |
| 854 // Extract the destination register from the first nop instructions. |
| 855 Register dst = |
| 856 Register::from_code(Instruction::RmValue(instr_at(pos + kInstrSize))); |
| 857 // In addition to the 24-bit label chain link, we expect to find one nop for |
| 858 // ARMv7 and above, or two nops for ARMv6. See mov_label_offset. |
| 859 DCHECK(IsNop(instr_at(pos + kInstrSize), dst.code())); |
| 860 if (!CpuFeatures::IsSupported(ARMv7)) { |
| 861 DCHECK(IsNop(instr_at(pos + 2 * kInstrSize), dst.code())); |
| 862 } |
| 863 |
| 851 // Here are the instructions we need to emit: | 864 // Here are the instructions we need to emit: |
| 852 // For ARMv7: target24 => target16_1:target16_0 | 865 // For ARMv7: target24 => target16_1:target16_0 |
| 853 // movw dst, #target16_0 | 866 // movw dst, #target16_0 |
| 854 // movt dst, #target16_1 | 867 // movt dst, #target16_1 |
| 855 // For ARMv6: target24 => target8_2:target8_1:target8_0 | 868 // For ARMv6: target24 => target8_2:target8_1:target8_0 |
| 856 // mov dst, #target8_0 | 869 // mov dst, #target8_0 |
| 857 // orr dst, dst, #target8_1 << 8 | 870 // orr dst, dst, #target8_1 << 8 |
| 858 // orr dst, dst, #target8_2 << 16 | 871 // orr dst, dst, #target8_2 << 16 |
| 859 | 872 |
| 860 // We extract the destination register from the emitted nop instruction. | |
| 861 Register dst = Register::from_code( | |
| 862 Instruction::RmValue(instr_at(pos + kInstrSize))); | |
| 863 DCHECK(IsNop(instr_at(pos + kInstrSize), dst.code())); | |
| 864 uint32_t target24 = target_pos + (Code::kHeaderSize - kHeapObjectTag); | 873 uint32_t target24 = target_pos + (Code::kHeaderSize - kHeapObjectTag); |
| 865 DCHECK(is_uint24(target24)); | 874 DCHECK(is_uint24(target24)); |
| 866 if (is_uint8(target24)) { | 875 if (is_uint8(target24)) { |
| 867 // If the target fits in a byte then only patch with a mov | 876 // If the target fits in a byte then only patch with a mov |
| 868 // instruction. | 877 // instruction. |
| 869 CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), 1, | 878 CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), 1, |
| 870 CodePatcher::DONT_FLUSH); | 879 CodePatcher::DONT_FLUSH); |
| 871 patcher.masm()->mov(dst, Operand(target24)); | 880 patcher.masm()->mov(dst, Operand(target24)); |
| 872 } else { | 881 } else { |
| 873 uint16_t target16_0 = target24 & kImm16Mask; | 882 uint16_t target16_0 = target24 & kImm16Mask; |
| (...skipping 3417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4291 DCHECK(is_uint12(offset)); | 4300 DCHECK(is_uint12(offset)); |
| 4292 instr_at_put(pc, SetLdrRegisterImmediateOffset(instr, offset)); | 4301 instr_at_put(pc, SetLdrRegisterImmediateOffset(instr, offset)); |
| 4293 } | 4302 } |
| 4294 } | 4303 } |
| 4295 | 4304 |
| 4296 | 4305 |
| 4297 } // namespace internal | 4306 } // namespace internal |
| 4298 } // namespace v8 | 4307 } // namespace v8 |
| 4299 | 4308 |
| 4300 #endif // V8_TARGET_ARCH_ARM | 4309 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |