#define mips_temp mips_t8
-#define MONO_ARCH_CALLEE_REGS (MIPS_T_REGS | MIPS_V_REGS)
+#define MONO_ARCH_CALLEE_REGS (MIPS_T_REGS | MIPS_V_REGS | MIPS_A_REGS)
#define MONO_ARCH_CALLEE_SAVED_REGS MIPS_S_REGS
#define MIPS_ARG_REGS MIPS_A_REGS
#define MIPS_LMF_MAGIC1 0xa5a5a5a5
#define MIPS_LMF_MAGIC2 0xc3c3c3c3
+/* Registers saved in lmf->iregs */
+#define MIPS_LMF_IREGMASK (0xffffffff & ~((1 << mips_zero) | (1 << mips_at) | MONO_ARCH_CALLEE_REGS))
+
struct MonoLMF {
gpointer previous_lmf;
gpointer lmf_addr;
MonoMethod *method;
- mgreg_t ebp;
gpointer eip;
- mgreg_t iregs [MONO_SAVED_GREGS];
+ mgreg_t iregs [MONO_SAVED_GREGS];
mips_freg fregs [MONO_SAVED_FREGS];
gulong magic;
};
guint spillvar_offset_float;
guint tracing_offset;
guint long_branch;
+ gboolean omit_fp;
+ gboolean omit_fp_computed;
} MonoCompileArch;
#if SIZEOF_REGISTER == 4
#define MONO_ARCH_HAVE_IMT 1
#define MONO_ARCH_IMT_REG mips_t0
-#define MONO_ARCH_VTABLE_REG mips_t0
-#define MONO_ARCH_RGCTX_REG mips_t0
+#define MONO_ARCH_VTABLE_REG mips_a0
+#define MONO_ARCH_RGCTX_REG MONO_ARCH_IMT_REG
#define MONO_ARCH_HAVE_DECOMPOSE_OPTS 1
#define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1
#define MONO_ARCH_HAVE_XP_UNWIND 1
#define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
#define MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX 1
-
-/* XXX - a mystery, but it works */
-#define MONO_GET_CONTEXT \
- void *ctx = (void *)(((int)context)+24);
+#define MONO_ARCH_GSHARED_SUPPORTED 1
/* set the next to 0 once inssel-mips.brg is updated */
#define MIPS_PASS_STRUCTS_BY_VALUE 1
} MonoMipsStackFrame;
#define MONO_INIT_CONTEXT_FROM_FUNC(ctx,func) do { \
- guint32 sp, ra; \
- guint32 *code = (guint32 *)(void *)func; \
- short imm; \
- memset ((ctx), 0, sizeof (*(ctx))); \
- __asm__ volatile("addu %0,$0,$29" : "=r" (sp)); \
- /* Look for adjustment of sp */ \
- while ((*code & 0xffff0000) != 0x27bd0000) \
- ++code; \
- imm = (short) (*code & 0xffff); \
- MONO_CONTEXT_SET_BP ((ctx), sp + (-imm)); \
- ra = *(guint32 *)(sp + (-imm) + MIPS_RET_ADDR_OFFSET); \
- MONO_CONTEXT_SET_IP ((ctx),ra); \
- MONO_CONTEXT_SET_SP ((ctx), MONO_CONTEXT_GET_BP (ctx)); \
+ MONO_CONTEXT_SET_BP ((ctx), __builtin_frame_address (0)); \
+ MONO_CONTEXT_SET_SP ((ctx), __builtin_frame_address (0)); \
+ MONO_CONTEXT_SET_IP ((ctx), (func)); \
} while (0)
-#define MONO_ARCH_INIT_TOP_LMF_ENTRY(lmf) do { (lmf)->ebp = -1; } while (0)
+#define MONO_ARCH_INIT_TOP_LMF_ENTRY(lmf)
/* re-attaches with gdb - sometimes causes executable to hang */
#undef HAVE_BACKTRACE_SYMBOLS