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" |
}; |