diff --git a/External/FEXCore/Source/Interface/Core/JIT/Arm64/EncryptionOps.cpp b/External/FEXCore/Source/Interface/Core/JIT/Arm64/EncryptionOps.cpp index cedf62f72..8c9cb3dc5 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/Arm64/EncryptionOps.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/Arm64/EncryptionOps.cpp @@ -144,11 +144,15 @@ DEF_OP(CRC32) { } DEF_OP(PCLMUL) { - auto Op = IROp->C(); + const auto Op = IROp->C(); + const auto OpSize = IROp->Size; - auto Dst = GetVReg(Node); - auto Src1 = GetVReg(Op->Src1.ID()); - auto Src2 = GetVReg(Op->Src2.ID()); + const auto Dst = GetVReg(Node); + const auto Src1 = GetVReg(Op->Src1.ID()); + const auto Src2 = GetVReg(Op->Src2.ID()); + + LOGMAN_THROW_AA_FMT(OpSize == Core::CPUState::XMM_SSE_REG_SIZE, + "Currently only supports 128-bit operations."); switch (Op->Selector) { case 0b00000000: diff --git a/External/FEXCore/Source/Interface/Core/JIT/x86_64/EncryptionOps.cpp b/External/FEXCore/Source/Interface/Core/JIT/x86_64/EncryptionOps.cpp index 8e9a1e0ab..4237760c6 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/x86_64/EncryptionOps.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/x86_64/EncryptionOps.cpp @@ -120,18 +120,24 @@ DEF_OP(CRC32) { } DEF_OP(PCLMUL) { - auto Op = IROp->C(); + const auto Op = IROp->C(); + const auto OpSize = IROp->Size; + const auto Is256Bit = OpSize == Core::CPUState::XMM_AVX_REG_SIZE; - auto Dst = GetDst(Node); - auto Src1 = GetSrc(Op->Src1.ID()); - auto Src2 = GetSrc(Op->Src2.ID()); + const auto Dst = GetDst(Node); + const auto Src1 = GetSrc(Op->Src1.ID()); + const auto Src2 = GetSrc(Op->Src2.ID()); switch (Op->Selector) { case 0b00000000: case 0b00000001: case 0b00010000: case 0b00010001: - vpclmulqdq(Dst, Src1, Src2, Op->Selector); + if (Is256Bit) { + vpclmulqdq(ToYMM(Dst), ToYMM(Src1), ToYMM(Src2), Op->Selector); + } else { + vpclmulqdq(Dst, Src1, Src2, Op->Selector); + } break; default: LOGMAN_MSG_A_FMT("Unknown PCLMUL selector: {}", Op->Selector); diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp index 0368ff7c7..a205438b1 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp @@ -399,7 +399,7 @@ void OpDispatchBuilder::PCLMULQDQOp(OpcodeArgs) { OrderedNode *Src = LoadSource(FPRClass, Op, Op->Src[0], Op->Flags, -1); const auto Selector = static_cast(Op->Src[1].Data.Literal.Value); - auto Res = _PCLMUL(Dest, Src, Selector); + auto Res = _PCLMUL(16, Dest, Src, Selector); StoreResult(FPRClass, Op, Res, -1); } @@ -413,7 +413,7 @@ void OpDispatchBuilder::VPCLMULQDQOp(OpcodeArgs) { OrderedNode *Src2 = LoadSource(FPRClass, Op, Op->Src[1], Op->Flags, -1); const auto Selector = static_cast(Op->Src[2].Data.Literal.Value); - OrderedNode *Res = _PCLMUL(Src1, Src2, Selector); + OrderedNode *Res = _PCLMUL(DstSize, Src1, Src2, Selector); if (Is128Bit) { Res = _VMov(16, Res); } diff --git a/External/FEXCore/Source/Interface/IR/IR.json b/External/FEXCore/Source/Interface/IR/IR.json index 62a4e23da..588312bb4 100644 --- a/External/FEXCore/Source/Interface/IR/IR.json +++ b/External/FEXCore/Source/Interface/IR/IR.json @@ -1443,7 +1443,7 @@ ], "DestSize": "std::max(4, GetOpSize(_Src1))" }, - "FPR = PCLMUL FPR:$Src1, FPR:$Src2, u8:$Selector": { + "FPR = PCLMUL u8:#RegisterSize, FPR:$Src1, FPR:$Src2, u8:$Selector": { "Desc": [ "Performs carryless multiplication of 64-bit elements depending on the selector.", "Selector = 0b00000000: Uses low 64-bit elements from both input vectors", @@ -1451,7 +1451,7 @@ "Selector = 0b00010000: Uses low 64-bit element from Src1 and high 64-bit element from Src2", "Selector = 0b00010001: Uses high 64-bit elements from both input vectors" ], - "DestSize": "16" + "DestSize": "RegisterSize" } }, "F64": {