s390x-codegen.h : Fix instruction definition and add instruction format variant
[mono.git] / mono / mini / mini-llvm-cpp.cpp
index bf5e16f8fac47d2e005ca5c7c4e2f205cc2513c8..f11db19bc9620eabc37089ab0ddecd5f7fb1f77d 100644 (file)
@@ -318,9 +318,25 @@ mono_llvm_build_alloca (LLVMBuilderRef builder, LLVMTypeRef Ty,
 
 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 
@@ -337,9 +353,25 @@ mono_llvm_build_aligned_load (LLVMBuilderRef builder, LLVMValueRef PointerVal,
 
 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 
@@ -385,16 +417,34 @@ mono_llvm_build_atomic_rmw (LLVMBuilderRef builder, AtomicRMWOp op, 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);
 }