X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-s390.c;h=a001ef7decfe11b13f7695a69cb72bab7b8cbe7d;hb=9342e7d1d4e5d0d3248de33d05b2c2b993314bd6;hp=87cbe5b0b94e884d76e726963d2abfa5bb64a7d2;hpb=3331634f37c395ea87d15a2f3338b2bc66a8470a;p=mono.git diff --git a/mono/mini/mini-s390.c b/mono/mini/mini-s390.c index 87cbe5b0b94..a001ef7decf 100644 --- a/mono/mini/mini-s390.c +++ b/mono/mini/mini-s390.c @@ -20,70 +20,38 @@ #define EMIT_COND_BRANCH(ins,cond) \ { \ -if (ins->flags & MONO_INST_BRLABEL) { \ - if (ins->inst_i0->inst_c0) { \ - int displace; \ - displace = ((cfg->native_code + ins->inst_i0->inst_c0) - code) / 2; \ - if (s390_is_imm16(displace)) { \ - s390_brc (code, cond, displace); \ - } else { \ - s390_jcl (code, cond, displace); \ - } \ - } else { \ - mono_add_patch_info (cfg, code - cfg->native_code, \ - MONO_PATCH_INFO_LABEL, ins->inst_i0); \ - s390_jcl (code, cond, 0); \ - } \ -} else { \ - if (ins->inst_true_bb->native_offset) { \ - int displace; \ - displace = ((cfg->native_code + \ - ins->inst_true_bb->native_offset) - code) / 2; \ - if (s390_is_imm16(displace)) { \ - s390_brc (code, cond, displace); \ - } else { \ - s390_jcl (code, cond, displace); \ - } \ - } else { \ - mono_add_patch_info (cfg, code - cfg->native_code, \ - MONO_PATCH_INFO_BB, ins->inst_true_bb); \ - s390_jcl (code, cond, 0); \ - } \ -} \ +if (ins->inst_true_bb->native_offset) { \ + int displace; \ + displace = ((cfg->native_code + \ + ins->inst_true_bb->native_offset) - code) / 2; \ + if (s390_is_imm16(displace)) { \ + s390_brc (code, cond, displace); \ + } else { \ + s390_jcl (code, cond, displace); \ + } \ +} else { \ + mono_add_patch_info (cfg, code - cfg->native_code, \ + MONO_PATCH_INFO_BB, ins->inst_true_bb); \ + s390_jcl (code, cond, 0); \ +} \ } #define EMIT_UNCOND_BRANCH(ins) \ { \ -if (ins->flags & MONO_INST_BRLABEL) { \ - if (ins->inst_i0->inst_c0) { \ - int displace; \ - displace = ((cfg->native_code + ins->inst_i0->inst_c0) - code) / 2; \ - if (s390_is_imm16(displace)) { \ - s390_brc (code, S390_CC_UN, displace); \ - } else { \ - s390_jcl (code, S390_CC_UN, displace); \ - } \ - } else { \ - mono_add_patch_info (cfg, code - cfg->native_code, \ - MONO_PATCH_INFO_LABEL, ins->inst_i0); \ - s390_jcl (code, S390_CC_UN, 0); \ - } \ -} else { \ - if (ins->inst_target_bb->native_offset) { \ - int displace; \ - displace = ((cfg->native_code + \ - ins->inst_target_bb->native_offset) - code) / 2; \ - if (s390_is_imm16(displace)) { \ - s390_brc (code, S390_CC_UN, displace); \ - } else { \ - s390_jcl (code, S390_CC_UN, displace); \ - } \ - } else { \ - mono_add_patch_info (cfg, code - cfg->native_code, \ - MONO_PATCH_INFO_BB, ins->inst_target_bb); \ - s390_jcl (code, S390_CC_UN, 0); \ - } \ -} \ +if (ins->inst_target_bb->native_offset) { \ + int displace; \ + displace = ((cfg->native_code + \ + ins->inst_target_bb->native_offset) - code) / 2; \ + if (s390_is_imm16(displace)) { \ + s390_brc (code, S390_CC_UN, displace); \ + } else { \ + s390_jcl (code, S390_CC_UN, displace); \ + } \ +} else { \ + mono_add_patch_info (cfg, code - cfg->native_code, \ + MONO_PATCH_INFO_BB, ins->inst_target_bb); \ + s390_jcl (code, S390_CC_UN, 0); \ +} \ } #define EMIT_COND_SYSTEM_EXCEPTION(cond,exc_name) \ @@ -139,21 +107,18 @@ if (ins->flags & MONO_INST_BRLABEL) { \ 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; \ @@ -163,16 +128,16 @@ if (ins->flags & MONO_INST_BRLABEL) { \ 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 { \ @@ -358,7 +323,7 @@ static CallInfo * get_call_info (MonoCompile *, MonoMemPool *, MonoMethodSignatu static guchar * emit_float_to_int (MonoCompile *, guchar *, int, int, int, gboolean); gpointer mono_arch_get_lmf_addr (void); static guint8 * emit_load_volatile_registers(guint8 *, MonoCompile *); -static void emit_sig_cookie (MonoCompile *, MonoCallInst *, CallInfo *, int); +static void emit_sig_cookie (MonoCompile *, MonoCallInst *, CallInfo *); /*========================= End of Prototypes ======================*/ @@ -695,7 +660,7 @@ enum_parmtype: MonoMarshalType *info; if (type->data.klass->enumtype) { - simpleType = type->data.klass->enum_basetype->type; + simpleType = mono_class_enum_basetype (type->data.klass)->type; printf("{VALUETYPE} - "); goto enum_parmtype; } @@ -1000,7 +965,7 @@ handle_enum: case MONO_TYPE_VALUETYPE: { MonoMarshalType *info; if (type->data.klass->enumtype) { - type = type->data.klass->enum_basetype; + type = mono_class_enum_basetype (type->data.klass); goto handle_enum; } else { guint8 *p = va_arg (ap, gpointer); @@ -1162,7 +1127,7 @@ is_regsize_var (MonoType *t) { return FALSE; case MONO_TYPE_VALUETYPE: if (t->data.klass->enumtype) - return is_regsize_var (t->data.klass->enum_basetype); + return is_regsize_var (mono_class_enum_basetype (t->data.klass)); return FALSE; } return FALSE; @@ -1224,7 +1189,7 @@ mono_arch_get_global_int_regs (MonoCompile *cfg) MonoMethodHeader *header; int i, top = 13; - header = mono_method_get_header (cfg->method); + header = cfg->header; if ((cfg->flags & MONO_CFG_HAS_ALLOCA) || header->num_clauses) cfg->frame_reg = s390_r11; @@ -1468,7 +1433,7 @@ enum_retvalue: sz->code_size += 4; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->ret)) { + if (!mono_type_generic_inst_is_valuetype (ret_type)) { cinfo->ret.reg = s390_r2; sz->code_size += 4; break; @@ -1477,7 +1442,7 @@ enum_retvalue: case MONO_TYPE_VALUETYPE: { MonoClass *klass = mono_class_from_mono_type (sig->ret); if (klass->enumtype) { - simpletype = klass->enum_basetype->type; + simpletype = mono_class_enum_basetype (klass)->type; goto enum_retvalue; } if (sig->pinvoke) @@ -1592,7 +1557,7 @@ enum_retvalue: nParm++; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->params [i])) { + if (!mono_type_generic_inst_is_valuetype (ptype)) { cinfo->args[nParm].size = sizeof(gpointer); add_general (&gr, sz, cinfo->args+nParm, TRUE); nParm++; @@ -1760,7 +1725,7 @@ mono_arch_allocate_vars (MonoCompile *cfg) int frame_reg = STK_BASE; int sArg, eArg; - header = mono_method_get_header (cfg->method); + header = cfg->header; cfg->flags |= MONO_CFG_HAS_SPILLUP; @@ -2413,7 +2378,7 @@ mono_arch_instrument_prolog (MonoCompile *cfg, void *func, void *p, /*------------------------------------------------------------------*/ void* -mono_arch_instrument_epilog (MonoCompile *cfg, void *func, void *p, gboolean enable_arguments) +mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolean enable_arguments, gboolean preserve_argument_registers) { guchar *code = p; int save_mode = SAVE_NONE, @@ -2446,7 +2411,7 @@ handle_enum: break; case MONO_TYPE_VALUETYPE: if (mono_method_signature (method)->ret->data.klass->enumtype) { - rtype = mono_method_signature (method)->ret->data.klass->enum_basetype->type; + rtype = mono_class_enum_basetype (mono_method_signature (method)->ret->data.klass)->type; goto handle_enum; } save_mode = SAVE_STRUCT; @@ -3810,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: { @@ -4225,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); @@ -4342,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; @@ -5010,7 +4981,7 @@ mono_arch_free_jit_tls_data (MonoJitTlsData *tls) /*------------------------------------------------------------------*/ /* */ -/* Name - mono_arch_emit_inst_for_method */ +/* Name - mono_arch_emit_inst_for_method */ /* */ /*------------------------------------------------------------------*/ @@ -5022,6 +4993,12 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_decompose_opts */ +/* */ +/*------------------------------------------------------------------*/ + void mono_arch_decompose_opts (MonoCompile *cfg, MonoInst *ins) { @@ -5047,7 +5024,7 @@ mono_arch_decompose_opts (MonoCompile *cfg, MonoInst *ins) /*------------------------------------------------------------------*/ /* */ -/* Name - mono_arch_decompose_long_opts */ +/* Name - mono_arch_decompose_long_opts */ /* */ /*------------------------------------------------------------------*/ @@ -5236,31 +5213,6 @@ mono_arch_get_domain_intrinsic (MonoCompile* cfg) /*========================= End of Function ========================*/ -/*------------------------------------------------------------------*/ -/* */ -/* Name - mono_arch_get_thread_intrinsic */ -/* */ -/* Function - */ -/* */ -/* Returns - */ -/* */ -/*------------------------------------------------------------------*/ - -MonoInst * -mono_arch_get_thread_intrinsic (MonoCompile* cfg) -{ - MonoInst *ins; - - if (thread_tls_offset == -1) - return NULL; - - MONO_INST_NEW (cfg, ins, OP_TLS_GET); - ins->inst_offset = thread_tls_offset; - return (ins); -} - -/*========================= End of Function ========================*/ - /*------------------------------------------------------------------*/ /* */ /* Name - mono_arch_flush_register_windows */ @@ -5315,6 +5267,16 @@ mono_arch_get_patch_offset (guint8 *code) /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_context_get_int_reg. */ +/* */ +/* Function - Dummy entry point until s390x supports aot. */ +/* */ +/* Returns - Pointer to intreg. */ +/* */ +/*------------------------------------------------------------------*/ + gpointer mono_arch_context_get_int_reg (MonoContext *ctx, int reg) { @@ -5322,3 +5284,5 @@ mono_arch_context_get_int_reg (MonoContext *ctx, int reg) g_assert_not_reached (); return NULL; } + +/*========================= End of Function ========================*/