From ad7dc6ca0a946eeefadfb8ed419b4f0722515cf6 Mon Sep 17 00:00:00 2001 From: lioncash Date: Sat, 31 Dec 2022 19:07:17 +0000 Subject: [PATCH 1/3] OpcodeDispatcher: Move ADDSUB table entries Makes them numerically ordered. --- External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 6ce33af6f..99837bc1d 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -5847,9 +5847,6 @@ void OpDispatchBuilder::InstallHostSpecificOpcodeHandlers() { {OPD(1, 0b00, 0x2F), 1, &OpDispatchBuilder::UCOMISxOp<4>}, {OPD(1, 0b01, 0x2F), 1, &OpDispatchBuilder::UCOMISxOp<8>}, - {OPD(1, 0b01, 0xD0), 1, &OpDispatchBuilder::VADDSUBPOp<8>}, - {OPD(1, 0b11, 0xD0), 1, &OpDispatchBuilder::VADDSUBPOp<4>}, - {OPD(1, 0b00, 0x51), 1, &OpDispatchBuilder::AVXVectorUnaryOp}, {OPD(1, 0b01, 0x51), 1, &OpDispatchBuilder::AVXVectorUnaryOp}, {OPD(1, 0b10, 0x51), 1, &OpDispatchBuilder::AVXVectorUnaryOp}, @@ -5948,6 +5945,9 @@ void OpDispatchBuilder::InstallHostSpecificOpcodeHandlers() { {OPD(1, 0b01, 0xC5), 1, &OpDispatchBuilder::PExtrOp<2>}, + {OPD(1, 0b01, 0xD0), 1, &OpDispatchBuilder::VADDSUBPOp<8>}, + {OPD(1, 0b11, 0xD0), 1, &OpDispatchBuilder::VADDSUBPOp<4>}, + {OPD(1, 0b01, 0xD1), 1, &OpDispatchBuilder::VPSRLDOp<2>}, {OPD(1, 0b01, 0xD2), 1, &OpDispatchBuilder::VPSRLDOp<4>}, {OPD(1, 0b01, 0xD3), 1, &OpDispatchBuilder::VPSRLDOp<8>}, From b8c0b0c267e6f0c53c0cfe00c1a27f71651ec64b Mon Sep 17 00:00:00 2001 From: lioncash Date: Sat, 31 Dec 2022 19:08:18 +0000 Subject: [PATCH 2/3] OpcodeDispatcher: Handle VMOVMSKPS --- .../Interface/Core/OpcodeDispatcher.cpp | 2 + .../Interface/Core/X86Tables/VEXTables.cpp | 2 +- unittests/ASM/VEX/vmovmskps.asm | 39 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 unittests/ASM/VEX/vmovmskps.asm diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 99837bc1d..5eb0ed3ed 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -5847,6 +5847,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::MOVMSKOp<4>}, + {OPD(1, 0b00, 0x51), 1, &OpDispatchBuilder::AVXVectorUnaryOp}, {OPD(1, 0b01, 0x51), 1, &OpDispatchBuilder::AVXVectorUnaryOp}, {OPD(1, 0b10, 0x51), 1, &OpDispatchBuilder::AVXVectorUnaryOp}, diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp index ba3dc88ba..f47aa57e5 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp @@ -48,7 +48,7 @@ void InitializeVEXTables() { {OPD(1, 0b00, 0x17), 1, X86InstInfo{"VMOVHPS", TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b01, 0x17), 1, X86InstInfo{"VMOVHPD", TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0, nullptr}}, - {OPD(1, 0b00, 0x50), 1, X86InstInfo{"VMOVMSKPS", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, + {OPD(1, 0b00, 0x50), 1, X86InstInfo{"VMOVMSKPS", TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR, 0, nullptr}}, {OPD(1, 0b01, 0x50), 1, X86InstInfo{"VMOVMSKPD", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, {OPD(1, 0b00, 0x51), 1, X86InstInfo{"VSQRTPS", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, diff --git a/unittests/ASM/VEX/vmovmskps.asm b/unittests/ASM/VEX/vmovmskps.asm new file mode 100644 index 000000000..46630c037 --- /dev/null +++ b/unittests/ASM/VEX/vmovmskps.asm @@ -0,0 +1,39 @@ +%ifdef CONFIG +{ + "HostFeatures": ["AVX"], + "RegData": { + "RAX": "0x00", + "RBX": "0x03", + "RDI": "0x00", + "RSI": "0x33" + }, + "MemoryRegions": { + "0x100000000": "4096" + } +} +%endif + +lea rdx, [rel .data] + +vmovaps ymm0, [rdx] +vmovaps ymm1, [rdx + 32] + +vmovmskps rax, xmm0 +vmovmskps rbx, xmm1 + +vmovmskps rdi, ymm0 +vmovmskps rsi, ymm1 + +hlt + +align 32 +.data: +dq 0x4142434445464748 +dq 0x5152535455565758 +dq 0x4142434445464748 +dq 0x5152535455565758 + +dq 0x8000000080000000 +dq 0x7000000070000000 +dq 0x8000000080000000 +dq 0x7000000070000000 From bdda14eb756013275d2fd879d1aefb10309a9382 Mon Sep 17 00:00:00 2001 From: lioncash Date: Sat, 31 Dec 2022 19:17:02 +0000 Subject: [PATCH 3/3] OpcodeDispatcher: Handle VMOVMSKPD --- .../Interface/Core/OpcodeDispatcher.cpp | 1 + .../Interface/Core/X86Tables/VEXTables.cpp | 2 +- unittests/ASM/VEX/vmovmskpd.asm | 39 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 unittests/ASM/VEX/vmovmskpd.asm diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 5eb0ed3ed..981318b71 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -5848,6 +5848,7 @@ void OpDispatchBuilder::InstallHostSpecificOpcodeHandlers() { {OPD(1, 0b01, 0x2F), 1, &OpDispatchBuilder::UCOMISxOp<8>}, {OPD(1, 0b00, 0x50), 1, &OpDispatchBuilder::MOVMSKOp<4>}, + {OPD(1, 0b01, 0x50), 1, &OpDispatchBuilder::MOVMSKOp<8>}, {OPD(1, 0b00, 0x51), 1, &OpDispatchBuilder::AVXVectorUnaryOp}, {OPD(1, 0b01, 0x51), 1, &OpDispatchBuilder::AVXVectorUnaryOp}, diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp index f47aa57e5..5fbd9ed8f 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp @@ -49,7 +49,7 @@ void InitializeVEXTables() { {OPD(1, 0b01, 0x17), 1, X86InstInfo{"VMOVHPD", TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_MEM_ONLY | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b00, 0x50), 1, X86InstInfo{"VMOVMSKPS", TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR, 0, nullptr}}, - {OPD(1, 0b01, 0x50), 1, X86InstInfo{"VMOVMSKPD", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, + {OPD(1, 0b01, 0x50), 1, X86InstInfo{"VMOVMSKPD", TYPE_INST, GenFlagsSizes(SIZE_32BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS | FLAGS_SF_DST_GPR, 0, nullptr}}, {OPD(1, 0b00, 0x51), 1, X86InstInfo{"VSQRTPS", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b01, 0x51), 1, X86InstInfo{"VSQRTPD", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, diff --git a/unittests/ASM/VEX/vmovmskpd.asm b/unittests/ASM/VEX/vmovmskpd.asm new file mode 100644 index 000000000..af7676588 --- /dev/null +++ b/unittests/ASM/VEX/vmovmskpd.asm @@ -0,0 +1,39 @@ +%ifdef CONFIG +{ + "HostFeatures": ["AVX"], + "RegData": { + "RAX": "0x2", + "RBX": "0xA", + "RDI": "0x0", + "RSI": "0x0" + }, + "MemoryRegions": { + "0x100000000": "4096" + } +} +%endif + +lea rdx, [rel .data] + +vmovapd ymm0, [rdx] +vmovapd ymm1, [rdx + 32] + +vmovmskpd rax, xmm0 +vmovmskpd rbx, ymm0 + +vmovmskpd rdi, xmm1 +vmovmskpd rsi, ymm1 + +hlt + +align 32 +.data: +dq 0x0000000000000000 +dq 0x8000000000000000 +dq 0x0000000000000000 +dq 0x8000000000000000 + +dq 0x4142434445464748 +dq 0x5152535455565758 +dq 0x4142434445464748 +dq 0x5152535455565758