From: christian Date: Fri, 22 Apr 2005 17:33:35 +0000 (+0000) Subject: 4 Byte Stackslots for i386 (native Calling Convention) X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=812ba923bef70f6a268b8ca463348f9612bed025;p=cacao.git 4 Byte Stackslots for i386 (native Calling Convention) 16 Byte Stack alignment for PowerPC in createnativestub no copy of spilled arguments to spilled locals on x86_64 new define HAS_4BYTE_STACKSLOT in arch.h SUPPORT_COMBINE_INTEGER_REGISTERS instead of USE_TWOREGS --- diff --git a/src/vm/jit/i386/arch.h b/src/vm/jit/i386/arch.h index 4975643fb..d742bb1ac 100644 --- a/src/vm/jit/i386/arch.h +++ b/src/vm/jit/i386/arch.h @@ -28,7 +28,7 @@ Changes: - $Id: arch.h 2340 2005-04-22 13:33:21Z twisti $ + $Id: arch.h 2356 2005-04-22 17:33:35Z christian $ */ @@ -123,8 +123,11 @@ #define CONDITIONAL_LOADCONST 1 -/* #define CONSECUTIVE_INTARGS */ -/* #define CONSECUTIVE_FLOATARGS */ +#define HAS_4BYTE_STACKSLOT +/* define SUPPORT_COMBINE_INTEGER_REGISTERS */ + +/* #define CONSECUTIVE_INTEGER_ARGS */ +/* #define CONSECUTIVE_FLOAT_ARGS */ #endif /* _ARCH_H */ diff --git a/src/vm/jit/i386/codegen.h b/src/vm/jit/i386/codegen.h index ed56ba3e1..1df5e2ee8 100644 --- a/src/vm/jit/i386/codegen.h +++ b/src/vm/jit/i386/codegen.h @@ -29,7 +29,7 @@ Changes: - $Id: codegen.h 2339 2005-04-22 13:31:01Z twisti $ + $Id: codegen.h 2356 2005-04-22 17:33:35Z christian $ */ @@ -64,6 +64,30 @@ copy: Points to first stackslot after the parameters rd->ifmemuse: max. number of stackslots used for spilling parameters so far ************************************************************************/ +#if defined(HAS_4BYTE_STACKSLOT) +#define SET_ARG_STACKSLOTS { \ + s4 stacksize = 0; \ + copy = curstack; \ + while (--i >= 0) { \ + stacksize+=IS_2_WORD_TYPE(copy->type)?2:1; \ + copy = copy->prev; \ + } \ + i=call_argcount; \ + copy=curstack; \ + if (stacksize > rd->ifmemuse) \ + rd->ifmemuse = stacksize; \ + while (--i >= 0) { \ + stacksize -= IS_2_WORD_TYPE(copy->type)?2:1; \ + if (!(copy->flags & SAVEDVAR)) { \ + copy->varkind = ARGVAR; \ + copy->varnum = i; \ + copy->flags |= INMEMORY; \ + copy->regoff = stacksize; \ + } \ + copy = copy->prev; \ + } \ + } +#else #define SET_ARG_STACKSLOTS { \ copy = curstack; \ if (i > rd->ifmemuse) \ @@ -78,7 +102,7 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters copy = copy->prev; \ } \ } - +#endif /* defined(HAS_4BYTE_STACKSLOTS) */ /* additional functions and macros to generate code ***************************/ @@ -122,7 +146,7 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters #define gen_div_check(v) \ if (checknull) { \ if ((v)->flags & INMEMORY) { \ - i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 8); \ + i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 4); \ } else { \ i386_test_reg_reg(cd, src->regoff, src->regoff); \ } \ @@ -163,10 +187,10 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters #define M_LNGMEMMOVE(reg,dreg) \ do { \ - i386_mov_membase_reg(cd, REG_SP, (reg) * 8, REG_ITMP1); \ - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, (dreg) * 8); \ - i386_mov_membase_reg(cd, REG_SP, (reg) * 8 + 4, REG_ITMP1); \ - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, (dreg) * 8 + 4); \ + i386_mov_membase_reg(cd, REG_SP, (reg) * 4, REG_ITMP1); \ + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, (dreg) * 4); \ + i386_mov_membase_reg(cd, REG_SP, (reg) * 4 + 4, REG_ITMP1); \ + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, (dreg) * 4 + 4); \ } while (0) @@ -188,7 +212,7 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters #define var_to_reg_int(regnr,v,tempnr) \ if ((v)->flags & INMEMORY) { \ COUNT_SPILLS; \ - i386_mov_membase_reg(cd, REG_SP, (v)->regoff * 8, tempnr); \ + i386_mov_membase_reg(cd, REG_SP, (v)->regoff * 4, tempnr); \ regnr = tempnr; \ } else { \ regnr = (v)->regoff; \ @@ -200,7 +224,7 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters if ((v)->type == TYPE_FLT) { \ if ((v)->flags & INMEMORY) { \ COUNT_SPILLS; \ - i386_flds_membase(cd, REG_SP, (v)->regoff * 8); \ + i386_flds_membase(cd, REG_SP, (v)->regoff * 4); \ fpu_st_offset++; \ regnr = tempnr; \ } else { \ @@ -211,7 +235,7 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters } else { \ if ((v)->flags & INMEMORY) { \ COUNT_SPILLS; \ - i386_fldl_membase(cd, REG_SP, (v)->regoff * 8); \ + i386_fldl_membase(cd, REG_SP, (v)->regoff * 4); \ fpu_st_offset++; \ regnr = tempnr; \ } else { \ @@ -225,7 +249,7 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters if ((v)->type == TYPE_FLT) { \ if ((v)->flags & INMEMORY) { \ COUNT_SPILLS; \ - i386_flds_membase(cd, REG_SP, (v)->regoff * 8); \ + i386_flds_membase(cd, REG_SP, (v)->regoff * 4); \ fpu_st_offset++; \ regnr = tempnr; \ } else { \ @@ -234,7 +258,7 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters } else { \ if ((v)->flags & INMEMORY) { \ COUNT_SPILLS; \ - i386_fldl_membase(cd, REG_SP, (v)->regoff * 8); \ + i386_fldl_membase(cd, REG_SP, (v)->regoff * 4); \ fpu_st_offset++; \ regnr = tempnr; \ } else { \ @@ -257,7 +281,7 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters #define store_reg_to_var_int(sptr, tempregnum) \ if ((sptr)->flags & INMEMORY) { \ COUNT_SPILLS; \ - i386_mov_reg_membase(cd, tempregnum, REG_SP, (sptr)->regoff * 8); \ + i386_mov_reg_membase(cd, tempregnum, REG_SP, (sptr)->regoff * 4); \ } @@ -265,7 +289,7 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters if ((sptr)->type == TYPE_FLT) { \ if ((sptr)->flags & INMEMORY) { \ COUNT_SPILLS; \ - i386_fstps_membase(cd, REG_SP, (sptr)->regoff * 8); \ + i386_fstps_membase(cd, REG_SP, (sptr)->regoff * 4); \ fpu_st_offset--; \ } else { \ /* i386_fxch_reg((sptr)->regoff);*/ \ @@ -275,7 +299,7 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters } else { \ if ((sptr)->flags & INMEMORY) { \ COUNT_SPILLS; \ - i386_fstpl_membase(cd, REG_SP, (sptr)->regoff * 8); \ + i386_fstpl_membase(cd, REG_SP, (sptr)->regoff * 4); \ fpu_st_offset--; \ } else { \ /* i386_fxch_reg((sptr)->regoff);*/ \ @@ -297,14 +321,14 @@ rd->ifmemuse: max. number of stackslots used for spilling parameters if (!IS_2_WORD_TYPE(from->type)) { \ if (to->flags & INMEMORY) { \ if (from->flags & INMEMORY) { \ - i386_mov_membase_reg(cd, REG_SP, from->regoff * 8, REG_ITMP1); \ - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, to->regoff * 8); \ + i386_mov_membase_reg(cd, REG_SP, from->regoff * 4, REG_ITMP1); \ + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, to->regoff * 4); \ } else { \ - i386_mov_reg_membase(cd, from->regoff, REG_SP, to->regoff * 8); \ + i386_mov_reg_membase(cd, from->regoff, REG_SP, to->regoff * 4); \ } \ } else { \ if (from->flags & INMEMORY) { \ - i386_mov_membase_reg(cd, REG_SP, from->regoff * 8, to->regoff); \ + i386_mov_membase_reg(cd, REG_SP, from->regoff * 4, to->regoff); \ } else { \ i386_mov_reg_reg(cd, from->regoff, to->regoff); \ } \ diff --git a/src/vm/jit/i386/emitfuncs.c b/src/vm/jit/i386/emitfuncs.c index c0e3d1d21..5a5f3519a 100644 --- a/src/vm/jit/i386/emitfuncs.c +++ b/src/vm/jit/i386/emitfuncs.c @@ -26,7 +26,7 @@ Authors: Christian Thalinger - $Id: emitfuncs.c 2338 2005-04-22 13:30:40Z twisti $ + $Id: emitfuncs.c 2356 2005-04-22 17:33:35Z christian $ */ @@ -48,60 +48,60 @@ void i386_emit_ialu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr) if (iptr->dst->flags & INMEMORY) { if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) { if (src->regoff == iptr->dst->regoff) { - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1); - i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1); + i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); } else if (src->prev->regoff == iptr->dst->regoff) { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1); - i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1); + i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); } else { - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1); - i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 8, REG_ITMP1); - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1); + i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 4, REG_ITMP1); + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); } } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) { if (src->regoff == iptr->dst->regoff) { - i386_alu_reg_membase(cd, alu_op, src->prev->regoff, REG_SP, iptr->dst->regoff * 8); + i386_alu_reg_membase(cd, alu_op, src->prev->regoff, REG_SP, iptr->dst->regoff * 4); } else { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1); i386_alu_reg_reg(cd, alu_op, src->prev->regoff, REG_ITMP1); - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); } } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) { if (src->prev->regoff == iptr->dst->regoff) { - i386_alu_reg_membase(cd, alu_op, src->regoff, REG_SP, iptr->dst->regoff * 8); + i386_alu_reg_membase(cd, alu_op, src->regoff, REG_SP, iptr->dst->regoff * 4); } else { - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1); i386_alu_reg_reg(cd, alu_op, src->regoff, REG_ITMP1); - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); } } else { - i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 8); - i386_alu_reg_membase(cd, alu_op, src->regoff, REG_SP, iptr->dst->regoff * 8); + i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 4); + i386_alu_reg_membase(cd, alu_op, src->regoff, REG_SP, iptr->dst->regoff * 4); } } else { if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) { - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, iptr->dst->regoff); - i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 8, iptr->dst->regoff); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, iptr->dst->regoff); + i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 4, iptr->dst->regoff); } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) { if (src->prev->regoff != iptr->dst->regoff) i386_mov_reg_reg(cd, src->prev->regoff, iptr->dst->regoff); - i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 8, iptr->dst->regoff); + i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 4, iptr->dst->regoff); } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) { if (src->regoff != iptr->dst->regoff) i386_mov_reg_reg(cd, src->regoff, iptr->dst->regoff); - i386_alu_membase_reg(cd, alu_op, REG_SP, src->prev->regoff * 8, iptr->dst->regoff); + i386_alu_membase_reg(cd, alu_op, REG_SP, src->prev->regoff * 4, iptr->dst->regoff); } else { if (src->regoff == iptr->dst->regoff) { @@ -123,22 +123,22 @@ void i386_emit_ialuconst(codegendata *cd, s4 alu_op, stackptr src, instruction * if (iptr->dst->flags & INMEMORY) { if (src->flags & INMEMORY) { if (src->regoff == iptr->dst->regoff) { - i386_alu_imm_membase(cd, alu_op, iptr->val.i, REG_SP, iptr->dst->regoff * 8); + i386_alu_imm_membase(cd, alu_op, iptr->val.i, REG_SP, iptr->dst->regoff * 4); } else { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1); i386_alu_imm_reg(cd, alu_op, iptr->val.i, REG_ITMP1); - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); } } else { - i386_mov_reg_membase(cd, src->regoff, REG_SP, iptr->dst->regoff * 8); - i386_alu_imm_membase(cd, alu_op, iptr->val.i, REG_SP, iptr->dst->regoff * 8); + i386_mov_reg_membase(cd, src->regoff, REG_SP, iptr->dst->regoff * 4); + i386_alu_imm_membase(cd, alu_op, iptr->val.i, REG_SP, iptr->dst->regoff * 4); } } else { if (src->flags & INMEMORY) { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, iptr->dst->regoff); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, iptr->dst->regoff); i386_alu_imm_reg(cd, alu_op, iptr->val.i, iptr->dst->regoff); } else { @@ -158,24 +158,24 @@ void i386_emit_lalu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr) if (iptr->dst->flags & INMEMORY) { if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) { if (src->regoff == iptr->dst->regoff) { - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1); - i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8 + 4, REG_ITMP1); - i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8 + 4); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1); + i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4 + 4, REG_ITMP1); + i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4 + 4); } else if (src->prev->regoff == iptr->dst->regoff) { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1); - i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8 + 4, REG_ITMP1); - i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 8 + 4); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1); + i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4 + 4, REG_ITMP1); + i386_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, iptr->dst->regoff * 4 + 4); } else { - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1); - i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 8, REG_ITMP1); - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8 + 4, REG_ITMP1); - i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 8 + 4, REG_ITMP1); - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8 + 4); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1); + i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 4, REG_ITMP1); + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4 + 4, REG_ITMP1); + i386_alu_membase_reg(cd, alu_op, REG_SP, src->regoff * 4 + 4, REG_ITMP1); + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4 + 4); } } } @@ -187,16 +187,16 @@ void i386_emit_laluconst(codegendata *cd, s4 alu_op, stackptr src, instruction * if (iptr->dst->flags & INMEMORY) { if (src->flags & INMEMORY) { if (src->regoff == iptr->dst->regoff) { - i386_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, iptr->dst->regoff * 8); - i386_alu_imm_membase(cd, alu_op, iptr->val.l >> 32, REG_SP, iptr->dst->regoff * 8 + 4); + i386_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, iptr->dst->regoff * 4); + i386_alu_imm_membase(cd, alu_op, iptr->val.l >> 32, REG_SP, iptr->dst->regoff * 4 + 4); } else { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1); i386_alu_imm_reg(cd, alu_op, iptr->val.l, REG_ITMP1); - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8 + 4, REG_ITMP1); + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4 + 4, REG_ITMP1); i386_alu_imm_reg(cd, alu_op, iptr->val.l >> 32, REG_ITMP1); - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8 + 4); + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4 + 4); } } } @@ -208,53 +208,53 @@ void i386_emit_ishift(codegendata *cd, s4 shift_op, stackptr src, instruction *i if (iptr->dst->flags & INMEMORY) { if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) { if (src->prev->regoff == iptr->dst->regoff) { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, ECX); - i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 8); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, ECX); + i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 4); } else { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, ECX); - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, ECX); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1); i386_shift_reg(cd, shift_op, REG_ITMP1); - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); } } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, ECX); - i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 8); - i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 8); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, ECX); + i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 4); + i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 4); } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) { if (src->prev->regoff == iptr->dst->regoff) { if (src->regoff != ECX) i386_mov_reg_reg(cd, src->regoff, ECX); - i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 8); + i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 4); } else { if (src->regoff != ECX) i386_mov_reg_reg(cd, src->regoff, ECX); - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, REG_ITMP1); i386_shift_reg(cd, shift_op, REG_ITMP1); - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); } } else { if (src->regoff != ECX) i386_mov_reg_reg(cd, src->regoff, ECX); - i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 8); - i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 8); + i386_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 4); + i386_shift_membase(cd, shift_op, REG_SP, iptr->dst->regoff * 4); } } else { if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, ECX); - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, iptr->dst->regoff); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, ECX); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, iptr->dst->regoff); i386_shift_reg(cd, shift_op, iptr->dst->regoff); } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, ECX); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, ECX); if (src->prev->regoff != iptr->dst->regoff) i386_mov_reg_reg(cd, src->prev->regoff, iptr->dst->regoff); @@ -265,7 +265,7 @@ void i386_emit_ishift(codegendata *cd, s4 shift_op, stackptr src, instruction *i if (src->regoff != ECX) i386_mov_reg_reg(cd, src->regoff, ECX); - i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, iptr->dst->regoff); + i386_mov_membase_reg(cd, REG_SP, src->prev->regoff * 4, iptr->dst->regoff); i386_shift_reg(cd, shift_op, iptr->dst->regoff); } else { @@ -285,21 +285,21 @@ void i386_emit_ishiftconst(codegendata *cd, s4 shift_op, stackptr src, instructi { if ((src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) { if (src->regoff == iptr->dst->regoff) { - i386_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, iptr->dst->regoff * 8); + i386_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, iptr->dst->regoff * 4); } else { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, REG_ITMP1); i386_shift_imm_reg(cd, shift_op, iptr->val.i, REG_ITMP1); - i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8); + i386_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 4); } } else if ((src->flags & INMEMORY) && !(iptr->dst->flags & INMEMORY)) { - i386_mov_membase_reg(cd, REG_SP, src->regoff * 8, iptr->dst->regoff); + i386_mov_membase_reg(cd, REG_SP, src->regoff * 4, iptr->dst->regoff); i386_shift_imm_reg(cd, shift_op, iptr->val.i, iptr->dst->regoff); } else if (!(src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) { - i386_mov_reg_membase(cd, src->regoff, REG_SP, iptr->dst->regoff * 8); - i386_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, iptr->dst->regoff * 8); + i386_mov_reg_membase(cd, src->regoff, REG_SP, iptr->dst->regoff * 4); + i386_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, iptr->dst->regoff * 4); } else { if (src->regoff != iptr->dst->regoff) @@ -316,26 +316,26 @@ void i386_emit_ifcc_iconst(codegendata *cd, s4 if_op, stackptr src, instruction s4 offset = 0; if (src->flags & INMEMORY) { - i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 8); + i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 4); } else { i386_test_reg_reg(cd, src->regoff, src->regoff); } offset += 7; - CALCOFFSETBYTES(offset, REG_SP, iptr->dst->regoff * 8); + CALCOFFSETBYTES(offset, REG_SP, iptr->dst->regoff * 4); i386_jcc(cd, if_op, offset + (iptr[1].opc == ICMD_ELSE_ICONST) ? 5 + offset : 0); - i386_mov_imm_membase(cd, iptr->val.i, REG_SP, iptr->dst->regoff * 8); + i386_mov_imm_membase(cd, iptr->val.i, REG_SP, iptr->dst->regoff * 4); if (iptr[1].opc == ICMD_ELSE_ICONST) { i386_jmp_imm(cd, offset); - i386_mov_imm_membase(cd, iptr[1].val.i, REG_SP, iptr->dst->regoff * 8); + i386_mov_imm_membase(cd, iptr[1].val.i, REG_SP, iptr->dst->regoff * 4); } } else { if (src->flags & INMEMORY) { - i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 8); + i386_alu_imm_membase(cd, I386_CMP, 0, REG_SP, src->regoff * 4); } else { i386_test_reg_reg(cd, src->regoff, src->regoff); diff --git a/src/vm/jit/powerpc/arch.h b/src/vm/jit/powerpc/arch.h index ca94ac50e..130f96c86 100644 --- a/src/vm/jit/powerpc/arch.h +++ b/src/vm/jit/powerpc/arch.h @@ -28,7 +28,7 @@ Changes: - $Id: arch.h 2039 2005-03-20 11:24:19Z twisti $ + $Id: arch.h 2356 2005-04-22 17:33:35Z christian $ */ @@ -116,12 +116,12 @@ /* #define CONDITIONAL_LOADCONST 1 */ #define NOLONG_CONDITIONAL -/* #define CONSECUTIVE_INTARGS */ -#define CONSECUTIVE_FLOATARGS +/* #define CONSECUTIVE_INTEGER_ARGS */ +#define CONSECUTIVE_FLOAT_ARGS #define SPECIALMEMUSE -#define USETWOREGS - +#define HAS_4BYTE_STACKSLOT +#define SUPPORT_COMBINE_INTEGER_REGISTERS #endif /* _ARCH_H */ diff --git a/src/vm/jit/powerpc/codegen.c b/src/vm/jit/powerpc/codegen.c index 3a52873b2..468ca666b 100644 --- a/src/vm/jit/powerpc/codegen.c +++ b/src/vm/jit/powerpc/codegen.c @@ -29,7 +29,7 @@ Changes: Christian Thalinger - $Id: codegen.c 2297 2005-04-13 12:50:07Z christian $ + $Id: codegen.c 2356 2005-04-22 17:33:35Z christian $ */ @@ -3400,6 +3400,7 @@ u1 *createnativestub(functionptr f, methodinfo *m) stackframesize = 24+32; } stackframesize = stackframesize + 8; /* Reserve Space to store Result registers */ + stackframesize = (stackframesize + 3) & ~3; /* Keep Stack 16 Byte aligned */ M_STWU(REG_SP, REG_SP, -stackframesize); /* build up stackframe */ /* if function is static, check for initialized */ diff --git a/src/vm/jit/reg.h b/src/vm/jit/reg.h index 2384a510e..fe3f37eac 100644 --- a/src/vm/jit/reg.h +++ b/src/vm/jit/reg.h @@ -26,7 +26,7 @@ Authors: Christian Thalinger - $Id: reg.h 2297 2005-04-13 12:50:07Z christian $ + $Id: reg.h 2356 2005-04-22 17:33:35Z christian $ */ @@ -35,6 +35,8 @@ #define _REG_H /* #define INVOKE_NEW_DEBUG */ +/* #define NEW_MEMORY */ + /* preliminary define for testing of the new creation of ARGVAR Stackslots in stack.c */ /* Changes affect handling of ARGVAR Stackslots in reg_of_var in codegen.inc */ @@ -118,10 +120,14 @@ struct registerdata { int freeargadrtop; /* free argument address register count */ #endif -#ifdef USETWOREGS +#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS int *secondregs; /* used for longs in 2 32 bit registers */ #endif +#if defined(NEW_MEMORY) && defined(HAS_4BYTE_STACKSLOT) + int *freemem_2; + int freememtop_2; +#endif int *freemem; /* free scratch memory */ int memuse; /* used memory count */ int ifmemuse; /* interface used memory count */ diff --git a/src/vm/jit/reg.inc b/src/vm/jit/reg.inc index 09e7f54b5..afa940952 100644 --- a/src/vm/jit/reg.inc +++ b/src/vm/jit/reg.inc @@ -29,7 +29,7 @@ Changes: Stefan Ring Christian Thalinger - $Id: reg.inc 2333 2005-04-22 13:26:36Z twisti $ + $Id: reg.inc 2356 2005-04-22 17:33:35Z christian $ */ @@ -96,7 +96,7 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id) rd->freeargintregs = DMNEW(s4, rd->intreg_argnum); rd->freetmpintregs = DMNEW(s4, rd->tmpintregcnt); rd->freesavintregs = DMNEW(s4, rd->savintregcnt); -#ifdef USETWOREGS +#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS rd->secondregs = DMNEW(s4, rd->intregsnum); #endif @@ -137,7 +137,7 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id) rd->argintregs[1] = i; #endif -#ifdef USETWOREGS +#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS for (i = 1; i < rd->intreg_argnum; i++) rd->secondregs[rd->argintregs[i - 1]] = rd->argintregs[i]; for (i = 1; i < rd->tmpintregcnt; i++) @@ -259,6 +259,9 @@ void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id) rd->freemem = DMNEW(s4, id->cummaxstack); +#if defined(NEW_MEMORY) && defined(HAS_4BYTE_STACKSLOT) + rd->freemem_2 = DMNEW(s4, id->cummaxstack); +#endif rd->locals = DMNEW(varinfo5, id->cumlocals); rd->interfaces = DMNEW(varinfo5, id->cummaxstack); @@ -349,7 +352,8 @@ static void interface_regalloc(methodinfo *m, codegendata *cd, registerdata *rd) int s, t, saved; int intalloc, fltalloc; /* ?per Interface slot only one flt or one int type can be allocated to a register? */ varinfo *v; - int regsneeded = 0; + int intregsneeded = 0; + int memneeded = 0; /* allocate stack space for passing arguments to called methods */ #ifdef INVOKE_NEW_DEBUG @@ -399,91 +403,95 @@ printf("analyse: argintru %3i argfltru %3i ifmemu %3i\n", rd->argintreguse, rd-> for (t = TYPE_INT; t <= TYPE_ADR; t++) { v = &rd->interfaces[s][t]; if (v->type >= 0) { -#ifdef USETWOREGS - regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0; +#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS) + intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0; +#endif +#if defined(HAS_4BYTE_STACKSLOT) + memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0; #endif if (!saved) { -#ifdef HAS_ADDRESS_REGISTER_FILE - if (t == TYPE_ADR) { #if defined(HAS_ADDRESS_REGISTER_FILE) + if (t == TYPE_ADR) { if (!m->isleafmethod &&(rd->ifargadrregcnt < rd->adrreg_argnum)) { v->regoff = rd->argadrregs[rd->ifargadrregcnt++]; } else -#endif - if (rd->iftmpadrregcnt > 0) { - rd->iftmpadrregcnt--; - v->regoff = rd->tmpadrregs[rd->iftmpadrregcnt]; - } - else if (rd->ifsavadrregcnt > 0) { - rd->ifsavadrregcnt--; - v->regoff = rd->savadrregs[rd->ifsavadrregcnt]; - } - else { - v->flags |= INMEMORY; - v->regoff = rd->ifmemuse; - rd->ifmemuse += regsneeded + 1; - } + if (rd->iftmpadrregcnt > 0) { + rd->iftmpadrregcnt--; + v->regoff = rd->tmpadrregs[rd->iftmpadrregcnt]; + } + else if (rd->ifsavadrregcnt > 0) { + rd->ifsavadrregcnt--; + v->regoff = rd->savadrregs[rd->ifsavadrregcnt]; + } + else { + v->flags |= INMEMORY; + v->regoff = rd->ifmemuse; + rd->ifmemuse++; + } } else { -#endif - if (IS_FLT_DBL_TYPE(t)) { - if (fltalloc >= 0) { - v->flags |= rd->interfaces[s][fltalloc].flags & INMEMORY; - v->regoff = rd->interfaces[s][fltalloc].regoff; - } - else if (!m->isleafmethod &&(rd->ifargfltregcnt < rd->fltreg_argnum)) { - v->regoff = rd->argfltregs[rd->ifargfltregcnt++]; - } - else if (rd->iftmpfltregcnt > 0) { - rd->iftmpfltregcnt--; - v->regoff = rd->tmpfltregs[rd->iftmpfltregcnt]; - } - else if (rd->ifsavfltregcnt > 0) { - rd->ifsavfltregcnt--; - v->regoff = rd->savfltregs[rd->ifsavfltregcnt]; - } - else { - v->flags |= INMEMORY; - v->regoff = rd->ifmemuse; - rd->ifmemuse += regsneeded + 1; - } - fltalloc = t; - } - else { -#if defined(__I386__) - /* - * for i386 put all longs in memory - */ - if (IS_2_WORD_TYPE(t)) { - v->flags |= INMEMORY; - v->regoff = rd->ifmemuse++; - } else { -#endif - if (intalloc >= 0) { - v->flags |= rd->interfaces[s][intalloc].flags & INMEMORY; - v->regoff = rd->interfaces[s][intalloc].regoff; +#endif /* defined(HAS_ADDRESS_REGISTER_FILE) */ + if (IS_FLT_DBL_TYPE(t)) { + if (fltalloc >= 0) { + v->flags |= rd->interfaces[s][fltalloc].flags & INMEMORY; + v->regoff = rd->interfaces[s][fltalloc].regoff; } - else if (!m->isleafmethod &&(rd->ifargintregcnt +regsneeded < rd->intreg_argnum)) { - v->regoff = rd->argintregs[rd->ifargintregcnt]; - rd->ifargintregcnt+=regsneeded+1; + else if (!m->isleafmethod &&(rd->ifargfltregcnt < rd->fltreg_argnum)) { + v->regoff = rd->argfltregs[rd->ifargfltregcnt++]; } - else if (rd->iftmpintregcnt > regsneeded) { - rd->iftmpintregcnt -= regsneeded + 1; - v->regoff = rd->tmpintregs[rd->iftmpintregcnt]; + else if (rd->iftmpfltregcnt > 0) { + rd->iftmpfltregcnt--; + v->regoff = rd->tmpfltregs[rd->iftmpfltregcnt]; } - else if (rd->ifsavintregcnt > regsneeded) { - rd->ifsavintregcnt -= regsneeded + 1; - v->regoff = rd->savintregs[rd->ifsavintregcnt]; + else if (rd->ifsavfltregcnt > 0) { + rd->ifsavfltregcnt--; + v->regoff = rd->savfltregs[rd->ifsavfltregcnt]; } else { v->flags |= INMEMORY; v->regoff = rd->ifmemuse; - rd->ifmemuse += regsneeded + 1; + rd->ifmemuse += memneeded + 1; } -#if defined(__I386__) + fltalloc = t; + } + else { + /* #if defined(__I386__) */ +#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS) + /* + * for i386 put all longs in memory + */ + if (IS_2_WORD_TYPE(t)) { + v->flags |= INMEMORY; + v->regoff = rd->ifmemuse; + rd->ifmemuse += memneeded + 1; + } else +#endif /* defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS) */ +#if !defined(HAS_4BYTE_STACKSLOT) + if (intalloc >= 0) { + v->flags |= rd->interfaces[s][intalloc].flags & INMEMORY; + v->regoff = rd->interfaces[s][intalloc].regoff; + } + else +#endif /* !defined(HAS_4BYTE_STACKSLOT) */ + if (!m->isleafmethod &&(rd->ifargintregcnt + intregsneeded < rd->intreg_argnum)) { + v->regoff = rd->argintregs[rd->ifargintregcnt]; + rd->ifargintregcnt += intregsneeded + 1; + } + else if (rd->iftmpintregcnt > intregsneeded) { + rd->iftmpintregcnt -= intregsneeded + 1; + v->regoff = rd->tmpintregs[rd->iftmpintregcnt]; + } + else if (rd->ifsavintregcnt > intregsneeded) { + rd->ifsavintregcnt -= intregsneeded + 1; + v->regoff = rd->savintregs[rd->ifsavintregcnt]; + } + else { + v->flags |= INMEMORY; + v->regoff = rd->ifmemuse; + rd->ifmemuse += memneeded + 1; + } + + intalloc = t; } -#endif - intalloc = t; - } #ifdef HAS_ADDRESS_REGISTER_FILE } #endif @@ -498,7 +506,7 @@ printf("analyse: argintru %3i argfltru %3i ifmemu %3i\n", rd->argintreguse, rd-> else { v->flags |= INMEMORY; v->regoff = rd->ifmemuse; - rd->ifmemuse += regsneeded + 1; + rd->ifmemuse++; } } else { #endif @@ -506,44 +514,44 @@ printf("analyse: argintru %3i argfltru %3i ifmemu %3i\n", rd->argintreguse, rd-> if (fltalloc >= 0) { v->flags |= rd->interfaces[s][fltalloc].flags & INMEMORY; v->regoff = rd->interfaces[s][fltalloc].regoff; - } - else if (rd->ifsavfltregcnt > 0) { + } else + if (rd->ifsavfltregcnt > 0) { rd->ifsavfltregcnt--; v->regoff = rd->savfltregs[rd->ifsavfltregcnt]; } else { v->flags |= INMEMORY; v->regoff = rd->ifmemuse; - rd->ifmemuse += regsneeded + 1; + rd->ifmemuse += memneeded + 1; } fltalloc = t; } else { -#if defined(__I386__) +#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS) /* * for i386 put all longs in memory */ if (IS_2_WORD_TYPE(t)) { v->flags |= INMEMORY; - v->regoff = rd->ifmemuse++; - } else { + v->regoff = rd->ifmemuse; + rd->ifmemuse += memneeded + 1; + } else #endif +#if !defined(HAS_4BYTE_STACKSLOT) if (intalloc >= 0) { v->flags |= rd->interfaces[s][intalloc].flags & INMEMORY; v->regoff = rd->interfaces[s][intalloc].regoff; - } - else if (rd->ifsavintregcnt > regsneeded) { - rd->ifsavintregcnt -= regsneeded + 1; + } else +#endif + if (rd->ifsavintregcnt > intregsneeded) { + rd->ifsavintregcnt -= intregsneeded + 1; v->regoff = rd->savintregs[rd->ifsavintregcnt]; } else { v->flags |= INMEMORY; v->regoff = rd->ifmemuse; - rd->ifmemuse += regsneeded + 1; + rd->ifmemuse += memneeded + 1; } -#if defined(__I386__) - } -#endif intalloc = t; } #ifdef HAS_ADDRESS_REGISTER_FILE @@ -583,11 +591,12 @@ printf("analyse: argintru %3i argfltru %3i ifmemu %3i\n", rd->argintreguse, rd-> static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd) { - int s, t, tt; - int intalloc, fltalloc; + int s, t, tt; + int intalloc, fltalloc; varinfo *v; - int regsneeded = 0; - int typeloop[] = { TYPE_LNG, TYPE_DBL, TYPE_INT, TYPE_FLT, TYPE_ADR }; + int intregsneeded = 0; + int memneeded = 0; + int typeloop[] = { TYPE_LNG, TYPE_DBL, TYPE_INT, TYPE_FLT, TYPE_ADR }; if (m->isleafmethod) { int arg, doublewordarg, iargcnt, fargcnt; @@ -607,13 +616,15 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd) v = &rd->locals[s][t]; if (v->type >= 0) { -#ifdef USETWOREGS - regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0; +#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS) + intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0; +#endif +#if defined(HAS_4BYTE_STACKSLOT) + memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0; #endif #ifdef HAS_ADDRESS_REGISTER_FILE if (t == TYPE_ADR) { - /* doublewordarg not possible for xdsp */ -#if !defined(CONSECUTIVE_ADDRESSARGS) +#if !defined(CONSECUTIVE_ADDRESS_ARGS) aargcnt = arg; #endif if ((arg < m->paramcount) && (aargcnt < rd->adrreg_argnum)) { @@ -633,12 +644,12 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd) else { v->flags |= INMEMORY; v->regoff = rd->ifmemuse; - rd->ifmemuse += regsneeded + 1; + rd->ifmemuse ++; } } else { #endif if (IS_FLT_DBL_TYPE(t)) { -#if !defined(CONSECUTIVE_FLOATARGS) +#if !defined(CONSECUTIVE_FLOAT_ARGS) fargcnt = arg; #endif if (fltalloc >= 0) { @@ -663,22 +674,23 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd) else { v->flags = INMEMORY; v->regoff = rd->maxmemuse; - rd->maxmemuse += regsneeded + 1; + rd->maxmemuse += memneeded + 1; } fltalloc = t; } else { int regtouse; -#if defined(__I386__) +#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS) /* * for i386 put all longs in memory */ if (IS_2_WORD_TYPE(t)) { v->flags = INMEMORY; - v->regoff = rd->maxmemuse++; + v->regoff = rd->maxmemuse; + rd->maxmemuse += memneeded + 1; } else { #endif -#if !defined(CONSECUTIVE_INTARGS) +#if !defined(CONSECUTIVE_INTEGER_ARGS) iargcnt = arg; #endif if (intalloc >= 0) { @@ -686,22 +698,22 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd) v->regoff = rd->locals[s][intalloc].regoff; } else if (!doublewordarg && (arg < m->paramcount) -#ifndef USETWOREGS +#ifndef SUPPORT_COMBINE_INTEGER_REGISTERS && ((regtouse = iargcnt) < rd->intreg_argnum) #else - && ((regtouse = s) < rd->intreg_argnum - regsneeded) + && ((regtouse = s) < rd->intreg_argnum - intregsneeded) #endif ) { v->flags = 0; v->regoff = rd->argintregs[regtouse]; } - else if (rd->maxtmpintreguse > regsneeded) { - rd->maxtmpintreguse -= regsneeded + 1; + else if (rd->maxtmpintreguse > intregsneeded) { + rd->maxtmpintreguse -= intregsneeded + 1; v->flags = 0; v->regoff = rd->tmpintregs[rd->maxtmpintreguse]; } - else if (rd->maxsavintreguse > regsneeded) { - rd->maxsavintreguse -= regsneeded + 1; + else if (rd->maxsavintreguse > intregsneeded) { + rd->maxsavintreguse -= intregsneeded + 1; v->flags = 0; v->regoff = rd->savintregs[rd->maxsavintreguse]; } @@ -718,7 +730,7 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd) else { v->flags = INMEMORY; v->regoff = rd->maxmemuse; - rd->maxmemuse += regsneeded + 1; + rd->maxmemuse += memneeded + 1; } #if defined(__I386__) } @@ -773,8 +785,11 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd) t = typeloop[tt]; v = &rd->locals[s][t]; if (v->type >= 0) { -#ifdef USETWOREGS - regsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0; +#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS + intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0; +#endif +#if defined(HAS_4BYTE_STACKSLOT) + memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0; #endif #ifdef HAS_ADDRESS_REGISTER_FILE if ( t == TYPE_ADR ) { @@ -786,7 +801,7 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd) else { v->flags = INMEMORY; v->regoff = rd->maxmemuse; - rd->maxmemuse += regsneeded + 1; + rd->maxmemuse++; } } else { #endif @@ -802,36 +817,41 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd) } else { v->flags = INMEMORY; +#if defined(NEW_MEMORY) + if ( (memneeded) && (rd->maxmemuse&1)) + rd->maxmemuse++; +#endif v->regoff = rd->maxmemuse; - rd->maxmemuse += regsneeded + 1; + rd->maxmemuse += memneeded + 1; } fltalloc = t; } else { -#if defined(__I386__) +#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS) /* * for i386 put all longs in memory */ if (IS_2_WORD_TYPE(t)) { v->flags = INMEMORY; - v->regoff = rd->maxmemuse++; + v->regoff = rd->maxmemuse; + rd->maxmemuse += memneeded + 1; } else { #endif if (intalloc >= 0) { v->flags = rd->locals[s][intalloc].flags; v->regoff = rd->locals[s][intalloc].regoff; } - else if (rd->maxsavintreguse > regsneeded) { - rd->maxsavintreguse -= regsneeded+1; + else if (rd->maxsavintreguse > intregsneeded) { + rd->maxsavintreguse -= intregsneeded+1; v->flags = 0; v->regoff = rd->savintregs[rd->maxsavintreguse]; } else { v->flags = INMEMORY; v->regoff = rd->maxmemuse; - rd->maxmemuse += regsneeded + 1; + rd->maxmemuse += memneeded + 1; } -#if defined(__I386__) +#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS) } #endif intalloc = t; @@ -848,6 +868,9 @@ static void local_regalloc(methodinfo *m, codegendata *cd, registerdata *rd) static void reg_init_temp(methodinfo *m, registerdata *rd) { rd->freememtop = 0; +#if defined(NEW_MEMORY) && defined(HAS_4BYTE_STACKSLOT) + rd->freememtop_2 = 0; +#endif rd->memuse = rd->ifmemuse; rd->freetmpinttop = 0; @@ -894,17 +917,23 @@ static void reg_init_temp(methodinfo *m, registerdata *rd) static void reg_new_temp_func(registerdata *rd, stackptr s) { - s4 regsneeded; + s4 intregsneeded; + s4 memneeded; s4 tryagain; /* Try to allocate a saved register if there is no temporary one */ /* available. This is what happens during the second run. */ tryagain = (s->flags & SAVEDVAR) ? 1 : 2; -#ifdef USETWOREGS +#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS regsneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0; #else - regsneeded = 0; + intregsneeded=0; +#endif +#if defined(HAS_4BYTE_STACKSLOT) + memneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0; +#else + memneeded=0; #endif for(; tryagain; --tryagain) { @@ -942,25 +971,25 @@ static void reg_new_temp_func(registerdata *rd, stackptr s) } } else { -#if defined(__I386__) +#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS) /* * for i386 put all longs in memory */ if (!IS_2_WORD_TYPE(s->type)) { #endif - if (rd->freesavinttop > regsneeded) { - rd->freesavinttop -= regsneeded + 1; + if (rd->freesavinttop > intregsneeded) { + rd->freesavinttop -= intregsneeded + 1; s->regoff = rd->freesavintregs[rd->freesavinttop]; return; - } else if (rd->savintreguse > regsneeded) { - rd->savintreguse -= regsneeded + 1; + } else if (rd->savintreguse > intregsneeded) { + rd->savintreguse -= intregsneeded + 1; if (rd->savintreguse < rd->maxsavintreguse) rd->maxsavintreguse = rd->savintreguse; s->regoff = rd->savintregs[rd->savintreguse]; return; } -#if defined(__I386__) +#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS) } #endif } @@ -1010,37 +1039,37 @@ static void reg_new_temp_func(registerdata *rd, stackptr s) } } else { -#if defined(__I386__) +#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS) /* * for i386 put all longs in memory */ if (!IS_2_WORD_TYPE(s->type)) { #endif - if (rd->freearginttop > regsneeded) { - rd->freearginttop -= regsneeded + 1; + if (rd->freearginttop > intregsneeded) { + rd->freearginttop -= intregsneeded + 1; s->regoff = rd->freeargintregs[rd->freearginttop]; s->flags |= TMPARG; return; - } else if (rd->argintreguse < rd->intreg_argnum - regsneeded) { + } else if (rd->argintreguse < rd->intreg_argnum - intregsneeded) { if (rd->argintreguse > rd->maxargintreguse) rd->maxargintreguse = rd->argintreguse; s->regoff = rd->argintregs[rd->argintreguse]; s->flags |= TMPARG; - rd->argintreguse += regsneeded + 1; + rd->argintreguse += intregsneeded + 1; return; - } else if (rd->freetmpinttop > regsneeded) { - rd->freetmpinttop -= regsneeded + 1; + } else if (rd->freetmpinttop > intregsneeded) { + rd->freetmpinttop -= intregsneeded + 1; s->regoff = rd->freetmpintregs[rd->freetmpinttop]; return; - } else if (rd->tmpintreguse > regsneeded) { - rd->tmpintreguse -= regsneeded + 1; + } else if (rd->tmpintreguse > intregsneeded) { + rd->tmpintreguse -= intregsneeded + 1; if (rd->tmpintreguse < rd->maxtmpintreguse) rd->maxtmpintreguse = rd->tmpintreguse; s->regoff = rd->tmpintregs[rd->tmpintreguse]; return; } -#if defined(__I386__) +#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS) } #endif } @@ -1050,16 +1079,41 @@ static void reg_new_temp_func(registerdata *rd, stackptr s) } } - if (rd->freememtop > regsneeded) { - rd->freememtop -= regsneeded + 1; +#if defined(NEW_MEMORY) +#if defined(HAS_4BYTE_STACKSLOT) + if ((memneeded>0) && (rd->freememtop_2 > memneeded)) { + rd->freememtop_2--; + s->regoff = rd->freemem_2[rd->freememtop_2]; + } else +#endif /*defined(HAS_4BYTE_STACKSLOT) */ + if ((memneeded == 0) && (rd->freememtop > memneeded)) { + rd->freememtop--;; + s->regoff = rd->freemem[rd->freememtop]; + } else { +#if defined(HAS_4BYTE_STACKSLOT) +/* align 2 Word Types */ +/* if ((memneeded) && (rd->memuse & 1 == 1)) { */ +/* rd->freemem[rd->freememtop] = rd->memuse; */ +/* rd->freememtop++; */ +/* rd->memuse++; */ +/* } */ +#endif /*defined(HAS_4BYTE_STACKSLOT) */ + s->regoff = rd->memuse; + rd->memuse += memneeded + 1; + if (rd->memuse > rd->maxmemuse) + rd->maxmemuse = rd->memuse; + } +#else /* defined(NEW_MEMORY) */ + if ((rd->freememtop > memneeded) && (memneeded == 0)) { + rd->freememtop -= memneeded + 1; s->regoff = rd->freemem[rd->freememtop]; - } else { s->regoff = rd->memuse; - rd->memuse += regsneeded + 1; + rd->memuse += memneeded + 1; if (rd->memuse > rd->maxmemuse) rd->maxmemuse = rd->memuse; } +#endif /* defined(NEW_MEMORY) */ s->flags |= INMEMORY; } @@ -1069,20 +1123,35 @@ static void reg_new_temp_func(registerdata *rd, stackptr s) static void reg_free_temp_func(registerdata *rd, stackptr s) { - s4 regsneeded; + s4 intregsneeded; + s4 memneeded; -#ifdef USETWOREGS +#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS regsneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0; #else - regsneeded = 0; + intregsneeded=0; +#endif +#if defined(HAS_4BYTE_STACKSLOT) + memneeded = (IS_2_WORD_TYPE(s->type)) ? 1 : 0; +#else + memneeded=0; #endif if (s->flags & INMEMORY) { +#if defined(NEW_MEMORY) && defined(HAS_4BYTE_STACKSLOT) + if (memneeded > 0) { + rd->freemem_2[rd->freememtop_2] = s->regoff; + rd->freememtop_2++; + } else { + rd->freemem[rd->freememtop] = s->regoff; + rd->freememtop++; + } +#else rd->freemem[rd->freememtop] = s->regoff; - if (regsneeded) + if (memneeded) rd->freemem[rd->freememtop + 1] = s->regoff + 1; - rd->freememtop += regsneeded + 1; - + rd->freememtop += memneeded + 1; +#endif /* defined(NEW_MEMORY) && defined(HAS_4BYTE_STACKSLOT */ #ifdef HAS_ADDRESS_REGISTER_FILE } else if (s->type == TYPE_ADR) { if (s->flags & (SAVEDVAR | SAVEDTMP)) { @@ -1106,27 +1175,27 @@ static void reg_free_temp_func(registerdata *rd, stackptr s) if (s->flags & (SAVEDVAR | SAVEDTMP)) { s->flags &= ~SAVEDTMP; rd->freesavintregs[rd->freesavinttop] = s->regoff; -#ifdef USETWOREGS - if (regsneeded) +#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS + if (intregsneeded) rd->freesavintregs[rd->freesavinttop + 1] = rd->secondregs[s->regoff]; #endif - rd->freesavinttop += regsneeded + 1; + rd->freesavinttop += intregsneeded + 1; } else if (s->flags & TMPARG) { s->flags &= ~TMPARG; rd->freeargintregs[rd->freearginttop] = s->regoff; -#ifdef USETWOREGS - if (regsneeded) +#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS + if (intregsneeded) rd->freeargintregs[rd->freearginttop + 1] = rd->secondregs[s->regoff]; #endif - rd->freearginttop += regsneeded + 1; + rd->freearginttop += intregsneeded + 1; } else { rd->freetmpintregs[rd->freetmpinttop] = s->regoff; -#ifdef USETWOREGS - if (regsneeded) +#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS + if (intregsneeded) rd->freetmpintregs[rd->freetmpinttop + 1] = rd->secondregs[s->regoff]; #endif - rd->freetmpinttop += regsneeded + 1; + rd->freetmpinttop += intregsneeded + 1; } } } diff --git a/src/vm/jit/stack.c b/src/vm/jit/stack.c index 231d4ff1b..19bd0ce33 100644 --- a/src/vm/jit/stack.c +++ b/src/vm/jit/stack.c @@ -29,7 +29,7 @@ Changes: Edwin Steiner Christian Thalinger - $Id: stack.c 2333 2005-04-22 13:26:36Z twisti $ + $Id: stack.c 2356 2005-04-22 17:33:35Z christian $ */ @@ -1925,13 +1925,19 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) rd->argintreguse = 3; i = iptr->op1; + REQUIRE(i); #ifdef SPECIALMEMUSE if (rd->ifmemuse < (i + rd->intreg_argnum + 6)) rd->ifmemuse = i + rd->intreg_argnum + 6; #else +# if defined(__I386__) + if (rd->ifmemuse < i + 3) + rd->ifmemuse = i + 3; /* n integer args spilled on stack */ +# else if (rd->ifmemuse < i) rd->ifmemuse = i; /* n integer args spilled on stack */ +# endif /* defined(__I386__) */ #endif if ((i + INT_ARG_CNT) > rd->arguments_num) rd->arguments_num = i + INT_ARG_CNT; @@ -1942,11 +1948,15 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) copy->varkind = ARGVAR; copy->varnum = i + INT_ARG_CNT; copy->flags|=INMEMORY; -#ifdef SPECIALMEMUSE +#if defined(SPECIALMEMUSE) copy->regoff = i + rd->intreg_argnum + 6; #else +# if defined(__I386__) + copy->regoff = i + 3; +# else copy->regoff = i; -#endif +# endif /* defined(__I386__) */ +#endif /* defined(SPECIALMEMUSE) */ } copy = copy->prev; } diff --git a/src/vm/jit/x86_64/codegen.c b/src/vm/jit/x86_64/codegen.c index 8896f299f..9bb014547 100644 --- a/src/vm/jit/x86_64/codegen.c +++ b/src/vm/jit/x86_64/codegen.c @@ -27,7 +27,7 @@ Authors: Andreas Krall Christian Thalinger - $Id: codegen.c 2352 2005-04-22 13:55:26Z twisti $ + $Id: codegen.c 2356 2005-04-22 17:33:35Z christian $ */ @@ -325,8 +325,9 @@ void codegen(methodinfo *m, codegendata *cd, registerdata *rd) if (!(var->flags & INMEMORY)) { /* stack arg -> register */ x86_64_mov_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, var->regoff); /* + 8 for return address */ } else { /* stack arg -> spilled */ - x86_64_mov_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, REG_ITMP1); /* + 8 for return address */ - x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, var->regoff * 8); + /* x86_64_mov_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, REG_ITMP1); */ /* + 8 for return address */ +/* x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, var->regoff * 8); */ + var->regoff = parentargs_base + pa + 1; } } s1++; @@ -349,8 +350,9 @@ void codegen(methodinfo *m, codegendata *cd, registerdata *rd) x86_64_movq_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, var->regoff); } else { - x86_64_movq_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, REG_FTMP1); - x86_64_movq_reg_membase(cd, REG_FTMP1, REG_SP, var->regoff * 8); +/* x86_64_movq_membase_reg(cd, REG_SP, (parentargs_base + pa) * 8 + 8, REG_FTMP1); */ +/* x86_64_movq_reg_membase(cd, REG_FTMP1, REG_SP, var->regoff * 8); */ + var->regoff = parentargs_base + pa + 1; } } s2++;