Rule Of Rose now works with the FPU recs :D

git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@131 a6443dda-0b58-4228-96e9-037be469359c
This commit is contained in:
cottonvibes 2008-09-18 06:42:16 +00:00 committed by Gregory Hainaut
parent 0bab1b1e8c
commit 5c2c09caf0
1 changed files with 197 additions and 95 deletions

View File

@ -302,8 +302,8 @@ void recCOP1_BC1()
recCP1BC1[_Rt_](); recCP1BC1[_Rt_]();
} }
static u32 _mxcsr = 0x7F80; //static u32 _mxcsr = 0x7F80;
static u32 _mxcsrs; //static u32 _mxcsrs;
static u32 fpucw = 0x007f; static u32 fpucw = 0x007f;
static u32 fpucws = 0; static u32 fpucws = 0;
@ -360,7 +360,6 @@ void recCOP1_W( void )
#ifndef FPU_RECOMPILE #ifndef FPU_RECOMPILE
REC_FPUFUNC(ADD_S); REC_FPUFUNC(ADD_S);
REC_FPUFUNC(SUB_S); REC_FPUFUNC(SUB_S);
REC_FPUFUNC(MUL_S); REC_FPUFUNC(MUL_S);
@ -385,10 +384,10 @@ REC_FPUBRANCH(BC1F);
REC_FPUBRANCH(BC1T); REC_FPUBRANCH(BC1T);
REC_FPUBRANCH(BC1FL); REC_FPUBRANCH(BC1FL);
REC_FPUBRANCH(BC1TL); REC_FPUBRANCH(BC1TL);
REC_FPUFUNC(C_F);
REC_FPUFUNC(C_EQ); REC_FPUFUNC(C_EQ);
REC_FPUFUNC(C_LE); REC_FPUFUNC(C_F);
REC_FPUFUNC(C_LT); REC_FPUFUNC(C_LT);
REC_FPUFUNC(C_LE);
#else #else
@ -676,97 +675,7 @@ void recMIN_S_(int info) {
#endif #endif
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
void recC_EQ_xmm(int info)
{
// assumes that inputs are valid
switch(info & (PROCESS_EE_S|PROCESS_EE_T) ) {
case PROCESS_EE_S: SSE_UCOMISS_M32_to_XMM(EEREC_S, (uptr)&fpuRegs.fpr[_Ft_]); break;
case PROCESS_EE_T: SSE_UCOMISS_M32_to_XMM(EEREC_T, (uptr)&fpuRegs.fpr[_Fs_]); break;
default: SSE_UCOMISS_XMM_to_XMM(EEREC_S, EEREC_T); break;
}
//write8(0x9f); // lahf
//TEST16ItoR(EAX, 0x4400);
j8Ptr[0] = JZ8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~0x00800000 );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], 0x00800000);
x86SetJ8(j8Ptr[1]);
}
FPURECOMPILE_CONSTCODE(C_EQ, XMMINFO_READS|XMMINFO_READT);
////////////////////////////////////////////////////
void recC_F()
{
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~0x00800000 );
}
////////////////////////////////////////////////////
void recC_LT_xmm(int info)
{
// assumes that inputs are valid
switch(info & (PROCESS_EE_S|PROCESS_EE_T) ) {
case PROCESS_EE_S: SSE_UCOMISS_M32_to_XMM(EEREC_S, (uptr)&fpuRegs.fpr[_Ft_]); break;
case PROCESS_EE_T: SSE_UCOMISS_M32_to_XMM(EEREC_T, (uptr)&fpuRegs.fpr[_Fs_]); break;
default: SSE_UCOMISS_XMM_to_XMM(EEREC_S, EEREC_T); break;
}
//write8(0x9f); // lahf
//TEST16ItoR(EAX, 0x4400);
if( info & PROCESS_EE_S ) {
j8Ptr[0] = JB8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~0x00800000 );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], 0x00800000);
x86SetJ8(j8Ptr[1]);
}
else {
j8Ptr[0] = JBE8(0);
OR32ItoM((uptr)&fpuRegs.fprc[31], 0x00800000);
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~0x00800000 );
x86SetJ8(j8Ptr[1]);
}
}
FPURECOMPILE_CONSTCODE(C_LT, XMMINFO_READS|XMMINFO_READT);
////////////////////////////////////////////////////
void recC_LE_xmm(int info )
{
switch(info & (PROCESS_EE_S|PROCESS_EE_T) ) {
case PROCESS_EE_S: SSE_UCOMISS_M32_to_XMM(EEREC_S, (uptr)&fpuRegs.fpr[_Ft_]); break;
case PROCESS_EE_T: SSE_UCOMISS_M32_to_XMM(EEREC_T, (uptr)&fpuRegs.fpr[_Fs_]); break;
default: SSE_UCOMISS_XMM_to_XMM(EEREC_S, EEREC_T); break;
}
//write8(0x9f); // lahf
//TEST16ItoR(EAX, 0x4400);
if( info & PROCESS_EE_S ) {
j8Ptr[0] = JBE8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~0x00800000 );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], 0x00800000);
x86SetJ8(j8Ptr[1]);
}
else {
j8Ptr[0] = JB8(0);
OR32ItoM((uptr)&fpuRegs.fprc[31], 0x00800000);
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~0x00800000 );
x86SetJ8(j8Ptr[1]);
}
}
FPURECOMPILE_CONSTCODE(C_LE, XMMINFO_READS|XMMINFO_READT);
////////////////////////////////////////////////////
static u32 s_signbit = 0x80000000; static u32 s_signbit = 0x80000000;
extern int g_VuNanHandling; extern int g_VuNanHandling;
@ -802,6 +711,199 @@ void ClampValues2(regd) {
} }
////////////////////////////////////////////////////
void recC_EQ_xmm(int info)
{
int tempReg;
switch(info & (PROCESS_EE_S|PROCESS_EE_T) ) {
case PROCESS_EE_S: SSE_UCOMISS_M32_to_XMM(EEREC_S, (uptr)&fpuRegs.fpr[_Ft_]); break;
case PROCESS_EE_T: SSE_UCOMISS_M32_to_XMM(EEREC_T, (uptr)&fpuRegs.fpr[_Fs_]); break;
case (PROCESS_EE_S|PROCESS_EE_T):
fpuFloat(EEREC_S);
fpuFloat(EEREC_T);
SSE_UCOMISS_XMM_to_XMM(EEREC_S, EEREC_T);
break;
default:
tempReg = _allocX86reg(-1, X86TYPE_TEMP, 0, 0);
if (tempReg == -1) {SysPrintf("FPU: DIV Allocation Error!\n"); tempReg = EAX;}
MOV32MtoR(tempReg, (uptr)&fpuRegs.fpr[_Fs_]);
CMP32MtoR(tempReg, (uptr)&fpuRegs.fpr[_Ft_]);
j8Ptr[0] = JZ8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~FPUflagC );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], FPUflagC);
x86SetJ8(j8Ptr[1]);
_freeX86reg(tempReg);
return;
}
j8Ptr[0] = JZ8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~FPUflagC );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], FPUflagC);
x86SetJ8(j8Ptr[1]);
}
FPURECOMPILE_CONSTCODE(C_EQ, XMMINFO_READS|XMMINFO_READT);
//REC_FPUFUNC(C_EQ);
////////////////////////////////////////////////////
void recC_F()
{
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~FPUflagC );
}
//REC_FPUFUNC(C_F);
////////////////////////////////////////////////////
void recC_LT_xmm(int info)
{
int tempReg;
switch(info & (PROCESS_EE_S|PROCESS_EE_T) ) {
case PROCESS_EE_S:
//SysPrintf("PROCESS_EE_S\n");
SSE_UCOMISS_M32_to_XMM(EEREC_S, (uptr)&fpuRegs.fpr[_Ft_]);
break;
case PROCESS_EE_T:
//SysPrintf("PROCESS_EE_T\n");
SSE_UCOMISS_M32_to_XMM(EEREC_T, (uptr)&fpuRegs.fpr[_Fs_]);
j8Ptr[0] = JA8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~FPUflagC );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], FPUflagC);
x86SetJ8(j8Ptr[1]);
return;
case (PROCESS_EE_S|PROCESS_EE_T):
//SysPrintf("PROCESS_EE_S|PROCESS_EE_T\n");
fpuFloat(EEREC_S);
fpuFloat(EEREC_T);
SSE_UCOMISS_XMM_to_XMM(EEREC_S, EEREC_T);
break;
default:
//SysPrintf("Default\n");
tempReg = _allocX86reg(-1, X86TYPE_TEMP, 0, 0);
if (tempReg == -1) {SysPrintf("FPU: DIV Allocation Error!\n"); tempReg = EAX;}
MOV32MtoR(tempReg, (uptr)&fpuRegs.fpr[_Fs_]);
CMP32MtoR(tempReg, (uptr)&fpuRegs.fpr[_Ft_]);
j8Ptr[0] = JL8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~FPUflagC );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], FPUflagC);
x86SetJ8(j8Ptr[1]);
_freeX86reg(tempReg);
return;
}
j8Ptr[0] = JB8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~FPUflagC );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], FPUflagC);
x86SetJ8(j8Ptr[1]);
}
FPURECOMPILE_CONSTCODE(C_LT, XMMINFO_READS|XMMINFO_READT);
//REC_FPUFUNC(C_LT);
/*
void recC_LT()
{
int tempS, tempT, tempReg;
iFlushCall(FLUSH_EVERYTHING);
tempS = _allocTempXMMreg(XMMT_FPS, -1);
tempT = _allocTempXMMreg(XMMT_FPS, -1);
tempReg = _allocX86reg(-1, X86TYPE_TEMP, 0, 0);
if (tempReg == -1) {SysPrintf("FPU: DIV Allocation Error!\n"); tempReg = EAX;}
SysPrintf("Default\n");
SSE_MOVSS_M32_to_XMM(tempS, (uptr)&fpuRegs.fpr[_Fs_]);
SSE_MINSS_M32_to_XMM(tempS, (uptr)&g_maxvals[0]);
SSE_MAXSS_M32_to_XMM(tempS, (uptr)&g_minvals[0]);
SSE_MOVSS_M32_to_XMM(tempT, (uptr)&fpuRegs.fpr[_Ft_]);
SSE_MINSS_M32_to_XMM(tempT, (uptr)&g_maxvals[0]);
SSE_MAXSS_M32_to_XMM(tempT, (uptr)&g_minvals[0]);
SSE_UCOMISS_XMM_to_XMM(tempS, tempT);
//MOV32MtoR(tempReg, (uptr)&fpuRegs.fpr[_Fs_]);
//CMP32MtoR(tempReg, (uptr)&fpuRegs.fpr[_Ft_]);
//j8Ptr[0] = JL8(0);
j8Ptr[0] = JB8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~FPUflagC );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], FPUflagC);
x86SetJ8(j8Ptr[1]);
_freeXMMreg(tempS);
_freeXMMreg(tempT);
_freeX86reg(tempReg);
}*/
////////////////////////////////////////////////////
void recC_LE_xmm(int info )
{
int tempReg;
switch(info & (PROCESS_EE_S|PROCESS_EE_T) ) {
case PROCESS_EE_S:
//SysPrintf("PROCESS_EE_S\n");
SSE_UCOMISS_M32_to_XMM(EEREC_S, (uptr)&fpuRegs.fpr[_Ft_]);
break;
case PROCESS_EE_T:
//SysPrintf("PROCESS_EE_T\n");
SSE_UCOMISS_M32_to_XMM(EEREC_T, (uptr)&fpuRegs.fpr[_Fs_]);
j8Ptr[0] = JAE8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~FPUflagC );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], FPUflagC);
x86SetJ8(j8Ptr[1]);
return;
case (PROCESS_EE_S|PROCESS_EE_T):
//SysPrintf("PROCESS_EE_S|PROCESS_EE_T\n");
fpuFloat(EEREC_S);
fpuFloat(EEREC_T);
SSE_UCOMISS_XMM_to_XMM(EEREC_S, EEREC_T);
break;
default:
//SysPrintf("Default\n");
tempReg = _allocX86reg(-1, X86TYPE_TEMP, 0, 0);
if (tempReg == -1) {SysPrintf("FPU: DIV Allocation Error!\n"); tempReg = EAX;}
MOV32MtoR(tempReg, (uptr)&fpuRegs.fpr[_Fs_]);
CMP32MtoR(tempReg, (uptr)&fpuRegs.fpr[_Ft_]);
j8Ptr[0] = JLE8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~FPUflagC );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], FPUflagC);
x86SetJ8(j8Ptr[1]);
_freeX86reg(tempReg);
return;
}
j8Ptr[0] = JBE8(0);
AND32ItoM( (uptr)&fpuRegs.fprc[31], ~FPUflagC );
j8Ptr[1] = JMP8(0);
x86SetJ8(j8Ptr[0]);
OR32ItoM((uptr)&fpuRegs.fprc[31], FPUflagC);
x86SetJ8(j8Ptr[1]);
}
FPURECOMPILE_CONSTCODE(C_LE, XMMINFO_READS|XMMINFO_READT);
//REC_FPUFUNC(C_LE);
////////////////////////////////////////////////////
static void (*recComOpXMM_to_XMM[] )(x86SSERegType, x86SSERegType) = { static void (*recComOpXMM_to_XMM[] )(x86SSERegType, x86SSERegType) = {
SSE_ADDSS_XMM_to_XMM, SSE_MULSS_XMM_to_XMM, SSE_MAXSS_XMM_to_XMM, SSE_MINSS_XMM_to_XMM }; SSE_ADDSS_XMM_to_XMM, SSE_MULSS_XMM_to_XMM, SSE_MAXSS_XMM_to_XMM, SSE_MINSS_XMM_to_XMM };