From 75fa95c7ff7c33cdcd932bdc10c80b6e6fd2d27d Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 24 Mar 2015 22:54:15 +0300 Subject: [PATCH] PPU: some instruction replaced --- rpcs3/Emu/Cell/PPUInterpreter.cpp | 98 +++++++++---------------------- 1 file changed, 28 insertions(+), 70 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUInterpreter.cpp b/rpcs3/Emu/Cell/PPUInterpreter.cpp index a2602977eb..3dca12fcb5 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.cpp +++ b/rpcs3/Emu/Cell/PPUInterpreter.cpp @@ -23,13 +23,14 @@ void ppu_interpreter::NOP(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::TDI(PPUThread& CPU, ppu_opcode_t op) { - s64 a = CPU.GPR[op.ra]; + const s64 a = CPU.GPR[op.ra], b = op.simm16; + const u64 a_ = a, b_ = b; // unsigned - if ((a < (s64)op.simm16 && (op.bo & 0x10)) || - (a >(s64)op.simm16 && (op.bo & 0x8)) || - (a == (s64)op.simm16 && (op.bo & 0x4)) || - ((u64)a < (u64)op.simm16 && (op.bo & 0x2)) || - ((u64)a >(u64)op.simm16 && (op.bo & 0x1))) + if (((op.bo & 0x10) && a < b) || + ((op.bo & 0x8) && a > b) || + ((op.bo & 0x4) && a == b) || + ((op.bo & 0x2) && a_ < b_) || + ((op.bo & 0x1) && a_ > b_)) { throw __FUNCTION__; } @@ -37,13 +38,14 @@ void ppu_interpreter::TDI(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::TWI(PPUThread& CPU, ppu_opcode_t op) { - s32 a = (s32)CPU.GPR[op.ra]; + const s32 a = (s32)CPU.GPR[op.ra], b = op.simm16; + const u32 a_ = a, b_ = b; // unsigned - if ((a < op.simm16 && (op.bo & 0x10)) || - (a > op.simm16 && (op.bo & 0x8)) || - (a == op.simm16 && (op.bo & 0x4)) || - ((u32)a < (u32)op.simm16 && (op.bo & 0x2)) || - ((u32)a >(u32)op.simm16 && (op.bo & 0x1))) + if (((op.bo & 0x10) && a < b) || + ((op.bo & 0x8) && a > b) || + ((op.bo & 0x4) && a == b) || + ((op.bo & 0x2) && a_ < b_) || + ((op.bo & 0x1) && a_ > b_)) { throw __FUNCTION__; } @@ -70,10 +72,7 @@ void ppu_interpreter::VADDCUW(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VADDFP(PPUThread& CPU, ppu_opcode_t op) { - for (uint w = 0; w < 4; w++) - { - CPU.VPR[op.vd]._f[w] = CPU.VPR[op.va]._f[w] + CPU.VPR[op.vb]._f[w]; - } + CPU.VPR[op.vd] = u128::addfs(CPU.VPR[op.va], CPU.VPR[op.vb]); } void ppu_interpreter::VADDSBS(PPUThread& CPU, ppu_opcode_t op) @@ -135,10 +134,7 @@ void ppu_interpreter::VADDSWS(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VADDUBM(PPUThread& CPU, ppu_opcode_t op) { - for (uint b = 0; b < 16; b++) - { - CPU.VPR[op.vd]._u8[b] = CPU.VPR[op.va]._u8[b] + CPU.VPR[op.vb]._u8[b]; - } + CPU.VPR[op.vd] = u128::add8(CPU.VPR[op.va], CPU.VPR[op.vb]); } void ppu_interpreter::VADDUBS(PPUThread& CPU, ppu_opcode_t op) @@ -158,10 +154,7 @@ void ppu_interpreter::VADDUBS(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VADDUHM(PPUThread& CPU, ppu_opcode_t op) { - for (uint h = 0; h < 8; h++) - { - CPU.VPR[op.vd]._u16[h] = CPU.VPR[op.va]._u16[h] + CPU.VPR[op.vb]._u16[h]; - } + CPU.VPR[op.vd] = u128::add16(CPU.VPR[op.va], CPU.VPR[op.vb]); } void ppu_interpreter::VADDUHS(PPUThread& CPU, ppu_opcode_t op) @@ -181,10 +174,7 @@ void ppu_interpreter::VADDUHS(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VADDUWM(PPUThread& CPU, ppu_opcode_t op) { - for (uint w = 0; w < 4; w++) - { - CPU.VPR[op.vd]._u32[w] = CPU.VPR[op.va]._u32[w] + CPU.VPR[op.vb]._u32[w]; - } + CPU.VPR[op.vd] = u128::add32(CPU.VPR[op.va], CPU.VPR[op.vb]); } void ppu_interpreter::VADDUWS(PPUThread& CPU, ppu_opcode_t op) @@ -204,18 +194,12 @@ void ppu_interpreter::VADDUWS(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VAND(PPUThread& CPU, ppu_opcode_t op) { - for (uint w = 0; w < 4; w++) - { - CPU.VPR[op.vd]._u32[w] = CPU.VPR[op.va]._u32[w] & CPU.VPR[op.vb]._u32[w]; - } + CPU.VPR[op.vd] = CPU.VPR[op.va] & CPU.VPR[op.vb]; } void ppu_interpreter::VANDC(PPUThread& CPU, ppu_opcode_t op) { - for (uint w = 0; w < 4; w++) - { - CPU.VPR[op.vd]._u32[w] = CPU.VPR[op.va]._u32[w] & (~CPU.VPR[op.vb]._u32[w]); - } + CPU.VPR[op.vd] = CPU.VPR[op.va] & ~CPU.VPR[op.vb]; } void ppu_interpreter::VAVGSB(PPUThread& CPU, ppu_opcode_t op) @@ -1351,18 +1335,12 @@ void ppu_interpreter::VNMSUBFP(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VNOR(PPUThread& CPU, ppu_opcode_t op) { - for (uint w = 0; w < 4; w++) - { - CPU.VPR[op.vd]._u32[w] = ~(CPU.VPR[op.va]._u32[w] | CPU.VPR[op.vb]._u32[w]); - } + CPU.VPR[op.vd] = ~(CPU.VPR[op.va] | CPU.VPR[op.vb]); } void ppu_interpreter::VOR(PPUThread& CPU, ppu_opcode_t op) { - for (uint w = 0; w < 4; w++) - { - CPU.VPR[op.vd]._u32[w] = CPU.VPR[op.va]._u32[w] | CPU.VPR[op.vb]._u32[w]; - } + CPU.VPR[op.vd] = CPU.VPR[op.va] | CPU.VPR[op.vb]; } void ppu_interpreter::VPERM(PPUThread& CPU, ppu_opcode_t op) @@ -1691,10 +1669,7 @@ void ppu_interpreter::VRSQRTEFP(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VSEL(PPUThread& CPU, ppu_opcode_t op) { - for (uint b = 0; b < 16; b++) - { - CPU.VPR[op.vd]._u8[b] = (CPU.VPR[op.vb]._u8[b] & CPU.VPR[op.vc]._u8[b]) | (CPU.VPR[op.va]._u8[b] & (~CPU.VPR[op.vc]._u8[b])); - } + CPU.VPR[op.vd] = (CPU.VPR[op.vb] & CPU.VPR[op.vc]) | (CPU.VPR[op.va] & ~CPU.VPR[op.vc]); } void ppu_interpreter::VSL(PPUThread& CPU, ppu_opcode_t op) @@ -1899,12 +1874,7 @@ void ppu_interpreter::VSUBCUW(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VSUBFP(PPUThread& CPU, ppu_opcode_t op) { - for (uint w = 0; w < 4; w++) - { - const float a = CPU.VPR[op.va]._f[w]; - const float b = CPU.VPR[op.vb]._f[w]; - CPU.VPR[op.vd]._f[w] = a - b; - } + CPU.VPR[op.vd] = u128::subfs(CPU.VPR[op.va], CPU.VPR[op.vb]); } void ppu_interpreter::VSUBSBS(PPUThread& CPU, ppu_opcode_t op) @@ -1966,10 +1936,7 @@ void ppu_interpreter::VSUBSWS(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VSUBUBM(PPUThread& CPU, ppu_opcode_t op) { - for (uint b = 0; b < 16; b++) - { - CPU.VPR[op.vd]._u8[b] = (u8)((CPU.VPR[op.va]._u8[b] - CPU.VPR[op.vb]._u8[b]) & 0xff); - } + CPU.VPR[op.vd] = u128::sub8(CPU.VPR[op.va], CPU.VPR[op.vb]); } void ppu_interpreter::VSUBUBS(PPUThread& CPU, ppu_opcode_t op) @@ -1989,10 +1956,7 @@ void ppu_interpreter::VSUBUBS(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VSUBUHM(PPUThread& CPU, ppu_opcode_t op) { - for (uint h = 0; h < 8; h++) - { - CPU.VPR[op.vd]._u16[h] = CPU.VPR[op.va]._u16[h] - CPU.VPR[op.vb]._u16[h]; - } + CPU.VPR[op.vd] = u128::sub16(CPU.VPR[op.va], CPU.VPR[op.vb]); } void ppu_interpreter::VSUBUHS(PPUThread& CPU, ppu_opcode_t op) @@ -2012,10 +1976,7 @@ void ppu_interpreter::VSUBUHS(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VSUBUWM(PPUThread& CPU, ppu_opcode_t op) { - for (uint w = 0; w < 4; w++) - { - CPU.VPR[op.vd]._u32[w] = CPU.VPR[op.va]._u32[w] - CPU.VPR[op.vb]._u32[w]; - } + CPU.VPR[op.vd] = u128::sub32(CPU.VPR[op.va], CPU.VPR[op.vb]); } void ppu_interpreter::VSUBUWS(PPUThread& CPU, ppu_opcode_t op) @@ -2206,10 +2167,7 @@ void ppu_interpreter::VUPKLSH(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VXOR(PPUThread& CPU, ppu_opcode_t op) { - CPU.VPR[op.vd]._u32[0] = CPU.VPR[op.va]._u32[0] ^ CPU.VPR[op.vb]._u32[0]; - CPU.VPR[op.vd]._u32[1] = CPU.VPR[op.va]._u32[1] ^ CPU.VPR[op.vb]._u32[1]; - CPU.VPR[op.vd]._u32[2] = CPU.VPR[op.va]._u32[2] ^ CPU.VPR[op.vb]._u32[2]; - CPU.VPR[op.vd]._u32[3] = CPU.VPR[op.va]._u32[3] ^ CPU.VPR[op.vb]._u32[3]; + CPU.VPR[op.vd] = CPU.VPR[op.va] ^ CPU.VPR[op.vb]; } void ppu_interpreter::MULLI(PPUThread& CPU, ppu_opcode_t op)