2008-09-25 Dick Porter <dick@ximian.com>
[mono.git] / mono / mini / mini-s390.h
index 5aa62b5614dbcf695459e45703058fd06010fd19..8dc7e17cae1a13b174d9c998eef5af8e43ae737a 100644 (file)
@@ -12,7 +12,6 @@
 /*-------------------------------------------*/
 /* Parameters used by the register allocator */
 /*-------------------------------------------*/
-#define MONO_ARCH_HAS_XP_LOCAL_REGALLOC 1
 
 #define MONO_EMIT_NEW_MOVE(cfg,dest,offset,src,imm,size) do {                  \
                 MonoInst *inst;                                                \
        switch (size) {                                                         \
                case 0:                                                         \
                        MONO_EMIT_NEW_ICONST(cfg, reg, 0);                      \
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); \
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr, FALSE);       \
                break;                                                          \
                case 1:                                                         \
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOADU1_MEMBASE,   \
                                reg, sr, so);                                   \
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); \
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr, FALSE);       \
                break;                                                          \
                case 2:                                                         \
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOADU2_MEMBASE,   \
                                reg, sr, so);                                   \
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); \
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr, FALSE);       \
                break;                                                          \
                case 4:                                                         \
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOAD_MEMBASE,     \
                                reg, sr, so);                                   \
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); \
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr, FALSE);       \
                break;                                                          \
                case 8:                                                         \
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOAD_MEMBASE,     \
                                reg, sr, so);                                   \
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); \
-                       dr++; so += sizeof(guint32);                            \
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr, FALSE);       \
                        reg = mono_regstate_next_int (cfg->rs);                 \
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOAD_MEMBASE,     \
-                               reg, sr, so);                                   \
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); \
+                               reg, sr, so + sizeof (guint32));                                        \
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr + 1, FALSE);   \
                break;                                                          \
        }                                                                       \
 } while (0)
@@ -134,6 +132,7 @@ struct MonoLMF {
 typedef struct ucontext MonoContext;
 
 typedef struct MonoCompileArch {
+       int bkchain_reg;
 } MonoCompileArch;
 
 typedef struct
@@ -158,14 +157,16 @@ typedef struct
 #define MONO_ARCH_EMULATE_LMUL                         1
 #define MONO_ARCH_HAVE_IS_INT_OVERFLOW         1
 #define MONO_ARCH_NEED_DIV_CHECK               1
+#define MONO_ARCH_HAVE_ATOMIC_ADD 1
+#define MONO_ARCH_HAVE_ATOMIC_EXCHANGE 1
+#define MONO_ARCH_ENABLE_NORMALIZE_OPCODES 1
+#define MONO_ARCH_HAVE_DECOMPOSE_OPTS 1
+#define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1
 // #define MONO_ARCH_SIGSEGV_ON_ALTSTACK               1
 // #define MONO_ARCH_SIGNAL_STACK_SIZE         65536
 // #define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION       1
 
 #define MONO_ARCH_USE_SIGACTION        1
-// #define CUSTOM_STACK_WALK           1
-// #define CUSTOM_EXCEPTION_HANDLING   1
-// #define mono_find_jit_info          mono_arch_find_jit_info
 
 #define S390_STACK_ALIGNMENT            8
 #define S390_FIRST_ARG_REG             s390_r2
@@ -182,12 +183,13 @@ typedef struct
 /* Definitions used by mini-codegen.c            */
 /*===============================================*/
 
-/*--------------------------------------------*/
-/* use s390_r2-s390_r6 as parm registers      */
-/* s390_r0, s390_r1, s390_r13 used internally */
-/* s390_r15 is the stack pointer              */
-/*--------------------------------------------*/
-#define MONO_ARCH_CALLEE_REGS (0x1ffc)
+/*-----------------------------------------------------*/
+/* use s390_r2-s390_r6 as parm registers               */
+/* s390_r0, s390_r1, s390_r12, s390_r13 used internally*/
+/* s390_r8..s390_r11 are used for global regalloc      */
+/* s390_r15 is the stack pointer                       */
+/*-----------------------------------------------------*/
+#define MONO_ARCH_CALLEE_REGS (0xfc)
 
 #define MONO_ARCH_CALLEE_SAVED_REGS 0xff80
 
@@ -223,8 +225,6 @@ typedef struct
 #define MONO_ARCH_BASEREG s390_r15
 #define MONO_ARCH_RETREG1 s390_r2
 
-#define MONO_SPARC_STACK_BIAS 0
-
 /*-----------------------------------------------*/
 /* Macros used to generate instructions          */
 /*-----------------------------------------------*/
@@ -258,6 +258,7 @@ typedef struct
                MonoS390StackFrame *sframe;                             \
                __asm__ volatile("lr    %0,15" : "=r" (sframe));        \
                MONO_CONTEXT_SET_BP ((ctx), sframe->prev);              \
+               MONO_CONTEXT_SET_SP ((ctx), sframe->prev);              \
                sframe = (MonoS390StackFrame*)sframe->prev;             \
                MONO_CONTEXT_SET_IP ((ctx), sframe->return_address);    \
        } while (0)