Index: src/x64/assembler-x64.cc |
diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc |
index 77bbf524053722d4450dc4a8ceb18448c4abcbd3..2357353ee1ba894594da133e7b265e1b880d721a 100644 |
--- a/src/x64/assembler-x64.cc |
+++ b/src/x64/assembler-x64.cc |
@@ -72,7 +72,49 @@ XMMRegister xmm13 = { 13 }; |
XMMRegister xmm14 = { 14 }; |
XMMRegister xmm15 = { 15 }; |
+ |
+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); |
+ } |
+} |
+ |
+ |
+Operand::Operand(Register base, |
+ Register index, |
+ ScaleFactor scale, |
+ int32_t disp) { |
+ ASSERT(!index.is(rsp) && !index.is(r12)); |
+ len_ = 1; |
+ set_sib(scale, index, base); |
+ if (disp == 0 && !base.is(rbp) && !base.is(r13)) { |
+ // The call to set_modrm doesn't overwrite the REX.B bit possibly set |
+ // by set_sib. |
+ set_modrm(0, rsp); |
+ } else if (is_int8(disp)) { |
+ set_modrm(1, rsp); |
+ set_disp8(disp); |
+ } else { |
+ set_modrm(2, rsp); |
+ set_disp32(disp); |
+ } |
+} |
+ |
+ |
// Safe default is no features. |
+// TODO(X64): Safe defaults include SSE2 for X64. |
uint64_t CpuFeatures::supported_ = 0; |
uint64_t CpuFeatures::enabled_ = 0; |
@@ -486,6 +528,7 @@ void Assembler::call(Register adr) { |
emit_modrm(0x2, adr); |
} |
+ |
void Assembler::cpuid() { |
ASSERT(CpuFeatures::IsEnabled(CpuFeatures::CPUID)); |
EnsureSpace ensure_space(this); |
@@ -843,6 +886,31 @@ void Assembler::movq(Register dst, ExternalReference ref) { |
} |
+void Assembler::movq(const Operand& dst, Immediate value) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_rex_64(dst); |
+ emit(0xC7); |
+ emit_operand(0, dst); |
+ emit(value); |
+} |
+ |
+ |
+void Assembler::movq(Register dst, Handle<Object> value, RelocInfo::Mode mode) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ ASSERT(!Heap::InNewSpace(*value)); |
William Hesse
2009/06/10 08:09:09
Is this from the ia32 code? I didn't know this.
|
+ emit_rex_64(dst); |
+ emit(0xB8 | dst.code() & 0x7); |
+ if (value->IsHeapObject()) { |
+ emitq(reinterpret_cast<uintptr_t>(value.location()), mode); |
+ } else { |
+ ASSERT_EQ(RelocInfo::NONE, mode); |
+ emitq(reinterpret_cast<uintptr_t>(*value), RelocInfo::NONE); |
+ } |
+} |
+ |
+ |
void Assembler::mul(Register src) { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
@@ -1128,6 +1196,7 @@ void Assembler::store_rax(ExternalReference ref) { |
void Assembler::testb(Register reg, Immediate mask) { |
+ ASSERT(is_int8(mask.value_)); |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
if (reg.is(rax)) { |
@@ -1146,6 +1215,7 @@ void Assembler::testb(Register reg, Immediate mask) { |
void Assembler::testb(const Operand& op, Immediate mask) { |
+ ASSERT(is_int8(mask.value_)); |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
emit_optional_rex_32(rax, op); |
@@ -1198,6 +1268,22 @@ void Assembler::testq(Register dst, Register src) { |
} |
+void Assembler::testq(Register dst, Immediate mask) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ if (dst.is(rax)) { |
+ emit_rex_64(); |
+ emit(0xA9); |
+ emit(mask); |
+ } else { |
+ emit_rex_64(dst); |
+ emit(0xF7); |
+ emit_modrm(0, dst); |
+ emit(mask); |
+ } |
+} |
+ |
+ |
// Relocation information implementations |
void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { |