diff --git a/FEXCore/Source/Interface/Core/JIT/Arm64/MemoryOps.cpp b/FEXCore/Source/Interface/Core/JIT/Arm64/MemoryOps.cpp index 40472ac20..6a2fe7118 100644 --- a/FEXCore/Source/Interface/Core/JIT/Arm64/MemoryOps.cpp +++ b/FEXCore/Source/Interface/Core/JIT/Arm64/MemoryOps.cpp @@ -1708,7 +1708,7 @@ DEF_OP(MemSet) { DirectionReg = GetReg(Op->Direction.ID()); } - // If Direction == 0 then: + // If Direction > 0 then: // MemReg is incremented (by size) // else: // MemReg is decremented (by size) @@ -1729,7 +1729,7 @@ DEF_OP(MemSet) { if (!DirectionIsInline) { // Backward or forwards implementation depends on flag - cbnz(ARMEmitter::Size::i64Bit, DirectionReg, &BackwardImpl); + tbnz(DirectionReg, 1, &BackwardImpl); } auto MemStore = [this](auto Value, uint32_t OpSize, int32_t Size) { @@ -1847,8 +1847,8 @@ DEF_OP(MemSet) { }; if (DirectionIsInline) { - // If the direction constant is set then the direction is negative. - EmitMemset(DirectionConstant ? -1 : 1); + LOGMAN_THROW_AA_FMT(DirectionConstant == 1 || DirectionConstant == -1, "unexpected direction"); + EmitMemset(DirectionConstant); } else { // Emit forward direction memset then backward direction memset. @@ -1886,7 +1886,7 @@ DEF_OP(MemCpy) { } auto Dst = GetRegPair(Node); - // If Direction == 0 then: + // If Direction > 0 then: // MemRegDest is incremented (by size) // MemRegSrc is incremented (by size) // else: @@ -1922,7 +1922,7 @@ DEF_OP(MemCpy) { if (!DirectionIsInline) { // Backward or forwards implementation depends on flag - cbnz(ARMEmitter::Size::i64Bit, DirectionReg, &BackwardImpl); + tbnz(DirectionReg, 1, &BackwardImpl); } auto MemCpy = [this](uint32_t OpSize, int32_t Size) { @@ -2121,8 +2121,8 @@ DEF_OP(MemCpy) { }; if (DirectionIsInline) { - // If the direction constant is set then the direction is negative. - EmitMemcpy(DirectionConstant ? -1 : 1); + LOGMAN_THROW_AA_FMT(DirectionConstant == 1 || DirectionConstant == -1, "unexpected direction"); + EmitMemcpy(DirectionConstant); } else { // Emit forward direction memset then backward direction memset. diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 61668099d..48cb08966 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -3651,9 +3651,8 @@ void OpDispatchBuilder::STOSOp(OpcodeArgs) { auto Segment = GetSegment(0, FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX, true); OrderedNode *Counter = LoadGPRRegister(X86State::REG_RCX); - auto DF = GetRFLAG(FEXCore::X86State::RFLAG_DF_LOC); - auto Result = _MemSet(CTX->IsAtomicTSOEnabled(), Size, Segment ?: InvalidNode, Dest, Src, Counter, DF); + auto Result = _MemSet(CTX->IsAtomicTSOEnabled(), Size, Segment ?: InvalidNode, Dest, Src, Counter, LoadDir(1)); StoreGPRRegister(X86State::REG_RCX, _Constant(0)); StoreGPRRegister(X86State::REG_RDI, Result); } @@ -3677,11 +3676,11 @@ void OpDispatchBuilder::MOVSOp(OpcodeArgs) { auto DstSegment = GetSegment(0, FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX, true); auto SrcSegment = GetSegment(Op->Flags, FEXCore::X86Tables::DecodeFlags::FLAG_DS_PREFIX); - auto DF = GetRFLAG(FEXCore::X86State::RFLAG_DF_LOC); auto Result = _MemCpy(CTX->IsAtomicTSOEnabled(), Size, DstSegment ?: InvalidNode, SrcSegment ?: InvalidNode, - DstAddr, SrcAddr, Counter, DF); + DstAddr, SrcAddr, Counter, + LoadDir(1)); OrderedNode *Result_Dst = _ExtractElementPair(OpSize::i64Bit, Result, 0); OrderedNode *Result_Src = _ExtractElementPair(OpSize::i64Bit, Result, 1); diff --git a/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp b/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp index b27d70210..2a2706091 100644 --- a/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp +++ b/FEXCore/Source/Interface/IR/Passes/ConstProp.cpp @@ -1330,7 +1330,7 @@ bool ConstProp::ConstantInlining(IREmitter *IREmit, const IRListView& CurrentIR) if (IREmit->IsValueConstant(Op->Direction, &Constant)) { IREmit->SetWriteCursor(CurrentIR.GetNode(Op->Direction)); - IREmit->ReplaceNodeArgument(CodeNode, Op->Direction_Index, CreateInlineConstant(IREmit, Constant & 1)); + IREmit->ReplaceNodeArgument(CodeNode, Op->Direction_Index, CreateInlineConstant(IREmit, Constant)); Changed = true; } @@ -1344,7 +1344,7 @@ bool ConstProp::ConstantInlining(IREmitter *IREmit, const IRListView& CurrentIR) if (IREmit->IsValueConstant(Op->Direction, &Constant)) { IREmit->SetWriteCursor(CurrentIR.GetNode(Op->Direction)); - IREmit->ReplaceNodeArgument(CodeNode, Op->Direction_Index, CreateInlineConstant(IREmit, Constant & 1)); + IREmit->ReplaceNodeArgument(CodeNode, Op->Direction_Index, CreateInlineConstant(IREmit, Constant)); Changed = true; }