From 3a8f0598c4a0cd21447c7c39bc6eee1d4d5b2cf6 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 10 Nov 2013 10:17:43 -0800 Subject: [PATCH] x86jit: Implement wsbh/wsbw. --- Core/MIPS/x86/CompALU.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/Core/MIPS/x86/CompALU.cpp b/Core/MIPS/x86/CompALU.cpp index fe0f13d6bc..988e5f5fc3 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -782,19 +782,33 @@ namespace MIPSComp if (rd == MIPS_REG_ZERO) return; - DISABLE; switch (op & 0x3ff) { case 0xA0: //wsbh + if (gpr.IsImmediate(rt)) { + u32 rtImm = gpr.GetImmediate32(rt); + gpr.SetImmediate32(rd, ((rtImm & 0xFF00FF00) >> 8) | ((rtImm & 0x00FF00FF) << 8)); + break; + } gpr.Lock(rd, rt); gpr.MapReg(rd, rd == rt, true); - // Stub + if (rd != rt) + MOV(32, gpr.R(rd), gpr.R(rt)); + // Swap both 16-bit halfwords by rotating afterward. + BSWAP(32, gpr.RX(rd)); + ROR(32, gpr.R(rd), Imm8(16)); gpr.UnlockAll(); break; case 0xE0: //wsbw + if (gpr.IsImmediate(rt)) { + gpr.SetImmediate32(rd, swap32(gpr.GetImmediate32(rt))); + break; + } gpr.Lock(rd, rt); gpr.MapReg(rd, rd == rt, true); - // Stub + if (rd != rt) + MOV(32, gpr.R(rd), gpr.R(rt)); + BSWAP(32, gpr.RX(rd)); gpr.UnlockAll(); break; default: