X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-s390.c;h=a001ef7decfe11b13f7695a69cb72bab7b8cbe7d;hb=9342e7d1d4e5d0d3248de33d05b2c2b993314bd6;hp=a35c4f527b131fe3935b996fabda0d9161c7b594;hpb=f9467fdbd01a3bab5d2f2e0cf34567788303945a;p=mono.git diff --git a/mono/mini/mini-s390.c b/mono/mini/mini-s390.c index a35c4f527b1..a001ef7decf 100644 --- a/mono/mini/mini-s390.c +++ b/mono/mini/mini-s390.c @@ -107,21 +107,18 @@ if (ins->inst_target_bb->native_offset) { \ MonoInst *inst; \ int tmpr = 0; \ int sReg, dReg; \ - MONO_INST_NEW (cfg, inst, OP_NOP); \ + MONO_INST_NEW (cfg, inst, OP_NOP); \ if (size > 256) { \ - tmpr = mono_alloc_preg (cfg); \ - MONO_EMIT_NEW_ICONST(cfg,tmpr,size); \ inst->dreg = dest; \ inst->inst_offset = offset; \ inst->sreg1 = src; \ inst->inst_imm = imm; \ - inst->sreg2 = tmpr; \ } else { \ if (s390_is_uimm12(offset)) { \ inst->dreg = dest; \ inst->inst_offset = offset; \ } else { \ - dReg = mono_alloc_preg (cfg); \ + dReg = mono_alloc_preg (cfg); \ MONO_EMIT_NEW_BIALU_IMM(cfg, OP_ADD_IMM, \ dReg, dest, offset); \ inst->dreg = dReg; \ @@ -131,16 +128,16 @@ if (ins->inst_target_bb->native_offset) { \ inst->sreg1 = src; \ inst->inst_imm = imm; \ } else { \ - sReg = mono_alloc_preg (cfg); \ + sReg = mono_alloc_preg (cfg); \ MONO_EMIT_NEW_BIALU_IMM(cfg, OP_ADD_IMM, \ sReg, src, imm); \ inst->sreg1 = sReg; \ inst->inst_imm = 0; \ } \ } \ - inst->opcode = OP_S390_MOVE; \ - inst->backend.size = size; \ - MONO_ADD_INS (cfg->cbb, inst); \ + inst->opcode = OP_S390_MOVE; \ + inst->backend.size = size; \ + MONO_ADD_INS (cfg->cbb, inst); \ } while (0) #define MONO_OUTPUT_VTR(cfg, size, dr, sr, so) do { \ @@ -3778,6 +3775,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) mono_add_patch_info (cfg, code-cfg->native_code, MONO_PATCH_INFO_BB, ins->inst_target_bb); s390_brasl (code, s390_r14, 0); + mono_cfg_add_try_hole (cfg, ins->inst_eh_block, code, bb); } break; case OP_LABEL: { @@ -4193,34 +4191,39 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_mvc (code, ins->backend.size, ins->dreg, ins->inst_offset, ins->sreg1, ins->inst_imm); } else { - s390_lr (code, s390_r0, ins->dreg); + s390_lr (code, s390_r0, ins->dreg); if (s390_is_imm16 (ins->inst_offset)) { s390_ahi (code, s390_r0, ins->inst_offset); } else { s390_basr (code, s390_r13, 0); - s390_j (code, 4); - s390_word (code, ins->inst_offset); + s390_j (code, 6); + s390_long (code, ins->inst_offset); s390_a (code, s390_r0, 0, s390_r13, 4); } - s390_lr (code, s390_r14, s390_r12); - s390_lr (code, s390_r12, ins->sreg1); + s390_lr (code, s390_r12, ins->sreg1); if (s390_is_imm16 (ins->inst_imm)) { s390_ahi (code, s390_r12, ins->inst_imm); } else { s390_basr (code, s390_r13, 0); - s390_j (code, 4); - s390_word (code, ins->inst_imm); + s390_j (code, 6); + s390_long (code, ins->inst_imm); s390_a (code, s390_r12, 0, s390_r13, 4); } - s390_lr (code, s390_r1, ins->sreg1); + if (s390_is_imm16 (ins->backend.size)) { + s390x_lhi (code, s390_r1, ins->backend.size); + } else { + s390_basr (code, s390_r13, 0); + s390_j (code, 6); + s390_long (code, ins->backend.size); + s390_l (code, s390_r1, 0, s390_r13, 4); + } + s390_lr (code, s390_r1, ins->backend.size); s390_lr (code, s390_r13, s390_r1); s390_mvcle(code, s390_r0, s390_r12, 0, 0); s390_jo (code, -2); - s390_lr (code, s390_r12, s390_r14); } } } - break; case OP_ATOMIC_ADD_I4: { s390_lr (code, s390_r1, ins->sreg2); s390_l (code, s390_r0, 0, ins->inst_basereg, ins->inst_offset); @@ -4310,7 +4313,7 @@ mono_arch_register_lowlevel_calls (void) void mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, - guint8 *code, MonoJumpInfo *ji, gboolean run_cctors) + guint8 *code, MonoJumpInfo *ji, MonoCodeManager *dyn_code_mp, gboolean run_cctors) { MonoJumpInfo *patch_info;