Index: src/x64/assembler-x64.cc |
diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc |
index cc64471356a00f4bc6645a848fcdf2c8a14f8f0e..eaeea194c940e3e41134c202c799f33067547413 100644 |
--- a/src/x64/assembler-x64.cc |
+++ b/src/x64/assembler-x64.cc |
@@ -413,6 +413,16 @@ void Assembler::arithmetic_op(byte opcode, Register dst, Register src) { |
emit_modrm(dst, src); |
} |
+ |
+void Assembler::arithmetic_op_32(byte opcode, Register dst, Register src) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_optional_rex_32(dst, src); |
+ emit(opcode); |
+ emit_modrm(dst, src); |
+} |
+ |
+ |
void Assembler::immediate_arithmetic_op(byte subcode, |
Register dst, |
Immediate src) { |
@@ -452,6 +462,27 @@ void Assembler::immediate_arithmetic_op(byte subcode, |
void Assembler::immediate_arithmetic_op_32(byte subcode, |
+ Register dst, |
+ Immediate src) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_optional_rex_32(dst); |
+ emit(0x83); |
+ if (is_int8(src.value_)) { |
+ emit_modrm(subcode, dst); |
+ emit(src.value_); |
+ } else if (dst.is(rax)) { |
+ emit(0x05 | (subcode << 3)); |
+ emitl(src.value_); |
+ } else { |
+ emit(0x81); |
+ emit_modrm(subcode, dst); |
+ emitl(src.value_); |
+ } |
+} |
+ |
+ |
+void Assembler::immediate_arithmetic_op_32(byte subcode, |
const Operand& dst, |
Immediate src) { |
EnsureSpace ensure_space(this); |
@@ -508,6 +539,15 @@ void Assembler::shift(Register dst, int subcode) { |
} |
+void Assembler::shift_32(Register dst, int subcode) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_optional_rex_32(dst); |
+ emit(0xD3); |
+ emit_modrm(subcode, dst); |
+} |
+ |
+ |
void Assembler::bt(const Operand& dst, Register src) { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
@@ -640,6 +680,16 @@ void Assembler::idiv(Register src) { |
} |
+void Assembler::imul(Register dst, Register src) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_rex_64(dst, src); |
+ emit(0x0F); |
+ emit(0xAF); |
+ emit_modrm(dst, src); |
+} |
+ |
+ |
void Assembler::imul(Register dst, const Operand& src) { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
@@ -666,6 +716,16 @@ void Assembler::imul(Register dst, Register src, Immediate imm) { |
} |
+void Assembler::imull(Register dst, Register src) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_optional_rex_32(dst, src); |
+ emit(0x0F); |
+ emit(0xAF); |
+ emit_modrm(dst, src); |
+} |
+ |
+ |
void Assembler::incq(Register dst) { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
@@ -971,6 +1031,25 @@ void Assembler::movq(Register dst, Handle<Object> value, RelocInfo::Mode mode) { |
} |
+void Assembler::movsxlq(Register dst, Register src) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_rex_64(dst, src); |
+ emit(0x63); |
+ emit_modrm(dst, src); |
+} |
+ |
+ |
+void Assembler::movzxbq(Register dst, const Operand& src) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_rex_64(dst, src); |
+ emit(0x0F); |
+ emit(0xB6); |
+ emit_operand(dst, src); |
+} |
+ |
+ |
void Assembler::mul(Register src) { |
EnsureSpace ensure_space(this); |
last_pc_ = pc_; |
@@ -1364,6 +1443,324 @@ void Assembler::testq(Register dst, Immediate mask) { |
} |
+// FPU instructions |
+ |
+ |
+void Assembler::fld(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xD9, 0xC0, i); |
+} |
+ |
+ |
+void Assembler::fld1() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit(0xE8); |
+} |
+ |
+ |
+void Assembler::fldz() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit(0xEE); |
+} |
+ |
+ |
+void Assembler::fld_s(const Operand& adr) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit_operand(0, adr); |
+} |
+ |
+ |
+void Assembler::fld_d(const Operand& adr) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDD); |
+ emit_operand(0, adr); |
+} |
+ |
+ |
+void Assembler::fstp_s(const Operand& adr) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit_operand(3, adr); |
+} |
+ |
+ |
+void Assembler::fstp_d(const Operand& adr) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDD); |
+ emit_operand(3, adr); |
+} |
+ |
+ |
+void Assembler::fild_s(const Operand& adr) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDB); |
+ emit_operand(0, adr); |
+} |
+ |
+ |
+void Assembler::fild_d(const Operand& adr) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDF); |
+ emit_operand(5, adr); |
+} |
+ |
+ |
+void Assembler::fistp_s(const Operand& adr) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDB); |
+ emit_operand(3, adr); |
+} |
+ |
+ |
+void Assembler::fisttp_s(const Operand& adr) { |
+ ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE3)); |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDB); |
+ emit_operand(1, adr); |
+} |
+ |
+ |
+void Assembler::fist_s(const Operand& adr) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDB); |
+ emit_operand(2, adr); |
+} |
+ |
+ |
+void Assembler::fistp_d(const Operand& adr) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDF); |
+ emit_operand(8, adr); |
+} |
+ |
+ |
+void Assembler::fabs() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit(0xE1); |
+} |
+ |
+ |
+void Assembler::fchs() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit(0xE0); |
+} |
+ |
+ |
+void Assembler::fcos() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit(0xFF); |
+} |
+ |
+ |
+void Assembler::fsin() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit(0xFE); |
+} |
+ |
+ |
+void Assembler::fadd(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xDC, 0xC0, i); |
+} |
+ |
+ |
+void Assembler::fsub(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xDC, 0xE8, i); |
+} |
+ |
+ |
+void Assembler::fisub_s(const Operand& adr) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDA); |
+ emit_operand(4, adr); |
+} |
+ |
+ |
+void Assembler::fmul(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xDC, 0xC8, i); |
+} |
+ |
+ |
+void Assembler::fdiv(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xDC, 0xF8, i); |
+} |
+ |
+ |
+void Assembler::faddp(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xDE, 0xC0, i); |
+} |
+ |
+ |
+void Assembler::fsubp(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xDE, 0xE8, i); |
+} |
+ |
+ |
+void Assembler::fsubrp(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xDE, 0xE0, i); |
+} |
+ |
+ |
+void Assembler::fmulp(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xDE, 0xC8, i); |
+} |
+ |
+ |
+void Assembler::fdivp(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xDE, 0xF8, i); |
+} |
+ |
+ |
+void Assembler::fprem() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit(0xF8); |
+} |
+ |
+ |
+void Assembler::fprem1() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit(0xF5); |
+} |
+ |
+ |
+void Assembler::fxch(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xD9, 0xC8, i); |
+} |
+ |
+ |
+void Assembler::fincstp() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit(0xF7); |
+} |
+ |
+ |
+void Assembler::ffree(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xDD, 0xC0, i); |
+} |
+ |
+ |
+void Assembler::ftst() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit(0xE4); |
+} |
+ |
+ |
+void Assembler::fucomp(int i) { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit_farith(0xDD, 0xE8, i); |
+} |
+ |
+ |
+void Assembler::fucompp() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDA); |
+ emit(0xE9); |
+} |
+ |
+ |
+void Assembler::fcompp() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDE); |
+ emit(0xD9); |
+} |
+ |
+ |
+void Assembler::fnstsw_ax() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDF); |
+ emit(0xE0); |
+} |
+ |
+ |
+void Assembler::fwait() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0x9B); |
+} |
+ |
+ |
+void Assembler::frndint() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xD9); |
+ emit(0xFC); |
+} |
+ |
+ |
+void Assembler::fnclex() { |
+ EnsureSpace ensure_space(this); |
+ last_pc_ = pc_; |
+ emit(0xDB); |
+ emit(0xE2); |
+} |
+ |
+ |
+void Assembler::emit_farith(int b1, int b2, int i) { |
+ ASSERT(is_uint8(b1) && is_uint8(b2)); // wrong opcode |
+ ASSERT(0 <= i && i < 8); // illegal stack offset |
+ emit(b1); |
+ emit(b2 + i); |
+} |
+ |
+ |
// Relocation information implementations |
void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { |
@@ -1463,18 +1860,6 @@ const int RelocInfo::kApplyMask = |
namespace v8 { |
namespace internal { |
-void ArgumentsAccessStub::GenerateNewObject(MacroAssembler* a) { |
- UNIMPLEMENTED(); |
-} |
- |
-void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* a) { |
- UNIMPLEMENTED(); |
-} |
- |
-void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* a) { |
- UNIMPLEMENTED(); |
-} |
- |
void BreakLocationIterator::ClearDebugBreakAtReturn() { |
UNIMPLEMENTED(); |
@@ -1501,31 +1886,6 @@ void CallIC::GenerateNormal(MacroAssembler* a, int b) { |
UNIMPLEMENTED(); |
} |
-Object* CallStubCompiler::CompileCallConstant(Object* a, |
- JSObject* b, |
- JSFunction* c, |
- StubCompiler::CheckType d, |
- Code::Flags flags) { |
- UNIMPLEMENTED(); |
- return NULL; |
-} |
- |
-Object* CallStubCompiler::CompileCallField(Object* a, |
- JSObject* b, |
- int c, |
- String* d, |
- Code::Flags flags) { |
- UNIMPLEMENTED(); |
- return NULL; |
-} |
- |
-Object* CallStubCompiler::CompileCallInterceptor(Object* a, |
- JSObject* b, |
- String* c) { |
- UNIMPLEMENTED(); |
- return NULL; |
-} |
- |
void JumpTarget::DoBind() { |
UNIMPLEMENTED(); |
} |
@@ -1538,60 +1898,5 @@ void JumpTarget::DoJump() { |
UNIMPLEMENTED(); |
} |
-Object* LoadStubCompiler::CompileLoadCallback(JSObject* a, |
- JSObject* b, |
- AccessorInfo* c, |
- String* d) { |
- UNIMPLEMENTED(); |
- return NULL; |
-} |
- |
-Object* LoadStubCompiler::CompileLoadConstant(JSObject* a, |
- JSObject* b, |
- Object* c, |
- String* d) { |
- UNIMPLEMENTED(); |
- return NULL; |
-} |
- |
-Object* LoadStubCompiler::CompileLoadField(JSObject* a, |
- JSObject* b, |
- int c, |
- String* d) { |
- UNIMPLEMENTED(); |
- return NULL; |
-} |
- |
-Object* LoadStubCompiler::CompileLoadInterceptor(JSObject* a, |
- JSObject* b, |
- String* c) { |
- UNIMPLEMENTED(); |
- return NULL; |
-} |
- |
-Object* StoreStubCompiler::CompileStoreCallback(JSObject* a, |
- AccessorInfo* b, |
- String* c) { |
- UNIMPLEMENTED(); |
- return NULL; |
-} |
- |
-Object* StoreStubCompiler::CompileStoreField(JSObject* a, |
- int b, |
- Map* c, |
- String* d) { |
- UNIMPLEMENTED(); |
- return NULL; |
-} |
- |
-Object* StoreStubCompiler::CompileStoreInterceptor(JSObject* a, String* b) { |
- UNIMPLEMENTED(); |
- return NULL; |
-} |
- |
-Object* StubCompiler::CompileLazyCompile(Code::Flags a) { |
- UNIMPLEMENTED(); |
- return NULL; |
-} |
} } // namespace v8::internal |