From 47a0ad469b3961f75890fcca5bf1b80cc7881f84 Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Fri, 5 Apr 2019 22:10:16 +0300 Subject: [PATCH] [interp] Add intrinsics for common object methods (#13762) GetHashCode is 2x faster while GetType is 10x faster. --- mono/mini/interp/interp.c | 13 +++++++++++++ mono/mini/interp/mintops.def | 2 ++ mono/mini/interp/transform.c | 7 +++++++ 3 files changed, 22 insertions(+) diff --git a/mono/mini/interp/interp.c b/mono/mini/interp/interp.c index 1bbbf59e849..d367cf21139 100644 --- a/mono/mini/interp/interp.c +++ b/mono/mini/interp/interp.c @@ -6167,6 +6167,19 @@ interp_exec_method_full (InterpFrame *frame, ThreadContext *context, FrameClause MINT_IN_CASE(MINT_TAN) MATH_UNOP(tan); MINT_IN_BREAK; MINT_IN_CASE(MINT_TANH) MATH_UNOP(tanh); MINT_IN_BREAK; + MINT_IN_CASE(MINT_INTRINS_GET_HASHCODE) { + sp [-1].data.i = mono_object_hash_internal (sp [-1].data.o); + ip++; + MINT_IN_BREAK; + } + MINT_IN_CASE(MINT_INTRINS_GET_TYPE) { + if (!sp[-1].data.o) + THROW_EX (mono_get_exception_null_reference (), ip); + sp [-1].data.o = (MonoObject*) sp [-1].data.o->vtable->type; + ip++; + MINT_IN_BREAK; + } + MINT_IN_DEFAULT g_print ("Unimplemented opcode: %04x %s at 0x%x\n", *ip, mono_interp_opname[*ip], ip-imethod->code); THROW_EX (mono_get_exception_execution_engine ("Unimplemented opcode"), ip); diff --git a/mono/mini/interp/mintops.def b/mono/mini/interp/mintops.def index 4504729d566..ef5365a3071 100644 --- a/mono/mini/interp/mintops.def +++ b/mono/mini/interp/mintops.def @@ -683,6 +683,8 @@ OPDEF(MINT_TANH, "tanh", 1, MintOpNoArgs) */ OPDEF(MINT_PROF_ENTER, "prof_enter", 1, MintOpNoArgs) +OPDEF(MINT_INTRINS_GET_HASHCODE, "get.hashcode", 1, MintOpNoArgs) +OPDEF(MINT_INTRINS_GET_TYPE, "get.type", 1, MintOpNoArgs) OPDEF(MINT_INTRINS_BYREFERENCE_CTOR, "intrins_byreference_ctor", 2, MintOpClassToken) OPDEF(MINT_INTRINS_BYREFERENCE_GET_VALUE, "intrins_byreference_get_value", 1, MintOpNoArgs) OPDEF(MINT_INTRINS_UNSAFE_ADD_BYTE_OFFSET, "intrins_unsafe_add_byte_offset", 1, MintOpNoArgs) diff --git a/mono/mini/interp/transform.c b/mono/mini/interp/transform.c index 1ba145af3f0..994d20b1a06 100644 --- a/mono/mini/interp/transform.c +++ b/mono/mini/interp/transform.c @@ -1282,6 +1282,13 @@ interp_handle_intrinsics (TransformData *td, MonoMethod *target_method, MonoMeth } else if (in_corlib && !strcmp (klass_name_space, "System") && !strcmp (klass_name, "RuntimeMethodHandle") && !strcmp (tm, "GetFunctionPointer") && csignature->param_count == 1) { // We must intrinsify this method on interp so we don't return a pointer to native code entering interpreter *op = MINT_LDFTN_DYNAMIC; + } else if (target_method->klass == mono_defaults.object_class) { + if (!strcmp (tm, "InternalGetHashCode")) + *op = MINT_INTRINS_GET_HASHCODE; +#ifdef DISABLE_REMOTING + else if (!strcmp (tm, "GetType")) + *op = MINT_INTRINS_GET_TYPE; +#endif } return FALSE; -- 2.11.4.GIT