mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-13 02:08:31 +12:00
PPCRec: Fix SRAW instruction
This commit is contained in:
parent
2692e158c3
commit
5fd0d9b4ed
1 changed files with 6 additions and 4 deletions
|
@ -1125,15 +1125,15 @@ bool PPCRecompilerImlGen_SRAW(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
|
||||||
|
|
||||||
// load masked shift factor into temporary register
|
// load masked shift factor into temporary register
|
||||||
ppcImlGenContext->emitInst().make_r_r_s32(PPCREC_IML_OP_AND, regTmpShiftAmount, regB, 0x3F);
|
ppcImlGenContext->emitInst().make_r_r_s32(PPCREC_IML_OP_AND, regTmpShiftAmount, regB, 0x3F);
|
||||||
ppcImlGenContext->emitInst().make_compare_s32(regTmpShiftAmount, 32, regTmpCondBool, IMLCondition::UNSIGNED_GT);
|
ppcImlGenContext->emitInst().make_compare_s32(regTmpShiftAmount, 31, regTmpCondBool, IMLCondition::UNSIGNED_GT);
|
||||||
ppcImlGenContext->emitInst().make_conditional_jump(regTmpCondBool, true);
|
ppcImlGenContext->emitInst().make_conditional_jump(regTmpCondBool, true);
|
||||||
|
|
||||||
PPCIMLGen_CreateSegmentBranchedPath(*ppcImlGenContext, *ppcImlGenContext->currentBasicBlock,
|
PPCIMLGen_CreateSegmentBranchedPath(*ppcImlGenContext, *ppcImlGenContext->currentBasicBlock,
|
||||||
[&](ppcImlGenContext_t& genCtx)
|
[&](ppcImlGenContext_t& genCtx)
|
||||||
{
|
{
|
||||||
/* branch taken */
|
/* branch taken, shift size 32 or above */
|
||||||
genCtx.emitInst().make_r_r_r(PPCREC_IML_OP_RIGHT_SHIFT_S, regA, regS, regTmpShiftAmount);
|
genCtx.emitInst().make_r_r_s32(PPCREC_IML_OP_RIGHT_SHIFT_S, regA, regS, 31); // shift the sign bit into all the bits
|
||||||
genCtx.emitInst().make_compare_s32(regA, 0, regCarry, IMLCondition::NEQ); // if the sign bit is still set it also means it was shifted out and we can set carry
|
genCtx.emitInst().make_compare_s32(regA, 0, regCarry, IMLCondition::NEQ);
|
||||||
},
|
},
|
||||||
[&](ppcImlGenContext_t& genCtx)
|
[&](ppcImlGenContext_t& genCtx)
|
||||||
{
|
{
|
||||||
|
@ -1148,6 +1148,8 @@ bool PPCRecompilerImlGen_SRAW(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
|
||||||
genCtx.emitInst().make_r_r_r(PPCREC_IML_OP_RIGHT_SHIFT_S, regA, regS, regTmpShiftAmount);
|
genCtx.emitInst().make_r_r_r(PPCREC_IML_OP_RIGHT_SHIFT_S, regA, regS, regTmpShiftAmount);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
if (opcode & PPC_OPC_RC)
|
||||||
|
PPCImlGen_UpdateCR0(ppcImlGenContext, regA);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue