From 348527989d672160e4ab64c5321d10633e298e93 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 9 May 2017 16:01:47 -0700 Subject: [PATCH] [jit] CPBLK and INITBLK now use the funtions in memory-access.c --- mono/mini/method-to-ir.c | 53 +++++++--------------------------------- 1 file changed, 9 insertions(+), 44 deletions(-) diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c index 46ec9435069..41dbd1a5cb6 100644 --- a/mono/mini/method-to-ir.c +++ b/mono/mini/method-to-ir.c @@ -12627,56 +12627,21 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b ip += 6; break; case CEE_CPBLK: - case CEE_INITBLK: { - MonoInst *iargs [3]; CHECK_STACK (3); sp -= 3; - - /* Skip optimized paths for volatile operations. */ - if ((ip [1] == CEE_CPBLK) && !(ins_flag & MONO_INST_VOLATILE) && (cfg->opt & MONO_OPT_INTRINS) && (sp [2]->opcode == OP_ICONST) && ((n = sp [2]->inst_c0) <= sizeof (gpointer) * 5)) { - mini_emit_memcpy (cfg, sp [0]->dreg, 0, sp [1]->dreg, 0, sp [2]->inst_c0, 0); - } else if ((ip [1] == CEE_INITBLK) && !(ins_flag & MONO_INST_VOLATILE) && (cfg->opt & MONO_OPT_INTRINS) && (sp [2]->opcode == OP_ICONST) && ((n = sp [2]->inst_c0) <= sizeof (gpointer) * 5) && (sp [1]->opcode == OP_ICONST) && (sp [1]->inst_c0 == 0)) { - /* emit_memset only works when val == 0 */ - mini_emit_memset (cfg, sp [0]->dreg, 0, sp [2]->inst_c0, sp [1]->inst_c0, 0); - } else { - MonoInst *call; - iargs [0] = sp [0]; - iargs [1] = sp [1]; - iargs [2] = sp [2]; - if (ip [1] == CEE_CPBLK) { - /* - * FIXME: It's unclear whether we should be emitting both the acquire - * and release barriers for cpblk. It is technically both a load and - * store operation, so it seems like that's the sensible thing to do. - * - * FIXME: We emit full barriers on both sides of the operation for - * simplicity. We should have a separate atomic memcpy method instead. - */ - MonoMethod *memcpy_method = mini_get_memcpy_method (); - - if (ins_flag & MONO_INST_VOLATILE) - mini_emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_SEQ); - - call = mono_emit_method_call (cfg, memcpy_method, iargs, NULL); - call->flags |= ins_flag; - - if (ins_flag & MONO_INST_VOLATILE) - mini_emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_SEQ); - } else { - MonoMethod *memset_method = mini_get_memset_method (); - if (ins_flag & MONO_INST_VOLATILE) { - /* Volatile stores have release semantics, see 12.6.7 in Ecma 335 */ - mini_emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_REL); - } - call = mono_emit_method_call (cfg, memset_method, iargs, NULL); - call->flags |= ins_flag; - } - } + mini_emit_memory_copy_bytes (cfg, sp [0], sp [1], sp [2], ins_flag); + ip += 2; + ins_flag = 0; + inline_costs += 1; + break; + case CEE_INITBLK: + CHECK_STACK (3); + sp -= 3; + mini_emit_memory_init_bytes (cfg, sp [0], sp [1], sp [2], ins_flag); ip += 2; ins_flag = 0; inline_costs += 1; break; - } case CEE_NO_: CHECK_OPSIZE (3); if (ip [2] & 0x1) -- 2.25.1