Index: runtime/vm/assembler_x64.cc |
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc |
index 373925e8921d1fb9558913596f29c5a04c6fe01c..5ccfb508d5526c331cb985864a50e7b52926566c 100644 |
--- a/runtime/vm/assembler_x64.cc |
+++ b/runtime/vm/assembler_x64.cc |
@@ -395,11 +395,10 @@ void Assembler::leaq(Register dst, const Address& src) { |
void Assembler::movss(XmmRegister dst, const Address& src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(dst <= XMM7); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF3); |
- EmitOperandREX(0, src, REX_NONE); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x10); |
EmitOperand(dst & 7, src); |
@@ -407,11 +406,10 @@ void Assembler::movss(XmmRegister dst, const Address& src) { |
void Assembler::movss(const Address& dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
+ ASSERT(src <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF3); |
- EmitOperandREX(0, dst, REX_NONE); |
+ EmitREX_RB(src, dst); |
EmitUint8(0x0F); |
EmitUint8(0x11); |
EmitOperand(src & 7, dst); |
@@ -419,11 +417,11 @@ void Assembler::movss(const Address& dst, XmmRegister src) { |
void Assembler::movss(XmmRegister dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF3); |
+ EmitREX_RB(src, dst); |
EmitUint8(0x0F); |
EmitUint8(0x11); |
EmitXmmRegisterOperand(src & 7, dst); |
@@ -431,9 +429,10 @@ void Assembler::movss(XmmRegister dst, XmmRegister src) { |
void Assembler::movd(XmmRegister dst, Register src) { |
- ASSERT(dst <= XMM7); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x66); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x6E); |
EmitOperand(dst & 7, Operand(src)); |
@@ -441,9 +440,10 @@ void Assembler::movd(XmmRegister dst, Register src) { |
void Assembler::movd(Register dst, XmmRegister src) { |
- ASSERT(src <= XMM7); |
+ ASSERT(src <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x66); |
+ EmitREX_RB(src, dst); |
EmitUint8(0x0F); |
EmitUint8(0x7E); |
EmitOperand(src & 7, Operand(dst)); |
@@ -451,59 +451,58 @@ void Assembler::movd(Register dst, XmmRegister src) { |
void Assembler::addss(XmmRegister dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF3); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x58); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::subss(XmmRegister dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF3); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x5C); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::mulss(XmmRegister dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF3); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x59); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::divss(XmmRegister dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF3); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x5E); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::movsd(XmmRegister dst, const Address& src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(dst <= XMM7); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF2); |
- EmitOperandREX(0, src, REX_NONE); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x10); |
EmitOperand(dst & 7, src); |
@@ -511,11 +510,10 @@ void Assembler::movsd(XmmRegister dst, const Address& src) { |
void Assembler::movsd(const Address& dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
+ ASSERT(src <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF2); |
- EmitOperandREX(0, dst, REX_NONE); |
+ EmitREX_RB(src, dst); |
EmitUint8(0x0F); |
EmitUint8(0x11); |
EmitOperand(src & 7, dst); |
@@ -523,11 +521,11 @@ void Assembler::movsd(const Address& dst, XmmRegister src) { |
void Assembler::movsd(XmmRegister dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF2); |
+ EmitREX_RB(src, dst); |
EmitUint8(0x0F); |
EmitUint8(0x11); |
EmitXmmRegisterOperand(src & 7, dst); |
@@ -535,10 +533,10 @@ void Assembler::movsd(XmmRegister dst, XmmRegister src) { |
void Assembler::movaps(XmmRegister dst, XmmRegister src) { |
- // TODO(vegorov): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x28); |
EmitXmmRegisterOperand(dst & 7, src); |
@@ -546,90 +544,93 @@ void Assembler::movaps(XmmRegister dst, XmmRegister src) { |
void Assembler::addsd(XmmRegister dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF2); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x58); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::subsd(XmmRegister dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF2); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x5C); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::mulsd(XmmRegister dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF2); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x59); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::divsd(XmmRegister dst, XmmRegister src) { |
- // TODO(srdjan): implement and test XMM8 - XMM15. |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF2); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x5E); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::comisd(XmmRegister a, XmmRegister b) { |
- ASSERT(a <= XMM7); |
- ASSERT(b <= XMM7); |
+ ASSERT(a <= XMM15); |
+ ASSERT(b <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x66); |
+ EmitREX_RB(a, b); |
EmitUint8(0x0F); |
EmitUint8(0x2F); |
- EmitXmmRegisterOperand(a, b); |
+ EmitXmmRegisterOperand(a & 7, b); |
} |
void Assembler::movmskpd(Register dst, XmmRegister src) { |
- ASSERT(src <= XMM7); |
+ ASSERT(src <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x66); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x50); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { |
- ASSERT(dst <= XMM7); |
- ASSERT(src <= XMM7); |
+ ASSERT(dst <= XMM15); |
+ ASSERT(src <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF2); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x51); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::xorpd(XmmRegister dst, const Address& src) { |
- ASSERT(dst <= XMM7); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x66); |
- EmitOperandREX(0, src, REX_NONE); |
+ EmitOperandREX(dst, src, REX_NONE); |
EmitUint8(0x0F); |
EmitUint8(0x57); |
EmitOperand(dst & 7, src); |
@@ -637,59 +638,62 @@ void Assembler::xorpd(XmmRegister dst, const Address& src) { |
void Assembler::xorpd(XmmRegister dst, XmmRegister src) { |
- ASSERT(dst <= XMM7); |
- ASSERT(src <= XMM7); |
+ ASSERT(dst <= XMM15); |
+ ASSERT(src <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x66); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x57); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::cvtsi2sd(XmmRegister dst, Register src) { |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
- ASSERT(dst <= XMM7); |
+ ASSERT(dst <= XMM15); |
Operand operand(src); |
EmitUint8(0xF2); |
- EmitOperandREX(0, operand, REX_W); |
+ EmitOperandREX(dst, operand, REX_W); |
EmitUint8(0x0F); |
EmitUint8(0x2A); |
- EmitOperand(dst, operand); |
+ EmitOperand(dst & 7, operand); |
} |
void Assembler::cvttsd2siq(Register dst, XmmRegister src) { |
- ASSERT(src <= XMM7); |
+ ASSERT(src <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF2); |
Operand operand(dst); |
- EmitOperandREX(0, operand, REX_W); |
+ EmitREX_RB(dst, src, REX_W); |
EmitUint8(0x0F); |
EmitUint8(0x2C); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF3); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x5A); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
void Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { |
- ASSERT(src <= XMM7); |
- ASSERT(dst <= XMM7); |
+ ASSERT(src <= XMM15); |
+ ASSERT(dst <= XMM15); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xF2); |
+ EmitREX_RB(dst, src); |
EmitUint8(0x0F); |
EmitUint8(0x5A); |
- EmitXmmRegisterOperand(dst, src); |
+ EmitXmmRegisterOperand(dst & 7, src); |
} |
@@ -2107,7 +2111,8 @@ const char* Assembler::RegisterName(Register reg) { |
static const char* xmm_reg_names[kNumberOfXmmRegisters] = { |
- "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" |
+ "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", |
+ "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15" |
}; |