[llvm] [PowerPC] enable AtomicExpandImpl::expandAtomicCmpXchg for powerpc (PR #142395)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 4 18:01:16 PDT 2025
================
@@ -12672,6 +12676,77 @@ static Instruction *callIntrinsic(IRBuilderBase &Builder, Intrinsic::ID Id) {
return Builder.CreateIntrinsic(Id, {});
}
+Value *PPCTargetLowering::emitLoadLinked(IRBuilderBase &Builder, Type *ValueTy,
+ Value *Addr,
+ AtomicOrdering Ord) const {
+ unsigned SZ = ValueTy->getPrimitiveSizeInBits();
+
+ assert((SZ == 8 || SZ == 16 || SZ == 32 || SZ == 64) &&
+ "Only 8/16/32/64-bit atomic loads supported");
+ Intrinsic::ID IntID;
+ switch (SZ) {
+ default:
+ llvm_unreachable("Unexpected PrimitiveSize");
+ case 8:
+ IntID = Intrinsic::ppc_lbarx;
+ assert(Subtarget.hasPartwordAtomics() && "No support partword atomics.");
+ break;
+ case 16:
+ IntID = Intrinsic::ppc_lharx;
+ assert(Subtarget.hasPartwordAtomics() && "No support partword atomics.");
+ break;
+ case 32:
+ IntID = Intrinsic::ppc_lwarx;
+ break;
+ case 64:
+ IntID = Intrinsic::ppc_ldarx;
+ break;
+ }
+ Value *Call =
+ Builder.CreateIntrinsic(IntID, Addr, /*FMFSource=*/nullptr, "larx");
+
+ return Builder.CreateTruncOrBitCast(Call, ValueTy);
+}
+
+// Perform a store-conditional operation to Addr. Return the status of the
+// store. This should be 0 if the store succeeded, non-zero otherwise.
+Value *PPCTargetLowering::emitStoreConditional(IRBuilderBase &Builder,
+ Value *Val, Value *Addr,
+ AtomicOrdering Ord) const {
+ Type *Ty = Val->getType();
+ unsigned SZ = Ty->getPrimitiveSizeInBits();
+
+ assert((SZ == 8 || SZ == 16 || SZ == 32 || SZ == 64) &&
+ "Only 8/16/32/64-bit atomic loads supported");
+ Intrinsic::ID IntID;
+ switch (SZ) {
+ default:
+ llvm_unreachable("Unexpected PrimitiveSize");
+ case 8:
+ IntID = Intrinsic::ppc_stbcx;
+ assert(Subtarget.hasPartwordAtomics() && "No support partword atomics.");
+ break;
+ case 16:
+ IntID = Intrinsic::ppc_sthcx;
+ assert(Subtarget.hasPartwordAtomics() && "No support partword atomics.");
+ break;
+ case 32:
+ IntID = Intrinsic::ppc_stwcx;
+ break;
+ case 64:
+ IntID = Intrinsic::ppc_stdcx;
+ break;
+ }
+
+ if (SZ == 8 || SZ == 16)
+ Val = Builder.CreateZExt(Val, Builder.getIntNTy(32));;
----------------
arsenm wrote:
```suggestion
Val = Builder.CreateZExt(Val, Builder.getInt32Ty());
```
https://github.com/llvm/llvm-project/pull/142395
More information about the llvm-commits
mailing list