diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 9d05c275a..7c8a52042 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -5042,8 +5042,8 @@ void OpDispatchBuilder::InstallHostSpecificOpcodeHandlers() { {OPD(1, 0b00, 0x2F), 1, &OpDispatchBuilder::UCOMISxOp<4>}, {OPD(1, 0b01, 0x2F), 1, &OpDispatchBuilder::UCOMISxOp<8>}, - {OPD(1, 0b00, 0x50), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, 4>}, - {OPD(1, 0b01, 0x50), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, 8>}, + {OPD(1, 0b00, 0x50), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, OpSize::i32Bit>}, + {OPD(1, 0b01, 0x50), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, OpSize::i64Bit>}, {OPD(1, 0b00, 0x51), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorUnaryOp, IR::OP_VFSQRT, 4>}, {OPD(1, 0b01, 0x51), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AVXVectorUnaryOp, IR::OP_VFSQRT, 8>}, diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.h b/FEXCore/Source/Interface/Core/OpcodeDispatcher.h index 12e92c840..14ed2813f 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.h +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.h @@ -440,7 +440,7 @@ public: void MOVQOp(OpcodeArgs, VectorOpType VectorType); void MOVQMMXOp(OpcodeArgs); - void MOVMSKOp(OpcodeArgs, size_t ElementSize); + void MOVMSKOp(OpcodeArgs, IR::OpSize ElementSize); void MOVMSKOpOne(OpcodeArgs); void PUNPCKLOp(OpcodeArgs, size_t ElementSize); void PUNPCKHOp(OpcodeArgs, size_t ElementSize); @@ -1106,7 +1106,7 @@ public: void AVX128_DefaultAVXState(); void AVX128_VPERM2(OpcodeArgs); - template + template void AVX128_VTESTP(OpcodeArgs); void AVX128_PTest(OpcodeArgs); diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/AVX_128.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/AVX_128.cpp index a81527e0d..647b07a37 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/AVX_128.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/AVX_128.cpp @@ -1197,7 +1197,7 @@ void OpDispatchBuilder::AVX128_MOVBetweenGPR_FPR(OpcodeArgs) { if (Op->Dest.IsGPR()) { auto ElementSize = OpSizeFromDst(Op); // Extract element from GPR. Zero extending in the process. - Src.Low = _VExtractToGPR(GetSrcSize(Op), ElementSize, Src.Low, 0); + Src.Low = _VExtractToGPR(OpSizeFromSrc(Op), ElementSize, Src.Low, 0); StoreResult(GPRClass, Op, Op->Dest, Src.Low, OpSize::iInvalid); } else { // Storing first element to memory. @@ -2213,7 +2213,7 @@ void OpDispatchBuilder::AVX128_VPERM2(OpcodeArgs) { AVX128_StoreResult_WithOpSize(Op, Op->Dest, Result); } -template +template void OpDispatchBuilder::AVX128_VTESTP(OpcodeArgs) { InvalidateDeferredFlags(); diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp index 99c75612b..a102f2435 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Crypto.cpp @@ -147,7 +147,7 @@ void OpDispatchBuilder::SHA1RNDS4Op(OpcodeArgs) { }; const auto Round1To3 = [&](Ref A, Ref B, Ref C, Ref D, Ref E, Ref Src, unsigned W_idx) -> RoundResult { // Kill W and E at the beginning - auto W = _VExtractToGPR(OpSize::i128Bit, 4, Src, W_idx); + auto W = _VExtractToGPR(OpSize::i128Bit, OpSize::i32Bit, Src, W_idx); auto Q = _Add(OpSize::i32Bit, W, E); auto ANext = diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/SecondaryTables.h b/FEXCore/Source/Interface/Core/OpcodeDispatcher/SecondaryTables.h index fd8ec5c52..b90102e91 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/SecondaryTables.h +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/SecondaryTables.h @@ -60,7 +60,7 @@ constexpr std::tuple OpDisp {0x2C, 1, &OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int<4, false, false>}, {0x2D, 1, &OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int<4, false, true>}, {0x2E, 2, &OpDispatchBuilder::UCOMISxOp<4>}, - {0x50, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, 4>}, + {0x50, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, OpSize::i32Bit>}, {0x51, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VFSQRT, 4>}, {0x52, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VFRSQRT, 4>}, {0x53, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VFRECP, 4>}, @@ -217,7 +217,7 @@ constexpr std::tuple OpDisp {0x2D, 1, &OpDispatchBuilder::XMM_To_MMX_Vector_CVT_Float_To_Int<8, true, true>}, {0x2E, 2, &OpDispatchBuilder::UCOMISxOp<8>}, - {0x50, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, 8>}, + {0x50, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::MOVMSKOp, OpSize::i64Bit>}, {0x51, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorUnaryOp, IR::OP_VFSQRT, 8>}, {0x54, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VAND, 16>}, {0x55, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUROp, IR::OP_VANDN, 8>}, diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp index 11688dc82..d00ba8cc3 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp @@ -704,8 +704,8 @@ void OpDispatchBuilder::MOVQMMXOp(OpcodeArgs) { StoreResult(FPRClass, Op, Src, OpSize::i8Bit); } -void OpDispatchBuilder::MOVMSKOp(OpcodeArgs, size_t ElementSize) { - auto Size = GetSrcSize(Op); +void OpDispatchBuilder::MOVMSKOp(OpcodeArgs, IR::OpSize ElementSize) { + const auto Size = OpSizeFromSrc(Op); uint8_t NumElements = Size / ElementSize; Ref Src = LoadSource(FPRClass, Op, Op->Src[0], Op->Flags); @@ -754,7 +754,7 @@ void OpDispatchBuilder::MOVMSKOp(OpcodeArgs, size_t ElementSize) { } void OpDispatchBuilder::MOVMSKOpOne(OpcodeArgs) { - const auto SrcSize = GetSrcSize(Op); + const auto SrcSize = OpSizeFromSrc(Op); const auto Is256Bit = SrcSize == Core::CPUState::XMM_AVX_REG_SIZE; const auto ExtractSize = Is256Bit ? OpSize::i32Bit : OpSize::i16Bit; @@ -2393,7 +2393,7 @@ void OpDispatchBuilder::MOVBetweenGPR_FPR(OpcodeArgs, VectorOpType VectorType) { if (Op->Dest.IsGPR()) { const auto ElementSize = OpSizeFromDst(Op); // Extract element from GPR. Zero extending in the process. - Src = _VExtractToGPR(GetSrcSize(Op), ElementSize, Src, 0); + Src = _VExtractToGPR(OpSizeFromSrc(Op), ElementSize, Src, 0); StoreResult(GPRClass, Op, Op->Dest, Src, OpSize::iInvalid); } else { // Storing first element to memory. diff --git a/FEXCore/Source/Interface/IR/IR.json b/FEXCore/Source/Interface/IR/IR.json index d8a2cee7e..48b2e351c 100644 --- a/FEXCore/Source/Interface/IR/IR.json +++ b/FEXCore/Source/Interface/IR/IR.json @@ -1646,7 +1646,7 @@ }, "Float to GPR": {"Ignore": 1}, - "GPR = VExtractToGPR u8:#RegisterSize, u8:#ElementSize, FPR:$Vector, u8:$Index": { + "GPR = VExtractToGPR OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector, u8:$Index": { "Desc": ["Extracts an element from a vector and places it in a GPR", "The element that is extracted from the vector is zero extended to the GPR size" ], diff --git a/FEXCore/Source/Interface/IR/Passes/x87StackOptimizationPass.cpp b/FEXCore/Source/Interface/IR/Passes/x87StackOptimizationPass.cpp index b5f3ca5a0..27a289683 100644 --- a/FEXCore/Source/Interface/IR/Passes/x87StackOptimizationPass.cpp +++ b/FEXCore/Source/Interface/IR/Passes/x87StackOptimizationPass.cpp @@ -809,7 +809,7 @@ void X87StackOptimization::Run(IREmitter* Emit) { case 10: { StackNode = IREmit->_F80CVTTo(StackNode, 8); IREmit->_StoreMem(FPRClass, OpSize::i64Bit, AddrNode, StackNode); - auto Upper = IREmit->_VExtractToGPR(16, 8, StackNode, 1); + auto Upper = IREmit->_VExtractToGPR(OpSize::i128Bit, OpSize::i64Bit, StackNode, 1); IREmit->_StoreMem(GPRClass, OpSize::i16Bit, Upper, AddrNode, GetConstant(8), OpSize::i64Bit, MEM_OFFSET_SXTX, 1); break; } @@ -821,7 +821,7 @@ void X87StackOptimization::Run(IREmitter* Emit) { if (Op->StoreSize == 10) { // Part of code from StoreResult_WithOpSize() // For X87 extended doubles, split before storing IREmit->_StoreMem(FPRClass, OpSize::i64Bit, AddrNode, StackNode); - auto Upper = IREmit->_VExtractToGPR(16, 8, StackNode, 1); + auto Upper = IREmit->_VExtractToGPR(OpSize::i128Bit, OpSize::i64Bit, StackNode, 1); auto DestAddr = IREmit->_Add(OpSize::i64Bit, AddrNode, GetConstant(8)); IREmit->_StoreMem(GPRClass, OpSize::i16Bit, DestAddr, Upper, OpSize::i64Bit); } else {