@@ -3527,6 +3527,47 @@ static LLVMAtomicOrdering mapToLLVMOrdering(AtomicOrdering Ordering) {
3527
3527
llvm_unreachable (" Invalid AtomicOrdering value!" );
3528
3528
}
3529
3529
3530
+ static AtomicRMWInst::BinOp mapFromLLVMRMWBinOp (LLVMAtomicRMWBinOp BinOp) {
3531
+ switch (BinOp) {
3532
+ case LLVMAtomicRMWBinOpXchg: return AtomicRMWInst::Xchg;
3533
+ case LLVMAtomicRMWBinOpAdd: return AtomicRMWInst::Add;
3534
+ case LLVMAtomicRMWBinOpSub: return AtomicRMWInst::Sub;
3535
+ case LLVMAtomicRMWBinOpAnd: return AtomicRMWInst::And;
3536
+ case LLVMAtomicRMWBinOpNand: return AtomicRMWInst::Nand;
3537
+ case LLVMAtomicRMWBinOpOr: return AtomicRMWInst::Or;
3538
+ case LLVMAtomicRMWBinOpXor: return AtomicRMWInst::Xor;
3539
+ case LLVMAtomicRMWBinOpMax: return AtomicRMWInst::Max;
3540
+ case LLVMAtomicRMWBinOpMin: return AtomicRMWInst::Min;
3541
+ case LLVMAtomicRMWBinOpUMax: return AtomicRMWInst::UMax;
3542
+ case LLVMAtomicRMWBinOpUMin: return AtomicRMWInst::UMin;
3543
+ case LLVMAtomicRMWBinOpFAdd: return AtomicRMWInst::FAdd;
3544
+ case LLVMAtomicRMWBinOpFSub: return AtomicRMWInst::FSub;
3545
+ }
3546
+
3547
+ llvm_unreachable (" Invalid LLVMAtomicRMWBinOp value!" );
3548
+ }
3549
+
3550
+ static LLVMAtomicRMWBinOp mapToLLVMRMWBinOp (AtomicRMWInst::BinOp BinOp) {
3551
+ switch (BinOp) {
3552
+ case AtomicRMWInst::Xchg: return LLVMAtomicRMWBinOpXchg;
3553
+ case AtomicRMWInst::Add: return LLVMAtomicRMWBinOpAdd;
3554
+ case AtomicRMWInst::Sub: return LLVMAtomicRMWBinOpSub;
3555
+ case AtomicRMWInst::And: return LLVMAtomicRMWBinOpAnd;
3556
+ case AtomicRMWInst::Nand: return LLVMAtomicRMWBinOpNand;
3557
+ case AtomicRMWInst::Or: return LLVMAtomicRMWBinOpOr;
3558
+ case AtomicRMWInst::Xor: return LLVMAtomicRMWBinOpXor;
3559
+ case AtomicRMWInst::Max: return LLVMAtomicRMWBinOpMax;
3560
+ case AtomicRMWInst::Min: return LLVMAtomicRMWBinOpMin;
3561
+ case AtomicRMWInst::UMax: return LLVMAtomicRMWBinOpUMax;
3562
+ case AtomicRMWInst::UMin: return LLVMAtomicRMWBinOpUMin;
3563
+ case AtomicRMWInst::FAdd: return LLVMAtomicRMWBinOpFAdd;
3564
+ case AtomicRMWInst::FSub: return LLVMAtomicRMWBinOpFSub;
3565
+ default : break ;
3566
+ }
3567
+
3568
+ llvm_unreachable (" Invalid AtomicRMWBinOp value!" );
3569
+ }
3570
+
3530
3571
// TODO: Should this and other atomic instructions support building with
3531
3572
// "syncscope"?
3532
3573
LLVMValueRef LLVMBuildFence (LLVMBuilderRef B, LLVMAtomicOrdering Ordering,
@@ -3602,23 +3643,41 @@ LLVMBool LLVMGetVolatile(LLVMValueRef MemAccessInst) {
3602
3643
Value *P = unwrap<Value>(MemAccessInst);
3603
3644
if (LoadInst *LI = dyn_cast<LoadInst>(P))
3604
3645
return LI->isVolatile ();
3605
- return cast<StoreInst>(P)->isVolatile ();
3646
+ if (StoreInst *SI = dyn_cast<StoreInst>(P))
3647
+ return SI->isVolatile ();
3648
+ if (AtomicRMWInst *AI = dyn_cast<AtomicRMWInst>(P))
3649
+ return AI->isVolatile ();
3650
+ return cast<AtomicCmpXchgInst>(P)->isVolatile ();
3606
3651
}
3607
3652
3608
3653
void LLVMSetVolatile (LLVMValueRef MemAccessInst, LLVMBool isVolatile) {
3609
3654
Value *P = unwrap<Value>(MemAccessInst);
3610
3655
if (LoadInst *LI = dyn_cast<LoadInst>(P))
3611
3656
return LI->setVolatile (isVolatile);
3612
- return cast<StoreInst>(P)->setVolatile (isVolatile);
3657
+ if (StoreInst *SI = dyn_cast<StoreInst>(P))
3658
+ return SI->setVolatile (isVolatile);
3659
+ if (AtomicRMWInst *AI = dyn_cast<AtomicRMWInst>(P))
3660
+ return AI->setVolatile (isVolatile);
3661
+ return cast<AtomicCmpXchgInst>(P)->setVolatile (isVolatile);
3662
+ }
3663
+
3664
+ LLVMBool LLVMGetWeak (LLVMValueRef CmpXchgInst) {
3665
+ return unwrap<AtomicCmpXchgInst>(CmpXchgInst)->isWeak ();
3666
+ }
3667
+
3668
+ void LLVMSetWeak (LLVMValueRef CmpXchgInst, LLVMBool isWeak) {
3669
+ return unwrap<AtomicCmpXchgInst>(CmpXchgInst)->setWeak (isWeak);
3613
3670
}
3614
3671
3615
3672
LLVMAtomicOrdering LLVMGetOrdering (LLVMValueRef MemAccessInst) {
3616
3673
Value *P = unwrap<Value>(MemAccessInst);
3617
3674
AtomicOrdering O;
3618
3675
if (LoadInst *LI = dyn_cast<LoadInst>(P))
3619
3676
O = LI->getOrdering ();
3677
+ else if (StoreInst *SI = dyn_cast<StoreInst>(P))
3678
+ O = SI->getOrdering ();
3620
3679
else
3621
- O = cast<StoreInst >(P)->getOrdering ();
3680
+ O = cast<AtomicRMWInst >(P)->getOrdering ();
3622
3681
return mapToLLVMOrdering (O);
3623
3682
}
3624
3683
@@ -3631,6 +3690,14 @@ void LLVMSetOrdering(LLVMValueRef MemAccessInst, LLVMAtomicOrdering Ordering) {
3631
3690
return cast<StoreInst>(P)->setOrdering (O);
3632
3691
}
3633
3692
3693
+ LLVMAtomicRMWBinOp LLVMGetAtomicRMWBinOp (LLVMValueRef Inst) {
3694
+ return mapToLLVMRMWBinOp (unwrap<AtomicRMWInst>(Inst)->getOperation ());
3695
+ }
3696
+
3697
+ void LLVMSetAtomicRMWBinOp (LLVMValueRef Inst, LLVMAtomicRMWBinOp BinOp) {
3698
+ unwrap<AtomicRMWInst>(Inst)->setOperation (mapFromLLVMRMWBinOp (BinOp));
3699
+ }
3700
+
3634
3701
/* --.. Casts ...............................................................--*/
3635
3702
3636
3703
LLVMValueRef LLVMBuildTrunc (LLVMBuilderRef B, LLVMValueRef Val,
@@ -3849,20 +3916,7 @@ LLVMValueRef LLVMBuildAtomicRMW(LLVMBuilderRef B,LLVMAtomicRMWBinOp op,
3849
3916
LLVMValueRef PTR, LLVMValueRef Val,
3850
3917
LLVMAtomicOrdering ordering,
3851
3918
LLVMBool singleThread) {
3852
- AtomicRMWInst::BinOp intop;
3853
- switch (op) {
3854
- case LLVMAtomicRMWBinOpXchg: intop = AtomicRMWInst::Xchg; break ;
3855
- case LLVMAtomicRMWBinOpAdd: intop = AtomicRMWInst::Add; break ;
3856
- case LLVMAtomicRMWBinOpSub: intop = AtomicRMWInst::Sub; break ;
3857
- case LLVMAtomicRMWBinOpAnd: intop = AtomicRMWInst::And; break ;
3858
- case LLVMAtomicRMWBinOpNand: intop = AtomicRMWInst::Nand; break ;
3859
- case LLVMAtomicRMWBinOpOr: intop = AtomicRMWInst::Or; break ;
3860
- case LLVMAtomicRMWBinOpXor: intop = AtomicRMWInst::Xor; break ;
3861
- case LLVMAtomicRMWBinOpMax: intop = AtomicRMWInst::Max; break ;
3862
- case LLVMAtomicRMWBinOpMin: intop = AtomicRMWInst::Min; break ;
3863
- case LLVMAtomicRMWBinOpUMax: intop = AtomicRMWInst::UMax; break ;
3864
- case LLVMAtomicRMWBinOpUMin: intop = AtomicRMWInst::UMin; break ;
3865
- }
3919
+ AtomicRMWInst::BinOp intop = mapFromLLVMRMWBinOp (op);
3866
3920
return wrap (unwrap (B)->CreateAtomicRMW (intop, unwrap (PTR), unwrap (Val),
3867
3921
mapFromLLVMOrdering (ordering), singleThread ? SyncScope::SingleThread
3868
3922
: SyncScope::System));
0 commit comments