From 53b86e559c2c69661d6c10b060e561fa0295d4cb Mon Sep 17 00:00:00 2001 From: Nicholas Date: Fri, 23 Jan 2015 22:21:34 +1100 Subject: [PATCH] add code for edge case in DSRLV for cbfd --- .../N64 System/Recompiler/Recompiler Ops.cpp | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/Source/Project64/N64 System/Recompiler/Recompiler Ops.cpp b/Source/Project64/N64 System/Recompiler/Recompiler Ops.cpp index 3819bfe33..8a0c6fec0 100644 --- a/Source/Project64/N64 System/Recompiler/Recompiler Ops.cpp +++ b/Source/Project64/N64 System/Recompiler/Recompiler Ops.cpp @@ -2138,10 +2138,25 @@ void CRecompilerOps::SPECIAL_DSRLV (void) { } return; } - //if (Shift < 0x20) { - //} else { - //} - CRecompilerOps::UnknownOpcode(); + if (m_Opcode.rd == m_Opcode.rt) + { + CRecompilerOps::UnknownOpcode(); + return; + } + + Map_TempReg(x86_ECX,-1,FALSE); + MoveConstToX86reg(Shift, x86_ECX); + Map_GPR_64bit(m_Opcode.rd,m_Opcode.rt); + if ((Shift & 0x20) == 0x20) + { + MoveX86RegToX86Reg(GetMipsRegMapHi(m_Opcode.rd),GetMipsRegMapLo(m_Opcode.rd)); + XorX86RegToX86Reg(GetMipsRegMapHi(m_Opcode.rd),GetMipsRegMapHi(m_Opcode.rd)); + AndConstToX86Reg(x86_ECX,0x1F); + ShiftRightUnsign(GetMipsRegMapLo(m_Opcode.rd)); + } else { + ShiftRightDouble(GetMipsRegMapLo(m_Opcode.rd),GetMipsRegMapHi(m_Opcode.rd)); + ShiftRightUnsign(GetMipsRegMapHi(m_Opcode.rd)); + } } else { Map_TempReg(x86_ECX,m_Opcode.rs,FALSE); AndConstToX86Reg(x86_ECX,0x3F);