X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fdecompose.c;h=93668ac852457377081ddd806f9b8f65ad75b32a;hb=b2cf1149023a9f5c44c176d2aa873719baa41b34;hp=23e576f0ea9046e20cc10366332ac0527ec40f64;hpb=a3304910e9e08ec965fb06ef6fa4a19257dddf8c;p=mono.git diff --git a/mono/mini/decompose.c b/mono/mini/decompose.c index 23e576f0ea9..93668ac8524 100644 --- a/mono/mini/decompose.c +++ b/mono/mini/decompose.c @@ -1227,8 +1227,8 @@ mono_decompose_vtype_opts (MonoCompile *cfg) EMIT_NEW_VARLOADA ((cfg), (src), src_var, src_var->inst_vtype); EMIT_NEW_VARLOADA ((cfg), (dest), dest_var, dest_var->inst_vtype); + mini_emit_memory_copy (cfg, dest, src, src_var->klass, src_var->backend.is_pinvoke, 0); - mini_emit_stobj (cfg, dest, src, src_var->klass, src_var->backend.is_pinvoke); break; } case OP_VZERO: @@ -1273,7 +1273,7 @@ mono_decompose_vtype_opts (MonoCompile *cfg) dreg = alloc_preg (cfg); EMIT_NEW_BIALU_IMM (cfg, dest, OP_ADD_IMM, dreg, ins->inst_destbasereg, ins->inst_offset); - mini_emit_stobj (cfg, dest, src, src_var->klass, src_var->backend.is_pinvoke); + mini_emit_memory_copy (cfg, dest, src, src_var->klass, src_var->backend.is_pinvoke, 0); break; } case OP_LOADV_MEMBASE: { @@ -1290,7 +1290,7 @@ mono_decompose_vtype_opts (MonoCompile *cfg) dreg = alloc_preg (cfg); EMIT_NEW_BIALU_IMM (cfg, src, OP_ADD_IMM, dreg, ins->inst_basereg, ins->inst_offset); EMIT_NEW_VARLOADA (cfg, dest, dest_var, dest_var->inst_vtype); - mini_emit_stobj (cfg, dest, src, dest_var->klass, dest_var->backend.is_pinvoke); + mini_emit_memory_copy (cfg, dest, src, dest_var->klass, dest_var->backend.is_pinvoke, 0); break; } case OP_OUTARG_VT: { @@ -1508,10 +1508,13 @@ mono_decompose_array_access_opts (MonoCompile *cfg) break; case OP_BOUNDS_CHECK: MONO_EMIT_NULL_CHECK (cfg, ins->sreg1); - if (COMPILE_LLVM (cfg)) - MONO_EMIT_DEFAULT_BOUNDS_CHECK (cfg, ins->sreg1, ins->inst_imm, ins->sreg2, ins->flags & MONO_INST_FAULT); - else + if (COMPILE_LLVM (cfg)) { + int index2_reg = alloc_preg (cfg); + MONO_EMIT_NEW_UNALU (cfg, OP_SEXT_I4, index2_reg, ins->sreg2); + MONO_EMIT_DEFAULT_BOUNDS_CHECK (cfg, ins->sreg1, ins->inst_imm, index2_reg, ins->flags & MONO_INST_FAULT); + } else { MONO_ARCH_EMIT_BOUNDS_CHECK (cfg, ins->sreg1, ins->inst_imm, ins->sreg2); + } break; case OP_NEWARR: if (cfg->opt & MONO_OPT_SHARED) {