#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) \
s390_ldr (code, ins->dreg, ins->sreg1); \
}
-#define MONO_EMIT_NEW_MOVE2(cfg,dest,offset,src,imm,size) do { \
+#define MONO_EMIT_NEW_MOVE(cfg,dest,offset,src,imm,size) do { \
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_VTR2(cfg, size, dr, sr, so) do { \
+#define MONO_OUTPUT_VTR(cfg, size, dr, sr, so) do { \
int reg = mono_alloc_preg (cfg); \
switch (size) { \
case 0: \
} \
} while (0)
-#define MONO_OUTPUT_VTS2(cfg, size, dr, dx, sr, so) do { \
+#define MONO_OUTPUT_VTS(cfg, size, dr, dx, sr, so) do { \
int tmpr; \
switch (size) { \
case 0: \
break; \
case 4: \
case 8: \
- MONO_EMIT_NEW_MOVE2 (cfg, dr, dx, sr, so, size); \
+ MONO_EMIT_NEW_MOVE (cfg, dr, dx, sr, so, size); \
break; \
} \
} while (0)
#include <mono/utils/mono-math.h>
#include "mini-s390.h"
-#include "inssel.h"
#include "cpu-s390.h"
#include "jit-icalls.h"
+#include "ir-emit.h"
/*========================= End of Includes ========================*/
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;
cinfo = get_call_info (cfg, cfg->mempool, sig, sig->pinvoke);
- if (cinfo->struct_ret) {
- if (!cfg->new_ir) {
- cfg->vret_addr->opcode = OP_REGVAR;
- cfg->vret_addr->inst_c0 = s390_r2;
- }
- } else {
+ if (!cinfo->struct_ret) {
switch (mono_type_get_underlying_type (sig->ret)->type) {
case MONO_TYPE_VOID:
break;
inst->opcode = OP_REGOFFSET;
inst->inst_basereg = frame_reg;
offset += sizeof(gpointer);
- if (!cfg->new_ir && (sig->call_convention == MONO_CALL_VARARG) &&
- (!retFitsInReg (cinfo->ret.size)))
- cfg->sig_cookie += cinfo->ret.size;
if (G_UNLIKELY (cfg->verbose_level > 1)) {
printf ("vret_addr =");
mono_print_ins (cfg->vret_addr);
inst = cfg->args [curinst];
if (inst->opcode != OP_REGVAR) {
switch (cinfo->args[iParm].regtype) {
- case RegTypeStructByAddr :
- if (cfg->new_ir) {
- MonoInst *indir;
-
- size = sizeof (gpointer);
-
- if (cinfo->args [iParm].reg == STK_BASE) {
- cfg->arch.bkchain_reg = s390_r12;
- cfg->used_int_regs |= 1 << cfg->arch.bkchain_reg;
-
- inst->opcode = OP_REGOFFSET;
- inst->inst_basereg = cfg->arch.bkchain_reg;
- inst->inst_offset = cinfo->args [iParm].offset;
- } else {
- inst->opcode = OP_REGOFFSET;
- inst->inst_basereg = frame_reg;
- inst->inst_offset = S390_ALIGN(offset, sizeof (gpointer));
- }
-
- /* Add a level of indirection */
- MONO_INST_NEW (cfg, indir, 0);
- *indir = *inst;
- inst->opcode = OP_VTARG_ADDR;
- inst->inst_left = indir;
+ case RegTypeStructByAddr : {
+ MonoInst *indir;
+
+ size = sizeof (gpointer);
+
+ if (cinfo->args [iParm].reg == STK_BASE) {
+ cfg->arch.bkchain_reg = s390_r12;
+ cfg->used_int_regs |= 1 << cfg->arch.bkchain_reg;
+
+ inst->opcode = OP_REGOFFSET;
+ inst->inst_basereg = cfg->arch.bkchain_reg;
+ inst->inst_offset = cinfo->args [iParm].offset;
} else {
- if (cinfo->args[iParm].reg == STK_BASE) {
- inst->opcode = OP_S390_LOADARG;
- inst->inst_basereg = frame_reg;
- size = abs(cinfo->args[iParm].vtsize);
- offset = S390_ALIGN(offset, sizeof(long));
- inst->inst_offset = offset;
- inst->backend.arg_info = cinfo->args[iParm].offset;
- } else {
- inst->opcode = OP_S390_ARGREG;
- inst->inst_basereg = frame_reg;
- size = sizeof(gpointer);
- offset = S390_ALIGN(offset, size);
- inst->inst_offset = offset;
- inst->backend.arg_info = cinfo->args[iParm].offset;
- }
+ inst->opcode = OP_REGOFFSET;
+ inst->inst_basereg = frame_reg;
+ inst->inst_offset = S390_ALIGN(offset, sizeof (gpointer));
}
+
+ /* Add a level of indirection */
+ MONO_INST_NEW (cfg, indir, 0);
+ *indir = *inst;
+ inst->opcode = OP_VTARG_ADDR;
+ inst->inst_left = indir;
+ }
break;
case RegTypeStructByVal :
- if (cfg->new_ir) {
- size = cinfo->args[iParm].size;
- offset = S390_ALIGN(offset, size);
- inst->opcode = OP_REGOFFSET;
- inst->inst_basereg = frame_reg;
- inst->inst_offset = S390_ALIGN (offset, size);
+ size = cinfo->args[iParm].size;
+ offset = S390_ALIGN(offset, size);
+ inst->opcode = OP_REGOFFSET;
+ inst->inst_basereg = frame_reg;
+ inst->inst_offset = S390_ALIGN (offset, size);
+ break;
+ default :
+ if (cinfo->args [iParm].reg == STK_BASE) {
+ /*
+ * These arguments are in the previous frame, so we can't
+ * compute their offset from the current frame pointer right
+ * now, since cfg->stack_offset is not yet known, so dedicate a
+ * register holding the previous frame pointer.
+ */
+ cfg->arch.bkchain_reg = s390_r12;
+ cfg->used_int_regs |= 1 << cfg->arch.bkchain_reg;
+
+ inst->opcode = OP_REGOFFSET;
+ inst->inst_basereg = cfg->arch.bkchain_reg;
+ size = (cinfo->args[iParm].size < 4
+ ? 4 - cinfo->args[iParm].size
+ : 0);
+ inst->inst_offset = cinfo->args [iParm].offset + size;
+ size = sizeof (long);
} else {
- inst->opcode = OP_S390_ARGPTR;
+ inst->opcode = OP_REGOFFSET;
inst->inst_basereg = frame_reg;
- size = cinfo->args[iParm].size;
+ size = (cinfo->args[iParm].size < 8
+ ? sizeof(long)
+ : sizeof(long long));
offset = S390_ALIGN(offset, size);
inst->inst_offset = offset;
- inst->backend.arg_info = cinfo->args[iParm].offset;
}
- break;
- default :
- if (cfg->new_ir) {
- if (cinfo->args [iParm].reg == STK_BASE) {
- /*
- * These arguments are in the previous frame, so we can't
- * compute their offset from the current frame pointer right
- * now, since cfg->stack_offset is not yet known, so dedicate a
- * register holding the previous frame pointer.
- */
- cfg->arch.bkchain_reg = s390_r12;
- cfg->used_int_regs |= 1 << cfg->arch.bkchain_reg;
-
- inst->opcode = OP_REGOFFSET;
- inst->inst_basereg = cfg->arch.bkchain_reg;
- size = (cinfo->args[iParm].size < 4
- ? 4 - cinfo->args[iParm].size
- : 0);
- inst->inst_offset = cinfo->args [iParm].offset + size;
- size = sizeof (long);
- } else {
- inst->opcode = OP_REGOFFSET;
- inst->inst_basereg = frame_reg;
- size = (cinfo->args[iParm].size < 8
- ? sizeof(long)
- : sizeof(long long));
- offset = S390_ALIGN(offset, size);
- inst->inst_offset = offset;
- }
- } else {
- if (cinfo->args[iParm].reg != STK_BASE) {
- inst->opcode = OP_REGOFFSET;
- inst->inst_basereg = frame_reg;
- size = (cinfo->args[iParm].size < 8
- ? sizeof(long)
- : sizeof(long long));
- offset = S390_ALIGN(offset, size);
- inst->inst_offset = offset;
- } else {
- inst->opcode = OP_S390_STKARG;
- inst->inst_basereg = frame_reg;
- size = (cinfo->args[iParm].size < 4
- ? 4 - cinfo->args[iParm].size
- : 0);
- inst->inst_offset = cinfo->args[iParm].offset +
- size;
- inst->backend.arg_info = 0;
- size = sizeof(long);
- }
- }
}
if ((sig->call_convention == MONO_CALL_VARARG) &&
(cinfo->args[iParm].regtype != RegTypeGeneral) &&
cfg->stack_offset = S390_ALIGN(offset, S390_STACK_ALIGNMENT);
/* Fix up offsets for arguments whose value is in the parent frame */
- if (cfg->new_ir) {
- for (iParm = sArg; iParm < eArg; ++iParm) {
- inst = cfg->args [iParm];
+ for (iParm = sArg; iParm < eArg; ++iParm) {
+ inst = cfg->args [iParm];
- if (inst->opcode == OP_S390_STKARG) {
- inst->opcode = OP_REGOFFSET;
- inst->inst_offset += cfg->stack_offset;
- }
+ if (inst->opcode == OP_S390_STKARG) {
+ inst->opcode = OP_REGOFFSET;
+ inst->inst_offset += cfg->stack_offset;
}
}
}
/*========================= End of Function ========================*/
-/*------------------------------------------------------------------*/
-/* */
-/* Name - mono_arch_call_opcode */
-/* */
-/* Function - Take the arguments and generate the arch-specific */
-/* instructions to properly call the function. This */
-/* includes pushing, moving argments to the correct */
-/* etc. */
-/* */
-/*------------------------------------------------------------------*/
-
-MonoCallInst*
-mono_arch_call_opcode (MonoCompile *cfg, MonoBasicBlock* bb,
- MonoCallInst *call, int is_virtual)
-{
- MonoInst *in;
- MonoCallArgParm *arg;
- MonoMethodSignature *sig;
- int i, n, lParamArea;
- CallInfo *cinfo;
- ArgInfo *ainfo = NULL;
- int stackSize;
-
- sig = call->signature;
- n = sig->param_count + sig->hasthis;
- DEBUG (g_print ("Call requires: %d parameters\n",n));
-
- cinfo = get_call_info (cfg, cfg->mempool, sig, sig->pinvoke);
-
- stackSize = cinfo->sz.stack_size + cinfo->sz.local_size + cinfo->sz.parm_size + cinfo->sz.offset;
- call->stack_usage = MAX(stackSize, call->stack_usage);
- lParamArea = MAX((call->stack_usage-S390_MINIMAL_STACK_SIZE-cinfo->sz.parm_size), 0);
- cfg->param_area = MAX(((signed) cfg->param_area), lParamArea);
- cfg->flags |= MONO_CFG_HAS_CALLS;
-
- if (cinfo->struct_ret)
- call->used_iregs |= 1 << cinfo->ret.reg;
-
- for (i = 0; i < n; ++i) {
- ainfo = cinfo->args + i;
-
- if ((sig->call_convention == MONO_CALL_VARARG) &&
- (i == sig->sentinelpos)) {
- emit_sig_cookie (cfg, call, cinfo, ainfo->size);
- }
-
- if (is_virtual && i == 0) {
- /* the argument will be attached to the call instrucion */
- in = call->args [i];
- call->used_iregs |= 1 << ainfo->reg;
- } else {
- MONO_INST_NEW_CALL_ARG (cfg, arg, OP_OUTARG);
- in = call->args [i];
- arg->ins.cil_code = in->cil_code;
- arg->ins.inst_left = in;
- arg->ins.type = in->type;
- /* prepend, we'll need to reverse them later */
- arg->ins.next = call->out_args;
- call->out_args = (MonoInst *) arg;
- arg->ins.inst_right = (MonoInst *) call;
- if (ainfo->regtype == RegTypeGeneral) {
- arg->ins.backend.reg3 = ainfo->reg;
- call->used_iregs |= 1 << ainfo->reg;
- if (arg->ins.type == STACK_I8)
- call->used_iregs |= 1 << (ainfo->reg + 1);
- } else if (ainfo->regtype == RegTypeStructByAddr) {
- call->used_iregs |= 1 << ainfo->reg;
- arg->ins.sreg1 = ainfo->reg;
- arg->ins.opcode = OP_OUTARG_VT;
- arg->size = -ainfo->vtsize;
- arg->offset = ainfo->offset;
- arg->offPrm = ainfo->offparm + cinfo->sz.offStruct;
- } else if (ainfo->regtype == RegTypeStructByVal) {
- if (ainfo->reg != STK_BASE) {
- switch (ainfo->size) {
- case 0:
- case 1:
- case 2:
- case 4:
- call->used_iregs |= 1 << ainfo->reg;
- break;
- case 8:
- call->used_iregs |= 1 << ainfo->reg;
- call->used_iregs |= 1 << (ainfo->reg+1);
- break;
- default:
- call->used_iregs |= 1 << ainfo->reg;
- }
- }
- arg->ins.sreg1 = ainfo->reg;
- arg->ins.opcode = OP_OUTARG_VT;
- arg->size = ainfo->size;
- arg->offset = ainfo->offset;
- arg->offPrm = ainfo->offparm + cinfo->sz.offStruct;
- } else if (ainfo->regtype == RegTypeBase) {
- arg->ins.opcode = OP_OUTARG_MEMBASE;
- arg->ins.sreg1 = ainfo->reg;
- arg->size = ainfo->size;
- arg->offset = ainfo->offset;
- call->used_iregs |= 1 << ainfo->reg;
- } else if (ainfo->regtype == RegTypeFP) {
- arg->ins.backend.reg3 = ainfo->reg;
- call->used_fregs |= 1 << ainfo->reg;
- if (ainfo->size == 4)
- arg->ins.opcode = OP_OUTARG_R4;
- else
- arg->ins.opcode = OP_OUTARG_R8;
- } else {
- g_assert_not_reached ();
- }
- }
- }
-
- /*
- * Handle the case where there are no implicit arguments
- */
- if ((sig->call_convention == MONO_CALL_VARARG) &&
- (i == sig->sentinelpos)) {
- emit_sig_cookie (cfg, call, cinfo, ainfo->size);
- }
-
- /*
- * Reverse the call->out_args list.
- */
- {
- MonoInst *prev = NULL, *list = call->out_args, *next;
- while (list) {
- next = list->next;
- list->next = prev;
- prev = list;
- list = next;
- }
- call->out_args = prev;
- }
-
- return call;
-}
-
-/*========================= End of Function ========================*/
-
static void
add_outarg_reg2 (MonoCompile *cfg, MonoCallInst *call, ArgStorage storage, int reg, MonoInst *tree)
{
}
static void
-emit_sig_cookie2 (MonoCompile *cfg, MonoCallInst *call, CallInfo *cinfo)
+emit_sig_cookie (MonoCompile *cfg, MonoCallInst *call, CallInfo *cinfo)
{
MonoMethodSignature *tmpSig;
MonoInst *sig_arg;
if ((sig->call_convention == MONO_CALL_VARARG) &&
(i == sig->sentinelpos)) {
- emit_sig_cookie2 (cfg, call, cinfo);
+ emit_sig_cookie (cfg, call, cinfo);
}
switch (ainfo->regtype) {
*/
if ((sig->call_convention == MONO_CALL_VARARG) &&
(i == sig->sentinelpos)) {
- emit_sig_cookie2 (cfg, call, cinfo);
+ emit_sig_cookie (cfg, call, cinfo);
}
}
arg->offPrm = ainfo->offparm + cinfo->sz.offStruct;
*/
if (ainfo->reg != STK_BASE) {
- MONO_OUTPUT_VTR2 (cfg, size, ainfo->reg, src->dreg, 0);
+ MONO_OUTPUT_VTR (cfg, size, ainfo->reg, src->dreg, 0);
} else {
- MONO_OUTPUT_VTS2 (cfg, size, ainfo->reg, ainfo->offset,
+ MONO_OUTPUT_VTS (cfg, size, ainfo->reg, ainfo->offset,
src->dreg, 0);
}
} else if (ainfo->regtype == RegTypeStructByValInFP) {
mono_call_inst_add_outarg_reg (cfg, call, dreg, ainfo->reg, TRUE);
} else {
- MONO_EMIT_NEW_MOVE2 (cfg, STK_BASE, ainfo->offparm,
+ MONO_EMIT_NEW_MOVE (cfg, STK_BASE, ainfo->offparm,
src->dreg, 0, size);
}
}
MONO_EMIT_NEW_UNALU (cfg, OP_MOVE, cfg->ret->dreg, val->dreg);
}
-/*========================= End of Function ========================*/
-
-/*------------------------------------------------------------------*/
-/* */
-/* Name - emit_sig_cookie. */
-/* */
-/* Function - For variable length parameter lists construct a */
-/* signature cookie and emit it. */
-/* */
-/*------------------------------------------------------------------*/
-
-static void
-emit_sig_cookie (MonoCompile *cfg, MonoCallInst *call,
- CallInfo *cinfo, int argSize)
-{
- MonoCallArgParm *arg;
- MonoMethodSignature *tmpSig;
- MonoInst *sigArg;
-
- cfg->disable_aot = TRUE;
-
- /*----------------------------------------------------------*/
- /* mono_ArgIterator_Setup assumes the signature cookie is */
- /* passed first and all the arguments which were before it */
- /* passed on the stack after the signature. So compensate */
- /* by passing a different signature. */
- /*----------------------------------------------------------*/
- tmpSig = mono_metadata_signature_dup (call->signature);
- tmpSig->param_count -= call->signature->sentinelpos;
- tmpSig->sentinelpos = 0;
- if (tmpSig->param_count > 0)
- memcpy (tmpSig->params,
- call->signature->params + call->signature->sentinelpos,
- tmpSig->param_count * sizeof(MonoType *));
-
- MONO_INST_NEW (cfg, sigArg, OP_ICONST);
- sigArg->inst_p0 = tmpSig;
-
- MONO_INST_NEW_CALL_ARG (cfg, arg, OP_OUTARG_MEMBASE);
- arg->ins.inst_left = sigArg;
- arg->ins.inst_right = (MonoInst *) call;
- arg->size = argSize;
- arg->offset = cinfo->sigCookie.offset;
- arg->ins.next = call->out_args;
- call->out_args = (MonoInst *) arg;
-}
-
/*========================= End of Function ========================*/
/*------------------------------------------------------------------*/
/*------------------------------------------------------------------*/
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;
{
MonoInst *ins, *next;
- if (bb->max_vreg > cfg->rs->next_vreg)
- cfg->rs->next_vreg = bb->max_vreg;
-
MONO_BB_FOR_EACH_INS_SAFE (bb, next, ins) {
switch (ins->opcode) {
case OP_DIV_IMM:
break;
}
}
+
+ bb->max_vreg = cfg->next_vreg;
}
/*========================= End of Function ========================*/
s390_ldebr (code, s390_f0, s390_f0);
}
break;
- case OP_OUTARG:
- g_assert_not_reached ();
- break;
case OP_LOCALLOC: {
/*------------------------------------------*/
/* To allocate space on the stack we have */
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: {
ins->inst_c0 = code - cfg->native_code;
}
break;
+ case OP_RELAXED_NOP:
case OP_NOP:
case OP_DUMMY_USE:
case OP_DUMMY_STORE:
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);
void
mono_arch_free_jit_tls_data (MonoJitTlsData *tls)
{
-
-}
-
-/*========================= End of Function ========================*/
-
-/*------------------------------------------------------------------*/
-/* */
-/* Name - mono_arch_emit_this_vret_args */
-/* */
-/* Function - */
-/* */
-/*------------------------------------------------------------------*/
-
-void
-mono_arch_emit_this_vret_args (MonoCompile *cfg, MonoCallInst *inst, int this_reg, int this_type, int vt_reg)
-{
- int this_dreg = s390_r2;
-
- if (vt_reg != -1)
- this_dreg = s390_r3;
-
- /* add the this argument */
- if (this_reg != -1) {
- MonoInst *this;
- MONO_INST_NEW (cfg, this, OP_MOVE);
- this->type = this_type;
- this->sreg1 = this_reg;
- this->dreg = mono_regstate_next_int (cfg->rs);
- mono_bblock_add_inst (cfg->cbb, this);
- mono_call_inst_add_outarg_reg (cfg, inst, this->dreg, this_dreg, FALSE);
- }
-
- if (vt_reg != -1) {
- MonoInst *vtarg;
- MONO_INST_NEW (cfg, vtarg, OP_MOVE);
- vtarg->type = STACK_MP;
- vtarg->sreg1 = vt_reg;
- vtarg->dreg = mono_regstate_next_int (cfg->rs);
- mono_bblock_add_inst (cfg->cbb, vtarg);
- mono_call_inst_add_outarg_reg (cfg, inst, vtarg->dreg, s390_r2, FALSE);
- }
}
/*========================= End of Function ========================*/
/*------------------------------------------------------------------*/
/* */
-/* Name - mono_arch_get_inst_for_method */
+/* Name - mono_arch_emit_inst_for_method */
/* */
-/* Function - Check for opcodes we can handle directly in */
-/* hardware. */
-/* */
/*------------------------------------------------------------------*/
MonoInst*
-mono_arch_get_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod,
- MonoMethodSignature *fsig, MonoInst **args)
+mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args)
{
- MonoInst *ins = NULL;
-
- if (cmethod->klass == mono_defaults.math_class) {
- if (strcmp (cmethod->name, "Sqrt") == 0) {
- MONO_INST_NEW (cfg, ins, OP_SQRT);
- ins->inst_i0 = args [0];
- }
- }
-
- return ins;
+ return NULL;
}
/*========================= End of Function ========================*/
/*------------------------------------------------------------------*/
/* */
-/* Name - mono_arch_emit_inst_for_method */
+/* Name - mono_arch_decompose_opts */
/* */
/*------------------------------------------------------------------*/
-MonoInst*
-mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args)
-{
- return NULL;
-}
-
-/*========================= End of Function ========================*/
-
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 ========================*/