diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index dd7b6f79e..5645eeff9 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -5724,6 +5724,8 @@ void OpDispatchBuilder::InstallHostSpecificOpcodeHandlers() { {OPD(1, 0b10, 0x59), 1, &OpDispatchBuilder::AVXVectorScalarALUOp}, {OPD(1, 0b11, 0x59), 1, &OpDispatchBuilder::AVXVectorScalarALUOp}, + {OPD(1, 0b00, 0x5A), 1, &OpDispatchBuilder::Vector_CVT_Float_To_Float<8, 4, true>}, + {OPD(1, 0b01, 0x5A), 1, &OpDispatchBuilder::Vector_CVT_Float_To_Float<4, 8, true>}, {OPD(1, 0b10, 0x5A), 1, &OpDispatchBuilder::AVXScalar_CVT_Float_To_Float<8, 4>}, {OPD(1, 0b11, 0x5A), 1, &OpDispatchBuilder::AVXScalar_CVT_Float_To_Float<4, 8>}, diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp index 38325ed05..9ea7aa8cf 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp @@ -2193,6 +2193,10 @@ template void OpDispatchBuilder::Vector_CVT_Float_To_Float<4, 8, false>(OpcodeArgs); template void OpDispatchBuilder::Vector_CVT_Float_To_Float<8, 4, false>(OpcodeArgs); +template +void OpDispatchBuilder::Vector_CVT_Float_To_Float<4, 8, true>(OpcodeArgs); +template +void OpDispatchBuilder::Vector_CVT_Float_To_Float<8, 4, true>(OpcodeArgs); template void OpDispatchBuilder::MMX_To_XMM_Vector_CVT_Int_To_Float(OpcodeArgs) { diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp index 4f99c9dd7..d5972939b 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp @@ -146,8 +146,8 @@ void InitializeVEXTables() { {OPD(1, 0b10, 0x59), 1, X86InstInfo{"VMULSS", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b11, 0x59), 1, X86InstInfo{"VMULSD", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, - {OPD(1, 0b00, 0x5A), 1, X86InstInfo{"VCVTPS2PD", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, - {OPD(1, 0b01, 0x5A), 1, X86InstInfo{"VCVTPD2PS", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, + {OPD(1, 0b00, 0x5A), 1, X86InstInfo{"VCVTPS2PD", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, + {OPD(1, 0b01, 0x5A), 1, X86InstInfo{"VCVTPD2PS", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b10, 0x5A), 1, X86InstInfo{"VCVTSS2SD", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_32BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(1, 0b11, 0x5A), 1, X86InstInfo{"VCVTSD2SS", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_VEX_1ST_SRC | FLAGS_XMM_FLAGS, 0, nullptr}}, diff --git a/unittests/ASM/VEX/vcvtpd2ps.asm b/unittests/ASM/VEX/vcvtpd2ps.asm new file mode 100644 index 000000000..793edcee0 --- /dev/null +++ b/unittests/ASM/VEX/vcvtpd2ps.asm @@ -0,0 +1,77 @@ +%ifdef CONFIG +{ + "HostFeatures": ["AVX"], + "RegData": { + "XMM0": ["0x4054C664C2F837B5", "0x40516053E2D6238E", "0x4044836D86EC17EC", "0x402A1E1C58255B03"], + "XMM1": ["0x401568E0C9D9D346", "0x4035FE425AEE6320", "0x402359003EEA209B", "0x40154B7D41743E96"], + "XMM2": ["0x403D075A31A4BDBA", "0x4050A018BD66277C", "0x40334EC17EBAF102", "0x4056D7404EA4A8C1"], + "XMM7": ["0x428B029F42A63326", "0x0000000000000000", "0x0000000000000000", "0x0000000000000000"], + "XMM8": ["0x41AFF21340AB4706", "0x0000000000000000", "0x0000000000000000", "0x0000000000000000"], + "XMM9": ["0x428500C641E83AD2", "0x0000000000000000", "0x0000000000000000", "0x0000000000000000"], + "XMM10": ["0x4214ADB642B062C4", "0x41245B0E42461AA5", "0x0000000000000000", "0x0000000000000000"], + "XMM11": ["0x41A1B712429B697F", "0x42252CF2411CE3BD", "0x0000000000000000", "0x0000000000000000"], + "XMM12": ["0x42662BE34176837B", "0x425E2C0D4119C75A", "0x0000000000000000", "0x0000000000000000"], + "XMM13": ["0x409C30014253A13B", "0x4041495242910EC1", "0x0000000000000000", "0x0000000000000000"] + } +} +%endif + +lea rdx, [rel .data] + +vmovapd ymm0, [rdx + 32 * 0] +vmovapd ymm1, [rdx + 32 * 1] +vmovapd ymm2, [rdx + 32 * 2] + +vcvtpd2ps xmm7, xmm0 +vcvtpd2ps xmm8, xmm1 +vcvtpd2ps xmm9, xmm2 +vcvtpd2ps xmm10, yword [rdx + 32 * 10] +vcvtpd2ps xmm11, yword [rdx + 32 * 11] +vcvtpd2ps xmm12, yword [rdx + 32 * 12] +vcvtpd2ps xmm13, yword [rdx + 32 * 13] + +hlt + +align 32 +.data: +dq 83.0999, 69.50512 +dq 41.02678, 13.05881 + +dq 5.35242, 21.9932 +dq 9.67383, 5.32372 + +dq 29.02872, 66.50151 +dq 19.30764, 91.3633 + +dq 40.45086, 50.96153 +dq 32.64489, 23.97574 + +dq 90.64316, 24.22547 +dq 98.9394, 91.21715 + +dq 90.80143, 99.48407 +dq 64.97245, 74.39838 + +dq 35.22761, 25.35321 +dq 5.8732, 90.19956 + +dq 33.03133, 52.02952 +dq 58.38554, 10.17531 + +dq 47.84703, 84.04831 +dq 90.02965, 65.81329 + +dq 96.27991, 6.64479 +dq 25.58971, 95.00694 + +dq 88.1929, 37.16964 +dq 49.52602, 10.27223 + +dq 77.70605, 20.21439 +dq 9.8056, 41.29389 + +dq 15.4071, 57.54286 +dq 9.61117, 55.54302 + +dq 52.90745, 4.88086 +dq 72.52882, 3.0201 diff --git a/unittests/ASM/VEX/vcvtps2pd.asm b/unittests/ASM/VEX/vcvtps2pd.asm new file mode 100644 index 000000000..d2173995c --- /dev/null +++ b/unittests/ASM/VEX/vcvtps2pd.asm @@ -0,0 +1,77 @@ +%ifdef CONFIG +{ + "HostFeatures": ["AVX"], + "RegData": { + "XMM0": ["0x428B029F42A63326", "0x4150F0E342241B6C", "0x409C30014253A13B", "0x4041495242910EC1"], + "XMM1": ["0x41AFF21340AB4706", "0x40AA5BEA411AC802", "0x42662BE34176837B", "0x425E2C0D4119C75A"], + "XMM2": ["0x428500C641E83AD2", "0x42B6BA02419A760C", "0x41A1B712429B697F", "0x42252CF2411CE3BD"], + "XMM7": ["0x4054C664C0000000", "0x40516053E0000000", "0x0000000000000000", "0x0000000000000000"], + "XMM8": ["0x401568E0C0000000", "0x4035FE4260000000", "0x0000000000000000", "0x0000000000000000"], + "XMM9": ["0x403D075A40000000", "0x4050A018C0000000", "0x0000000000000000", "0x0000000000000000"], + "XMM10": ["0x40560C5880000000", "0x404295B6C0000000", "0x4048C354A0000000", "0x40248B61C0000000"], + "XMM11": ["0x40536D2FE0000000", "0x403436E240000000", "0x40239C77A0000000", "0x4044A59E40000000"], + "XMM12": ["0x402ED06F60000000", "0x404CC57C60000000", "0x402338EB40000000", "0x404BC581A0000000"], + "XMM13": ["0x404A742760000000", "0x4013860020000000", "0x405221D820000000", "0x4008292A40000000"] + } +} +%endif + +lea rdx, [rel .data] + +vmovapd ymm0, [rdx + 32 * 0] +vmovapd ymm1, [rdx + 32 * 1] +vmovapd ymm2, [rdx + 32 * 2] + +vcvtps2pd xmm7, xmm0 +vcvtps2pd xmm8, xmm1 +vcvtps2pd xmm9, xmm2 +vcvtps2pd ymm10, [rdx + 32 * 10] +vcvtps2pd ymm11, [rdx + 32 * 11] +vcvtps2pd ymm12, [rdx + 32 * 12] +vcvtps2pd ymm13, [rdx + 32 * 13] + +hlt + +align 32 +.data: +dd 83.0999, 69.50512, 41.02678, 13.05881 +dd 52.90745, 4.88086, 72.52882, 3.0201 + +dd 5.35242, 21.9932, 9.67383, 5.32372 +dd 15.4071, 57.54286, 9.61117, 55.54302 + +dd 29.02872, 66.50151, 19.30764, 91.3633 +dd 77.70605, 20.21439, 9.8056, 41.29389 + +dd 40.45086, 50.96153, 32.64489, 23.97574 +dd 88.1929, 37.16964, 49.52602, 10.27223 + +dd 90.64316, 24.22547, 98.9394, 91.21715 +dd 96.27991, 6.64479, 25.58971, 95.00694 + +dd 90.80143, 99.48407, 64.97245, 74.39838 +dd 47.84703, 84.04831, 90.02965, 65.81329 + +dd 35.22761, 25.35321, 5.8732, 90.19956 +dd 33.03133, 52.02952, 58.38554, 10.17531 + +dd 33.03133, 52.02952, 58.38554, 10.17531 +dd 83.0999, 69.50512, 41.02678, 13.05881 + +dd 47.84703, 84.04831, 90.02965, 65.81329 +dd 5.35242, 21.9932, 9.67383, 5.32372 + +dd 96.27991, 6.64479, 25.58971, 95.00694 +dd 29.02872, 66.50151, 19.30764, 91.3633 + +dd 88.1929, 37.16964, 49.52602, 10.27223 +dd 40.45086, 50.96153, 32.64489, 23.97574 + +dd 77.70605, 20.21439, 9.8056, 41.29389 +dd 90.64316, 24.22547, 98.9394, 91.21715 + +dd 15.4071, 57.54286, 9.61117, 55.54302 +dd 90.80143, 99.48407, 64.97245, 74.39838 + +dd 52.90745, 4.88086, 72.52882, 3.0201 +dd 35.22761, 25.35321, 5.8732, 90.19956