X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-mips.h;h=73d0ad3272062fad992e68c42e33ca075b703a07;hb=a4ac636499cf00012912daeeb9218bda305068c0;hp=ffaf08f1951b8e84a03b326c1f2266548f0b2ef6;hpb=69eed87c79d70e67591bbdf6ee885bc21106f53b;p=mono.git diff --git a/mono/mini/mini-mips.h b/mono/mini/mini-mips.h index ffaf08f1951..73d0ad32720 100644 --- a/mono/mini/mini-mips.h +++ b/mono/mini/mini-mips.h @@ -17,7 +17,7 @@ #endif -#define MONO_ARCH_CPU_SPEC mips_desc +#define MONO_ARCH_CPU_SPEC mono_mips_desc #define MONO_MAX_IREGS 32 #define MONO_MAX_FREGS 32 @@ -28,14 +28,12 @@ #if SIZEOF_REGISTER == 4 #define IREG_SIZE 4 -typedef guint32 mips_ireg; #define FREG_SIZE 4 typedef gfloat mips_freg; #elif SIZEOF_REGISTER == 8 #define IREG_SIZE 8 -typedef guint64 mips_ireg; #define FREG_SIZE 8 typedef gdouble mips_freg; @@ -43,14 +41,6 @@ typedef gdouble mips_freg; #error Unknown REGISTER_SIZE #endif -#if G_BYTE_ORDER == G_LITTLE_ENDIAN -#define MSW_OFFSET sizeof(mips_ireg) -#define LSW_OFFSET 0 -#else -#define MSW_OFFSET 0 -#define LSW_OFFSET sizeof(mips_ireg) -#endif - /* * at and t0 used internally * v0, v1 aren't here for clarity reasons @@ -104,7 +94,7 @@ typedef gdouble mips_freg; #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 @@ -209,13 +199,15 @@ void mips_patch (guint32 *code, guint32 target); #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; - mips_ireg ebp; gpointer eip; - mips_ireg iregs [MONO_SAVED_GREGS]; + mgreg_t iregs [MONO_SAVED_GREGS]; mips_freg fregs [MONO_SAVED_FREGS]; gulong magic; }; @@ -229,6 +221,8 @@ typedef struct MonoCompileArch { guint spillvar_offset_float; guint tracing_offset; guint long_branch; + gboolean omit_fp; + gboolean omit_fp_computed; } MonoCompileArch; #if SIZEOF_REGISTER == 4 @@ -237,7 +231,6 @@ typedef struct MonoCompileArch { #define MONO_ARCH_EMULATE_LCONV_TO_R4 1 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1 #define MONO_ARCH_EMULATE_FREM 1 -#define MONO_ARCH_BIGMUL_INTRINS 1 #endif #if SIZEOF_REGISTER == 8 @@ -248,7 +241,7 @@ typedef struct MonoCompileArch { #define MIPS_FP_ADDR_OFFSET (-8) #define MIPS_STACK_ALIGNMENT 16 #define MIPS_STACK_PARAM_OFFSET 16 /* from sp to first parameter */ -#define MIPS_MINIMAL_STACK_SIZE (4*sizeof(mips_ireg) + 4*sizeof(mips_ireg)) +#define MIPS_MINIMAL_STACK_SIZE (4*sizeof(mgreg_t) + 4*sizeof(mgreg_t)) #define MIPS_EXTRA_STACK_SIZE 16 /* from last parameter to top of frame */ #if _MIPS_SIM == _ABIO32 @@ -263,11 +256,10 @@ typedef struct MonoCompileArch { #define MIPS_LAST_FPARG_REG mips_f19 #endif -#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 @@ -275,11 +267,8 @@ typedef struct MonoCompileArch { #define MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK 1 #define MONO_ARCH_SOFT_DEBUG_SUPPORTED 1 #define MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX 1 -#define MONO_ARCH_HAVE_XP_UNWIND 1 - -/* XXX - a mystery, but it works */ -#define MONO_GET_CONTEXT \ - void *ctx = (void *)(((int)context)+24); +#define MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX 1 +#define MONO_ARCH_GSHARED_SUPPORTED 1 /* set the next to 0 once inssel-mips.brg is updated */ #define MIPS_PASS_STRUCTS_BY_VALUE 1 @@ -288,8 +277,6 @@ typedef struct MonoCompileArch { #define MONO_ARCH_NEED_DIV_CHECK 1 #define MONO_ARCH_NO_IOV_CHECK 1 -#define MONO_ARCH_THIS_AS_FIRST_ARG 1 - #define MIPS_NUM_REG_ARGS (MIPS_LAST_ARG_REG-MIPS_FIRST_ARG_REG+1) #define MIPS_NUM_REG_FPARGS (MIPS_LAST_FPARG_REG-MIPS_FIRST_FPARG_REG+1) @@ -329,30 +316,18 @@ typedef struct { } 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 #undef DEBUG_EXCEPTIONS -#define MONO_ZERO_REG mips_zero - #define MONO_EMIT_NEW_MIPS_COND_EXC(cfg,cond,sr1,sr2,name) do { \ MonoInst *inst; \ MONO_INST_NEW ((cfg), (inst), cond); \