2008-10-24 Mark Probst <mark.probst@gmail.com>
[mono.git] / mono / mini / mini-mips.h
index e375ee8a838a20bb9fb603e28ede25419d72bc7f..c07ae5a18ee1ce20138ab7425538e16339ab9076 100644 (file)
  * This is true in both big and little endian
  */
 
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define RET_REG1 mips_v0
+#define RET_REG2 mips_v1
+#else
+#define RET_REG1 mips_v1
+#define RET_REG2 mips_v0
+#endif
+
 #define MONO_ARCH_INST_SREG2_MASK(ins)         (0)
 #define MONO_ARCH_INST_IS_REGPAIR(desc)                ((desc) == 'V' || (desc) == 'l')
-#define MONO_ARCH_INST_REGPAIR_REG2(desc,hreg1) (((desc) == 'l') ? ((hreg1) + 1) : (((desc) == 'V') ? ((hreg1) - 1) : -1))
+#define MONO_ARCH_INST_REGPAIR_REG2(desc,hreg1) (((desc) == 'l') ? ((hreg1) + 1) : (((desc) == 'V') ? RET_REG2 : -1))
 #define MONO_ARCH_INST_IS_FLOAT(desc)          ((desc == 'f') || (desc == 'g'))
 
 // This define is called to get specific dest register as defined
 // by md file (letter after "dest"). Overwise return -1
 
-#define MONO_ARCH_INST_FIXED_REG(desc)         (((desc) == '0') ? mips_zero : (((desc) == 'a') ? mips_at : ((((desc) == 'v')) ? mips_v0 : (((desc) == 'V') ? mips_v1 : (((desc) == 'g') ? mips_f0 : -1)))))
+#define MONO_ARCH_INST_FIXED_REG(desc)         (((desc) == '0') ? mips_zero : (((desc) == 'a') ? mips_at : ((((desc) == 'v')) ? mips_v0 : (((desc) == 'V') ? RET_REG1 : (((desc) == 'g') ? mips_f0 : -1)))))
 
 #define MONO_ARCH_FRAME_ALIGNMENT 8
 
@@ -166,6 +174,7 @@ typedef struct MonoCompileArch {
 
 #define MONO_ARCH_USE_SIGACTION
 #define MONO_ARCH_NEED_DIV_CHECK 1
+#define MONO_ARCH_ENABLE_NORMALIZE_OPCODES 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)
@@ -230,16 +239,10 @@ typedef struct {
                MONO_CONTEXT_SET_SP ((ctx), MONO_CONTEXT_GET_BP (ctx)); \
        } while (0)
 
-#if 0
-#define mono_find_jit_info mono_arch_find_jit_info
-#define CUSTOM_STACK_WALK
-#endif
-
 /* re-attaches with gdb - sometimes causes executable to hang */
 #undef HAVE_BACKTRACE_SYMBOLS
 
 #undef DEBUG_EXCEPTIONS
-#undef CUSTOM_EXCEPTION_HANDLING
 
 #define MONO_ZERO_REG          mips_zero
 
@@ -269,9 +272,9 @@ typedef struct {
                MonoInst *target_label; \
                target_label = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \
                target_label->opcode = OP_LABEL;        \
-               MONO_INST_LIST_ADD (&target_label->node, \
-                                  &(targetbb)->ins_list); \
+               target_label->next = (targetbb)->code; \
                target_label->inst_c0 = (targetbb)->native_offset; \
+               (targetbb)->code = target_label; \
                inst = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \
                inst->opcode = op;      \
                 (inst)->sreg1 = sr1; \
@@ -286,9 +289,9 @@ typedef struct {
                MonoInst *target_label; \
                target_label = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \
                target_label->opcode = OP_LABEL;        \
-               MONO_INST_LIST_ADD (&target_label->node, \
-                                  &(targetbb)->ins_list); \
+               target_label->next = (targetbb)->code; \
                target_label->inst_c0 = (targetbb)->native_offset; \
+               (targetbb)->code = target_label; \
                inst = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \
                inst->opcode = op;      \
                 (inst)->sreg1 = sr1; \