| 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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 void CpuFeatures::PrintTarget() { } | 101 void CpuFeatures::PrintTarget() { } |
| 102 void CpuFeatures::PrintFeatures() { | 102 void CpuFeatures::PrintFeatures() { |
| 103 printf("SSE3=%d SSE4_1=%d SAHF=%d AVX=%d FMA3=%d ATOM=%d\n", | 103 printf("SSE3=%d SSE4_1=%d SAHF=%d AVX=%d FMA3=%d ATOM=%d\n", |
| 104 CpuFeatures::IsSupported(SSE3), CpuFeatures::IsSupported(SSE4_1), | 104 CpuFeatures::IsSupported(SSE3), CpuFeatures::IsSupported(SSE4_1), |
| 105 CpuFeatures::IsSupported(SAHF), CpuFeatures::IsSupported(AVX), | 105 CpuFeatures::IsSupported(SAHF), CpuFeatures::IsSupported(AVX), |
| 106 CpuFeatures::IsSupported(FMA3), CpuFeatures::IsSupported(ATOM)); | 106 CpuFeatures::IsSupported(FMA3), CpuFeatures::IsSupported(ATOM)); |
| 107 } | 107 } |
| 108 | 108 |
| 109 | 109 |
| 110 // ----------------------------------------------------------------------------- | 110 // ----------------------------------------------------------------------------- |
| 111 // Implementation of RelocInfo | |
| 112 | |
| 113 // Patch the code at the current PC with a call to the target address. | |
| 114 // Additional guard int3 instructions can be added if required. | |
| 115 void RelocInfo::PatchCodeWithCall(Address target, int guard_bytes) { | |
| 116 int code_size = Assembler::kCallSequenceLength + guard_bytes; | |
| 117 | |
| 118 // Create a code patcher. | |
| 119 CodePatcher patcher(pc_, code_size); | |
| 120 | |
| 121 // Add a label for checking the size of the code used for returning. | |
| 122 #ifdef DEBUG | |
| 123 Label check_codesize; | |
| 124 patcher.masm()->bind(&check_codesize); | |
| 125 #endif | |
| 126 | |
| 127 // Patch the code. | |
| 128 patcher.masm()->movp(kScratchRegister, reinterpret_cast<void*>(target), | |
| 129 Assembler::RelocInfoNone()); | |
| 130 patcher.masm()->call(kScratchRegister); | |
| 131 | |
| 132 // Check that the size of the code generated is as expected. | |
| 133 DCHECK_EQ(Assembler::kCallSequenceLength, | |
| 134 patcher.masm()->SizeOfCodeGeneratedSince(&check_codesize)); | |
| 135 | |
| 136 // Add the requested number of int3 instructions after the call. | |
| 137 for (int i = 0; i < guard_bytes; i++) { | |
| 138 patcher.masm()->int3(); | |
| 139 } | |
| 140 } | |
| 141 | |
| 142 | |
| 143 void RelocInfo::PatchCode(byte* instructions, int instruction_count) { | |
| 144 // Patch the code at the current address with the supplied instructions. | |
| 145 for (int i = 0; i < instruction_count; i++) { | |
| 146 *(pc_ + i) = *(instructions + i); | |
| 147 } | |
| 148 | |
| 149 // Indicate that code has changed. | |
| 150 CpuFeatures::FlushICache(pc_, instruction_count); | |
| 151 } | |
| 152 | |
| 153 | |
| 154 // ----------------------------------------------------------------------------- | |
| 155 // Register constants. | 111 // Register constants. |
| 156 | 112 |
| 157 const int | 113 const int |
| 158 Register::kRegisterCodeByAllocationIndex[kMaxNumAllocatableRegisters] = { | 114 Register::kRegisterCodeByAllocationIndex[kMaxNumAllocatableRegisters] = { |
| 159 // rax, rbx, rdx, rcx, rsi, rdi, r8, r9, r11, r12, r14, r15 | 115 // rax, rbx, rdx, rcx, rsi, rdi, r8, r9, r11, r12, r14, r15 |
| 160 0, 3, 2, 1, 6, 7, 8, 9, 11, 12, 14, 15 | 116 0, 3, 2, 1, 6, 7, 8, 9, 11, 12, 14, 15 |
| 161 }; | 117 }; |
| 162 | 118 |
| 163 const int Register::kAllocationIndexByRegisterCode[kNumRegisters] = { | 119 const int Register::kAllocationIndexByRegisterCode[kNumRegisters] = { |
| 164 0, 3, 2, 1, -1, -1, 4, 5, 6, 7, -1, 8, 9, -1, 10, 11 | 120 0, 3, 2, 1, -1, -1, 4, 5, 6, 7, -1, 8, 9, -1, 10, 11 |
| (...skipping 3292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3457 | 3413 |
| 3458 | 3414 |
| 3459 bool RelocInfo::IsInConstantPool() { | 3415 bool RelocInfo::IsInConstantPool() { |
| 3460 return false; | 3416 return false; |
| 3461 } | 3417 } |
| 3462 | 3418 |
| 3463 | 3419 |
| 3464 } } // namespace v8::internal | 3420 } } // namespace v8::internal |
| 3465 | 3421 |
| 3466 #endif // V8_TARGET_ARCH_X64 | 3422 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |