| Index: runtime/vm/assembler_x64.cc
|
| ===================================================================
|
| --- runtime/vm/assembler_x64.cc (revision 41048)
|
| +++ runtime/vm/assembler_x64.cc (working copy)
|
| @@ -1827,6 +1827,47 @@
|
| }
|
|
|
|
|
| +void Assembler::addl(Register dst, const Address& address) {
|
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + EmitOperandREX(dst, address, REX_NONE);
|
| + EmitUint8(0x03);
|
| + EmitOperand(dst & 7, address);
|
| +}
|
| +
|
| +
|
| +void Assembler::addl(const Address& address, Register src) {
|
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + EmitOperandREX(src, address, REX_NONE);
|
| + EmitUint8(0x01);
|
| + EmitOperand(src & 7, address);
|
| +}
|
| +
|
| +
|
| +void Assembler::adcl(Register dst, Register src) {
|
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + Operand operand(src);
|
| + EmitOperandREX(dst, operand, REX_NONE);
|
| + EmitUint8(0x13);
|
| + EmitOperand(dst & 7, operand);
|
| +}
|
| +
|
| +
|
| +void Assembler::adcl(Register dst, const Immediate& imm) {
|
| + ASSERT(imm.is_int32());
|
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + EmitRegisterREX(dst, REX_NONE);
|
| + EmitComplex(2, Operand(dst), imm);
|
| +}
|
| +
|
| +
|
| +void Assembler::adcl(Register dst, const Address& address) {
|
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + EmitOperandREX(dst, address, REX_NONE);
|
| + EmitUint8(0x13);
|
| + EmitOperand(dst & 7, address);
|
| +}
|
| +
|
| +
|
| void Assembler::addq(Register dst, Register src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| Operand operand(src);
|
| @@ -1844,19 +1885,14 @@
|
| }
|
|
|
|
|
| -void Assembler::addl(const Address& address, const Immediate& imm) {
|
| - UNIMPLEMENTED();
|
| -}
|
| -
|
| -
|
| -void Assembler::addq(Register reg, const Immediate& imm) {
|
| +void Assembler::addq(Register dst, const Immediate& imm) {
|
| if (imm.is_int32()) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| - EmitRegisterREX(reg, REX_W);
|
| - EmitComplex(0, Operand(reg), imm);
|
| + EmitRegisterREX(dst, REX_W);
|
| + EmitComplex(0, Operand(dst), imm);
|
| } else {
|
| movq(TMP, imm);
|
| - addq(reg, TMP);
|
| + addq(dst, TMP);
|
| }
|
| }
|
|
|
| @@ -1873,32 +1909,56 @@
|
| }
|
|
|
|
|
| -void Assembler::addq(const Address& address, Register reg) {
|
| +void Assembler::addq(const Address& address, Register src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| - EmitOperandREX(reg, address, REX_W);
|
| + EmitOperandREX(src, address, REX_W);
|
| EmitUint8(0x01);
|
| - EmitOperand(reg & 7, address);
|
| + EmitOperand(src & 7, address);
|
| }
|
|
|
|
|
| -void Assembler::adcl(Register dst, Register src) {
|
| +void Assembler::subl(Register dst, Register src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| Operand operand(src);
|
| EmitOperandREX(dst, operand, REX_NONE);
|
| - EmitUint8(0x13);
|
| + EmitUint8(0x2B);
|
| EmitOperand(dst & 7, operand);
|
| }
|
|
|
|
|
| -void Assembler::subl(Register dst, Register src) {
|
| +void Assembler::subl(Register dst, const Address& address) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + EmitOperandREX(dst, address, REX_NONE);
|
| + EmitUint8(0x2B);
|
| + EmitOperand(dst & 7, address);
|
| +}
|
| +
|
| +
|
| +void Assembler::sbbl(Register dst, Register src) {
|
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| Operand operand(src);
|
| EmitOperandREX(dst, operand, REX_NONE);
|
| - EmitUint8(0x2B);
|
| + EmitUint8(0x1B);
|
| EmitOperand(dst & 7, operand);
|
| }
|
|
|
|
|
| +void Assembler::sbbl(Register dst, const Immediate& imm) {
|
| + ASSERT(imm.is_int32());
|
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + EmitRegisterREX(dst, REX_NONE);
|
| + EmitComplex(3, Operand(dst), imm);
|
| +}
|
| +
|
| +
|
| +void Assembler::sbbl(Register dst, const Address& address) {
|
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + EmitOperandREX(dst, address, REX_NONE);
|
| + EmitUint8(0x1B);
|
| + EmitOperand(dst & 7, address);
|
| +}
|
| +
|
| +
|
| void Assembler::cdq() {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| EmitUint8(0x99);
|
| @@ -1916,15 +1976,23 @@
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| EmitRegisterREX(reg, REX_NONE);
|
| EmitUint8(0xF7);
|
| - EmitUint8(0xF8 | (reg & 7));
|
| + EmitOperand(7, Operand(reg));
|
| }
|
|
|
|
|
| +void Assembler::divl(Register reg) {
|
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + EmitRegisterREX(reg, REX_NONE);
|
| + EmitUint8(0xF7);
|
| + EmitOperand(6, Operand(reg));
|
| +}
|
| +
|
| +
|
| void Assembler::idivq(Register reg) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| EmitRegisterREX(reg, REX_W);
|
| EmitUint8(0xF7);
|
| - EmitUint8(0xF8 | (reg & 7));
|
| + EmitOperand(7, Operand(reg));
|
| }
|
|
|
|
|
| @@ -1948,6 +2016,14 @@
|
| }
|
|
|
|
|
| +void Assembler::mull(Register reg) {
|
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + EmitRegisterREX(reg, REX_NONE);
|
| + EmitUint8(0xF7);
|
| + EmitOperand(4, Operand(reg));
|
| +}
|
| +
|
| +
|
| void Assembler::imulq(Register dst, Register src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| Operand operand(src);
|
| @@ -2072,6 +2148,18 @@
|
| }
|
|
|
|
|
| +void Assembler::shldl(Register dst, Register src, const Immediate& imm) {
|
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_);
|
| + ASSERT(imm.is_int8());
|
| + Operand operand(src);
|
| + EmitOperandREX(dst, operand, REX_NONE);
|
| + EmitUint8(0x0F);
|
| + EmitUint8(0xA4);
|
| + EmitOperand(src & 7, Operand(dst));
|
| + EmitUint8(imm.value() & 0xFF);
|
| +}
|
| +
|
| +
|
| void Assembler::shlq(Register reg, const Immediate& imm) {
|
| EmitGenericShift(true, 4, reg, imm);
|
| }
|
|
|