#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) \
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; \
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 { \
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 ======================*/
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;
}
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);
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;
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;
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;
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)
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++;
int frame_reg = STK_BASE;
int sArg, eArg;
- header = mono_method_get_header (cfg->method);
+ header = cfg->header;
cfg->flags |= MONO_CFG_HAS_SPILLUP;
/*------------------------------------------------------------------*/
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,
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;
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: {
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);
/*------------------------------------------------------------------*/
/* */
-/* Name - mono_arch_emit_inst_for_method */
+/* Name - mono_arch_emit_inst_for_method */
/* */
/*------------------------------------------------------------------*/
/*========================= End of Function ========================*/
+/*------------------------------------------------------------------*/
+/* */
+/* Name - mono_arch_decompose_opts */
+/* */
+/*------------------------------------------------------------------*/
+
void
mono_arch_decompose_opts (MonoCompile *cfg, MonoInst *ins)
{
/*------------------------------------------------------------------*/
/* */
-/* Name - mono_arch_decompose_long_opts */
+/* Name - mono_arch_decompose_long_opts */
/* */
/*------------------------------------------------------------------*/
/*========================= 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 */
/*========================= 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)
{
g_assert_not_reached ();
return NULL;
}
+
+/*========================= End of Function ========================*/