X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fdecompose.c;h=aaa34a3bc34fba472c49726be3bd70936bc4426a;hb=8850a990f86a12547279e78891f8179b200d448e;hp=30e8f7f91dc88cf770d4e863477f4ea00ee160f0;hpb=8e663307d6ec99fc7f1df701438a85de31b47f6d;p=mono.git diff --git a/mono/mini/decompose.c b/mono/mini/decompose.c index 30e8f7f91dc..aaa34a3bc34 100644 --- a/mono/mini/decompose.c +++ b/mono/mini/decompose.c @@ -6,6 +6,7 @@ * * (C) 2002 Ximian, Inc. * Copyright 2011 Xamarin, Inc (http://www.xamarin.com) + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #include "mini.h" @@ -14,6 +15,7 @@ #include #include +#include #ifndef DISABLE_JIT @@ -471,6 +473,7 @@ mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins) } break; +#if SIZEOF_VOID_P == 8 case OP_LDIV: case OP_LREM: case OP_LDIV_UN: @@ -502,10 +505,12 @@ mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins) NULLIFY_INS (ins); } break; +#endif case OP_DIV_IMM: case OP_REM_IMM: case OP_IDIV_IMM: + case OP_IREM_IMM: case OP_IDIV_UN_IMM: case OP_IREM_UN_IMM: if (cfg->backend->need_div_check) { @@ -929,6 +934,8 @@ mono_decompose_long_opts (MonoCompile *cfg) MONO_EMIT_NEW_BIALU_IMM (cfg, OP_XOR_IMM, MONO_LVREG_LS (tree->dreg), MONO_LVREG_LS (tree->sreg1), tree->inst_ls_word); MONO_EMIT_NEW_BIALU_IMM (cfg, OP_XOR_IMM, MONO_LVREG_MS (tree->dreg), MONO_LVREG_MS (tree->sreg1), tree->inst_ms_word); break; +#ifdef TARGET_POWERPC +/* FIXME This is normally handled in cprop. Proper fix or remove if no longer needed. */ case OP_LSHR_UN_IMM: if (tree->inst_c1 == 32) { @@ -937,20 +944,12 @@ mono_decompose_long_opts (MonoCompile *cfg) * later apply the speedup to the left shift as well * See BUG# 57957. */ - /* FIXME: Move this to the strength reduction pass */ /* just move the upper half to the lower and zero the high word */ MONO_EMIT_NEW_UNALU (cfg, OP_MOVE, MONO_LVREG_LS (tree->dreg), MONO_LVREG_MS (tree->sreg1)); MONO_EMIT_NEW_ICONST (cfg, MONO_LVREG_MS (tree->dreg), 0); } break; - case OP_LSHL_IMM: - if (tree->inst_c1 == 32) { - /* just move the lower half to the upper and zero the lower word */ - MONO_EMIT_NEW_UNALU (cfg, OP_MOVE, MONO_LVREG_MS (tree->dreg), MONO_LVREG_LS (tree->sreg1)); - MONO_EMIT_NEW_ICONST (cfg, MONO_LVREG_LS (tree->dreg), 0); - } - break; - +#endif case OP_LCOMPARE: { MonoInst *next = mono_inst_next (tree, FILTER_IL_SEQ_POINT); @@ -1266,6 +1265,9 @@ mono_decompose_vtype_opts (MonoCompile *cfg) case OP_STOREV_MEMBASE: { src_var = get_vreg_to_inst (cfg, ins->sreg1); + if (COMPILE_LLVM (cfg) && !mini_is_gsharedvt_klass (ins->klass) && !cfg->gen_write_barriers) + break; + if (!src_var) { g_assert (ins->klass); src_var = mono_compile_create_var_for_vreg (cfg, &ins->klass->byval_arg, OP_LOCAL, ins->sreg1); @@ -1522,7 +1524,7 @@ mono_decompose_array_access_opts (MonoCompile *cfg) MONO_INST_NEW (cfg, iargs [2], OP_MOVE); iargs [2]->dreg = ins->sreg1; - dest = mono_emit_jit_icall (cfg, mono_array_new, iargs); + dest = mono_emit_jit_icall (cfg, ves_icall_array_new, iargs); dest->dreg = ins->dreg; } else { MonoClass *array_class = mono_array_class_get (ins->inst_newa_class, 1); @@ -1888,6 +1890,13 @@ mono_local_emulate_ops (MonoCompile *cfg) int op_noimm = mono_op_imm_to_op (ins->opcode); MonoJitICallInfo *info; + /* + * These opcodes don't have logical equivalence to the emulating native + * function. They are decomposed in specific fashion in mono_decompose_soft_float. + */ + if (MONO_HAS_CUSTOM_EMULATION (ins)) + continue; + /* * Emulation can't handle _IMM ops. If this is an imm opcode we need * to check whether its non-imm counterpart is emulated and, if so, @@ -1924,9 +1933,9 @@ mono_local_emulate_ops (MonoCompile *cfg) /* We emit the call on a separate dummy basic block */ cfg->cbb = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoBasicBlock)); - first_bb = cfg->cbb; + first_bb = cfg->cbb; - call = mono_emit_jit_icall_by_info (cfg, info, args); + call = mono_emit_jit_icall_by_info (cfg, bb->real_offset, info, args); call->dreg = ins->dreg; /* Replace ins with the emitted code and do the necessary bb linking */ @@ -1960,4 +1969,8 @@ mono_local_emulate_ops (MonoCompile *cfg) } } -#endif /* DISABLE_JIT */ +#else /* !DISABLE_JIT */ + +MONO_EMPTY_SOURCE_FILE (decompose); + +#endif /* !DISABLE_JIT */