| 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
|
|
|