| 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/x64/assembler-x64.h" | 5 #include "src/x64/assembler-x64.h" |
| 6 | 6 |
| 7 #include <cstring> | 7 #include <cstring> |
| 8 | 8 |
| 9 #if V8_TARGET_ARCH_X64 | 9 #if V8_TARGET_ARCH_X64 |
| 10 | 10 |
| (...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 826 void Assembler::bsfq(Register dst, const Operand& src) { | 826 void Assembler::bsfq(Register dst, const Operand& src) { |
| 827 EnsureSpace ensure_space(this); | 827 EnsureSpace ensure_space(this); |
| 828 emit_rex_64(dst, src); | 828 emit_rex_64(dst, src); |
| 829 emit(0x0F); | 829 emit(0x0F); |
| 830 emit(0xBC); | 830 emit(0xBC); |
| 831 emit_operand(dst, src); | 831 emit_operand(dst, src); |
| 832 } | 832 } |
| 833 | 833 |
| 834 | 834 |
| 835 void Assembler::call(Label* L) { | 835 void Assembler::call(Label* L) { |
| 836 positions_recorder()->WriteRecordedPositions(); | |
| 837 EnsureSpace ensure_space(this); | 836 EnsureSpace ensure_space(this); |
| 838 // 1110 1000 #32-bit disp. | 837 // 1110 1000 #32-bit disp. |
| 839 emit(0xE8); | 838 emit(0xE8); |
| 840 if (L->is_bound()) { | 839 if (L->is_bound()) { |
| 841 int offset = L->pos() - pc_offset() - sizeof(int32_t); | 840 int offset = L->pos() - pc_offset() - sizeof(int32_t); |
| 842 DCHECK(offset <= 0); | 841 DCHECK(offset <= 0); |
| 843 emitl(offset); | 842 emitl(offset); |
| 844 } else if (L->is_linked()) { | 843 } else if (L->is_linked()) { |
| 845 emitl(L->pos()); | 844 emitl(L->pos()); |
| 846 L->link_to(pc_offset() - sizeof(int32_t)); | 845 L->link_to(pc_offset() - sizeof(int32_t)); |
| 847 } else { | 846 } else { |
| 848 DCHECK(L->is_unused()); | 847 DCHECK(L->is_unused()); |
| 849 int32_t current = pc_offset(); | 848 int32_t current = pc_offset(); |
| 850 emitl(current); | 849 emitl(current); |
| 851 L->link_to(current); | 850 L->link_to(current); |
| 852 } | 851 } |
| 853 } | 852 } |
| 854 | 853 |
| 855 | 854 |
| 856 void Assembler::call(Address entry, RelocInfo::Mode rmode) { | 855 void Assembler::call(Address entry, RelocInfo::Mode rmode) { |
| 857 DCHECK(RelocInfo::IsRuntimeEntry(rmode)); | 856 DCHECK(RelocInfo::IsRuntimeEntry(rmode)); |
| 858 positions_recorder()->WriteRecordedPositions(); | |
| 859 EnsureSpace ensure_space(this); | 857 EnsureSpace ensure_space(this); |
| 860 // 1110 1000 #32-bit disp. | 858 // 1110 1000 #32-bit disp. |
| 861 emit(0xE8); | 859 emit(0xE8); |
| 862 emit_runtime_entry(entry, rmode); | 860 emit_runtime_entry(entry, rmode); |
| 863 } | 861 } |
| 864 | 862 |
| 865 | 863 |
| 866 void Assembler::call(Handle<Code> target, | 864 void Assembler::call(Handle<Code> target, |
| 867 RelocInfo::Mode rmode, | 865 RelocInfo::Mode rmode, |
| 868 TypeFeedbackId ast_id) { | 866 TypeFeedbackId ast_id) { |
| 869 positions_recorder()->WriteRecordedPositions(); | |
| 870 EnsureSpace ensure_space(this); | 867 EnsureSpace ensure_space(this); |
| 871 // 1110 1000 #32-bit disp. | 868 // 1110 1000 #32-bit disp. |
| 872 emit(0xE8); | 869 emit(0xE8); |
| 873 emit_code_target(target, rmode, ast_id); | 870 emit_code_target(target, rmode, ast_id); |
| 874 } | 871 } |
| 875 | 872 |
| 876 | 873 |
| 877 void Assembler::call(Register adr) { | 874 void Assembler::call(Register adr) { |
| 878 positions_recorder()->WriteRecordedPositions(); | |
| 879 EnsureSpace ensure_space(this); | 875 EnsureSpace ensure_space(this); |
| 880 // Opcode: FF /2 r64. | 876 // Opcode: FF /2 r64. |
| 881 emit_optional_rex_32(adr); | 877 emit_optional_rex_32(adr); |
| 882 emit(0xFF); | 878 emit(0xFF); |
| 883 emit_modrm(0x2, adr); | 879 emit_modrm(0x2, adr); |
| 884 } | 880 } |
| 885 | 881 |
| 886 | 882 |
| 887 void Assembler::call(const Operand& op) { | 883 void Assembler::call(const Operand& op) { |
| 888 positions_recorder()->WriteRecordedPositions(); | |
| 889 EnsureSpace ensure_space(this); | 884 EnsureSpace ensure_space(this); |
| 890 // Opcode: FF /2 m64. | 885 // Opcode: FF /2 m64. |
| 891 emit_optional_rex_32(op); | 886 emit_optional_rex_32(op); |
| 892 emit(0xFF); | 887 emit(0xFF); |
| 893 emit_operand(0x2, op); | 888 emit_operand(0x2, op); |
| 894 } | 889 } |
| 895 | 890 |
| 896 | 891 |
| 897 // Calls directly to the given address using a relative offset. | 892 // Calls directly to the given address using a relative offset. |
| 898 // Should only ever be used in Code objects for calls within the | 893 // Should only ever be used in Code objects for calls within the |
| 899 // same Code object. Should not be used when generating new code (use labels), | 894 // same Code object. Should not be used when generating new code (use labels), |
| 900 // but only when patching existing code. | 895 // but only when patching existing code. |
| 901 void Assembler::call(Address target) { | 896 void Assembler::call(Address target) { |
| 902 positions_recorder()->WriteRecordedPositions(); | |
| 903 EnsureSpace ensure_space(this); | 897 EnsureSpace ensure_space(this); |
| 904 // 1110 1000 #32-bit disp. | 898 // 1110 1000 #32-bit disp. |
| 905 emit(0xE8); | 899 emit(0xE8); |
| 906 Address source = pc_ + 4; | 900 Address source = pc_ + 4; |
| 907 intptr_t displacement = target - source; | 901 intptr_t displacement = target - source; |
| 908 DCHECK(is_int32(displacement)); | 902 DCHECK(is_int32(displacement)); |
| 909 emitl(static_cast<int32_t>(displacement)); | 903 emitl(static_cast<int32_t>(displacement)); |
| 910 } | 904 } |
| 911 | 905 |
| 912 | 906 |
| (...skipping 3660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4573 | 4567 |
| 4574 bool RelocInfo::IsInConstantPool() { | 4568 bool RelocInfo::IsInConstantPool() { |
| 4575 return false; | 4569 return false; |
| 4576 } | 4570 } |
| 4577 | 4571 |
| 4578 | 4572 |
| 4579 } // namespace internal | 4573 } // namespace internal |
| 4580 } // namespace v8 | 4574 } // namespace v8 |
| 4581 | 4575 |
| 4582 #endif // V8_TARGET_ARCH_X64 | 4576 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |