From df34d43936411582ac1a1553cd1cc6a32bf03dd7 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Thu, 21 May 2015 12:33:37 +0200 Subject: [PATCH] Jit64: merge ps_sign into fsign --- Source/Core/Core/PowerPC/Jit64/Jit.h | 1 - .../Core/Core/PowerPC/Jit64/Jit64_Tables.cpp | 6 ++-- .../Core/PowerPC/Jit64/Jit_FloatingPoint.cpp | 24 +++++++------- Source/Core/Core/PowerPC/Jit64/Jit_Paired.cpp | 31 ------------------- 4 files changed, 15 insertions(+), 47 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit.h b/Source/Core/Core/PowerPC/Jit64/Jit.h index f068030b61..3c7e80bcec 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit.h +++ b/Source/Core/Core/PowerPC/Jit64/Jit.h @@ -192,7 +192,6 @@ public: void reg_imm(UGeckoInstruction inst); void ps_mr(UGeckoInstruction inst); - void ps_sign(UGeckoInstruction inst); //aggregate void ps_mergeXX(UGeckoInstruction inst); void ps_res(UGeckoInstruction inst); void ps_rsqrte(UGeckoInstruction inst); diff --git a/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp b/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp index 8dd66132ca..5da1deb704 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp @@ -102,9 +102,9 @@ static GekkoOPTemplate table4[] = { //SUBOP10 {0, &Jit64::ps_cmpXX}, // ps_cmpu0 {32, &Jit64::ps_cmpXX}, // ps_cmpo0 - {40, &Jit64::ps_sign}, // ps_neg - {136, &Jit64::ps_sign}, // ps_nabs - {264, &Jit64::ps_sign}, // ps_abs + {40, &Jit64::fsign}, // ps_neg + {136, &Jit64::fsign}, // ps_nabs + {264, &Jit64::fsign}, // ps_abs {64, &Jit64::ps_cmpXX}, // ps_cmpu1 {72, &Jit64::ps_mr}, // ps_mr {96, &Jit64::ps_cmpXX}, // ps_cmpo1 diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp index a848c72e6e..954b2410c1 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp @@ -13,6 +13,7 @@ using namespace Gen; static const u64 GC_ALIGNED16(psSignBits[2]) = {0x8000000000000000ULL, 0x0000000000000000ULL}; static const u64 GC_ALIGNED16(psSignBits2[2]) = {0x8000000000000000ULL, 0x8000000000000000ULL}; static const u64 GC_ALIGNED16(psAbsMask[2]) = {0x7FFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL}; +static const u64 GC_ALIGNED16(psAbsMask2[2]) = {0x7FFFFFFFFFFFFFFFULL, 0x7FFFFFFFFFFFFFFFULL}; static const double GC_ALIGNED16(half_qnan_and_s32_max[2]) = {0x7FFFFFFF, -0x80000}; void Jit64::fp_tri_op(int d, int a, int b, bool reversible, bool single, void (XEmitter::*avxOp)(X64Reg, X64Reg, OpArg), @@ -238,23 +239,22 @@ void Jit64::fsign(UGeckoInstruction inst) int d = inst.FD; int b = inst.FB; - fpr.Lock(b, d); - fpr.BindToRegister(d); + bool packed = inst.OPCD == 4; + + fpr.Lock(b, d); + OpArg src = fpr.R(b); + fpr.BindToRegister(d, false); - if (d != b) - MOVSD(fpr.RX(d), fpr.R(b)); switch (inst.SUBOP10) { - case 40: // fnegx - // We can cheat and not worry about clobbering the top half by using masks - // that don't modify the top half. - PXOR(fpr.RX(d), M(psSignBits)); + case 40: // neg + avx_op(&XEmitter::VPXOR, &XEmitter::PXOR, fpr.RX(d), src, M(packed ? psSignBits2 : psSignBits), packed); break; - case 264: // fabsx - PAND(fpr.RX(d), M(psAbsMask)); + case 136: // nabs + avx_op(&XEmitter::VPOR, &XEmitter::POR, fpr.RX(d), src, M(packed ? psSignBits2 : psSignBits), packed); break; - case 136: // fnabs - POR(fpr.RX(d), M(psSignBits)); + case 264: // abs + avx_op(&XEmitter::VPAND, &XEmitter::PAND, fpr.RX(d), src, M(packed ? psAbsMask2 : psAbsMask), packed); break; default: PanicAlert("fsign bleh"); diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Paired.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Paired.cpp index 9a4a6186bf..c60e5c8d58 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Paired.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Paired.cpp @@ -10,9 +10,6 @@ using namespace Gen; -static const u64 GC_ALIGNED16(psSignBits[2]) = {0x8000000000000000ULL, 0x8000000000000000ULL}; -static const u64 GC_ALIGNED16(psAbsMask[2]) = {0x7FFFFFFFFFFFFFFFULL, 0x7FFFFFFFFFFFFFFFULL}; - void Jit64::ps_mr(UGeckoInstruction inst) { INSTRUCTION_START @@ -28,34 +25,6 @@ void Jit64::ps_mr(UGeckoInstruction inst) MOVAPD(fpr.RX(d), fpr.R(b)); } -void Jit64::ps_sign(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(bJITPairedOff); - FALLBACK_IF(inst.Rc); - - int d = inst.FD; - int b = inst.FB; - - fpr.Lock(d, b); - fpr.BindToRegister(d, d == b); - - switch (inst.SUBOP10) - { - case 40: //neg - avx_op(&XEmitter::VPXOR, &XEmitter::PXOR, fpr.RX(d), fpr.R(b), M(psSignBits)); - break; - case 136: //nabs - avx_op(&XEmitter::VPOR, &XEmitter::POR, fpr.RX(d), fpr.R(b), M(psSignBits)); - break; - case 264: //abs - avx_op(&XEmitter::VPAND, &XEmitter::PAND, fpr.RX(d), fpr.R(b), M(psAbsMask)); - break; - } - - fpr.UnlockAll(); -} - void Jit64::ps_sum(UGeckoInstruction inst) { INSTRUCTION_START