Correct 2 mistakes I made in SQV in RSP recompiler
It may be true that this SQV edge case only seems to happen when isRegConst = true, I forgot to account for the possibility that GPR Constant Analysis could be disabled. I also just noticed that I goofed with the non-sse shuffling ;/ . The registers weren't in order.
This commit is contained in:
parent
448b0ed6be
commit
55fc2a6255
Source/RSP
|
@ -4990,13 +4990,13 @@ void Compile_Opcode_SQV ( void ) {
|
||||||
if (IsSseEnabled == FALSE) {
|
if (IsSseEnabled == FALSE) {
|
||||||
if (RSPOpC.del == 12) {
|
if (RSPOpC.del == 12) {
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[0]", RSPOpC.rt);
|
sprintf(Reg, "RSP_Vect[%i].B[0]", RSPOpC.rt);
|
||||||
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[0], Reg, x86_EDX);
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[0], Reg, x86_EAX);
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[12]", RSPOpC.rt);
|
sprintf(Reg, "RSP_Vect[%i].B[12]", RSPOpC.rt);
|
||||||
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[12], Reg, x86_EAX);
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[12], Reg, x86_EBX);
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[8]", RSPOpC.rt);
|
sprintf(Reg, "RSP_Vect[%i].B[8]", RSPOpC.rt);
|
||||||
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[8], Reg, x86_EBX);
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[8], Reg, x86_ECX);
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[4]", RSPOpC.rt);
|
sprintf(Reg, "RSP_Vect[%i].B[4]", RSPOpC.rt);
|
||||||
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[4], Reg, x86_ECX);
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[4], Reg, x86_EDX);
|
||||||
} else {
|
} else {
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[12]", RSPOpC.rt);
|
sprintf(Reg, "RSP_Vect[%i].B[12]", RSPOpC.rt);
|
||||||
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[12], Reg, x86_EAX);
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[12], Reg, x86_EAX);
|
||||||
|
@ -5048,6 +5048,16 @@ void Compile_Opcode_SQV ( void ) {
|
||||||
|
|
||||||
AndConstToX86Reg(x86_EBX, 0x0fff);
|
AndConstToX86Reg(x86_EBX, 0x0fff);
|
||||||
if (IsSseEnabled == FALSE) {
|
if (IsSseEnabled == FALSE) {
|
||||||
|
if (RSPOpC.del == 12) {
|
||||||
|
sprintf(Reg, "RSP_Vect[%i].B[0]", RSPOpC.rt);
|
||||||
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[0], Reg, x86_EAX);
|
||||||
|
sprintf(Reg, "RSP_Vect[%i].B[12]", RSPOpC.rt);
|
||||||
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[12], Reg, x86_ECX);
|
||||||
|
sprintf(Reg, "RSP_Vect[%i].B[8]", RSPOpC.rt);
|
||||||
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[8], Reg, x86_EDX);
|
||||||
|
sprintf(Reg, "RSP_Vect[%i].B[4]", RSPOpC.rt);
|
||||||
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[4], Reg, x86_EDI);
|
||||||
|
} else {
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[12]", RSPOpC.rt);
|
sprintf(Reg, "RSP_Vect[%i].B[12]", RSPOpC.rt);
|
||||||
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[12], Reg, x86_EAX);
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[12], Reg, x86_EAX);
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[8]", RSPOpC.rt);
|
sprintf(Reg, "RSP_Vect[%i].B[8]", RSPOpC.rt);
|
||||||
|
@ -5056,6 +5066,7 @@ void Compile_Opcode_SQV ( void ) {
|
||||||
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[4], Reg, x86_EDX);
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[4], Reg, x86_EDX);
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[0]", RSPOpC.rt);
|
sprintf(Reg, "RSP_Vect[%i].B[0]", RSPOpC.rt);
|
||||||
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[0], Reg, x86_EDI);
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.rt].B[0], Reg, x86_EDI);
|
||||||
|
}
|
||||||
|
|
||||||
MoveX86regToN64MemDisp(x86_EAX, x86_EBX, 0);
|
MoveX86regToN64MemDisp(x86_EAX, x86_EBX, 0);
|
||||||
MoveX86regToN64MemDisp(x86_ECX, x86_EBX, 4);
|
MoveX86regToN64MemDisp(x86_ECX, x86_EBX, 4);
|
||||||
|
@ -5064,7 +5075,11 @@ void Compile_Opcode_SQV ( void ) {
|
||||||
} else {
|
} else {
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[0]", RSPOpC.rt);
|
sprintf(Reg, "RSP_Vect[%i].B[0]", RSPOpC.rt);
|
||||||
SseMoveAlignedVariableToReg(&RSP_Vect[RSPOpC.rt].B[0], Reg, x86_XMM0);
|
SseMoveAlignedVariableToReg(&RSP_Vect[RSPOpC.rt].B[0], Reg, x86_XMM0);
|
||||||
|
if (RSPOpC.del == 12) {
|
||||||
|
SseShuffleReg(x86_XMM0, x86_MM0, 0x6c);
|
||||||
|
} else {
|
||||||
SseShuffleReg(x86_XMM0, x86_MM0, 0x1b);
|
SseShuffleReg(x86_XMM0, x86_MM0, 0x1b);
|
||||||
|
}
|
||||||
SseMoveUnalignedRegToN64Mem(x86_XMM0, x86_EBX);
|
SseMoveUnalignedRegToN64Mem(x86_XMM0, x86_EBX);
|
||||||
}
|
}
|
||||||
CPU_Message(" Done:");
|
CPU_Message(" Done:");
|
||||||
|
|
Loading…
Reference in New Issue