From d441ebe48914bf0f4f8a5c162cd5b25eafe0c247 Mon Sep 17 00:00:00 2001 From: Stefanos Kornilios Mitsis Poiitidis Date: Thu, 10 Sep 2020 03:56:00 +0300 Subject: [PATCH] SHLD/SHRD: Less broken flags, correct zero shifts --- .../Source/Interface/Core/OpcodeDispatcher.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 41e2f8520..583f0b168 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -1598,16 +1598,18 @@ void OpDispatchBuilder::SHLDOp(OpcodeArgs) { else Shift = _And(Shift, _Constant(0x1F)); - auto ShiftRight = _Sub(_Constant(Size), Shift); + auto ShiftRight = _Sub(_Constant(Size-1), Shift); OrderedNode *Res{}; auto Tmp1 = _Lshl(Dest, Shift); auto Tmp2 = _Lshr(Src, ShiftRight); + Tmp2 = _Lshr(Tmp2, _Constant(1)); + Res = _Or(Tmp1, Tmp2); StoreResult(GPRClass, Op, Res, -1); - GenerateFlags_ShiftLeft(Op, _Bfe(Size, 0, Res), _Bfe(Size, 0, Dest), _Bfe(Size, 0, Src)); + GenerateFlags_ShiftLeft(Op, _Bfe(Size, 0, Res), _Bfe(Size, 0, Dest), _Bfe(Size, 0, Shift)); } void OpDispatchBuilder::SHLDImmediateOp(OpcodeArgs) { @@ -1652,15 +1654,16 @@ void OpDispatchBuilder::SHRDOp(OpcodeArgs) { else Shift = _And(Shift, _Constant(0x1F)); - auto ShiftLeft = _Sub(_Constant(Size), Shift); + auto ShiftLeft = _Sub(_Constant(Size-1), Shift); OrderedNode *Res{}; auto Tmp1 = _Lshr(Dest, Shift); auto Tmp2 = _Lshl(Src, ShiftLeft); + Tmp2 = _Lshl(Tmp2, _Constant(1)); Res = _Or(Tmp1, Tmp2); StoreResult(GPRClass, Op, Res, -1); - GenerateFlags_ShiftRight(Op, _Bfe(Size, 0, Res), _Bfe(Size, 0, Dest), _Bfe(Size, 0, Src)); + GenerateFlags_ShiftRight(Op, _Bfe(Size, 0, Res), _Bfe(Size, 0, Dest), _Bfe(Size, 0, Shift)); } void OpDispatchBuilder::SHRDImmediateOp(OpcodeArgs) {