2007-07-19 Mark Probst <mark.probst@gmail.com>
[mono.git] / mono / mini / mini-s390.h
index f1200357266335ae55b7386b3f9e052375b13822..8681a77cdb2dbf03671390077fca4e1a700810f9 100644 (file)
@@ -4,13 +4,14 @@
 #include <mono/arch/s390/s390-codegen.h>
 #include <signal.h>
 
+#define MONO_ARCH_CPU_SPEC s390_cpu_desc
+
 #define MONO_MAX_IREGS 16
 #define MONO_MAX_FREGS 16
 
 /*-------------------------------------------*/
 /* 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;                                                \
                        }                                                       \
                }                                                               \
                 inst->opcode     = OP_S390_MOVE;                               \
-               inst->unused      = size;                                       \
+               inst->backend.size        = size;                                       \
                mono_bblock_add_inst (cfg->cbb, inst);                          \
        } while (0)
 
 #define MONO_OUTPUT_VTR(cfg, size, dr, sr, so) do {                            \
        int reg = mono_regstate_next_int (cfg->rs);                             \
        switch (size) {                                                         \
+               case 0:                                                         \
+                       MONO_EMIT_NEW_ICONST(cfg, reg, 0);                      \
+                       mono_call_inst_add_outarg_reg(s, 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 (call, reg, dr, FALSE);   \
+                       mono_call_inst_add_outarg_reg(s, 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 (call, reg, dr, FALSE);   \
+                       mono_call_inst_add_outarg_reg(s, 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 (call, reg, dr, FALSE);   \
+                       mono_call_inst_add_outarg_reg(s, 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 (call, reg, dr, FALSE);   \
+                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); \
                        dr++; so += sizeof(guint32);                            \
                        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 (call, reg, dr, FALSE);   \
+                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); \
                break;                                                          \
        }                                                                       \
 } while (0)
 #define MONO_OUTPUT_VTS(cfg, size, dr, dx, sr, so) do {                                \
        int tmpr;                                                               \
        switch (size) {                                                         \
+               case 0:                                                         \
+                       tmpr = mono_regstate_next_int (cfg->rs);                \
+                       MONO_EMIT_NEW_ICONST(cfg, tmpr, 0);                     \
+                       MONO_EMIT_NEW_STORE_MEMBASE(cfg, OP_STORE_MEMBASE_REG,  \
+                               dr, dx, tmpr);                                  \
+               break;                                                          \
                case 1:                                                         \
                        tmpr = mono_regstate_next_int (cfg->rs);                \
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOADU1_MEMBASE,   \
@@ -146,12 +157,14 @@ 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_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 mono_find_jit_info          mono_arch_find_jit_info
 
 #define S390_STACK_ALIGNMENT            8
 #define S390_FIRST_ARG_REG             s390_r2
@@ -203,7 +216,7 @@ typedef struct
 
 #define MONO_ARCH_IS_GLOBAL_IREG(reg) 0
 
-#define MONO_ARCH_FRAME_ALIGNMENT (sizeof (glong))
+#define MONO_ARCH_FRAME_ALIGNMENT 4
 #define MONO_ARCH_CODE_ALIGNMENT 32
 
 #define MONO_ARCH_BASEREG s390_r15
@@ -242,8 +255,9 @@ typedef struct
 
 #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,func) do {                     \
                MonoS390StackFrame *sframe;                             \
-               __asm__ volatile("l     %0,0(15)" : "=r" (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)