From a0c0384340c5e4f653bc5a8136c2c0a4c66e1ac4 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Fri, 24 Apr 2020 23:34:47 -0700 Subject: [PATCH 1/3] Ensures reciprocal hits the precision we expect in the x86-64 JIT Otherwise unit tests can fail --- .../FEXCore/Source/Interface/Core/JIT/x86_64/JIT.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/JIT/x86_64/JIT.cpp b/External/FEXCore/Source/Interface/Core/JIT/x86_64/JIT.cpp index 9ea4187e0..b0223edbc 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/x86_64/JIT.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/x86_64/JIT.cpp @@ -2802,7 +2802,9 @@ void *JITCore::CompileCode([[maybe_unused]] FEXCore::IR::IRListView const // Scalar switch (Op->Header.ElementSize) { case 4: { - vrcpss(GetDst(Node), GetSrc(Op->Header.Args[0].ID()), GetSrc(Op->Header.Args[0].ID())); + mov(eax, 0x3f800000); // 1.0f + vmovd(xmm15, eax); + vdivss(GetDst(Node), xmm15, GetSrc(Op->Header.Args[0].ID())); break; } default: LogMan::Msg::A("Unknown Element Size: %d", Op->Header.ElementSize); break; @@ -2812,7 +2814,10 @@ void *JITCore::CompileCode([[maybe_unused]] FEXCore::IR::IRListView const // Vector switch (Op->Header.ElementSize) { case 4: { - vrcpps(GetDst(Node), GetSrc(Op->Header.Args[0].ID())); + mov(eax, 0x3f800000); // 1.0f + vmovd(xmm15, eax); + pshufd(xmm15, xmm15, 0); + vdivps(GetDst(Node), xmm15, GetSrc(Op->Header.Args[0].ID())); break; } default: LogMan::Msg::A("Unknown Element Size: %d", Op->Header.ElementSize); break; From 4ae33147f5c83041d31bbf4cd5eb4930207160d8 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Fri, 24 Apr 2020 23:35:33 -0700 Subject: [PATCH 2/3] Implements support for rcpps/rcpss --- External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 755e98339..d7f8a8c95 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -5516,6 +5516,7 @@ void InstallOpcodeHandlers() { {0x50, 1, &OpDispatchBuilder::MOVMSKOp<4>}, {0x51, 1, &OpDispatchBuilder::VectorUnaryOp}, {0x52, 1, &OpDispatchBuilder::VectorUnaryOp}, + {0x53, 1, &OpDispatchBuilder::VectorUnaryOp}, {0x54, 1, &OpDispatchBuilder::VectorALUOp}, {0x55, 1, &OpDispatchBuilder::ANDNOp}, {0x56, 1, &OpDispatchBuilder::VectorALUOp}, @@ -5710,6 +5711,7 @@ void InstallOpcodeHandlers() { {0x2D, 1, &OpDispatchBuilder::CVTFPR_To_GPR<4, true>}, {0x51, 1, &OpDispatchBuilder::VectorUnaryOp}, {0x52, 1, &OpDispatchBuilder::VectorUnaryOp}, + {0x53, 1, &OpDispatchBuilder::VectorUnaryOp}, {0x58, 1, &OpDispatchBuilder::VectorScalarALUOp}, {0x59, 1, &OpDispatchBuilder::VectorScalarALUOp}, {0x5A, 1, &OpDispatchBuilder::Scalar_CVT_Float_To_Float<8, 4>}, From bf5dbdf143628387fd7ed8e56212355c0180855e Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Fri, 24 Apr 2020 23:36:01 -0700 Subject: [PATCH 3/3] Adds reciprocal unit tests --- unittests/ASM/REP/F3_53.asm | 31 +++++++++++++++++++++++++++++++ unittests/ASM/TwoByte/0F_53.asm | 30 ++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 unittests/ASM/REP/F3_53.asm create mode 100644 unittests/ASM/TwoByte/0F_53.asm diff --git a/unittests/ASM/REP/F3_53.asm b/unittests/ASM/REP/F3_53.asm new file mode 100644 index 000000000..ee21277db --- /dev/null +++ b/unittests/ASM/REP/F3_53.asm @@ -0,0 +1,31 @@ +%ifdef CONFIG +{ + "RegData": { + "XMM0": ["0x3f8000003f800000", "0x3f8000003f800000"], + "XMM1": ["0x408000003e800000", "0x4080000040800000"] + }, + "MemoryRegions": { + "0x100000000": "4096" + } +} +%endif + +mov rdx, 0xe0000000 + +mov rax, 0x3f8000003f800000 ; 1.0 +mov [rdx + 8 * 0], rax +mov rax, 0x3f8000003f800000 +mov [rdx + 8 * 1], rax + +mov rax, 0x4080000040800000 ; 4.0 +mov [rdx + 8 * 2], rax +mov rax, 0x4080000040800000 +mov [rdx + 8 * 3], rax + +movapd xmm0, [rdx + 8 * 0] +movapd xmm1, [rdx + 8 * 2] + +rcpss xmm0, xmm0 +rcpss xmm1, [rdx + 8 * 2] + +hlt diff --git a/unittests/ASM/TwoByte/0F_53.asm b/unittests/ASM/TwoByte/0F_53.asm new file mode 100644 index 000000000..168ca896c --- /dev/null +++ b/unittests/ASM/TwoByte/0F_53.asm @@ -0,0 +1,30 @@ +%ifdef CONFIG +{ + "RegData": { + "XMM0": ["0x3f8000003f800000", "0x3f8000003f800000"], + "XMM1": ["0x3e8000003e800000", "0x3e8000003e800000"] + }, + "MemoryRegions": { + "0x100000000": "4096" + } +} +%endif + +mov rdx, 0xe0000000 + +mov rax, 0x3f8000003f800000 ; 1.0 +mov [rdx + 8 * 0], rax +mov rax, 0x3f8000003f800000 +mov [rdx + 8 * 1], rax + +mov rax, 0x4080000040800000 ; 4.0 +mov [rdx + 8 * 2], rax +mov rax, 0x4080000040800000 +mov [rdx + 8 * 3], rax + +movapd xmm0, [rdx + 8 * 0] + +rcpps xmm0, xmm0 +rcpps xmm1, [rdx + 8 * 2] + +hlt