[jit] Fix using conv.u with string.
[mono.git] / mono / mini / mini-mips.h
index 26918f42990b09ec9464cd6663867123736c80ff..de4898bdd3e06cfce4162bfbce591c22bc293ff7 100644 (file)
@@ -1,3 +1,7 @@
+/**
+ * \file
+ */
+
 #ifndef __MONO_MINI_MIPS_H__
 #define __MONO_MINI_MIPS_H__
 
@@ -17,7 +21,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
@@ -231,7 +235,15 @@ 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
+
+/*
+ * mips backend misses some instructions that enable emitting of optimal
+ * code on other targets and, additionally, the register allocator gets
+ * confused by this optimization, failing to allocate all hw regs.
+ */
+#if SIZEOF_REGISTER == 4
+#define MONO_ARCH_NO_DIV_WITH_MUL
 #endif
 
 #if SIZEOF_REGISTER == 8
@@ -257,7 +269,6 @@ 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_a0
@@ -266,17 +277,12 @@ typedef struct MonoCompileArch {
 #define MONO_ARCH_HAVE_DECOMPOSE_OPTS 1
 #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1
 
-#define MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK 1
+#define MONO_ARCH_HAVE_GENERALIZED_IMT_TRAMPOLINE 1
 #define MONO_ARCH_SOFT_DEBUG_SUPPORTED 1
 #define MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX 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
 #define MONO_ARCH_GSHARED_SUPPORTED 1
-
-/* XXX - a mystery, but it works */
-#define MONO_GET_CONTEXT \
-       void *ctx = (void *)(((int)context)+24);
+#define MONO_ARCH_HAVE_INIT_LMF_EXT 1
 
 /* set the next to 0 once inssel-mips.brg is updated */
 #define MIPS_PASS_STRUCTS_BY_VALUE 1
@@ -285,8 +291,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)
 
@@ -326,19 +330,9 @@ 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)
@@ -348,8 +342,6 @@ typedef struct {
 
 #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); \