#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"
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; \
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; \
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)
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: