[llvm] Enable support for the atomic store intrinsics when running with llvmonly.
authorZoltan Varga <vargaz@gmail.com>
Wed, 8 Jun 2016 18:58:07 +0000 (14:58 -0400)
committerZoltan Varga <vargaz@gmail.com>
Wed, 8 Jun 2016 18:58:15 +0000 (14:58 -0400)
mono/mini/mini-llvm.c

index ca7a3ce12b2ba071c84d3b0c1583c0cc56bf09cc..93dee86723df1fe88855b0770b1e2cc1100141e9 100644 (file)
@@ -2036,7 +2036,10 @@ emit_store_general (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builde
                args [4] = LLVMConstInt (LLVMInt32Type (), ordering, FALSE);
                emit_call (ctx, bb, builder_ref, get_intrinsic (ctx, intrins_name), args, 5);
        } else {
-               mono_llvm_build_store (*builder_ref, value, addr, is_faulting, barrier);
+               if (barrier != LLVM_BARRIER_NONE)
+                       mono_llvm_build_aligned_store (*builder_ref, value, addr, barrier, size);
+               else
+                       mono_llvm_build_store (*builder_ref, value, addr, is_faulting, barrier);
        }
 }
 
@@ -5478,9 +5481,6 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
                case OP_ATOMIC_STORE_U8:
                case OP_ATOMIC_STORE_R4:
                case OP_ATOMIC_STORE_R8: {
-                       set_failure (ctx, "atomic mono.store intrinsic");
-                       break;
-#if 0
                        int size;
                        gboolean sext, zext;
                        LLVMTypeRef t;
@@ -5488,6 +5488,11 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
                        BarrierKind barrier = (BarrierKind) ins->backend.memory_barrier_kind;
                        LLVMValueRef index, addr, value;
 
+                       if (!cfg->llvm_only) {
+                               set_failure (ctx, "atomic mono.store intrinsic");
+                               break;
+                       }
+
                        if (!values [ins->inst_destbasereg]) {
                            set_failure (ctx, "inst_destbasereg");
                                break;
@@ -5501,7 +5506,6 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
 
                        emit_store_general (ctx, bb, &builder, size, value, addr, is_volatile, barrier);
                        break;
-#endif
                }
                case OP_RELAXED_NOP: {
 #if defined(TARGET_AMD64) || defined(TARGET_X86)