diff --git a/Source/Interface/Core/OpcodeDispatcher.cpp b/Source/Interface/Core/OpcodeDispatcher.cpp index c643bf470..dfe9c9a9e 100644 --- a/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/Source/Interface/Core/OpcodeDispatcher.cpp @@ -2518,6 +2518,19 @@ void OpDispatchBuilder::SHUFOp(OpcodeArgs) { StoreResult(Op, Dest, -1); } + +void OpDispatchBuilder::ANDNOp(OpcodeArgs) { + auto Size = GetSrcSize(Op); + OrderedNode *Src1 = LoadSource(Op, Op->Dest, Op->Flags, -1); + OrderedNode *Src2 = LoadSource(Op, Op->Src1, Op->Flags, -1); + // Dest = ~Src1 & Src2 + + Src1 = _VNot(Size, Size, Src1); + auto Dest = _VAnd(Size, Size, Src1, Src2); + + StoreResult(Op, Dest, -1); +} + void OpDispatchBuilder::PCMPEQOp(OpcodeArgs) { auto Size = GetSrcSize(Op); uint8_t ElementSize = 4; @@ -4242,6 +4255,7 @@ void InstallOpcodeHandlers() { {0x17, 1, &OpDispatchBuilder::MOVUPSOp}, {0x28, 2, &OpDispatchBuilder::MOVUPSOp}, {0x54, 1, &OpDispatchBuilder::VectorALUOp}, + {0x55, 1, &OpDispatchBuilder::ANDNOp}, {0x56, 1, &OpDispatchBuilder::VectorALUOp}, {0x57, 1, &OpDispatchBuilder::VectorALUOp}, {0x58, 1, &OpDispatchBuilder::VectorALUOp}, @@ -4430,6 +4444,7 @@ void InstallOpcodeHandlers() { {0x40, 16, &OpDispatchBuilder::CMOVOp}, {0x54, 1, &OpDispatchBuilder::VectorALUOp}, + {0x55, 1, &OpDispatchBuilder::ANDNOp}, {0x56, 1, &OpDispatchBuilder::VectorALUOp}, {0x57, 1, &OpDispatchBuilder::VectorALUOp}, {0x58, 1, &OpDispatchBuilder::VectorALUOp}, diff --git a/Source/Interface/Core/OpcodeDispatcher.h b/Source/Interface/Core/OpcodeDispatcher.h index 012ec0744..56cebca6c 100644 --- a/Source/Interface/Core/OpcodeDispatcher.h +++ b/Source/Interface/Core/OpcodeDispatcher.h @@ -211,6 +211,7 @@ public: template void SHUFOp(OpcodeArgs); + void ANDNOp(OpcodeArgs); // X87 Ops template