LLVMValueRef
mono_llvm_build_load (LLVMBuilderRef builder, LLVMValueRef PointerVal,
- const char *Name, gboolean is_volatile)
+ const char *Name, gboolean is_volatile, BarrierKind barrier)
{
- return wrap(unwrap(builder)->CreateLoad(unwrap(PointerVal), is_volatile, Name));
+ LoadInst *ins = unwrap(builder)->CreateLoad(unwrap(PointerVal), is_volatile, Name);
+
+ switch (barrier) {
+ case LLVM_BARRIER_NONE:
+ break;
+ case LLVM_BARRIER_ACQ:
+ ins->setOrdering(Acquire);
+ break;
+ case LLVM_BARRIER_SEQ:
+ ins->setOrdering(SequentiallyConsistent);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ return wrap(ins);
}
LLVMValueRef
LLVMValueRef
mono_llvm_build_store (LLVMBuilderRef builder, LLVMValueRef Val, LLVMValueRef PointerVal,
- gboolean is_volatile)
+ gboolean is_volatile, BarrierKind barrier)
{
- return wrap(unwrap(builder)->CreateStore(unwrap(Val), unwrap(PointerVal), is_volatile));
+ StoreInst *ins = unwrap(builder)->CreateStore(unwrap(Val), unwrap(PointerVal), is_volatile);
+
+ switch (barrier) {
+ case LLVM_BARRIER_NONE:
+ break;
+ case LLVM_BARRIER_REL:
+ ins->setOrdering(Release);
+ break;
+ case LLVM_BARRIER_SEQ:
+ ins->setOrdering(SequentiallyConsistent);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ return wrap(ins);
}
LLVMValueRef
break;
}
- ins = unwrap (builder)->CreateAtomicRMW (aop, unwrap (ptr), unwrap (val), AcquireRelease);
+ ins = unwrap (builder)->CreateAtomicRMW (aop, unwrap (ptr), unwrap (val), SequentiallyConsistent);
return wrap (ins);
}
LLVMValueRef
-mono_llvm_build_fence (LLVMBuilderRef builder)
+mono_llvm_build_fence (LLVMBuilderRef builder, BarrierKind kind)
{
FenceInst *ins;
+ AtomicOrdering ordering;
+
+ g_assert (kind != LLVM_BARRIER_NONE);
+
+ switch (kind) {
+ case LLVM_BARRIER_ACQ:
+ ordering = Acquire;
+ break;
+ case LLVM_BARRIER_REL:
+ ordering = Release;
+ break;
+ case LLVM_BARRIER_SEQ:
+ ordering = SequentiallyConsistent;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
- ins = unwrap (builder)->CreateFence (AcquireRelease);
+ ins = unwrap (builder)->CreateFence (ordering);
return wrap (ins);
}