* cpu-s390x.md, mini-gc.c, mini-s390x.c mini-s390x.h, mono-context.h: Add gc mapping for s390x
* Makefile.am: Don't run bridge tests for s390x
mono_mb_emit_ldloc (mb, p_var);
mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoArray, max_length));
mono_mb_emit_ldarg (mb, 1);
+#ifdef MONO_BIG_ARRAYS
mono_mb_emit_byte (mb, CEE_STIND_I);
+#else
+ mono_mb_emit_byte (mb, CEE_STIND_I4);
+#endif
}
/*
s390_long_add_ovf_un: dest:i src1:i src2:i len:32
s390_long_sub_ovf: dest:i src1:i src2:i len:32
s390_long_sub_ovf_un: dest:i src1:i src2:i len:32
+
+gc_liveness_def: len:0
+gc_liveness_use: len:0
+gc_spill_slot_liveness_def: len:0
+gc_param_slot_liveness_def: len:0
return 0;
else if (frame_reg == ARMREG_FP)
return 1;
+#elif defined(TARGET_S390X)
+ if (frame_reg == S390_SP)
+ return 0;
+ else if (frame_reg == S390_FP)
+ return 1;
#else
NOT_IMPLEMENTED;
#endif
return ARMREG_SP;
else if (encoded == 1)
return ARMREG_FP;
+#elif defined(TARGET_S390X)
+ if (encoded == 0)
+ return S390_SP;
+ else if (encoded == 1)
+ return S390_FP;
#else
NOT_IMPLEMENTED;
#endif
static int callee_saved_regs [] = { X86_EBX, X86_ESI, X86_EDI };
#elif defined(TARGET_ARM)
static int callee_saved_regs [] = { ARMREG_V1, ARMREG_V2, ARMREG_V3, ARMREG_V4, ARMREG_V5, ARMREG_V7, ARMREG_FP };
+#elif defined(TARGET_S390X)
+static int callee_saved_regs [] = { s390_r6, s390_r7, s390_r8, s390_r9, s390_r10, s390_r11, s390_r12, s390_r13, s390_r14 };
#endif
static guint32
return (mgreg_t)MONO_CONTEXT_GET_SP (ctx);
else if (frame_reg == ARMREG_FP)
return (mgreg_t)MONO_CONTEXT_GET_BP (ctx);
+#elif defined(TARGET_S390X)
+ if (frame_reg == S390_SP)
+ return (mgreg_t)MONO_CONTEXT_GET_SP (ctx);
+ else if (frame_reg == S390_FP)
+ return (mgreg_t)MONO_CONTEXT_GET_BP (ctx);
#endif
g_assert_not_reached ();
return 0;
/* Compute min/max offsets from the fp */
/* Locals */
-#if defined(TARGET_AMD64) || defined(TARGET_X86) || defined(TARGET_ARM)
+#if defined(TARGET_AMD64) || defined(TARGET_X86) || defined(TARGET_ARM) || defined(TARGET_S390X)
locals_min_offset = ALIGN_TO (cfg->locals_min_stack_offset, SIZEOF_SLOT);
locals_max_offset = cfg->locals_max_stack_offset;
#else
min_offset = MIN (min_offset, - (cfg->arch.sp_fp_offset + cfg->arch.param_area_size));
#elif defined(TARGET_ARM)
// FIXME:
+#elif defined(TARGET_s390X)
+ // FIXME:
#else
NOT_IMPLEMENTED;
#endif
curinst++;
}
+ cfg->locals_min_stack_offset = offset;
+
curinst = cfg->locals_start;
for (iVar = curinst; iVar < cfg->num_varinfo; ++iVar) {
inst = cfg->varinfo [iVar];
iVar, inst->inst_offset, size));
}
+ cfg->locals_max_stack_offset = offset;
+
/*------------------------------------------------------*/
/* Allow space for the trace method stack area if needed*/
/*------------------------------------------------------*/
frmReg, ainfo->offparm);
MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG,
ainfo->reg, ainfo->offset, treg);
+
+ if (cfg->compute_gc_maps) {
+ MonoInst *def;
+
+ EMIT_NEW_GC_PARAM_SLOT_LIVENESS_DEF (cfg, def, ainfo->offset, t);
+ }
}
break;
}
MONO_EMIT_NEW_MOVE (cfg, srcReg, ainfo->offparm,
src->dreg, 0, size);
+
+ if (cfg->compute_gc_maps) {
+ MonoInst *def;
+
+ EMIT_NEW_GC_PARAM_SLOT_LIVENESS_DEF (cfg, def, ainfo->offset, &ins->klass->byval_arg);
+ }
}
}
case OP_MEMORY_BARRIER: {
}
break;
+ case OP_GC_LIVENESS_DEF:
+ case OP_GC_LIVENESS_USE:
+ case OP_GC_PARAM_SLOT_LIVENESS_DEF:
+ ins->backend.pc_offset = code - cfg->native_code;
+ break;
+ case OP_GC_SPILL_SLOT_LIVENESS_DEF:
+ ins->backend.pc_offset = code - cfg->native_code;
+ bb->spill_slot_defs = g_slist_prepend_mempool (cfg->mempool, bb->spill_slot_defs, ins);
+ break;
default:
g_warning ("unknown opcode %s in %s()\n", mono_inst_name (ins->opcode), __FUNCTION__);
g_assert_not_reached ();
#define MONO_ARCH_SOFT_DEBUG_SUPPORTED 1
#define MONO_ARCH_HAVE_CONTEXT_SET_INT_REG 1
#define MONO_ARCH_USE_SIGACTION 1
+#define MONO_ARCH_GC_MAPS_SUPPORTED 1
#define S390_STACK_ALIGNMENT 8
#define S390_FIRST_ARG_REG s390_r2
test-sgen : sgen-tests
else
if S390x
-test-sgen : sgen-tests
+test-sgen : sgen-regular-tests
endif
endif
endif
} while (0)
#define MONO_CONTEXT_GET_IP(ctx) (gpointer) (ctx)->uc_mcontext.psw.addr
-#define MONO_CONTEXT_GET_BP(ctx) MONO_CONTEXT_GET_SP((ctx))
#define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->uc_mcontext.gregs[15]))
+#define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->uc_mcontext.gregs[11]))
#define MONO_CONTEXT_GET_CURRENT(ctx) \
__asm__ __volatile__( \