mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-05 22:41:18 +12:00
PPCRec: Simplify FPR instruction names
This commit is contained in:
parent
ca292b1a50
commit
3031a98b16
5 changed files with 228 additions and 264 deletions
|
@ -72,8 +72,7 @@ bool PPCRecompilerX64Gen_imlInstruction_fpr_load(PPCRecFunction_t* PPCRecFunctio
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
x64Gen_cvtss2sd_xmmReg_xmmReg(x64GenContext, realRegisterXMM, realRegisterXMM);
|
x64Gen_cvtss2sd_xmmReg_xmmReg(x64GenContext, realRegisterXMM, realRegisterXMM);
|
||||||
x64Gen_movddup_xmmReg_xmmReg(x64GenContext, realRegisterXMM, realRegisterXMM);
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if( mode == PPCREC_FPR_LD_MODE_DOUBLE_INTO_PS0 )
|
else if( mode == PPCREC_FPR_LD_MODE_DOUBLE_INTO_PS0 )
|
||||||
{
|
{
|
||||||
|
@ -246,27 +245,27 @@ void PPCRecompilerX64Gen_imlInstruction_fpr_r_r(PPCRecFunction_t* PPCRecFunction
|
||||||
uint32 regR = _regF64(imlInstruction->op_fpr_r_r.regR);
|
uint32 regR = _regF64(imlInstruction->op_fpr_r_r.regR);
|
||||||
uint32 regA = _regF64(imlInstruction->op_fpr_r_r.regA);
|
uint32 regA = _regF64(imlInstruction->op_fpr_r_r.regA);
|
||||||
|
|
||||||
if( imlInstruction->operation == PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM )
|
if( imlInstruction->operation == PPCREC_IML_OP_FPR_ASSIGN )
|
||||||
{
|
{
|
||||||
x64Gen_movsd_xmmReg_xmmReg(x64GenContext, regR, regA);
|
x64Gen_movsd_xmmReg_xmmReg(x64GenContext, regR, regA);
|
||||||
}
|
}
|
||||||
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM )
|
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_MULTIPLY )
|
||||||
{
|
{
|
||||||
x64Gen_mulsd_xmmReg_xmmReg(x64GenContext, regR, regA);
|
x64Gen_mulsd_xmmReg_xmmReg(x64GenContext, regR, regA);
|
||||||
}
|
}
|
||||||
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_DIVIDE_BOTTOM )
|
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_DIVIDE )
|
||||||
{
|
{
|
||||||
x64Gen_divsd_xmmReg_xmmReg(x64GenContext, regR, regA);
|
x64Gen_divsd_xmmReg_xmmReg(x64GenContext, regR, regA);
|
||||||
}
|
}
|
||||||
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_ADD_BOTTOM )
|
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_ADD )
|
||||||
{
|
{
|
||||||
x64Gen_addsd_xmmReg_xmmReg(x64GenContext, regR, regA);
|
x64Gen_addsd_xmmReg_xmmReg(x64GenContext, regR, regA);
|
||||||
}
|
}
|
||||||
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_SUB_BOTTOM )
|
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_SUB )
|
||||||
{
|
{
|
||||||
x64Gen_subsd_xmmReg_xmmReg(x64GenContext, regR, regA);
|
x64Gen_subsd_xmmReg_xmmReg(x64GenContext, regR, regA);
|
||||||
}
|
}
|
||||||
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_BOTTOM_FCTIWZ )
|
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_FCTIWZ )
|
||||||
{
|
{
|
||||||
x64Gen_cvttsd2si_xmmReg_xmmReg(x64GenContext, REG_RESV_TEMP, regA);
|
x64Gen_cvttsd2si_xmmReg_xmmReg(x64GenContext, REG_RESV_TEMP, regA);
|
||||||
x64Gen_mov_reg64Low32_reg64Low32(x64GenContext, REG_RESV_TEMP, REG_RESV_TEMP);
|
x64Gen_mov_reg64Low32_reg64Low32(x64GenContext, REG_RESV_TEMP, REG_RESV_TEMP);
|
||||||
|
@ -288,7 +287,7 @@ void PPCRecompilerX64Gen_imlInstruction_fpr_r_r_r(PPCRecFunction_t* PPCRecFuncti
|
||||||
uint32 regA = _regF64(imlInstruction->op_fpr_r_r_r.regA);
|
uint32 regA = _regF64(imlInstruction->op_fpr_r_r_r.regA);
|
||||||
uint32 regB = _regF64(imlInstruction->op_fpr_r_r_r.regB);
|
uint32 regB = _regF64(imlInstruction->op_fpr_r_r_r.regB);
|
||||||
|
|
||||||
if (imlInstruction->operation == PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM)
|
if (imlInstruction->operation == PPCREC_IML_OP_FPR_MULTIPLY)
|
||||||
{
|
{
|
||||||
if (regR == regA)
|
if (regR == regA)
|
||||||
{
|
{
|
||||||
|
@ -304,7 +303,7 @@ void PPCRecompilerX64Gen_imlInstruction_fpr_r_r_r(PPCRecFunction_t* PPCRecFuncti
|
||||||
x64Gen_mulsd_xmmReg_xmmReg(x64GenContext, regR, regB);
|
x64Gen_mulsd_xmmReg_xmmReg(x64GenContext, regR, regB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (imlInstruction->operation == PPCREC_IML_OP_FPR_ADD_BOTTOM)
|
else if (imlInstruction->operation == PPCREC_IML_OP_FPR_ADD)
|
||||||
{
|
{
|
||||||
// todo: Use AVX 3-operand VADDSD if available
|
// todo: Use AVX 3-operand VADDSD if available
|
||||||
if (regR == regA)
|
if (regR == regA)
|
||||||
|
@ -321,7 +320,7 @@ void PPCRecompilerX64Gen_imlInstruction_fpr_r_r_r(PPCRecFunction_t* PPCRecFuncti
|
||||||
x64Gen_addsd_xmmReg_xmmReg(x64GenContext, regR, regB);
|
x64Gen_addsd_xmmReg_xmmReg(x64GenContext, regR, regB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_SUB_BOTTOM )
|
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_SUB )
|
||||||
{
|
{
|
||||||
if( regR == regA )
|
if( regR == regA )
|
||||||
{
|
{
|
||||||
|
@ -353,7 +352,7 @@ void PPCRecompilerX64Gen_imlInstruction_fpr_r_r_r_r(PPCRecFunction_t* PPCRecFunc
|
||||||
uint32 regB = _regF64(imlInstruction->op_fpr_r_r_r_r.regB);
|
uint32 regB = _regF64(imlInstruction->op_fpr_r_r_r_r.regB);
|
||||||
uint32 regC = _regF64(imlInstruction->op_fpr_r_r_r_r.regC);
|
uint32 regC = _regF64(imlInstruction->op_fpr_r_r_r_r.regC);
|
||||||
|
|
||||||
if( imlInstruction->operation == PPCREC_IML_OP_FPR_SELECT_BOTTOM )
|
if( imlInstruction->operation == PPCREC_IML_OP_FPR_SELECT )
|
||||||
{
|
{
|
||||||
x64Gen_comisd_xmmReg_mem64Reg64(x64GenContext, regA, REG_RESV_RECDATA, offsetof(PPCRecompilerInstanceData_t, _x64XMM_constDouble0_0));
|
x64Gen_comisd_xmmReg_mem64Reg64(x64GenContext, regA, REG_RESV_RECDATA, offsetof(PPCRecompilerInstanceData_t, _x64XMM_constDouble0_0));
|
||||||
sint32 jumpInstructionOffset1 = x64GenContext->emitter->GetWriteIndex();
|
sint32 jumpInstructionOffset1 = x64GenContext->emitter->GetWriteIndex();
|
||||||
|
@ -376,7 +375,7 @@ void PPCRecompilerX64Gen_imlInstruction_fpr_r(PPCRecFunction_t* PPCRecFunction,
|
||||||
{
|
{
|
||||||
uint32 regR = _regF64(imlInstruction->op_fpr_r.regR);
|
uint32 regR = _regF64(imlInstruction->op_fpr_r.regR);
|
||||||
|
|
||||||
if( imlInstruction->operation == PPCREC_IML_OP_FPR_NEGATE_BOTTOM )
|
if( imlInstruction->operation == PPCREC_IML_OP_FPR_NEGATE )
|
||||||
{
|
{
|
||||||
x64Gen_xorps_xmmReg_mem128Reg64(x64GenContext, regR, REG_RESV_RECDATA, offsetof(PPCRecompilerInstanceData_t, _x64XMM_xorNegateMaskBottom));
|
x64Gen_xorps_xmmReg_mem128Reg64(x64GenContext, regR, REG_RESV_RECDATA, offsetof(PPCRecompilerInstanceData_t, _x64XMM_xorNegateMaskBottom));
|
||||||
}
|
}
|
||||||
|
@ -384,11 +383,11 @@ void PPCRecompilerX64Gen_imlInstruction_fpr_r(PPCRecFunction_t* PPCRecFunction,
|
||||||
{
|
{
|
||||||
x64Gen_movsd_xmmReg_memReg64(x64GenContext, regR, REG_RESV_RECDATA, offsetof(PPCRecompilerInstanceData_t, _x64XMM_constDouble1_1));
|
x64Gen_movsd_xmmReg_memReg64(x64GenContext, regR, REG_RESV_RECDATA, offsetof(PPCRecompilerInstanceData_t, _x64XMM_constDouble1_1));
|
||||||
}
|
}
|
||||||
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_ABS_BOTTOM )
|
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_ABS )
|
||||||
{
|
{
|
||||||
x64Gen_andps_xmmReg_mem128Reg64(x64GenContext, regR, REG_RESV_RECDATA, offsetof(PPCRecompilerInstanceData_t, _x64XMM_andAbsMaskBottom));
|
x64Gen_andps_xmmReg_mem128Reg64(x64GenContext, regR, REG_RESV_RECDATA, offsetof(PPCRecompilerInstanceData_t, _x64XMM_andAbsMaskBottom));
|
||||||
}
|
}
|
||||||
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_NEGATIVE_ABS_BOTTOM )
|
else if( imlInstruction->operation == PPCREC_IML_OP_FPR_NEGATIVE_ABS )
|
||||||
{
|
{
|
||||||
x64Gen_orps_xmmReg_mem128Reg64(x64GenContext, regR, REG_RESV_RECDATA, offsetof(PPCRecompilerInstanceData_t, _x64XMM_xorNegateMaskBottom));
|
x64Gen_orps_xmmReg_mem128Reg64(x64GenContext, regR, REG_RESV_RECDATA, offsetof(PPCRecompilerInstanceData_t, _x64XMM_xorNegateMaskBottom));
|
||||||
}
|
}
|
||||||
|
@ -399,12 +398,10 @@ void PPCRecompilerX64Gen_imlInstruction_fpr_r(PPCRecFunction_t* PPCRecFunction,
|
||||||
// convert back to 64bit double
|
// convert back to 64bit double
|
||||||
x64Gen_cvtss2sd_xmmReg_xmmReg(x64GenContext, regR, regR);
|
x64Gen_cvtss2sd_xmmReg_xmmReg(x64GenContext, regR, regR);
|
||||||
}
|
}
|
||||||
else if (imlInstruction->operation == PPCREC_IML_OP_FPR_EXPAND_BOTTOM32_TO_BOTTOM64_AND_TOP64)
|
else if (imlInstruction->operation == PPCREC_IML_OP_FPR_EXPAND_F32_TO_F64)
|
||||||
{
|
{
|
||||||
// convert bottom to 64bit double
|
// convert bottom to 64bit double
|
||||||
x64Gen_cvtss2sd_xmmReg_xmmReg(x64GenContext, regR, regR);
|
x64Gen_cvtss2sd_xmmReg_xmmReg(x64GenContext, regR, regR);
|
||||||
// copy to top half
|
|
||||||
x64Gen_movddup_xmmReg_xmmReg(x64GenContext, regR, regR);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -282,9 +282,9 @@ void IMLInstruction::CheckRegisterUsage(IMLUsedRegisters* registersUsed) const
|
||||||
{
|
{
|
||||||
// fpr operation
|
// fpr operation
|
||||||
if (
|
if (
|
||||||
operation == PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM ||
|
operation == PPCREC_IML_OP_FPR_ASSIGN ||
|
||||||
operation == PPCREC_IML_OP_FPR_EXPAND_BOTTOM32_TO_BOTTOM64_AND_TOP64 ||
|
operation == PPCREC_IML_OP_FPR_EXPAND_F32_TO_F64 ||
|
||||||
operation == PPCREC_IML_OP_FPR_BOTTOM_FCTIWZ
|
operation == PPCREC_IML_OP_FPR_FCTIWZ
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// operand read, result read and (partially) written
|
// operand read, result read and (partially) written
|
||||||
|
@ -292,10 +292,10 @@ void IMLInstruction::CheckRegisterUsage(IMLUsedRegisters* registersUsed) const
|
||||||
registersUsed->readGPR2 = op_fpr_r_r.regR;
|
registersUsed->readGPR2 = op_fpr_r_r.regR;
|
||||||
registersUsed->writtenGPR1 = op_fpr_r_r.regR;
|
registersUsed->writtenGPR1 = op_fpr_r_r.regR;
|
||||||
}
|
}
|
||||||
else if (operation == PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM ||
|
else if (operation == PPCREC_IML_OP_FPR_MULTIPLY ||
|
||||||
operation == PPCREC_IML_OP_FPR_DIVIDE_BOTTOM ||
|
operation == PPCREC_IML_OP_FPR_DIVIDE ||
|
||||||
operation == PPCREC_IML_OP_FPR_ADD_BOTTOM ||
|
operation == PPCREC_IML_OP_FPR_ADD ||
|
||||||
operation == PPCREC_IML_OP_FPR_SUB_BOTTOM)
|
operation == PPCREC_IML_OP_FPR_SUB)
|
||||||
{
|
{
|
||||||
// operand read, result read and written
|
// operand read, result read and written
|
||||||
registersUsed->readGPR1 = op_fpr_r_r.regA;
|
registersUsed->readGPR1 = op_fpr_r_r.regA;
|
||||||
|
@ -321,9 +321,9 @@ void IMLInstruction::CheckRegisterUsage(IMLUsedRegisters* registersUsed) const
|
||||||
// handle partially written result
|
// handle partially written result
|
||||||
switch (operation)
|
switch (operation)
|
||||||
{
|
{
|
||||||
case PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM:
|
case PPCREC_IML_OP_FPR_MULTIPLY:
|
||||||
case PPCREC_IML_OP_FPR_ADD_BOTTOM:
|
case PPCREC_IML_OP_FPR_ADD:
|
||||||
case PPCREC_IML_OP_FPR_SUB_BOTTOM:
|
case PPCREC_IML_OP_FPR_SUB:
|
||||||
registersUsed->readGPR3 = op_fpr_r_r_r.regR;
|
registersUsed->readGPR3 = op_fpr_r_r_r.regR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -340,7 +340,7 @@ void IMLInstruction::CheckRegisterUsage(IMLUsedRegisters* registersUsed) const
|
||||||
// handle partially written result
|
// handle partially written result
|
||||||
switch (operation)
|
switch (operation)
|
||||||
{
|
{
|
||||||
case PPCREC_IML_OP_FPR_SELECT_BOTTOM:
|
case PPCREC_IML_OP_FPR_SELECT:
|
||||||
registersUsed->readGPR4 = op_fpr_r_r_r_r.regR;
|
registersUsed->readGPR4 = op_fpr_r_r_r_r.regR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -350,10 +350,10 @@ void IMLInstruction::CheckRegisterUsage(IMLUsedRegisters* registersUsed) const
|
||||||
else if (type == PPCREC_IML_TYPE_FPR_R)
|
else if (type == PPCREC_IML_TYPE_FPR_R)
|
||||||
{
|
{
|
||||||
// fpr operation
|
// fpr operation
|
||||||
if (operation == PPCREC_IML_OP_FPR_NEGATE_BOTTOM ||
|
if (operation == PPCREC_IML_OP_FPR_NEGATE ||
|
||||||
operation == PPCREC_IML_OP_FPR_ABS_BOTTOM ||
|
operation == PPCREC_IML_OP_FPR_ABS ||
|
||||||
operation == PPCREC_IML_OP_FPR_NEGATIVE_ABS_BOTTOM ||
|
operation == PPCREC_IML_OP_FPR_NEGATIVE_ABS ||
|
||||||
operation == PPCREC_IML_OP_FPR_EXPAND_BOTTOM32_TO_BOTTOM64_AND_TOP64 ||
|
operation == PPCREC_IML_OP_FPR_EXPAND_F32_TO_F64 ||
|
||||||
operation == PPCREC_IML_OP_FPR_ROUND_TO_SINGLE_PRECISION_BOTTOM)
|
operation == PPCREC_IML_OP_FPR_ROUND_TO_SINGLE_PRECISION_BOTTOM)
|
||||||
{
|
{
|
||||||
registersUsed->readGPR1 = op_fpr_r.regR;
|
registersUsed->readGPR1 = op_fpr_r.regR;
|
||||||
|
|
|
@ -126,27 +126,23 @@ enum
|
||||||
PPCREC_IML_OP_SRW, // SRW (shift based on register by up to 63 bits)
|
PPCREC_IML_OP_SRW, // SRW (shift based on register by up to 63 bits)
|
||||||
PPCREC_IML_OP_CNTLZW,
|
PPCREC_IML_OP_CNTLZW,
|
||||||
// FPU
|
// FPU
|
||||||
PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM,
|
PPCREC_IML_OP_FPR_ASSIGN,
|
||||||
PPCREC_IML_OP_FPR_LOAD_ONE, // load constant 1.0 into register
|
PPCREC_IML_OP_FPR_LOAD_ONE, // load constant 1.0 into register
|
||||||
PPCREC_IML_OP_FPR_ADD_BOTTOM,
|
PPCREC_IML_OP_FPR_ADD,
|
||||||
PPCREC_IML_OP_FPR_SUB_BOTTOM,
|
PPCREC_IML_OP_FPR_SUB,
|
||||||
PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM,
|
PPCREC_IML_OP_FPR_MULTIPLY,
|
||||||
PPCREC_IML_OP_FPR_DIVIDE_BOTTOM,
|
PPCREC_IML_OP_FPR_DIVIDE,
|
||||||
PPCREC_IML_OP_FPR_EXPAND_BOTTOM32_TO_BOTTOM64_AND_TOP64, // expand bottom f32 to f64 in bottom and top half
|
PPCREC_IML_OP_FPR_EXPAND_F32_TO_F64, // expand f32 to f64 in-place
|
||||||
PPCREC_IML_OP_FPR_NEGATE_BOTTOM,
|
PPCREC_IML_OP_FPR_NEGATE,
|
||||||
PPCREC_IML_OP_FPR_ABS_BOTTOM, // abs(fp0)
|
PPCREC_IML_OP_FPR_ABS, // abs(fpr)
|
||||||
PPCREC_IML_OP_FPR_NEGATIVE_ABS_BOTTOM, // -abs(fp0)
|
PPCREC_IML_OP_FPR_NEGATIVE_ABS, // -abs(fpr)
|
||||||
PPCREC_IML_OP_FPR_ROUND_TO_SINGLE_PRECISION_BOTTOM, // round 64bit double to 64bit double with 32bit float precision (in bottom half of xmm register)
|
PPCREC_IML_OP_FPR_ROUND_TO_SINGLE_PRECISION_BOTTOM, // round 64bit double to 64bit double with 32bit float precision (in bottom half of xmm register)
|
||||||
PPCREC_IML_OP_FPR_BOTTOM_FCTIWZ,
|
PPCREC_IML_OP_FPR_FCTIWZ,
|
||||||
PPCREC_IML_OP_FPR_SELECT_BOTTOM, // selectively copy bottom value from operand B or C based on value in operand A
|
PPCREC_IML_OP_FPR_SELECT, // selectively copy bottom value from operand B or C based on value in operand A
|
||||||
// Conversion (FPR_R_R)
|
// Conversion (FPR_R_R)
|
||||||
PPCREC_IML_OP_FPR_INT_TO_FLOAT, // convert integer value in gpr to floating point value in fpr
|
PPCREC_IML_OP_FPR_INT_TO_FLOAT, // convert integer value in gpr to floating point value in fpr
|
||||||
PPCREC_IML_OP_FPR_FLOAT_TO_INT, // convert floating point value in fpr to integer value in gpr
|
PPCREC_IML_OP_FPR_FLOAT_TO_INT, // convert floating point value in fpr to integer value in gpr
|
||||||
|
|
||||||
// R_R_R only
|
|
||||||
|
|
||||||
// R_R_S32 only
|
|
||||||
|
|
||||||
// R_R_R + R_R_S32
|
// R_R_R + R_R_S32
|
||||||
PPCREC_IML_OP_ADD, // also R_R_R_CARRY
|
PPCREC_IML_OP_ADD, // also R_R_R_CARRY
|
||||||
PPCREC_IML_OP_SUB,
|
PPCREC_IML_OP_SUB,
|
||||||
|
|
|
@ -73,7 +73,7 @@ void PPCRecompiler_optimizeDirectFloatCopiesScanForward(ppcImlGenContext_t* ppcI
|
||||||
{
|
{
|
||||||
// insert expand instruction after store
|
// insert expand instruction after store
|
||||||
IMLInstruction* newExpand = PPCRecompiler_insertInstruction(imlSegment, lastStore);
|
IMLInstruction* newExpand = PPCRecompiler_insertInstruction(imlSegment, lastStore);
|
||||||
newExpand->make_fpr_r(PPCREC_IML_OP_FPR_EXPAND_BOTTOM32_TO_BOTTOM64_AND_TOP64, _FPRRegFromID(fprIndex));
|
newExpand->make_fpr_r(PPCREC_IML_OP_FPR_EXPAND_F32_TO_F64, _FPRRegFromID(fprIndex));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ bool PPCRecompilerImlGen_LFS_LFSU_LFD_LFDU(ppcImlGenContext_t* ppcImlGenContext,
|
||||||
if( ppcImlGenContext->LSQE )
|
if( ppcImlGenContext->LSQE )
|
||||||
{
|
{
|
||||||
DefinePS1(fpPs1, frD);
|
DefinePS1(fpPs1, frD);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fpPs1, fpPs0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fpPs1, fpPs0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -112,7 +112,7 @@ bool PPCRecompilerImlGen_LFSX_LFSUX_LFDX_LFDUX(ppcImlGenContext_t* ppcImlGenCont
|
||||||
if( ppcImlGenContext->LSQE )
|
if( ppcImlGenContext->LSQE )
|
||||||
{
|
{
|
||||||
DefinePS1(fpPs1, frD);
|
DefinePS1(fpPs1, frD);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fpPs1, fpPs0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fpPs1, fpPs0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -205,7 +205,7 @@ bool PPCRecompilerImlGen_FADD(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
|
||||||
DefinePS0(fprA, frA);
|
DefinePS0(fprA, frA);
|
||||||
DefinePS0(fprB, frB);
|
DefinePS0(fprB, frB);
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprD, fprA, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_ADD, fprD, fprA, fprB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,7 +217,7 @@ bool PPCRecompilerImlGen_FSUB(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
|
||||||
DefinePS0(fprA, frA);
|
DefinePS0(fprA, frA);
|
||||||
DefinePS0(fprB, frB);
|
DefinePS0(fprB, frB);
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprD, fprA, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_SUB, fprD, fprA, fprB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,9 +237,9 @@ bool PPCRecompilerImlGen_FMUL(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
// move frA to frD (if different register)
|
// move frA to frD (if different register)
|
||||||
if( frD != frA )
|
if( frD != frA )
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprA);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprA);
|
||||||
// multiply bottom double of frD with bottom double of frB
|
// multiply bottom double of frD with bottom double of frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprD, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprD, fprC);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,18 +255,18 @@ bool PPCRecompilerImlGen_FDIV(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
|
||||||
{
|
{
|
||||||
DefineTempFPR(fprTemp, 0);
|
DefineTempFPR(fprTemp, 0);
|
||||||
// move frA to temporary register
|
// move frA to temporary register
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp, fprA);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp, fprA);
|
||||||
// divide bottom double of temporary register by bottom double of frB
|
// divide bottom double of temporary register by bottom double of frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE_BOTTOM, fprTemp, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE, fprTemp, fprB);
|
||||||
// move result to frD
|
// move result to frD
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprTemp);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprTemp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// move frA to frD (if different register)
|
// move frA to frD (if different register)
|
||||||
if( frD != frA )
|
if( frD != frA )
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprA); // copy ps0
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprA); // copy ps0
|
||||||
// divide bottom double of frD by bottom double of frB
|
// divide bottom double of frD by bottom double of frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE_BOTTOM, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE, fprD, fprB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -283,11 +283,11 @@ bool PPCRecompilerImlGen_FMADD(ppcImlGenContext_t* ppcImlGenContext, uint32 opco
|
||||||
{
|
{
|
||||||
DefineTempFPR(fprTemp, 0);
|
DefineTempFPR(fprTemp, 0);
|
||||||
// move frA to temporary register
|
// move frA to temporary register
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp, fprA);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp, fprA);
|
||||||
// multiply bottom double of temporary register with bottom double of frC
|
// multiply bottom double of temporary register with bottom double of frC
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp, fprC);
|
||||||
// add result to frD
|
// add result to frD
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprD, fprTemp);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprD, fprTemp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// if frC == frD -> swap registers, we assume that frC != frD
|
// if frC == frD -> swap registers, we assume that frC != frD
|
||||||
|
@ -300,11 +300,11 @@ bool PPCRecompilerImlGen_FMADD(ppcImlGenContext_t* ppcImlGenContext, uint32 opco
|
||||||
}
|
}
|
||||||
// move frA to frD (if different register)
|
// move frA to frD (if different register)
|
||||||
if( frD != frA )
|
if( frD != frA )
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprA); // always copy ps0 and ps1
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprA); // always copy ps0 and ps1
|
||||||
// multiply bottom double of frD with bottom double of frC
|
// multiply bottom double of frD with bottom double of frC
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprD, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprD, fprC);
|
||||||
// add frB
|
// add frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprD, fprB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,10 +320,10 @@ bool PPCRecompilerImlGen_FMSUB(ppcImlGenContext_t* ppcImlGenContext, uint32 opco
|
||||||
{
|
{
|
||||||
// if frB is already in frD we need a temporary register to store the product of frA*frC
|
// if frB is already in frD we need a temporary register to store the product of frA*frC
|
||||||
DefineTempFPR(fprTemp, 0);
|
DefineTempFPR(fprTemp, 0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp, fprA);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp, fprA);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp, fprC);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprTemp, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprTemp, fprB);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprTemp);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprTemp);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if( frD == frC )
|
if( frD == frC )
|
||||||
|
@ -335,11 +335,11 @@ bool PPCRecompilerImlGen_FMSUB(ppcImlGenContext_t* ppcImlGenContext, uint32 opco
|
||||||
}
|
}
|
||||||
// move frA to frD
|
// move frA to frD
|
||||||
if( frD != frA )
|
if( frD != frA )
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprA);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprA);
|
||||||
// multiply bottom double of frD with bottom double of frC
|
// multiply bottom double of frD with bottom double of frC
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprD, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprD, fprC);
|
||||||
// sub frB
|
// sub frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprD, fprB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -356,15 +356,15 @@ bool PPCRecompilerImlGen_FNMSUB(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
{
|
{
|
||||||
DefineTempFPR(fprTemp, 0);
|
DefineTempFPR(fprTemp, 0);
|
||||||
// move frA to temporary register
|
// move frA to temporary register
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp, fprA);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp, fprA);
|
||||||
// multiply bottom double of temporary register with bottom double of frC
|
// multiply bottom double of temporary register with bottom double of frC
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp, fprC);
|
||||||
// sub frB from temporary register
|
// sub frB from temporary register
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprTemp, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprTemp, fprB);
|
||||||
// negate result
|
// negate result
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE_BOTTOM, fprTemp);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE, fprTemp);
|
||||||
// move result to frD
|
// move result to frD
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprTemp);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprTemp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// if frC == frD -> swap registers, we assume that frC != frD
|
// if frC == frD -> swap registers, we assume that frC != frD
|
||||||
|
@ -377,20 +377,20 @@ bool PPCRecompilerImlGen_FNMSUB(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
}
|
}
|
||||||
// move frA to frD (if different register)
|
// move frA to frD (if different register)
|
||||||
if( frD != frA )
|
if( frD != frA )
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprA);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprA);
|
||||||
// multiply bottom double of frD with bottom double of frC
|
// multiply bottom double of frD with bottom double of frC
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprD, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprD, fprC);
|
||||||
// sub frB
|
// sub frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprD, fprB);
|
||||||
// negate result
|
// negate result
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE_BOTTOM, fprD);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE, fprD);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PSE_CopyResultToPs1() if( ppcImlGenContext->PSE ) \
|
#define PSE_CopyResultToPs1() if( ppcImlGenContext->PSE ) \
|
||||||
{ \
|
{ \
|
||||||
DefinePS1(fprDPS1, frD); \
|
DefinePS1(fprDPS1, frD); \
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDPS1, fprD); \
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDPS1, fprD); \
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PPCRecompilerImlGen_FMULS(ppcImlGenContext_t* ppcImlGenContext, uint32 opcode)
|
bool PPCRecompilerImlGen_FMULS(ppcImlGenContext_t* ppcImlGenContext, uint32 opcode)
|
||||||
|
@ -410,9 +410,9 @@ bool PPCRecompilerImlGen_FMULS(ppcImlGenContext_t* ppcImlGenContext, uint32 opco
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
// move frA to frD (if different register)
|
// move frA to frD (if different register)
|
||||||
if( frD != frA )
|
if( frD != frA )
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprA);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprA);
|
||||||
// multiply bottom double of frD with bottom double of frB
|
// multiply bottom double of frD with bottom double of frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprD, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprD, fprC);
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprD);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprD);
|
||||||
// if paired single mode, copy frD ps0 to ps1
|
// if paired single mode, copy frD ps0 to ps1
|
||||||
|
@ -432,11 +432,11 @@ bool PPCRecompilerImlGen_FDIVS(ppcImlGenContext_t* ppcImlGenContext, uint32 opco
|
||||||
{
|
{
|
||||||
DefineTempFPR(fprTemp, 0);
|
DefineTempFPR(fprTemp, 0);
|
||||||
// move frA to temporary register
|
// move frA to temporary register
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp, fprA);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp, fprA);
|
||||||
// divide bottom double of temporary register by bottom double of frB
|
// divide bottom double of temporary register by bottom double of frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE_BOTTOM, fprTemp, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE, fprTemp, fprB);
|
||||||
// move result to frD
|
// move result to frD
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprTemp);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprTemp);
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprD);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprD);
|
||||||
PSE_CopyResultToPs1();
|
PSE_CopyResultToPs1();
|
||||||
|
@ -444,9 +444,9 @@ bool PPCRecompilerImlGen_FDIVS(ppcImlGenContext_t* ppcImlGenContext, uint32 opco
|
||||||
}
|
}
|
||||||
// move frA to frD (if different register)
|
// move frA to frD (if different register)
|
||||||
if( frD != frA )
|
if( frD != frA )
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprA);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprA);
|
||||||
// subtract bottom double of frB from bottom double of frD
|
// subtract bottom double of frB from bottom double of frD
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE_BOTTOM, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE, fprD, fprB);
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprD);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprD);
|
||||||
PSE_CopyResultToPs1();
|
PSE_CopyResultToPs1();
|
||||||
|
@ -470,9 +470,9 @@ bool PPCRecompilerImlGen_FADDS(ppcImlGenContext_t* ppcImlGenContext, uint32 opco
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
// move frA to frD (if different register)
|
// move frA to frD (if different register)
|
||||||
if( frD != frA )
|
if( frD != frA )
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprA);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprA);
|
||||||
// add bottom double of frD and bottom double of frB
|
// add bottom double of frD and bottom double of frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprD, fprB);
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprD);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprD);
|
||||||
PSE_CopyResultToPs1();
|
PSE_CopyResultToPs1();
|
||||||
|
@ -487,7 +487,7 @@ bool PPCRecompilerImlGen_FSUBS(ppcImlGenContext_t* ppcImlGenContext, uint32 opco
|
||||||
DefinePS0(fprA, frA);
|
DefinePS0(fprA, frA);
|
||||||
DefinePS0(fprB, frB);
|
DefinePS0(fprB, frB);
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprD, fprA, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_SUB, fprD, fprA, fprB);
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprD);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprD);
|
||||||
PSE_CopyResultToPs1();
|
PSE_CopyResultToPs1();
|
||||||
return true;
|
return true;
|
||||||
|
@ -511,14 +511,14 @@ bool PPCRecompilerImlGen_FMADDS(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
fprRegisterTemp = fprD;
|
fprRegisterTemp = fprD;
|
||||||
else
|
else
|
||||||
fprRegisterTemp = _GetFPRTemp(ppcImlGenContext, 0);
|
fprRegisterTemp = _GetFPRTemp(ppcImlGenContext, 0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprRegisterTemp, fprA, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprRegisterTemp, fprA, fprC);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprRegisterTemp, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprRegisterTemp, fprB);
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprRegisterTemp);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprRegisterTemp);
|
||||||
// set result
|
// set result
|
||||||
if( fprD != fprRegisterTemp )
|
if( fprD != fprRegisterTemp )
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprRegisterTemp);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprRegisterTemp);
|
||||||
}
|
}
|
||||||
PSE_CopyResultToPs1();
|
PSE_CopyResultToPs1();
|
||||||
return true;
|
return true;
|
||||||
|
@ -542,14 +542,14 @@ bool PPCRecompilerImlGen_FMSUBS(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
fprRegisterTemp = fprD;
|
fprRegisterTemp = fprD;
|
||||||
else
|
else
|
||||||
fprRegisterTemp = _GetFPRTemp(ppcImlGenContext, 0);
|
fprRegisterTemp = _GetFPRTemp(ppcImlGenContext, 0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprRegisterTemp, fprA, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprRegisterTemp, fprA, fprC);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprRegisterTemp, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprRegisterTemp, fprB);
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprRegisterTemp);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprRegisterTemp);
|
||||||
// set result
|
// set result
|
||||||
if( fprD != fprRegisterTemp )
|
if( fprD != fprRegisterTemp )
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprRegisterTemp);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprRegisterTemp);
|
||||||
}
|
}
|
||||||
PSE_CopyResultToPs1();
|
PSE_CopyResultToPs1();
|
||||||
return true;
|
return true;
|
||||||
|
@ -569,15 +569,15 @@ bool PPCRecompilerImlGen_FNMSUBS(ppcImlGenContext_t* ppcImlGenContext, uint32 op
|
||||||
fprRegisterTemp = fprD;
|
fprRegisterTemp = fprD;
|
||||||
else
|
else
|
||||||
fprRegisterTemp = _GetFPRTemp(ppcImlGenContext, 0);
|
fprRegisterTemp = _GetFPRTemp(ppcImlGenContext, 0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprRegisterTemp, fprA, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprRegisterTemp, fprA, fprC);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprRegisterTemp, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprRegisterTemp, fprB);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE_BOTTOM, fprRegisterTemp);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE, fprRegisterTemp);
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprRegisterTemp);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprRegisterTemp);
|
||||||
// set result
|
// set result
|
||||||
if( fprD != fprRegisterTemp )
|
if( fprD != fprRegisterTemp )
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprRegisterTemp);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprRegisterTemp);
|
||||||
}
|
}
|
||||||
PSE_CopyResultToPs1();
|
PSE_CopyResultToPs1();
|
||||||
return true;
|
return true;
|
||||||
|
@ -644,7 +644,7 @@ bool PPCRecompilerImlGen_FMR(ppcImlGenContext_t* ppcImlGenContext, uint32 opcode
|
||||||
PPC_OPC_TEMPL_X(opcode, frD, rA, frB);
|
PPC_OPC_TEMPL_X(opcode, frD, rA, frB);
|
||||||
DefinePS0(fprB, frB);
|
DefinePS0(fprB, frB);
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -656,8 +656,8 @@ bool PPCRecompilerImlGen_FABS(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
|
||||||
DefinePS0(fprB, frB);
|
DefinePS0(fprB, frB);
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
if( frD != frB )
|
if( frD != frB )
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprB);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_ABS_BOTTOM, fprD);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_ABS, fprD);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -669,8 +669,8 @@ bool PPCRecompilerImlGen_FNABS(ppcImlGenContext_t* ppcImlGenContext, uint32 opco
|
||||||
DefinePS0(fprB, frB);
|
DefinePS0(fprB, frB);
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
if( frD != frB )
|
if( frD != frB )
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprB);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATIVE_ABS_BOTTOM, fprD);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATIVE_ABS, fprD);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -697,7 +697,7 @@ bool PPCRecompilerImlGen_FRSP(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
if( fprD != fprB )
|
if( fprD != fprB )
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprB);
|
||||||
}
|
}
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_ROUND_TO_SINGLE_PRECISION_BOTTOM, fprD);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_ROUND_TO_SINGLE_PRECISION_BOTTOM, fprD);
|
||||||
PSE_CopyResultToPs1();
|
PSE_CopyResultToPs1();
|
||||||
|
@ -717,9 +717,9 @@ bool PPCRecompilerImlGen_FNEG(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
// move frB to frD (if different register)
|
// move frB to frD (if different register)
|
||||||
if( frD != frB )
|
if( frD != frB )
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprD, fprB);
|
||||||
// negate frD
|
// negate frD
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE_BOTTOM, fprD);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE, fprD);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -735,7 +735,7 @@ bool PPCRecompilerImlGen_FSEL(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
|
||||||
DefinePS0(fprB, frB);
|
DefinePS0(fprB, frB);
|
||||||
DefinePS0(fprC, frC);
|
DefinePS0(fprC, frC);
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r_r_r(PPCREC_IML_OP_FPR_SELECT_BOTTOM, fprD, fprA, fprB, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r_r_r(PPCREC_IML_OP_FPR_SELECT, fprD, fprA, fprB, fprC);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -757,7 +757,7 @@ bool PPCRecompilerImlGen_FCTIWZ(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
PPC_OPC_TEMPL_X(opcode, frD, frA, frB);
|
PPC_OPC_TEMPL_X(opcode, frD, frA, frB);
|
||||||
DefinePS0(fprB, frB);
|
DefinePS0(fprB, frB);
|
||||||
DefinePS0(fprD, frD);
|
DefinePS0(fprD, frD);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_BOTTOM_FCTIWZ, fprD, fprB);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_FCTIWZ, fprD, fprB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1031,16 +1031,16 @@ bool PPCRecompilerImlGen_PS_MULSX(ppcImlGenContext_t* ppcImlGenContext, uint32 o
|
||||||
// todo - round fprC to 25bit accuracy
|
// todo - round fprC to 25bit accuracy
|
||||||
|
|
||||||
// copy ps0 and ps1 to temporary
|
// copy ps0 and ps1 to temporary
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTmp0, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTmp0, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTmp1, fprAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTmp1, fprAps1);
|
||||||
|
|
||||||
// multiply
|
// multiply
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTmp0, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTmp0, fprC);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTmp1, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTmp1, fprC);
|
||||||
|
|
||||||
// copy back to result
|
// copy back to result
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprTmp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprTmp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprTmp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprTmp1);
|
||||||
|
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps1);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps1);
|
||||||
|
@ -1072,52 +1072,23 @@ bool PPCRecompilerImlGen_PS_MADDSX(ppcImlGenContext_t* ppcImlGenContext, uint32
|
||||||
// todo - optimize cases where a temporary is not necessary
|
// todo - optimize cases where a temporary is not necessary
|
||||||
|
|
||||||
// copy ps0 and ps1 to temporary
|
// copy ps0 and ps1 to temporary
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTmp0, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTmp0, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTmp1, fprAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTmp1, fprAps1);
|
||||||
|
|
||||||
// multiply
|
// multiply
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTmp0, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTmp0, fprC);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTmp1, fprC);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTmp1, fprC);
|
||||||
|
|
||||||
// add
|
// add
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprTmp0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprTmp0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprTmp1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprTmp1, fprBps1);
|
||||||
|
|
||||||
// copy back to result
|
// copy back to result
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprTmp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprTmp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprTmp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprTmp1);
|
||||||
|
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps1);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps1);
|
||||||
|
|
||||||
// //float s0 = (float)(hCPU->fpr[frA].fp0 * hCPU->fpr[frC].fp0 + hCPU->fpr[frB].fp0);
|
|
||||||
// //float s1 = (float)(hCPU->fpr[frA].fp1 * hCPU->fpr[frC].fp0 + hCPU->fpr[frB].fp1);
|
|
||||||
// // load registers
|
|
||||||
// // IMLReg fprRegisterA = PPCRecompilerImlGen_loadFPRRegister(ppcImlGenContext, PPCREC_NAME_FPR0+frA);
|
|
||||||
// // IMLReg fprRegisterB = PPCRecompilerImlGen_loadFPRRegister(ppcImlGenContext, PPCREC_NAME_FPR0+frB);
|
|
||||||
// // IMLReg fprRegisterC = PPCRecompilerImlGen_loadFPRRegister(ppcImlGenContext, PPCREC_NAME_FPR0+frC);
|
|
||||||
// // IMLReg fprRegisterD = PPCRecompilerImlGen_loadFPRRegister(ppcImlGenContext, PPCREC_NAME_FPR0+frD);
|
|
||||||
// // we need a temporary register to store frC.fp0 in low and high half
|
|
||||||
// IMLReg fprRegisterTemp = PPCRecompilerImlGen_loadFPRRegister(ppcImlGenContext, PPCREC_NAME_TEMPORARY_FPR0+0);
|
|
||||||
// ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM_AND_TOP, fprRegisterTemp, fprRegisterC);
|
|
||||||
// // if frD == frA and frD != frB we can multiply frD immediately and safe a copy instruction
|
|
||||||
// if( frD == frA && frD != frB )
|
|
||||||
// {
|
|
||||||
// ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_PAIR, fprRegisterD, fprRegisterTemp);
|
|
||||||
// // add frB
|
|
||||||
// ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_PAIR, fprRegisterD, fprRegisterB);
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// // we multiply temporary by frA
|
|
||||||
// ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_PAIR, fprRegisterTemp, fprRegisterA);
|
|
||||||
// // add frB
|
|
||||||
// ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_PAIR, fprRegisterTemp, fprRegisterB);
|
|
||||||
// // copy result to frD
|
|
||||||
// ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_PAIR, fprRegisterD, fprRegisterTemp);
|
|
||||||
// }
|
|
||||||
// // adjust accuracy
|
|
||||||
// PPRecompilerImmGen_optionalRoundPairFPRToSinglePrecision(ppcImlGenContext, fprRegisterD);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1139,20 +1110,20 @@ bool PPCRecompilerImlGen_PS_ADD(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
|
|
||||||
if( frD == frA )
|
if( frD == frA )
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps1, fprBps1);
|
||||||
}
|
}
|
||||||
else if( frD == frB )
|
else if( frD == frB )
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps0, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps0, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps1, fprAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps1, fprAps1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprAps1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps1, fprBps1);
|
||||||
}
|
}
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
||||||
|
@ -1176,8 +1147,8 @@ bool PPCRecompilerImlGen_PS_SUB(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
DefinePS0(fprBps0, frB);
|
DefinePS0(fprBps0, frB);
|
||||||
DefinePS1(fprBps1, frB);
|
DefinePS1(fprBps1, frB);
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprDps0, fprAps0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_SUB, fprDps0, fprAps0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprDps1, fprAps1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r_r(PPCREC_IML_OP_FPR_SUB, fprDps1, fprAps1, fprBps1);
|
||||||
|
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
||||||
|
@ -1205,19 +1176,19 @@ bool PPCRecompilerImlGen_PS_MUL(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
// todo: Optimize for when a temporary isnt necessary
|
// todo: Optimize for when a temporary isnt necessary
|
||||||
// todo: Round to 25bit?
|
// todo: Round to 25bit?
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp0, fprCps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp0, fprCps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp1, fprCps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp1, fprCps1);
|
||||||
if (frD == frA)
|
if (frD == frA)
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprDps0, fprTemp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprDps1, fprTemp1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp0, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp0, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp1, fprAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp1, fprAps1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprTemp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprTemp1);
|
||||||
}
|
}
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
||||||
|
@ -1243,21 +1214,21 @@ bool PPCRecompilerImlGen_PS_DIV(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
|
|
||||||
if (frD == frA)
|
if (frD == frA)
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE_BOTTOM, fprDps0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE, fprDps0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE_BOTTOM, fprDps1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE, fprDps1, fprBps1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DefineTempFPR(fprTemp0, 0);
|
DefineTempFPR(fprTemp0, 0);
|
||||||
DefineTempFPR(fprTemp1, 1);
|
DefineTempFPR(fprTemp1, 1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp0, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp0, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp1, fprAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp1, fprAps1);
|
||||||
// we divide temporary by frB
|
// we divide temporary by frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE_BOTTOM, fprTemp0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE, fprTemp0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE_BOTTOM, fprTemp1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_DIVIDE, fprTemp1, fprBps1);
|
||||||
// copy result to frD
|
// copy result to frD
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprTemp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprTemp1);
|
||||||
}
|
}
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
||||||
|
@ -1287,28 +1258,28 @@ bool PPCRecompilerImlGen_PS_MADD(ppcImlGenContext_t* ppcImlGenContext, uint32 op
|
||||||
DefineTempFPR(fprTemp0, 0);
|
DefineTempFPR(fprTemp0, 0);
|
||||||
DefineTempFPR(fprTemp1, 1);
|
DefineTempFPR(fprTemp1, 1);
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp0, fprCps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp0, fprCps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp1, fprCps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp1, fprCps1);
|
||||||
// todo-optimize: This instruction can be optimized so that it doesn't always use a temporary register
|
// todo-optimize: This instruction can be optimized so that it doesn't always use a temporary register
|
||||||
// if frD == frA and frD != frB we can multiply frD immediately and save a copy instruction
|
// if frD == frA and frD != frB we can multiply frD immediately and save a copy instruction
|
||||||
if( frD == frA && frD != frB )
|
if( frD == frA && frD != frB )
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprDps0, fprTemp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprDps1, fprTemp1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps1, fprBps1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// we multiply temporary by frA
|
// we multiply temporary by frA
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp0, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp0, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp1, fprAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp1, fprAps1);
|
||||||
// add frB
|
// add frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprTemp0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprTemp0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprTemp1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprTemp1, fprBps1);
|
||||||
// copy result to frD
|
// copy result to frD
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprTemp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprTemp1);
|
||||||
}
|
}
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
||||||
|
@ -1336,33 +1307,33 @@ bool PPCRecompilerImlGen_PS_NMADD(ppcImlGenContext_t* ppcImlGenContext, uint32 o
|
||||||
DefineTempFPR(fprTemp0, 0);
|
DefineTempFPR(fprTemp0, 0);
|
||||||
DefineTempFPR(fprTemp1, 1);
|
DefineTempFPR(fprTemp1, 1);
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp0, fprCps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp0, fprCps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp1, fprCps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp1, fprCps1);
|
||||||
// todo-optimize: This instruction can be optimized so that it doesn't always use a temporary register
|
// todo-optimize: This instruction can be optimized so that it doesn't always use a temporary register
|
||||||
// if frD == frA and frD != frB we can multiply frD immediately and save a copy instruction
|
// if frD == frA and frD != frB we can multiply frD immediately and save a copy instruction
|
||||||
if( frD == frA && frD != frB )
|
if( frD == frA && frD != frB )
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprDps0, fprTemp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprDps1, fprTemp1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps1, fprBps1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// we multiply temporary by frA
|
// we multiply temporary by frA
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp0, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp0, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp1, fprAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp1, fprAps1);
|
||||||
// add frB
|
// add frB
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprTemp0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprTemp0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprTemp1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprTemp1, fprBps1);
|
||||||
// copy result to frD
|
// copy result to frD
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprTemp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprTemp1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// negate
|
// negate
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE_BOTTOM, fprDps0);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE, fprDps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE_BOTTOM, fprDps1);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE, fprDps1);
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
//PPRecompilerImmGen_optionalRoundPairFPRToSinglePrecision(ppcImlGenContext, fprRegisterD);
|
//PPRecompilerImmGen_optionalRoundPairFPRToSinglePrecision(ppcImlGenContext, fprRegisterD);
|
||||||
// Splatoon requires that we emulate flush-to-denormals for this instruction
|
// Splatoon requires that we emulate flush-to-denormals for this instruction
|
||||||
|
@ -1392,24 +1363,24 @@ bool PPCRecompilerImlGen_PS_MSUB(ppcImlGenContext_t* ppcImlGenContext, uint32 op
|
||||||
DefineTempFPR(fprTemp0, 0);
|
DefineTempFPR(fprTemp0, 0);
|
||||||
DefineTempFPR(fprTemp1, 1);
|
DefineTempFPR(fprTemp1, 1);
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp0, fprCps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp0, fprCps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp1, fprCps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp1, fprCps1);
|
||||||
// todo: This instruction can be optimized so that it doesn't always use a temporary register
|
// todo: This instruction can be optimized so that it doesn't always use a temporary register
|
||||||
if( frD == frA && frD != frB )
|
if( frD == frA && frD != frB )
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprDps0, fprTemp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprDps1, fprTemp1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprDps0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprDps0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprDps1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprDps1, fprBps1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp0, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp0, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp1, fprAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp1, fprAps1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprTemp0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprTemp0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprTemp1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprTemp1, fprBps1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprTemp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprTemp1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
|
@ -1438,28 +1409,28 @@ bool PPCRecompilerImlGen_PS_NMSUB(ppcImlGenContext_t* ppcImlGenContext, uint32 o
|
||||||
DefineTempFPR(fprTemp0, 0);
|
DefineTempFPR(fprTemp0, 0);
|
||||||
DefineTempFPR(fprTemp1, 1);
|
DefineTempFPR(fprTemp1, 1);
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp0, fprCps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp0, fprCps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp1, fprCps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp1, fprCps1);
|
||||||
// todo: This instruction can be optimized so that it doesn't always use a temporary register
|
// todo: This instruction can be optimized so that it doesn't always use a temporary register
|
||||||
if( frD == frA && frD != frB )
|
if( frD == frA && frD != frB )
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprDps0, fprTemp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprDps1, fprTemp1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprDps0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprDps0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprDps1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprDps1, fprBps1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp0, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp0, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY_BOTTOM, fprTemp1, fprAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_MULTIPLY, fprTemp1, fprAps1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprTemp0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprTemp0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB_BOTTOM, fprTemp1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_SUB, fprTemp1, fprBps1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprTemp0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprTemp1);
|
||||||
}
|
}
|
||||||
// negate result
|
// negate result
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE_BOTTOM, fprDps0);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE, fprDps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE_BOTTOM, fprDps1);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE, fprDps1);
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps1);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps1);
|
||||||
|
@ -1486,15 +1457,15 @@ bool PPCRecompilerImlGen_PS_SUM0(ppcImlGenContext_t* ppcImlGenContext, uint32 op
|
||||||
|
|
||||||
if( frD == frA )
|
if( frD == frA )
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps0, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps0, fprBps1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprDps0, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprDps0, fprBps1);
|
||||||
}
|
}
|
||||||
if (fprDps1 != fprCps1)
|
if (fprDps1 != fprCps1)
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprCps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprCps1);
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps1);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps1);
|
||||||
|
@ -1522,14 +1493,14 @@ bool PPCRecompilerImlGen_PS_SUM1(ppcImlGenContext_t* ppcImlGenContext, uint32 op
|
||||||
// todo - avoid temporaries when possible
|
// todo - avoid temporaries when possible
|
||||||
|
|
||||||
DefineTempFPR(fprTemp0, 0);
|
DefineTempFPR(fprTemp0, 0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp0, fprCps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp0, fprCps0);
|
||||||
|
|
||||||
DefineTempFPR(fprTemp1, 1);
|
DefineTempFPR(fprTemp1, 1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprTemp1, fprAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprTemp1, fprAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD_BOTTOM, fprTemp1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ADD, fprTemp1, fprBps1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprTemp1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprTemp1);
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprTemp0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprTemp0);
|
||||||
|
|
||||||
// adjust accuracy
|
// adjust accuracy
|
||||||
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
PPRecompilerImmGen_optionalRoundBottomFPRToSinglePrecision(ppcImlGenContext, fprDps0);
|
||||||
|
@ -1551,11 +1522,11 @@ bool PPCRecompilerImlGen_PS_NEG(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
if (frB != frD)
|
if (frB != frD)
|
||||||
{
|
{
|
||||||
// copy
|
// copy
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprBps1);
|
||||||
}
|
}
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE_BOTTOM, fprDps0);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE, fprDps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE_BOTTOM, fprDps1);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_NEGATE, fprDps1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1570,11 +1541,11 @@ bool PPCRecompilerImlGen_PS_ABS(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
DefinePS0(fprDps0, frD);
|
DefinePS0(fprDps0, frD);
|
||||||
DefinePS1(fprDps1, frD);
|
DefinePS1(fprDps1, frD);
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprBps1);
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_ABS_BOTTOM, fprDps0);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_ABS, fprDps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_ABS_BOTTOM, fprDps1);
|
ppcImlGenContext->emitInst().make_fpr_r(PPCREC_IML_OP_FPR_ABS, fprDps1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1630,8 +1601,8 @@ bool PPCRecompilerImlGen_PS_MR(ppcImlGenContext_t* ppcImlGenContext, uint32 opco
|
||||||
DefinePS0(fprDps0, frD);
|
DefinePS0(fprDps0, frD);
|
||||||
DefinePS1(fprDps1, frD);
|
DefinePS1(fprDps1, frD);
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps0, fprBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps0, fprBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, fprDps1, fprBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, fprDps1, fprBps1);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1653,8 +1624,8 @@ bool PPCRecompilerImlGen_PS_SEL(ppcImlGenContext_t* ppcImlGenContext, uint32 opc
|
||||||
DefinePS0(fprDps0, frD);
|
DefinePS0(fprDps0, frD);
|
||||||
DefinePS1(fprDps1, frD);
|
DefinePS1(fprDps1, frD);
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r_r_r(PPCREC_IML_OP_FPR_SELECT_BOTTOM, fprDps0, fprAps0, fprBps0, fprCps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r_r_r(PPCREC_IML_OP_FPR_SELECT, fprDps0, fprAps0, fprBps0, fprCps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r_r_r(PPCREC_IML_OP_FPR_SELECT_BOTTOM, fprDps1, fprAps1, fprBps1, fprCps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r_r_r(PPCREC_IML_OP_FPR_SELECT, fprDps1, fprAps1, fprBps1, fprCps1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1668,9 +1639,9 @@ bool PPCRecompilerImlGen_PS_MERGE00(ppcImlGenContext_t* ppcImlGenContext, uint32
|
||||||
DefinePS0(frpBps0, frB);
|
DefinePS0(frpBps0, frB);
|
||||||
DefinePS0(frpDps0, frD);
|
DefinePS0(frpDps0, frD);
|
||||||
DefinePS1(frpDps1, frD);
|
DefinePS1(frpDps1, frD);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, frpDps1, frpBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, frpDps1, frpBps0);
|
||||||
if (frpDps0 != frpAps0)
|
if (frpDps0 != frpAps0)
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, frpDps0, frpAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, frpDps0, frpAps0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1686,8 +1657,8 @@ bool PPCRecompilerImlGen_PS_MERGE01(ppcImlGenContext_t* ppcImlGenContext, uint32
|
||||||
DefinePS1(frpDps1, frD);
|
DefinePS1(frpDps1, frD);
|
||||||
|
|
||||||
if (frpDps0 != frpAps0)
|
if (frpDps0 != frpAps0)
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, frpDps0, frpAps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, frpDps0, frpAps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, frpDps1, frpBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, frpDps1, frpBps1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1706,9 +1677,9 @@ bool PPCRecompilerImlGen_PS_MERGE10(ppcImlGenContext_t* ppcImlGenContext, uint32
|
||||||
DefineTempFPR(frpTemp, 0);
|
DefineTempFPR(frpTemp, 0);
|
||||||
|
|
||||||
// todo - optimize cases where a temporary is not necessary
|
// todo - optimize cases where a temporary is not necessary
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, frpTemp, frpBps0);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, frpTemp, frpBps0);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, frpDps0, frpAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, frpDps0, frpAps1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, frpDps1, frpTemp);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, frpDps1, frpTemp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1724,8 +1695,8 @@ bool PPCRecompilerImlGen_PS_MERGE11(ppcImlGenContext_t* ppcImlGenContext, uint32
|
||||||
DefinePS0(frpDps0, frD);
|
DefinePS0(frpDps0, frD);
|
||||||
DefinePS1(frpDps1, frD);
|
DefinePS1(frpDps1, frD);
|
||||||
|
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, frpDps0, frpAps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, frpDps0, frpAps1);
|
||||||
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_COPY_BOTTOM_TO_BOTTOM, frpDps1, frpBps1);
|
ppcImlGenContext->emitInst().make_fpr_r_r(PPCREC_IML_OP_FPR_ASSIGN, frpDps1, frpBps1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue