60 return Builder.CreateAdd(Loaded, Val,
"new");
62 return Builder.CreateSub(Loaded, Val,
"new");
64 return Builder.CreateAnd(Loaded, Val,
"new");
66 return Builder.CreateNot(Builder.CreateAnd(Loaded, Val),
"new");
68 return Builder.CreateOr(Loaded, Val,
"new");
70 return Builder.CreateXor(Loaded, Val,
"new");
72 NewVal = Builder.CreateICmpSGT(Loaded, Val);
73 return Builder.CreateSelect(NewVal, Loaded, Val,
"new");
75 NewVal = Builder.CreateICmpSLE(Loaded, Val);
76 return Builder.CreateSelect(NewVal, Loaded, Val,
"new");
78 NewVal = Builder.CreateICmpUGT(Loaded, Val);
79 return Builder.CreateSelect(NewVal, Loaded, Val,
"new");
81 NewVal = Builder.CreateICmpULE(Loaded, Val);
82 return Builder.CreateSelect(NewVal, Loaded, Val,
"new");
84 return Builder.CreateFAdd(Loaded, Val,
"new");
86 return Builder.CreateFSub(Loaded, Val,
"new");
88 return Builder.CreateMaxNum(Loaded, Val);
90 return Builder.CreateMinNum(Loaded, Val);
92 return Builder.CreateMaximum(Loaded, Val);
94 return Builder.CreateMinimum(Loaded, Val);
97 Value *Inc = Builder.CreateAdd(Loaded, One);
98 Value *Cmp = Builder.CreateICmpUGE(Loaded, Val);
100 return Builder.CreateSelect(Cmp, Zero, Inc,
"new");
106 Value *Dec = Builder.CreateSub(Loaded, One);
107 Value *CmpEq0 = Builder.CreateICmpEQ(Loaded, Zero);
108 Value *CmpOldGtVal = Builder.CreateICmpUGT(Loaded, Val);
109 Value *
Or = Builder.CreateOr(CmpEq0, CmpOldGtVal);
110 return Builder.CreateSelect(
Or, Val, Dec,
"new");
113 Value *Cmp = Builder.CreateICmpUGE(Loaded, Val);
114 Value *
Sub = Builder.CreateSub(Loaded, Val);
115 return Builder.CreateSelect(Cmp,
Sub, Loaded,
"new");
118 return Builder.CreateIntrinsic(Intrinsic::usub_sat, Loaded->
getType(),
119 {Loaded, Val},
nullptr,
"new");
std::pair< Value *, Value * > buildCmpXchgValue(IRBuilderBase &Builder, Value *Ptr, Value *Cmp, Value *Val, Align Alignment)
Emit IR to implement the given cmpxchg operation on values in registers, returning the new value.
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.