[jit] Add mini_emit_memory_load that is to be used to lower CIL memory loads.
authorRodrigo Kumpera <kumpera@gmail.com>
Mon, 8 May 2017 23:09:28 +0000 (16:09 -0700)
committerRodrigo Kumpera <kumpera@gmail.com>
Mon, 8 May 2017 23:09:28 +0000 (16:09 -0700)
mono/mini/memory-access.c
mono/mini/mini.h

index 2f25005a0ca2ead56b2026a71774c1bb55cce8a1..8c948d2b9c5a2e728f517ec08a57af13691d32a2 100644 (file)
@@ -8,6 +8,8 @@
 
 #ifndef DISABLE_JIT
 
+#include <mono/utils/mono-memory-model.h>
+
 #include "mini.h"
 #include "ir-emit.h"
 
@@ -147,4 +149,20 @@ mini_emit_memcpy (MonoCompile *cfg, int destreg, int doffset, int srcreg, int so
        }
 }
 
+MonoInst*
+mini_emit_memory_load (MonoCompile *cfg, MonoType *type, MonoInst *src, int offset, int ins_flag)
+{
+       MonoInst *ins;
+
+       EMIT_NEW_LOAD_MEMBASE_TYPE (cfg, ins, type, src->dreg, offset);
+       ins->flags |= ins_flag;
+
+       if (ins_flag & MONO_INST_VOLATILE) {
+               /* Volatile loads have acquire semantics, see 12.6.7 in Ecma 335 */
+               mini_emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_ACQ);
+       }
+
+       return ins;
+}
+
 #endif
index e4a594183a480e78f11a9d658ae043ea0aadebb6..bfcf681b37420f21d94714c1865af61676e9b195 100644 (file)
@@ -2634,6 +2634,8 @@ MonoInst*         mini_emit_calli (MonoCompile *cfg, MonoMethodSignature *sig, M
 MonoInst*         mini_emit_memory_barrier (MonoCompile *cfg, int kind);
 void              mini_emit_write_barrier (MonoCompile *cfg, MonoInst *ptr, MonoInst *value);
 gboolean          mini_emit_wb_aware_memcpy (MonoCompile *cfg, MonoClass *klass, MonoInst *iargs[4], int size, int align);
+MonoInst*         mini_emit_memory_load (MonoCompile *cfg, MonoType *type, MonoInst *src, int offset, int ins_flag);
+
 MonoMethod*       mini_get_memcpy_method (void);
 MonoMethod*       mini_get_memset_method (void);
 int               mini_class_check_context_used (MonoCompile *cfg, MonoClass *klass);