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.