aboutsummaryrefslogtreecommitdiff
path: root/src/zig_llvm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zig_llvm.cpp')
-rw-r--r--src/zig_llvm.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp
index 852475c3c4..7ecb717047 100644
--- a/src/zig_llvm.cpp
+++ b/src/zig_llvm.cpp
@@ -1096,6 +1096,56 @@ bool ZigLLDLink(ZigLLVM_ObjectFormatType oformat, const char **args, size_t arg_
abort();
}
+static AtomicRMWInst::BinOp toLLVMRMWBinOp(enum ZigLLVM_AtomicRMWBinOp BinOp) {
+ switch (BinOp) {
+ default:
+ case ZigLLVMAtomicRMWBinOpXchg: return AtomicRMWInst::Xchg;
+ case ZigLLVMAtomicRMWBinOpAdd: return AtomicRMWInst::Add;
+ case ZigLLVMAtomicRMWBinOpSub: return AtomicRMWInst::Sub;
+ case ZigLLVMAtomicRMWBinOpAnd: return AtomicRMWInst::And;
+ case ZigLLVMAtomicRMWBinOpNand: return AtomicRMWInst::Nand;
+ case ZigLLVMAtomicRMWBinOpOr: return AtomicRMWInst::Or;
+ case ZigLLVMAtomicRMWBinOpXor: return AtomicRMWInst::Xor;
+ case ZigLLVMAtomicRMWBinOpMax: return AtomicRMWInst::Max;
+ case ZigLLVMAtomicRMWBinOpMin: return AtomicRMWInst::Min;
+ case ZigLLVMAtomicRMWBinOpUMax: return AtomicRMWInst::UMax;
+ case ZigLLVMAtomicRMWBinOpUMin: return AtomicRMWInst::UMin;
+ case ZigLLVMAtomicRMWBinOpFAdd: return AtomicRMWInst::FAdd;
+ case ZigLLVMAtomicRMWBinOpFSub: return AtomicRMWInst::FSub;
+ }
+}
+
+static AtomicOrdering toLLVMOrdering(LLVMAtomicOrdering Ordering) {
+ switch (Ordering) {
+ default:
+ case LLVMAtomicOrderingNotAtomic: return AtomicOrdering::NotAtomic;
+ case LLVMAtomicOrderingUnordered: return AtomicOrdering::Unordered;
+ case LLVMAtomicOrderingMonotonic: return AtomicOrdering::Monotonic;
+ case LLVMAtomicOrderingAcquire: return AtomicOrdering::Acquire;
+ case LLVMAtomicOrderingRelease: return AtomicOrdering::Release;
+ case LLVMAtomicOrderingAcquireRelease: return AtomicOrdering::AcquireRelease;
+ case LLVMAtomicOrderingSequentiallyConsistent: return AtomicOrdering::SequentiallyConsistent;
+ }
+}
+
+inline LLVMAttributeRef wrap(Attribute Attr) {
+ return reinterpret_cast<LLVMAttributeRef>(Attr.getRawPointer());
+}
+
+inline Attribute unwrap(LLVMAttributeRef Attr) {
+ return Attribute::fromRawPointer(Attr);
+}
+
+LLVMValueRef ZigLLVMBuildAtomicRMW(LLVMBuilderRef B, enum ZigLLVM_AtomicRMWBinOp op,
+ LLVMValueRef PTR, LLVMValueRef Val,
+ LLVMAtomicOrdering ordering, LLVMBool singleThread)
+{
+ AtomicRMWInst::BinOp intop = toLLVMRMWBinOp(op);
+ return wrap(unwrap(B)->CreateAtomicRMW(intop, unwrap(PTR),
+ unwrap(Val), toLLVMOrdering(ordering),
+ singleThread ? SyncScope::SingleThread : SyncScope::System));
+}
+
static_assert((Triple::ArchType)ZigLLVM_UnknownArch == Triple::UnknownArch, "");
static_assert((Triple::ArchType)ZigLLVM_arm == Triple::arm, "");
static_assert((Triple::ArchType)ZigLLVM_armeb == Triple::armeb, "");