diff --git a/FEXCore/Source/Interface/Core/JIT/AtomicOps.cpp b/FEXCore/Source/Interface/Core/JIT/AtomicOps.cpp index aad0f5b9d..937083faf 100644 --- a/FEXCore/Source/Interface/Core/JIT/AtomicOps.cpp +++ b/FEXCore/Source/Interface/Core/JIT/AtomicOps.cpp @@ -138,108 +138,6 @@ DEF_OP(CAS) { } } -DEF_OP(AtomicAdd) { - auto Op = IROp->C(); - const auto EmitSize = ConvertSize(IROp); - const auto SubEmitSize = ConvertSubRegSize8(IROp->Size); - - auto MemSrc = GetReg(Op->Addr); - auto Src = GetReg(Op->Value); - - if (CTX->HostFeatures.SupportsAtomics) { - staddl(SubEmitSize, Src, MemSrc); - } else { - ARMEmitter::BackwardLabel LoopTop; - Bind(&LoopTop); - ldaxr(SubEmitSize, TMP2, MemSrc); - add(EmitSize, TMP2, TMP2, Src); - stlxr(SubEmitSize, TMP2, TMP2, MemSrc); - cbnz(EmitSize, TMP2, &LoopTop); - } -} - -DEF_OP(AtomicSub) { - auto Op = IROp->C(); - const auto EmitSize = ConvertSize(IROp); - const auto SubEmitSize = ConvertSubRegSize8(IROp->Size); - - auto MemSrc = GetReg(Op->Addr); - auto Src = GetReg(Op->Value); - - if (CTX->HostFeatures.SupportsAtomics) { - neg(EmitSize, TMP2, Src); - staddl(SubEmitSize, TMP2, MemSrc); - } else { - ARMEmitter::BackwardLabel LoopTop; - Bind(&LoopTop); - ldaxr(SubEmitSize, TMP2, MemSrc); - sub(EmitSize, TMP2, TMP2, Src); - stlxr(SubEmitSize, TMP2, TMP2, MemSrc); - cbnz(EmitSize, TMP2, &LoopTop); - } -} - -DEF_OP(AtomicAnd) { - auto Op = IROp->C(); - const auto EmitSize = ConvertSize(IROp); - const auto SubEmitSize = ConvertSubRegSize8(IROp->Size); - - auto MemSrc = GetReg(Op->Addr); - auto Src = GetReg(Op->Value); - - if (CTX->HostFeatures.SupportsAtomics) { - mvn(EmitSize, TMP2, Src); - stclrl(SubEmitSize, TMP2, MemSrc); - } else { - ARMEmitter::BackwardLabel LoopTop; - Bind(&LoopTop); - ldaxr(SubEmitSize, TMP2, MemSrc); - and_(EmitSize, TMP2, TMP2, Src); - stlxr(SubEmitSize, TMP2, TMP2, MemSrc); - cbnz(EmitSize, TMP2, &LoopTop); - } -} - -DEF_OP(AtomicCLR) { - auto Op = IROp->C(); - const auto EmitSize = ConvertSize(IROp); - const auto SubEmitSize = ConvertSubRegSize8(IROp->Size); - - auto MemSrc = GetReg(Op->Addr); - auto Src = GetReg(Op->Value); - - if (CTX->HostFeatures.SupportsAtomics) { - stclrl(SubEmitSize, Src, MemSrc); - } else { - ARMEmitter::BackwardLabel LoopTop; - Bind(&LoopTop); - ldaxr(SubEmitSize, TMP2, MemSrc); - bic(EmitSize, TMP2, TMP2, Src); - stlxr(SubEmitSize, TMP2, TMP2, MemSrc); - cbnz(EmitSize, TMP2, &LoopTop); - } -} - -DEF_OP(AtomicOr) { - auto Op = IROp->C(); - const auto EmitSize = ConvertSize(IROp); - const auto SubEmitSize = ConvertSubRegSize8(IROp->Size); - - auto MemSrc = GetReg(Op->Addr); - auto Src = GetReg(Op->Value); - - if (CTX->HostFeatures.SupportsAtomics) { - stsetl(SubEmitSize, Src, MemSrc); - } else { - ARMEmitter::BackwardLabel LoopTop; - Bind(&LoopTop); - ldaxr(SubEmitSize, TMP2, MemSrc); - orr(EmitSize, TMP2, TMP2, Src); - stlxr(SubEmitSize, TMP2, TMP2, MemSrc); - cbnz(EmitSize, TMP2, &LoopTop); - } -} - DEF_OP(AtomicXor) { auto Op = IROp->C(); const auto EmitSize = ConvertSize(IROp); @@ -260,21 +158,6 @@ DEF_OP(AtomicXor) { } } -DEF_OP(AtomicNeg) { - auto Op = IROp->C(); - const auto EmitSize = ConvertSize(IROp); - const auto SubEmitSize = ConvertSubRegSize8(IROp->Size); - - auto MemSrc = GetReg(Op->Addr); - - ARMEmitter::BackwardLabel LoopTop; - Bind(&LoopTop); - ldaxr(SubEmitSize, TMP2, MemSrc); - neg(EmitSize, TMP3, TMP2); - stlxr(SubEmitSize, TMP4, TMP3, MemSrc); - cbnz(EmitSize, TMP4, &LoopTop); -} - DEF_OP(AtomicSwap) { auto Op = IROp->C(); const auto OpSize = IROp->Size; diff --git a/FEXCore/Source/Interface/IR/IR.json b/FEXCore/Source/Interface/IR/IR.json index ad6ee2f6d..651411257 100644 --- a/FEXCore/Source/Interface/IR/IR.json +++ b/FEXCore/Source/Interface/IR/IR.json @@ -826,56 +826,6 @@ "Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit" ] }, - "AtomicAdd OpSize:#Size, GPR:$Value, GPR:$Addr": { - "HasSideEffects": true, - "Desc": ["Atomic integer add", - "IR layout must match Fetch-variant, otherwise DCE IR optimization breaks!" - ], - "DestSize": "Size", - "EmitValidation": [ - "Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit" - ] - }, - "AtomicSub OpSize:#Size, GPR:$Value, GPR:$Addr": { - "HasSideEffects": true, - "Desc": ["Atomic integer sub", - "IR layout must match Fetch-variant, otherwise DCE IR optimization breaks!" - ], - "DestSize": "Size", - "EmitValidation": [ - "Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit" - ] - }, - "AtomicAnd OpSize:#Size, GPR:$Value, GPR:$Addr": { - "HasSideEffects": true, - "Desc": ["Atomic integer and", - "IR layout must match Fetch-variant, otherwise DCE IR optimization breaks!" - ], - "DestSize": "Size", - "EmitValidation": [ - "Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit" - ] - }, - "AtomicCLR OpSize:#Size, GPR:$Value, GPR:$Addr": { - "HasSideEffects": true, - "Desc": ["Atomic integer binary clear", - "IR layout must match Fetch-variant, otherwise DCE IR optimization breaks!" - ], - "DestSize": "Size", - "EmitValidation": [ - "Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit" - ] - }, - "AtomicOr OpSize:#Size, GPR:$Value, GPR:$Addr": { - "HasSideEffects": true, - "Desc": ["Atomic integer or", - "IR layout must match Fetch-variant, otherwise DCE IR optimization breaks!" - ], - "DestSize": "Size", - "EmitValidation": [ - "Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit" - ] - }, "AtomicXor OpSize:#Size, GPR:$Value, GPR:$Addr": { "HasSideEffects": true, "Desc": ["Atomic integer xor", @@ -886,16 +836,6 @@ "Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit" ] }, - "AtomicNeg OpSize:#Size, GPR:$Addr": { - "HasSideEffects": true, - "Desc": ["Atomic integer two's complement negate", - "IR layout must match Fetch-variant, otherwise DCE IR optimization breaks!" - ], - "DestSize": "Size", - "EmitValidation": [ - "Size == FEXCore::IR::OpSize::i8Bit || Size == FEXCore::IR::OpSize::i16Bit || Size == FEXCore::IR::OpSize::i32Bit || Size == FEXCore::IR::OpSize::i64Bit" - ] - }, "GPR = AtomicSwap OpSize:#Size, GPR:$Value, GPR:$Addr": { "HasSideEffects": true, "Desc": ["Atomic integer swap"