diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 2fa26a43a..91fadbfc7 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -5914,6 +5914,7 @@ void OpDispatchBuilder::InstallHostSpecificOpcodeHandlers() { {OPD(1, 0b01, 0xD7), 1, &OpDispatchBuilder::UnimplementedOp}, {OPD(1, 0b01, 0xD8), 1, &OpDispatchBuilder::AVXVectorALUOp}, + {OPD(1, 0b01, 0xD9), 1, &OpDispatchBuilder::AVXVectorALUOp}, {OPD(1, 0b01, 0xDB), 1, &OpDispatchBuilder::AVXVectorALUOp}, {OPD(1, 0b01, 0xDC), 1, &OpDispatchBuilder::AVXVectorALUOp}, {OPD(1, 0b01, 0xDD), 1, &OpDispatchBuilder::AVXVectorALUOp}, diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp index 7eedf9362..31e125e8c 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp @@ -434,6 +434,8 @@ template void OpDispatchBuilder::AVXVectorALUOp(OpcodeArgs); template void OpDispatchBuilder::AVXVectorALUOp(OpcodeArgs); +template +void OpDispatchBuilder::AVXVectorALUOp(OpcodeArgs); template void OpDispatchBuilder::AVXVectorALUOp(OpcodeArgs); diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp index eb2fc58f3..360a7d9f8 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp @@ -211,7 +211,7 @@ void InitializeVEXTables() { {OPD(1, 0b01, 0xD7), 1, X86InstInfo{"VPMOVMSKB", TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR | FLAGS_SF_MOD_REG_ONLY, 0, nullptr}}, {OPD(1, 0b01, 0xD8), 1, X86InstInfo{"VPSUBUSB", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, - {OPD(1, 0b01, 0xD9), 1, X86InstInfo{"VPSUBUSW", TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, + {OPD(1, 0b01, 0xD9), 1, X86InstInfo{"VPSUBUSW", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b01, 0xDA), 1, X86InstInfo{"VPMINUB", TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b01, 0xDB), 1, X86InstInfo{"VPAND", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b01, 0xDC), 1, X86InstInfo{"VPADDUSB", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, diff --git a/unittests/ASM/VEX/vpsubusw.asm b/unittests/ASM/VEX/vpsubusw.asm new file mode 100644 index 000000000..9cdcae49c --- /dev/null +++ b/unittests/ASM/VEX/vpsubusw.asm @@ -0,0 +1,41 @@ +%ifdef CONFIG +{ + "HostFeatures": ["AVX"], + "RegData": { + "XMM0": ["0x6162636445464748", "0x5152535455565758", "0x6162636445464748", "0x5152535455565758"], + "XMM1": ["0x4142434465666768", "0x7172737475767778", "0x4142434465666768", "0x7172737475767778"], + "XMM2": ["0x2020202000000000", "0x0000000000000000", "0x0000000000000000", "0x0000000000000000"], + "XMM3": ["0x2020202000000000", "0x0000000000000000", "0x2020202000000000", "0x0000000000000000"], + "XMM4": ["0x2020202000000000", "0x0000000000000000", "0x0000000000000000", "0x0000000000000000"], + "XMM5": ["0x2020202000000000", "0x0000000000000000", "0x2020202000000000", "0x0000000000000000"] + }, + "MemoryRegions": { + "0x100000000": "4096" + } +} +%endif + +lea rdx, [rel .data] + +vmovaps ymm0, [rdx] +vmovaps ymm1, [rdx + 32] + +vpsubusw xmm2, xmm0, xmm1 +vpsubusw ymm3, ymm0, ymm1 + +vpsubusw xmm4, xmm0, [rdx + 32] +vpsubusw ymm5, ymm0, [rdx + 32] + +hlt + +align 32 +.data: +dq 0x6162636445464748 +dq 0x5152535455565758 +dq 0x6162636445464748 +dq 0x5152535455565758 + +dq 0x4142434465666768 +dq 0x7172737475767778 +dq 0x4142434465666768 +dq 0x7172737475767778