From 600f43779c49fdc508564ca1838ff7e21d4f8f7b Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 12 Mar 2020 22:13:17 -0700 Subject: [PATCH] Fixes and implements a couple vector shift ops in the x86 JIT --- .../Source/Interface/Core/JIT/x86_64/JIT.cpp | 59 ++++++++++++------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/JIT/x86_64/JIT.cpp b/External/FEXCore/Source/Interface/Core/JIT/x86_64/JIT.cpp index 3633dba26..8573c54c1 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/x86_64/JIT.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/x86_64/JIT.cpp @@ -2742,47 +2742,62 @@ void *JITCore::CompileCode([[maybe_unused]] FEXCore::IR::IRListView const } case IR::OP_VUSHLS: { auto Op = IROp->C(); - movapd(xmm15, GetSrc(Op->Header.Args[0].ID())); - vmovq(xmm14, Reg64(GetSrc(Op->Header.Args[1].ID()).getIdx())); switch (Op->ElementSize) { case 2: { - psllw(xmm15, xmm14); + vpsllw(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), GetSrc(Op->Header.Args[1].ID())); break; } case 4: { - pslld(xmm15, xmm14); + vpslld(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), GetSrc(Op->Header.Args[1].ID())); break; } case 8: { - psllq(xmm15, xmm14); + vpsllq(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), GetSrc(Op->Header.Args[1].ID())); break; } default: LogMan::Msg::A("Unknown Element Size: %d", Op->ElementSize); break; } - movapd(GetDst(Node), xmm15); break; } - case IR::OP_VUSHR: { - auto Op = IROp->C(); - vmovq(xmm14, Reg64(GetSrc(Op->Header.Args[1].ID()).getIdx())); + case IR::OP_VUSHRS: { + auto Op = IROp->C(); switch (Op->ElementSize) { - case 2: { - vpsrlw(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), xmm14); - break; - } - case 4: { - vpsrld(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), xmm14); - break; - } - case 8: { - vpsrlq(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), xmm14); - break; - } - default: LogMan::Msg::A("Unknown Element Size: %d", Op->ElementSize); break; + case 2: { + vpsrlw(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), GetSrc(Op->Header.Args[1].ID())); + break; } + case 4: { + vpsrld(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), GetSrc(Op->Header.Args[1].ID())); + break; + } + case 8: { + vpsrlq(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), GetSrc(Op->Header.Args[1].ID())); + break; + } + default: LogMan::Msg::A("Unknown Element Size: %d", Op->ElementSize); break; + } + + break; + } + case IR::OP_VSSHRS: { + auto Op = IROp->C(); + + switch (Op->ElementSize) { + case 2: { + vpsraw(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), GetSrc(Op->Header.Args[1].ID())); + break; + } + case 4: { + vpsrad(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), GetSrc(Op->Header.Args[1].ID())); + break; + } + case 8: // Doesn't exist on x86 + default: LogMan::Msg::A("Unknown Element Size: %d", Op->ElementSize); break; + } + break; } case IR::OP_VSLI: {