diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index ce41391f0..f603ec65a 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -5866,6 +5866,7 @@ void OpDispatchBuilder::InstallHostSpecificOpcodeHandlers() { {OPD(1, 0b00, 0x5C), 1, &OpDispatchBuilder::AVXVectorALUOp}, {OPD(1, 0b01, 0x5C), 1, &OpDispatchBuilder::AVXVectorALUOp}, {OPD(1, 0b10, 0x5C), 1, &OpDispatchBuilder::AVXVectorScalarALUOp}, + {OPD(1, 0b11, 0x5C), 1, &OpDispatchBuilder::AVXVectorScalarALUOp}, {OPD(1, 0b01, 0x64), 1, &OpDispatchBuilder::AVXVectorALUOp}, {OPD(1, 0b01, 0x65), 1, &OpDispatchBuilder::AVXVectorALUOp}, diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp index ee33e85d4..f7e136822 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp @@ -557,6 +557,8 @@ template void OpDispatchBuilder::AVXVectorScalarALUOp(OpcodeArgs); template void OpDispatchBuilder::AVXVectorScalarALUOp(OpcodeArgs); +template +void OpDispatchBuilder::AVXVectorScalarALUOp(OpcodeArgs); template void OpDispatchBuilder::VectorUnaryOp(OpcodeArgs) { diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp index 37a40c753..7846a6d2f 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp @@ -153,7 +153,7 @@ void InitializeVEXTables() { {OPD(1, 0b00, 0x5C), 1, X86InstInfo{"VSUBPS", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b01, 0x5C), 1, X86InstInfo{"VSUBPD", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b10, 0x5C), 1, X86InstInfo{"VSUBSS", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, - {OPD(1, 0b11, 0x5C), 1, X86InstInfo{"VSUBSD", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, + {OPD(1, 0b11, 0x5C), 1, X86InstInfo{"VSUBSD", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b00, 0x5D), 1, X86InstInfo{"VMINPS", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, {OPD(1, 0b01, 0x5D), 1, X86InstInfo{"VMINPD", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, diff --git a/unittests/ASM/VEX/vsubsd.asm b/unittests/ASM/VEX/vsubsd.asm new file mode 100644 index 000000000..990f349c7 --- /dev/null +++ b/unittests/ASM/VEX/vsubsd.asm @@ -0,0 +1,70 @@ +%ifdef CONFIG +{ + "HostFeatures": ["AVX"], + "RegData": { + "XMM0": ["0xC008000000000000", "0x5152535455565758", "0x0000000000000000", "0x0000000000000000"], + "XMM1": ["0x4010000000000000", "0x5152535455565758", "0x5152535455565758", "0x5152535455565758"], + "XMM2": ["0xC01C000000000000", "0x5152535455565758", "0x0000000000000000", "0x0000000000000000"], + "XMM3": ["0x4030000000000000", "0x5152535455565758", "0x5152535455565758", "0x5152535455565758"], + "XMM4": ["0x4038000000000000", "0x5152535455565758", "0x0000000000000000", "0x0000000000000000"], + "XMM5": ["0x4035000000000000", "0x5152535455565758", "0x0000000000000000", "0x0000000000000000"], + "XMM7": ["0xC022000000000000", "0x5152535455565758", "0x0000000000000000", "0x0000000000000000"], + "XMM8": ["0x4030000000000000", "0x5152535455565758", "0x5152535455565758", "0x5152535455565758"], + "XMM9": ["0x4039000000000000", "0x5152535455565758", "0x5152535455565758", "0x5152535455565758"] + }, + "MemoryRegions": { + "0x100000000": "4096" + } +} +%endif + +lea rdx, [rel .data] + +vmovapd ymm0, [rdx + 32 * 0] +vmovapd ymm1, [rdx + 32 * 1] +vmovapd ymm2, [rdx + 32 * 2] +vmovapd ymm3, [rdx + 32 * 3] +vmovapd ymm4, [rdx + 32 * 4] + +; Register only +vsubsd xmm0, xmm0, xmm1 +vsubsd xmm2, xmm2, xmm3 + +; Memory operand +vsubsd xmm5, xmm4, [rdx + 32 * 1] +vsubsd xmm4, xmm4, [rdx + 32 * 0] + +; Merging different src into destination +vpxor xmm7, xmm7, xmm7 +vmovapd ymm8, [rdx + 32 * 3] +vmovapd ymm9, [rdx + 32 * 4] +vsubsd xmm7, xmm8, xmm9 + +hlt + +align 32 +.data: +dq 0x3FF0000000000000 ; 1.0 +dq 0x5152535455565758 +dq 0x5152535455565758 +dq 0x5152535455565758 + +dq 0x4010000000000000 ; 4.0 +dq 0x5152535455565758 +dq 0x5152535455565758 +dq 0x5152535455565758 + +dq 0x4022000000000000 ; 9.0 +dq 0x5152535455565758 +dq 0x5152535455565758 +dq 0x5152535455565758 + +dq 0x4030000000000000 ; 16.0 +dq 0x5152535455565758 +dq 0x5152535455565758 +dq 0x5152535455565758 + +dq 0x4039000000000000 ; 25.0 +dq 0x5152535455565758 +dq 0x5152535455565758 +dq 0x5152535455565758