X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-s390.h;h=dd542f85dfd2365a8b9582931f4ce1aeb285d104;hb=409cc50c9c94638819abc1d9a1b921b518313807;hp=8fc8d364d30efd27fe2d31b2a56876bf73b9a98b;hpb=496dfbf9ec0fd3143e5dd560a863d916e56a52b8;p=mono.git diff --git a/mono/mini/mini-s390.h b/mono/mini/mini-s390.h index 8fc8d364d30..dd542f85dfd 100644 --- a/mono/mini/mini-s390.h +++ b/mono/mini/mini-s390.h @@ -4,119 +4,14 @@ #include #include +#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; \ - int tmpr = 0; \ - int sReg, dReg; \ - \ - inst = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \ - if (size > 256) { \ - tmpr = mono_regstate_next_int (cfg->rs); \ - MONO_EMIT_NEW_ICONST(cfg,tmpr,size); \ - inst->dreg = dest; \ - inst->inst_offset = offset; \ - inst->sreg1 = src; \ - inst->inst_imm = imm; \ - inst->sreg2 = tmpr; \ - } else { \ - if (s390_is_uimm12(offset)) { \ - inst->dreg = dest; \ - inst->inst_offset = offset; \ - } else { \ - dReg = mono_regstate_next_int (cfg->rs); \ - MONO_EMIT_NEW_BIALU_IMM(cfg, OP_ADD_IMM, \ - dReg, dest, offset); \ - inst->dreg = dReg; \ - inst->inst_offset = 0; \ - } \ - if (s390_is_uimm12(imm)) { \ - inst->sreg1 = src; \ - inst->inst_imm = imm; \ - } else { \ - sReg = mono_regstate_next_int (cfg->rs); \ - MONO_EMIT_NEW_BIALU_IMM(cfg, OP_ADD_IMM, \ - sReg, src, imm); \ - inst->sreg1 = sReg; \ - inst->inst_imm = 0; \ - } \ - } \ - inst->opcode = OP_S390_MOVE; \ - 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(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(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(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(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(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, \ - tmpr, sr, so); \ - MONO_EMIT_NEW_STORE_MEMBASE(cfg, OP_STORE_MEMBASE_REG, \ - dr, dx, tmpr); \ - break; \ - case 2: \ - tmpr = mono_regstate_next_int (cfg->rs); \ - MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOADU2_MEMBASE, \ - tmpr, sr, so); \ - MONO_EMIT_NEW_STORE_MEMBASE(cfg, OP_STORE_MEMBASE_REG, \ - dr, dx, tmpr); \ - break; \ - case 4: \ - case 8: \ - MONO_EMIT_NEW_MOVE (cfg, dr, dx, sr, so, size); \ - break; \ - } \ -} while (0) struct MonoLMF { gpointer previous_lmf; @@ -132,6 +27,7 @@ struct MonoLMF { typedef struct ucontext MonoContext; typedef struct MonoCompileArch { + int bkchain_reg; } MonoCompileArch; typedef struct @@ -156,14 +52,15 @@ 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_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 @@ -180,12 +77,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 @@ -215,14 +113,11 @@ 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 #define MONO_ARCH_RETREG1 s390_r2 -#define MONO_SPARC_STACK_BIAS 0 - /*-----------------------------------------------*/ /* Macros used to generate instructions */ /*-----------------------------------------------*/ @@ -256,6 +151,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)