Chromium Code Reviews| Index: runtime/vm/assembler_x64.cc |
| diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc |
| index 373925e8921d1fb9558913596f29c5a04c6fe01c..80dd36c3412d0711db97f3d8c0e3887c62119da9 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); |
| + EmitOperandREX(dst, src, REX_NONE); |
| 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); |
| + EmitOperandREX(src, dst, REX_NONE); |
| 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); |
| + EmitXmmRegisterREX(src, REX_NONE); |
|
Florian Schneider
2012/11/15 05:40:59
I think you also need to set the REX_B bit for reg
|
| 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); |
| + EmitOperandREX(dst, Operand(src), REX_NONE); |
| 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); |
| + EmitOperandREX(src, Operand(dst), REX_NONE); |
| EmitUint8(0x0F); |
| EmitUint8(0x7E); |
| EmitOperand(src & 7, Operand(dst)); |
| @@ -451,56 +451,55 @@ 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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); |
| @@ -511,8 +510,7 @@ 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); |
| @@ -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); |
| + EmitXmmRegisterREX(src, REX_NONE); |
| EmitUint8(0x0F); |
| EmitUint8(0x11); |
| EmitXmmRegisterOperand(src & 7, dst); |
| @@ -535,98 +533,101 @@ 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_); |
| EmitUint8(0x0F); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| EmitUint8(0x28); |
| EmitXmmRegisterOperand(dst & 7, 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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); |
| + EmitXmmRegisterREX(a, REX_NONE); |
| 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); |
| + EmitOperandREX(0, Operand(dst), REX_NONE); |
| 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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); |
| @@ -637,30 +638,31 @@ 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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); |
| 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); |
| @@ -672,24 +674,26 @@ void Assembler::cvttsd2siq(Register dst, XmmRegister 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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); |
| + EmitXmmRegisterREX(dst, REX_NONE); |
| 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" |
| }; |