Index: src/x64/assembler-x64.cc |
=================================================================== |
--- src/x64/assembler-x64.cc (revision 2042) |
+++ src/x64/assembler-x64.cc (working copy) |
@@ -33,6 +33,9 @@ |
namespace internal { |
Register no_reg = { -1 }; |
+Register rax = { 0 }; |
+Register rcx = { 1 }; |
+Register rsi = { 7 }; |
// Safe default is no features. |
@@ -239,13 +242,42 @@ |
} |
-void Assembler::int3() { |
+void Assembler::add(Register dst, const Operand& src) { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
- EMIT(0xCC); |
+ emit_rex_64(dst, src); |
+ EMIT(0x03); |
+ emit_operand(dst, src); |
} |
+void Assembler::add(Register dst, Register src) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_rex_64(dst, src); |
+ EMIT(0x03); |
+ EMIT(0xC0 | (src.code() & 0x7) << 3 | (dst.code() & 0x7)); |
+} |
+ |
+ |
+void Assembler::dec(Register dst) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_rex_64(rcx, dst); |
+ EMIT(0xFF); |
+ EMIT(0xC8 | (dst.code() & 0x7)); |
+} |
+ |
+ |
+void Assembler::dec(const Operand& dst) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_rex_64(rax, dst); |
+ EMIT(0xFF); |
+ emit_operand(rcx, dst); |
+} |
+ |
+ |
void Assembler::hlt() { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
@@ -253,27 +285,31 @@ |
} |
-void Assembler::nop() { |
+void Assembler::inc(Register dst) { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
- EMIT(0x90); |
+ emit_rex_64(rax, dst); |
+ EMIT(0xFF); |
+ EMIT(0xC0 | (dst.code() & 0x7)); |
} |
-void Assembler::ret(int imm16) { |
+void Assembler::inc(const Operand& dst) { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
- ASSERT(is_uint16(imm16)); |
- if (imm16 == 0) { |
- EMIT(0xC3); |
- } else { |
- EMIT(0xC2); |
- EMIT(imm16 & 0xFF); |
- EMIT((imm16 >> 8) & 0xFF); |
- } |
+ emit_rex_64(rax, dst); |
+ EMIT(0xFF); |
+ emit_operand(rax, dst); |
} |
+void Assembler::int3() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ EMIT(0xCC); |
+} |
+ |
+ |
void Assembler::mov(Register dst, const Operand& src) { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
@@ -291,6 +327,64 @@ |
EMIT(0xC0 | (src.code() & 0x7) << 3 | (dst.code() & 0x7)); |
} |
+ |
+void Assembler::nop() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ EMIT(0x90); |
+} |
+ |
+void Assembler::pop(Register dst) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ if (dst.code() & 0x8) { |
+ emit_rex_64(rax, dst); |
+ } |
+ EMIT(0x58 | (dst.code() & 0x7)); |
+} |
+ |
+ |
+void Assembler::pop(const Operand& dst) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_rex_64(rax, dst); // Could be omitted in some cases. |
+ EMIT(0x8F); |
+ emit_operand(rax, dst); |
+} |
+ |
+ |
+void Assembler::push(Register src) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ if (src.code() & 0x8) { |
+ emit_rex_64(rax, src); |
+ } |
+ EMIT(0x50 | (src.code() & 0x7)); |
+} |
+ |
+ |
+void Assembler::push(const Operand& src) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_rex_64(rsi, src); // Could be omitted in some cases. |
+ EMIT(0xFF); |
+ emit_operand(rsi, src); |
+} |
+ |
+ |
+void Assembler::ret(int imm16) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ ASSERT(is_uint16(imm16)); |
+ if (imm16 == 0) { |
+ EMIT(0xC3); |
+ } else { |
+ EMIT(0xC2); |
+ EMIT(imm16 & 0xFF); |
+ EMIT((imm16 >> 8) & 0xFF); |
+ } |
+} |
+ |
} } // namespace v8::internal |