2008-08-28 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / mini-s390x.h
index de2bd0c788f53eae5be9072eb28e33f9f890a851..5274d34536662f94fda060fbf5b03a7bf2e7e29a 100644 (file)
@@ -4,13 +4,14 @@
 #include <mono/arch/s390x/s390x-codegen.h>
 #include <signal.h>
 
+#define MONO_ARCH_CPU_SPEC s390x_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;                                                \
@@ -158,6 +159,7 @@ typedef struct ucontext MonoContext;
 typedef struct MonoCompileArch {
        gpointer    litpool;
        glong       litsize;
+       int         bkchain_reg;
 } MonoCompileArch;
 
 typedef struct
@@ -174,7 +176,11 @@ typedef struct
 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS    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_SIGNAL_STACK_SIZE            256*1024
+#define MONO_ARCH_HAVE_DECOMPOSE_OPTS 1
+#define MONO_ARCH_ENABLE_NORMALIZE_OPCODES 1
 // #define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION       1
 
 #define MONO_ARCH_USE_SIGACTION        1
@@ -194,12 +200,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
 
@@ -226,14 +233,12 @@ typedef struct
 
 #define MONO_ARCH_IS_GLOBAL_IREG(reg) 0
 
-#define MONO_ARCH_FRAME_ALIGNMENT (sizeof (glong))
+#define MONO_ARCH_FRAME_ALIGNMENT 8
 #define MONO_ARCH_CODE_ALIGNMENT 32
 
 #define MONO_ARCH_BASEREG s390_r15
 #define MONO_ARCH_RETREG1 s390_r2
 
-#define MONO_SPARC_STACK_BIAS 0
-
 /*-----------------------------------------------*/
 /* Macros used to generate instructions          */
 /*-----------------------------------------------*/
@@ -267,6 +272,7 @@ typedef struct
                MonoS390StackFrame *sframe;                             \
                __asm__ volatile("lgr   %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)