[interp] implement CEE_MONO_{TLS,ATOMIC_STORE_I4}
authorBernhard Urban <bernhard.urban@xamarin.com>
Wed, 26 Apr 2017 15:21:28 +0000 (17:21 +0200)
committerBernhard Urban <bernhard.urban@xamarin.com>
Fri, 28 Apr 2017 18:52:06 +0000 (20:52 +0200)
so we can execute the alloc wrapper

mono/mini/interp/interp.c
mono/mini/interp/mintops.def
mono/mini/interp/transform.c

index 4fc20983886d6616716d7691ba7ef255e83bce18..30412ffb4c9d94056c31b1babec2b77498d974ae 100644 (file)
@@ -57,6 +57,7 @@
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/environment.h>
 #include <mono/metadata/mono-debug.h>
+#include <mono/utils/atomic.h>
 
 #include "interp.h"
 #include "interp-internals.h"
@@ -3101,6 +3102,11 @@ ves_exec_method_with_context (MonoInvocation *frame, ThreadContext *context, uns
                        sp -= 2;
                        * (double *) sp->data.p = sp[1].data.f;
                        MINT_IN_BREAK;
+               MINT_IN_CASE(MINT_MONO_ATOMIC_STORE_I4)
+                       ++ip;
+                       sp -= 2;
+                       InterlockedWrite ((gint32 *) sp->data.p, sp [1].data.i);
+                       MINT_IN_BREAK;
 #define BINOP(datamem, op) \
        --sp; \
        sp [-1].data.datamem = sp [-1].data.datamem op sp [0].data.datamem; \
@@ -4340,6 +4346,13 @@ array_constructed:
                        if (sp > frame->stack)
                                g_warning ("retobj: more values on stack: %d", sp-frame->stack);
                        goto exit_frame;
+               MINT_IN_CASE(MINT_MONO_TLS) {
+                       MonoTlsKey key = *(gint32 *)(ip + 1);
+                       sp->data.p = ((gpointer (*)()) mono_tls_get_tls_getter (key, FALSE)) ();
+                       sp++;
+                       ip += 3;
+                       MINT_IN_BREAK;
+               }
 
 #define RELOP(datamem, op) \
        --sp; \
index ded690d7410d239a807ec95c44c7c01d9bb1b429..ec0fda2f8ca0c08c94050aee916e56e4593d470b 100644 (file)
@@ -508,9 +508,12 @@ OPDEF(MINT_ICALL_PI_P, "mono_icall_pi_p", 2, MintOpClassToken)
 OPDEF(MINT_ICALL_PPP_V, "mono_icall_ppp_v", 2, MintOpClassToken)
 OPDEF(MINT_ICALL_PPI_V, "mono_icall_ppi_v", 2, MintOpClassToken)
 OPDEF(MINT_MONO_LDPTR, "mono_ldptr", 2, MintOpClassToken) 
+OPDEF(MINT_MONO_TLS, "mono_tls", 2, MintOpInt)
 OPDEF(MINT_MONO_NEWOBJ, "mono_newobj", 2, MintOpClassToken)
 OPDEF(MINT_MONO_RETOBJ, "mono_retobj", 1, MintOpNoArgs)
 OPDEF(MINT_MONO_FREE, "mono_free", 1, MintOpNoArgs)
 
+OPDEF(MINT_MONO_ATOMIC_STORE_I4, "mono_atomic.store.i4", 1, MintOpNoArgs)
+
 // FIXME: MintOp
 OPDEF(MINT_JIT_CALL, "mono_jit_call", 2, MintOpNoArgs)
index 9387e5f2f1377f046ae9dd8bb5b2c921a2458b1d..8b692e51f82f17b2ae409f7f2067381731d336cf 100644 (file)
@@ -2985,6 +2985,21 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                                g_assert(klass->valuetype);
                                SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_MP);
                                break;
+                       case CEE_MONO_TLS: {
+                               gint32 key = read32 (td.ip + 1);
+                               td.ip += 5;
+                               g_assert (key < TLS_KEY_NUM);
+                               ADD_CODE (&td, MINT_MONO_TLS);
+                               WRITE32 (&td, &key);
+                               PUSH_SIMPLE_TYPE (&td, STACK_TYPE_MP);
+                               break;
+                       }
+                       case CEE_MONO_ATOMIC_STORE_I4:
+                               CHECK_STACK (&td, 2);
+                               SIMPLE_OP (td, MINT_MONO_ATOMIC_STORE_I4);
+                               td.sp -= 2;
+                               td.ip++;
+                               break;
                        case CEE_MONO_SAVE_LMF:
                        case CEE_MONO_RESTORE_LMF:
                        case CEE_MONO_NOT_TAKEN: