45 Builder.CreateAlignedLoad(Val->
getType(), Ptr, Alignment, IsVolatile);
46 Value *Equal = Builder.CreateICmpEQ(Orig, Cmp);
51 Builder.CreateSelectWithUnknownProfile(Equal, Val, Orig,
DEBUG_TYPE);
52 Builder.CreateAlignedStore(Res, Ptr, Alignment, IsVolatile);
65 return Builder.CreateAdd(Loaded, Val,
"new");
67 return Builder.CreateSub(Loaded, Val,
"new");
69 return Builder.CreateAnd(Loaded, Val,
"new");
71 return Builder.CreateNot(Builder.CreateAnd(Loaded, Val),
"new");
73 return Builder.CreateOr(Loaded, Val,
"new");
75 return Builder.CreateXor(Loaded, Val,
"new");
77 NewVal = Builder.CreateICmpSGT(Loaded, Val);
78 return Builder.CreateSelect(NewVal, Loaded, Val,
"new");
80 NewVal = Builder.CreateICmpSLE(Loaded, Val);
81 return Builder.CreateSelect(NewVal, Loaded, Val,
"new");
83 NewVal = Builder.CreateICmpUGT(Loaded, Val);
84 return Builder.CreateSelect(NewVal, Loaded, Val,
"new");
86 NewVal = Builder.CreateICmpULE(Loaded, Val);
87 return Builder.CreateSelect(NewVal, Loaded, Val,
"new");
89 return Builder.CreateFAdd(Loaded, Val,
"new");
91 return Builder.CreateFSub(Loaded, Val,
"new");
93 return Builder.CreateMaxNum(Loaded, Val);
95 return Builder.CreateMinNum(Loaded, Val);
97 return Builder.CreateMaximum(Loaded, Val);
99 return Builder.CreateMinimum(Loaded, Val);
101 return Builder.CreateMaximumNum(Loaded, Val);
103 return Builder.CreateMinimumNum(Loaded, Val);
105 Constant *One = ConstantInt::get(Loaded->getType(), 1);
106 Value *Inc = Builder.CreateAdd(Loaded, One);
107 Value *Cmp = Builder.CreateICmpUGE(Loaded, Val);
108 Constant *Zero = ConstantInt::get(Loaded->getType(), 0);
109 return Builder.CreateSelect(Cmp, Zero, Inc,
"new");
112 Constant *Zero = ConstantInt::get(Loaded->getType(), 0);
113 Constant *One = ConstantInt::get(Loaded->getType(), 1);
115 Value *Dec = Builder.CreateSub(Loaded, One);
116 Value *CmpEq0 = Builder.CreateICmpEQ(Loaded, Zero);
117 Value *CmpOldGtVal = Builder.CreateICmpUGT(Loaded, Val);
118 Value *
Or = Builder.CreateOr(CmpEq0, CmpOldGtVal);
119 return Builder.CreateSelect(
Or, Val, Dec,
"new");
122 Value *Cmp = Builder.CreateICmpUGE(Loaded, Val);
123 Value *
Sub = Builder.CreateSub(Loaded, Val);
124 return Builder.CreateSelect(Cmp,
Sub, Loaded,
"new");
127 return Builder.CreateIntrinsic(Intrinsic::usub_sat, Loaded->getType(),
128 {Loaded, Val},
nullptr,
"new");
LLVM_ABI Value * buildAtomicRMWValue(AtomicRMWInst::BinOp Op, IRBuilderBase &Builder, Value *Loaded, Value *Val)
Emit IR to implement the given atomicrmw operation on values in registers, returning the new value.
LLVM_ABI std::pair< Value *, Value * > buildCmpXchgValue(IRBuilderBase &Builder, Value *Ptr, Value *Cmp, Value *Val, Align Alignment, bool IsVolatile=false)
Emit IR to implement the given cmpxchg operation on values in registers, returning the new value.