| 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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 Address RelocInfo::wasm_global_reference() { | 125 Address RelocInfo::wasm_global_reference() { |
| 126 DCHECK(IsWasmGlobalReference(rmode_)); | 126 DCHECK(IsWasmGlobalReference(rmode_)); |
| 127 return Memory::Address_at(pc_); | 127 return Memory::Address_at(pc_); |
| 128 } | 128 } |
| 129 | 129 |
| 130 uint32_t RelocInfo::wasm_memory_size_reference() { | 130 uint32_t RelocInfo::wasm_memory_size_reference() { |
| 131 DCHECK(IsWasmMemorySizeReference(rmode_)); | 131 DCHECK(IsWasmMemorySizeReference(rmode_)); |
| 132 return Memory::uint32_at(pc_); | 132 return Memory::uint32_at(pc_); |
| 133 } | 133 } |
| 134 | 134 |
| 135 void RelocInfo::update_wasm_memory_reference( | 135 void RelocInfo::unchecked_update_wasm_memory_reference( |
| 136 Address old_base, Address new_base, uint32_t old_size, uint32_t new_size, | 136 Address address, ICacheFlushMode flush_mode) { |
| 137 ICacheFlushMode icache_flush_mode) { | 137 Memory::Address_at(pc_) = address; |
| 138 DCHECK(IsWasmMemoryReference(rmode_) || IsWasmMemorySizeReference(rmode_)); | |
| 139 if (IsWasmMemoryReference(rmode_)) { | |
| 140 Address updated_reference; | |
| 141 DCHECK(old_base <= wasm_memory_reference() && | |
| 142 wasm_memory_reference() < old_base + old_size); | |
| 143 updated_reference = new_base + (wasm_memory_reference() - old_base); | |
| 144 DCHECK(new_base <= updated_reference && | |
| 145 updated_reference < new_base + new_size); | |
| 146 Memory::Address_at(pc_) = updated_reference; | |
| 147 } else if (IsWasmMemorySizeReference(rmode_)) { | |
| 148 uint32_t updated_size_reference; | |
| 149 DCHECK(wasm_memory_size_reference() <= old_size); | |
| 150 updated_size_reference = | |
| 151 new_size + (wasm_memory_size_reference() - old_size); | |
| 152 DCHECK(updated_size_reference <= new_size); | |
| 153 Memory::uint32_at(pc_) = updated_size_reference; | |
| 154 } else { | |
| 155 UNREACHABLE(); | |
| 156 } | |
| 157 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { | |
| 158 Assembler::FlushICache(isolate_, pc_, sizeof(int64_t)); | |
| 159 } | |
| 160 } | 138 } |
| 161 | 139 |
| 162 void RelocInfo::update_wasm_global_reference( | 140 void RelocInfo::unchecked_update_wasm_memory_size(uint32_t size, |
| 163 Address old_base, Address new_base, ICacheFlushMode icache_flush_mode) { | 141 ICacheFlushMode flush_mode) { |
| 164 DCHECK(IsWasmGlobalReference(rmode_)); | 142 Memory::uint32_at(pc_) = size; |
| 165 Address updated_reference; | |
| 166 DCHECK(old_base <= wasm_global_reference()); | |
| 167 updated_reference = new_base + (wasm_global_reference() - old_base); | |
| 168 DCHECK(new_base <= updated_reference); | |
| 169 Memory::Address_at(pc_) = updated_reference; | |
| 170 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { | |
| 171 Assembler::FlushICache(isolate_, pc_, sizeof(int64_t)); | |
| 172 } | |
| 173 } | 143 } |
| 174 | 144 |
| 175 // ----------------------------------------------------------------------------- | 145 // ----------------------------------------------------------------------------- |
| 176 // Implementation of Operand | 146 // Implementation of Operand |
| 177 | 147 |
| 178 Operand::Operand(Register base, int32_t disp) : rex_(0) { | 148 Operand::Operand(Register base, int32_t disp) : rex_(0) { |
| 179 len_ = 1; | 149 len_ = 1; |
| 180 if (base.is(rsp) || base.is(r12)) { | 150 if (base.is(rsp) || base.is(r12)) { |
| 181 // SIB byte is needed to encode (rsp + offset) or (r12 + offset). | 151 // SIB byte is needed to encode (rsp + offset) or (r12 + offset). |
| 182 set_sib(times_1, rsp, base); | 152 set_sib(times_1, rsp, base); |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 } | 580 } |
| 611 } | 581 } |
| 612 | 582 |
| 613 | 583 |
| 614 void Assembler::immediate_arithmetic_op(byte subcode, | 584 void Assembler::immediate_arithmetic_op(byte subcode, |
| 615 Register dst, | 585 Register dst, |
| 616 Immediate src, | 586 Immediate src, |
| 617 int size) { | 587 int size) { |
| 618 EnsureSpace ensure_space(this); | 588 EnsureSpace ensure_space(this); |
| 619 emit_rex(dst, size); | 589 emit_rex(dst, size); |
| 620 if (is_int8(src.value_)) { | 590 if (is_int8(src.value_) && RelocInfo::IsNone(src.rmode_)) { |
| 621 emit(0x83); | 591 emit(0x83); |
| 622 emit_modrm(subcode, dst); | 592 emit_modrm(subcode, dst); |
| 623 if (!RelocInfo::IsNone(src.rmode_)) { | |
| 624 RecordRelocInfo(src.rmode_); | |
| 625 } | |
| 626 emit(src.value_); | 593 emit(src.value_); |
| 627 } else if (dst.is(rax)) { | 594 } else if (dst.is(rax)) { |
| 628 emit(0x05 | (subcode << 3)); | 595 emit(0x05 | (subcode << 3)); |
| 629 emit(src); | 596 emit(src); |
| 630 } else { | 597 } else { |
| 631 emit(0x81); | 598 emit(0x81); |
| 632 emit_modrm(subcode, dst); | 599 emit_modrm(subcode, dst); |
| 633 emit(src); | 600 emit(src); |
| 634 } | 601 } |
| 635 } | 602 } |
| (...skipping 3970 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4606 | 4573 |
| 4607 bool RelocInfo::IsInConstantPool() { | 4574 bool RelocInfo::IsInConstantPool() { |
| 4608 return false; | 4575 return false; |
| 4609 } | 4576 } |
| 4610 | 4577 |
| 4611 | 4578 |
| 4612 } // namespace internal | 4579 } // namespace internal |
| 4613 } // namespace v8 | 4580 } // namespace v8 |
| 4614 | 4581 |
| 4615 #endif // V8_TARGET_ARCH_X64 | 4582 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |