diff options
Diffstat (limited to 'V8Binding/v8/src/x64/assembler-x64-inl.h')
-rw-r--r-- | V8Binding/v8/src/x64/assembler-x64-inl.h | 86 |
1 files changed, 45 insertions, 41 deletions
diff --git a/V8Binding/v8/src/x64/assembler-x64-inl.h b/V8Binding/v8/src/x64/assembler-x64-inl.h index 1822568..196f2ee 100644 --- a/V8Binding/v8/src/x64/assembler-x64-inl.h +++ b/V8Binding/v8/src/x64/assembler-x64-inl.h @@ -29,6 +29,7 @@ #define V8_X64_ASSEMBLER_X64_INL_H_ #include "cpu.h" +#include "memory.h" namespace v8 { namespace internal { @@ -70,18 +71,28 @@ void Assembler::emitw(uint16_t x) { void Assembler::emit_rex_64(Register reg, Register rm_reg) { + emit(0x48 | reg.high_bit() << 2 | rm_reg.high_bit()); +} + + +void Assembler::emit_rex_64(XMMRegister reg, Register rm_reg) { emit(0x48 | (reg.code() & 0x8) >> 1 | rm_reg.code() >> 3); } void Assembler::emit_rex_64(Register reg, const Operand& op) { + emit(0x48 | reg.high_bit() << 2 | op.rex_); +} + + +void Assembler::emit_rex_64(XMMRegister reg, const Operand& op) { emit(0x48 | (reg.code() & 0x8) >> 1 | op.rex_); } void Assembler::emit_rex_64(Register rm_reg) { ASSERT_EQ(rm_reg.code() & 0xf, rm_reg.code()); - emit(0x48 | (rm_reg.code() >> 3)); + emit(0x48 | rm_reg.high_bit()); } @@ -91,17 +102,17 @@ void Assembler::emit_rex_64(const Operand& op) { void Assembler::emit_rex_32(Register reg, Register rm_reg) { - emit(0x40 | (reg.code() & 0x8) >> 1 | rm_reg.code() >> 3); + emit(0x40 | reg.high_bit() << 2 | rm_reg.high_bit()); } void Assembler::emit_rex_32(Register reg, const Operand& op) { - emit(0x40 | (reg.code() & 0x8) >> 1 | op.rex_); + emit(0x40 | reg.high_bit() << 2 | op.rex_); } void Assembler::emit_rex_32(Register rm_reg) { - emit(0x40 | (rm_reg.code() & 0x8) >> 3); + emit(0x40 | rm_reg.high_bit()); } @@ -111,19 +122,37 @@ void Assembler::emit_rex_32(const Operand& op) { void Assembler::emit_optional_rex_32(Register reg, Register rm_reg) { - byte rex_bits = (reg.code() & 0x8) >> 1 | rm_reg.code() >> 3; + byte rex_bits = reg.high_bit() << 2 | rm_reg.high_bit(); if (rex_bits != 0) emit(0x40 | rex_bits); } void Assembler::emit_optional_rex_32(Register reg, const Operand& op) { + byte rex_bits = reg.high_bit() << 2 | op.rex_; + if (rex_bits != 0) emit(0x40 | rex_bits); +} + + +void Assembler::emit_optional_rex_32(XMMRegister reg, const Operand& op) { byte rex_bits = (reg.code() & 0x8) >> 1 | op.rex_; if (rex_bits != 0) emit(0x40 | rex_bits); } +void Assembler::emit_optional_rex_32(XMMRegister reg, XMMRegister base) { + byte rex_bits = (reg.code() & 0x8) >> 1 | (base.code() & 0x8) >> 3; + if (rex_bits != 0) emit(0x40 | rex_bits); +} + + +void Assembler::emit_optional_rex_32(XMMRegister reg, Register base) { + byte rex_bits = (reg.code() & 0x8) >> 1 | (base.code() & 0x8) >> 3; + if (rex_bits != 0) emit(0x40 | rex_bits); +} + + void Assembler::emit_optional_rex_32(Register rm_reg) { - if (rm_reg.code() & 0x8 != 0) emit(0x41); + if (rm_reg.high_bit()) emit(0x41); } @@ -147,16 +176,8 @@ void Assembler::set_target_address_at(Address pc, Address target) { // Implementation of RelocInfo // The modes possibly affected by apply must be in kApplyMask. -void RelocInfo::apply(int delta) { - if (rmode_ == RUNTIME_ENTRY || IsCodeTarget(rmode_)) { - intptr_t* p = reinterpret_cast<intptr_t*>(pc_); - *p -= delta; // relocate entry - } else if (rmode_ == JS_RETURN && IsCallInstruction()) { - // Special handling of js_return when a break point is set (call - // instruction has been inserted). - intptr_t* p = reinterpret_cast<intptr_t*>(pc_ + 1); - *p -= delta; // relocate entry - } else if (IsInternalReference(rmode_)) { +void RelocInfo::apply(intptr_t delta) { + if (IsInternalReference(rmode_)) { // absolute code pointer inside code object moves with the code object. intptr_t* p = reinterpret_cast<intptr_t*>(pc_); *p += delta; // relocate entry @@ -249,39 +270,22 @@ Object** RelocInfo::call_object_address() { // ----------------------------------------------------------------------------- // Implementation of Operand -Operand::Operand(Register base, int32_t disp) { - len_ = 1; - if (base.is(rsp) || base.is(r12)) { - // SIB byte is needed to encode (rsp + offset) or (r12 + offset). - set_sib(kTimes1, rsp, base); - } - - if (disp == 0 && !base.is(rbp) && !base.is(r13)) { - set_modrm(0, rsp); - } else if (is_int8(disp)) { - set_modrm(1, base); - set_disp8(disp); - } else { - set_modrm(2, base); - set_disp32(disp); - } -} - -void Operand::set_modrm(int mod, Register rm) { - ASSERT((mod & -4) == 0); - buf_[0] = mod << 6 | (rm.code() & 0x7); +void Operand::set_modrm(int mod, Register rm_reg) { + ASSERT(is_uint2(mod)); + buf_[0] = mod << 6 | rm_reg.low_bits(); // Set REX.B to the high bit of rm.code(). - rex_ |= (rm.code() >> 3); + rex_ |= rm_reg.high_bit(); } void Operand::set_sib(ScaleFactor scale, Register index, Register base) { ASSERT(len_ == 1); ASSERT(is_uint2(scale)); - // Use SIB with no index register only for base rsp or r12. + // Use SIB with no index register only for base rsp or r12. Otherwise we + // would skip the SIB byte entirely. ASSERT(!index.is(rsp) || base.is(rsp) || base.is(r12)); - buf_[1] = scale << 6 | (index.code() & 0x7) << 3 | (base.code() & 0x7); - rex_ |= (index.code() >> 3) << 1 | base.code() >> 3; + buf_[1] = scale << 6 | index.low_bits() << 3 | base.low_bits(); + rex_ |= index.high_bit() << 1 | base.high_bit(); len_ = 2; } |