mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-09-21 03:41:42 +02:00
Merge pull request #1844 from Tilka/sse_mov
x64Emitter: fix MOVLPD/MOVHPD
This commit is contained in:
commit
6bc274a968
3 changed files with 55 additions and 10 deletions
|
@ -60,10 +60,10 @@ enum NormalSSEOps
|
||||||
sseMOVAPtoRM = 0x29, //MOVAP to RM
|
sseMOVAPtoRM = 0x29, //MOVAP to RM
|
||||||
sseMOVUPfromRM = 0x10, //MOVUP from RM
|
sseMOVUPfromRM = 0x10, //MOVUP from RM
|
||||||
sseMOVUPtoRM = 0x11, //MOVUP to RM
|
sseMOVUPtoRM = 0x11, //MOVUP to RM
|
||||||
sseMOVLPDfromRM= 0x12,
|
sseMOVLPfromRM = 0x12,
|
||||||
sseMOVLPDtoRM = 0x13,
|
sseMOVLPtoRM = 0x13,
|
||||||
sseMOVHPDfromRM= 0x16,
|
sseMOVHPfromRM = 0x16,
|
||||||
sseMOVHPDtoRM = 0x17,
|
sseMOVHPtoRM = 0x17,
|
||||||
sseMOVHLPS = 0x12,
|
sseMOVHLPS = 0x12,
|
||||||
sseMOVLHPS = 0x16,
|
sseMOVLHPS = 0x16,
|
||||||
sseMOVDQfromRM = 0x6F,
|
sseMOVDQfromRM = 0x6F,
|
||||||
|
@ -1552,10 +1552,15 @@ void XEmitter::MOVSD(X64Reg regOp, OpArg arg) {WriteSSEOp(0xF2, sseMOVUPfromRM
|
||||||
void XEmitter::MOVSS(OpArg arg, X64Reg regOp) {WriteSSEOp(0xF3, sseMOVUPtoRM, regOp, arg);}
|
void XEmitter::MOVSS(OpArg arg, X64Reg regOp) {WriteSSEOp(0xF3, sseMOVUPtoRM, regOp, arg);}
|
||||||
void XEmitter::MOVSD(OpArg arg, X64Reg regOp) {WriteSSEOp(0xF2, sseMOVUPtoRM, regOp, arg);}
|
void XEmitter::MOVSD(OpArg arg, X64Reg regOp) {WriteSSEOp(0xF2, sseMOVUPtoRM, regOp, arg);}
|
||||||
|
|
||||||
void XEmitter::MOVLPD(X64Reg regOp, OpArg arg) {WriteSSEOp(0xF2, sseMOVLPDfromRM, regOp, arg);}
|
void XEmitter::MOVLPS(X64Reg regOp, OpArg arg) {WriteSSEOp(0x00, sseMOVLPfromRM, regOp, arg);}
|
||||||
void XEmitter::MOVHPD(X64Reg regOp, OpArg arg) {WriteSSEOp(0xF2, sseMOVHPDfromRM, regOp, arg);}
|
void XEmitter::MOVLPD(X64Reg regOp, OpArg arg) {WriteSSEOp(0x66, sseMOVLPfromRM, regOp, arg);}
|
||||||
void XEmitter::MOVLPD(OpArg arg, X64Reg regOp) {WriteSSEOp(0xF2, sseMOVLPDtoRM, regOp, arg);}
|
void XEmitter::MOVLPS(OpArg arg, X64Reg regOp) {WriteSSEOp(0x00, sseMOVLPtoRM, regOp, arg);}
|
||||||
void XEmitter::MOVHPD(OpArg arg, X64Reg regOp) {WriteSSEOp(0xF2, sseMOVHPDtoRM, regOp, arg);}
|
void XEmitter::MOVLPD(OpArg arg, X64Reg regOp) {WriteSSEOp(0x66, sseMOVLPtoRM, regOp, arg);}
|
||||||
|
|
||||||
|
void XEmitter::MOVHPS(X64Reg regOp, OpArg arg) {WriteSSEOp(0x00, sseMOVHPfromRM, regOp, arg);}
|
||||||
|
void XEmitter::MOVHPD(X64Reg regOp, OpArg arg) {WriteSSEOp(0x66, sseMOVHPfromRM, regOp, arg);}
|
||||||
|
void XEmitter::MOVHPS(OpArg arg, X64Reg regOp) {WriteSSEOp(0x00, sseMOVHPtoRM, regOp, arg);}
|
||||||
|
void XEmitter::MOVHPD(OpArg arg, X64Reg regOp) {WriteSSEOp(0x66, sseMOVHPtoRM, regOp, arg);}
|
||||||
|
|
||||||
void XEmitter::MOVHLPS(X64Reg regOp1, X64Reg regOp2) {WriteSSEOp(0x00, sseMOVHLPS, regOp1, R(regOp2));}
|
void XEmitter::MOVHLPS(X64Reg regOp1, X64Reg regOp2) {WriteSSEOp(0x00, sseMOVHLPS, regOp1, R(regOp2));}
|
||||||
void XEmitter::MOVLHPS(X64Reg regOp1, X64Reg regOp2) {WriteSSEOp(0x00, sseMOVLHPS, regOp1, R(regOp2));}
|
void XEmitter::MOVLHPS(X64Reg regOp1, X64Reg regOp2) {WriteSSEOp(0x00, sseMOVLHPS, regOp1, R(regOp2));}
|
||||||
|
|
|
@ -615,9 +615,14 @@ public:
|
||||||
void MOVSS(OpArg arg, X64Reg regOp);
|
void MOVSS(OpArg arg, X64Reg regOp);
|
||||||
void MOVSD(OpArg arg, X64Reg regOp);
|
void MOVSD(OpArg arg, X64Reg regOp);
|
||||||
|
|
||||||
|
void MOVLPS(X64Reg regOp, OpArg arg);
|
||||||
void MOVLPD(X64Reg regOp, OpArg arg);
|
void MOVLPD(X64Reg regOp, OpArg arg);
|
||||||
void MOVHPD(X64Reg regOp, OpArg arg);
|
void MOVLPS(OpArg arg, X64Reg regOp);
|
||||||
void MOVLPD(OpArg arg, X64Reg regOp);
|
void MOVLPD(OpArg arg, X64Reg regOp);
|
||||||
|
|
||||||
|
void MOVHPS(X64Reg regOp, OpArg arg);
|
||||||
|
void MOVHPD(X64Reg regOp, OpArg arg);
|
||||||
|
void MOVHPS(OpArg arg, X64Reg regOp);
|
||||||
void MOVHPD(OpArg arg, X64Reg regOp);
|
void MOVHPD(OpArg arg, X64Reg regOp);
|
||||||
|
|
||||||
void MOVHLPS(X64Reg regOp1, X64Reg regOp2);
|
void MOVHLPS(X64Reg regOp1, X64Reg regOp2);
|
||||||
|
|
|
@ -728,9 +728,44 @@ TWO_OP_SSE_TEST(UCOMISS, "dword")
|
||||||
TWO_OP_SSE_TEST(COMISD, "qword")
|
TWO_OP_SSE_TEST(COMISD, "qword")
|
||||||
TWO_OP_SSE_TEST(UCOMISD, "qword")
|
TWO_OP_SSE_TEST(UCOMISD, "qword")
|
||||||
|
|
||||||
|
// register-only instructions
|
||||||
|
#define TWO_OP_SSE_REG_TEST(Name, MemBits) \
|
||||||
|
TEST_F(x64EmitterTest, Name) \
|
||||||
|
{ \
|
||||||
|
for (const auto& r1 : xmmnames) \
|
||||||
|
{ \
|
||||||
|
for (const auto& r2 : xmmnames) \
|
||||||
|
{ \
|
||||||
|
emitter->Name(r1.reg, r2.reg); \
|
||||||
|
ExpectDisassembly(#Name " " + r1.name + ", " + r2.name); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
TWO_OP_SSE_REG_TEST(MOVHLPS, "qword")
|
||||||
|
TWO_OP_SSE_REG_TEST(MOVLHPS, "qword")
|
||||||
|
|
||||||
|
// "register + memory"-only instructions
|
||||||
|
#define TWO_OP_SSE_MEM_TEST(Name, MemBits) \
|
||||||
|
TEST_F(x64EmitterTest, Name) \
|
||||||
|
{ \
|
||||||
|
for (const auto& r1 : xmmnames) \
|
||||||
|
{ \
|
||||||
|
emitter->Name(r1.reg, MatR(R12)); \
|
||||||
|
ExpectDisassembly(#Name " " + r1.name + ", " MemBits " ptr ds:[r12]"); \
|
||||||
|
emitter->Name(MatR(R12), r1.reg); \
|
||||||
|
ExpectDisassembly(#Name " " MemBits " ptr ds:[r12], " + r1.name); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
TWO_OP_SSE_MEM_TEST(MOVLPS, "qword")
|
||||||
|
TWO_OP_SSE_MEM_TEST(MOVHPS, "qword")
|
||||||
|
TWO_OP_SSE_MEM_TEST(MOVLPD, "qword")
|
||||||
|
TWO_OP_SSE_MEM_TEST(MOVHPD, "qword")
|
||||||
|
|
||||||
// TODO: CMPSS/SD
|
// TODO: CMPSS/SD
|
||||||
// TODO: SHUFPS/PD
|
// TODO: SHUFPS/PD
|
||||||
// TODO: SSE MOVs
|
// TODO: more SSE MOVs
|
||||||
// TODO: MOVMSK
|
// TODO: MOVMSK
|
||||||
|
|
||||||
TEST_F(x64EmitterTest, MASKMOVDQU)
|
TEST_F(x64EmitterTest, MASKMOVDQU)
|
||||||
|
|
Loading…
Reference in a new issue