From 4c25f79bc251f0ced93b2a56e2255ae7014f107e Mon Sep 17 00:00:00 2001 From: christian Date: Fri, 15 Sep 2006 17:05:58 +0000 Subject: [PATCH] * src/vm/jit/ppc/emit.c (emit_load): Changed to new variable structure (varinfo * instead of stackptr) and the use of Macros IS_INMEMORY and VAROP. (emit_store): Likewise. (emit_copy): Likewise. (emit_load_high): Likewise. (emit_load_low): Likewise. (emit_load_s1): Likewise. (emit_load_s1_low): Likewise. (emit_load_s1_high): Likewise. (emit_load_s2): Likewise. (emit_load_s2_low): Likewise. (emit_load_s2_high): Likewise. (emit_load_s3): Likewise. (emit_load_s3_low): Likewise. (emit_load_s3_high): Likewise. (emit_store_dst): Likewise. * src/vm/jit/ppc/codegen.c (codegen): Changed to new variable structure (varinfo * instead of stackptr, adapting of Argument handling, no interface copying anymore at BB Boundaries ) and the use of Macros IS_INMEMORY, VAR and VAROP. ICMD_xSTORE and ICMD_xLOAD use now emit_copy. ICMD_DUPx and ICMD_SWAP were replaced by ICMD_MOVE and ICMD_COPY. Invars are now regarded for EXH and JSR Blocks. Changed ICMD_RET handling like with i386. * src/vm/jit/ppc/codegen.h (M_COPY): Changed to new variable structure. * src/vm/jit/ppc/linux/md-abi.c (md_return_alloc): Changed to new variable structure. * src/vm/jit/ppc/darwin/md-abi.c (md_return_alloc): Changed to new variable structure. --HG-- branch : unified_variables --- src/vm/jit/powerpc/codegen.c | 410 +++++++---------------------- src/vm/jit/powerpc/codegen.h | 4 +- src/vm/jit/powerpc/darwin/md-abi.c | 26 +- src/vm/jit/powerpc/emit.c | 98 +++---- src/vm/jit/powerpc/linux/md-abi.c | 26 +- 5 files changed, 173 insertions(+), 391 deletions(-) diff --git a/src/vm/jit/powerpc/codegen.c b/src/vm/jit/powerpc/codegen.c index f7262af12..a93686c02 100644 --- a/src/vm/jit/powerpc/codegen.c +++ b/src/vm/jit/powerpc/codegen.c @@ -31,7 +31,7 @@ Christian Ullrich Edwin Steiner - $Id: codegen.c 5488 2006-09-13 00:21:40Z edwin $ + $Id: codegen.c 5522 2006-09-15 17:05:58Z christian $ */ @@ -95,8 +95,7 @@ bool codegen(jitdata *jd) s4 len, s1, s2, s3, d, disp; ptrint a; s4 fieldtype; - stackptr src; - varinfo *var; + varinfo *var, *var1, *var2; basicblock *bptr; instruction *iptr; exceptiontable *ex; @@ -106,6 +105,7 @@ bool codegen(jitdata *jd) builtintable_entry *bte; methoddesc *md; rplpoint *replacementpoint; + s4 varindex; /* get required compiler data */ @@ -232,12 +232,17 @@ bool codegen(jitdata *jd) for (p = 0, l = 0; p < md->paramcount; p++) { t = md->paramtypes[p].type; - var = &(rd->locals[l][t]); + varindex = jd->local_map[l * 5 + t]; + l++; if (IS_2_WORD_TYPE(t)) /* increment local counter for 2 word types */ l++; - if (var->type < 0) - continue; + + if (varindex == UNUSED) + continue; + + var = VAR(varindex); + s1 = md->params[p].regoff; if (IS_INT_LNG_TYPE(t)) { /* integer args */ if (IS_2_WORD_TYPE(t)) @@ -248,35 +253,35 @@ bool codegen(jitdata *jd) if (!md->params[p].inmemory) { /* register arguments */ if (!IS_INMEMORY(var->flags)) { /* reg arg -> register */ if (IS_2_WORD_TYPE(t)) - M_LNGMOVE(s2, var->regoff); + M_LNGMOVE(s2, var->vv.regoff); else - M_INTMOVE(s2, var->regoff); + M_INTMOVE(s2, var->vv.regoff); } else { /* reg arg -> spilled */ if (IS_2_WORD_TYPE(t)) - M_LST(s2, REG_SP, var->regoff * 4); + M_LST(s2, REG_SP, var->vv.regoff * 4); else - M_IST(s2, REG_SP, var->regoff * 4); + M_IST(s2, REG_SP, var->vv.regoff * 4); } } else { /* stack arguments */ if (!IS_INMEMORY(var->flags)) { /* stack arg -> register */ if (IS_2_WORD_TYPE(t)) - M_LLD(var->regoff, REG_SP, (cd->stackframesize + s1) * 4); + M_LLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4); else - M_ILD(var->regoff, REG_SP, (cd->stackframesize + s1) * 4); + M_ILD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4); } else { /* stack arg -> spilled */ #if 1 M_ILD(REG_ITMP1, REG_SP, (cd->stackframesize + s1) * 4); - M_IST(REG_ITMP1, REG_SP, var->regoff * 4); + M_IST(REG_ITMP1, REG_SP, var->vv.regoff * 4); if (IS_2_WORD_TYPE(t)) { M_ILD(REG_ITMP1, REG_SP, (cd->stackframesize + s1) * 4 +4); - M_IST(REG_ITMP1, REG_SP, var->regoff * 4 + 4); + M_IST(REG_ITMP1, REG_SP, var->vv.regoff * 4 + 4); } #else /* Reuse Memory Position on Caller Stack */ - var->regoff = cd->stackframesize + s1; + var->vv.regoff = cd->stackframesize + s1; #endif } } @@ -285,37 +290,37 @@ bool codegen(jitdata *jd) if (!md->params[p].inmemory) { /* register arguments */ s2 = rd->argfltregs[s1]; if (!IS_INMEMORY(var->flags)) { /* reg arg -> register */ - M_FLTMOVE(s2, var->regoff); + M_FLTMOVE(s2, var->vv.regoff); } else { /* reg arg -> spilled */ if (IS_2_WORD_TYPE(t)) - M_DST(s2, REG_SP, var->regoff * 4); + M_DST(s2, REG_SP, var->vv.regoff * 4); else - M_FST(s2, REG_SP, var->regoff * 4); + M_FST(s2, REG_SP, var->vv.regoff * 4); } } else { /* stack arguments */ if (!IS_INMEMORY(var->flags)) { /* stack-arg -> register */ if (IS_2_WORD_TYPE(t)) - M_DLD(var->regoff, REG_SP, (cd->stackframesize + s1) * 4); + M_DLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4); else - M_FLD(var->regoff, REG_SP, (cd->stackframesize + s1) * 4); + M_FLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4); } else { /* stack-arg -> spilled */ #if 1 if (IS_2_WORD_TYPE(t)) { M_DLD(REG_FTMP1, REG_SP, (cd->stackframesize + s1) * 4); - M_DST(REG_FTMP1, REG_SP, var->regoff * 4); - var->regoff = cd->stackframesize + s1; + M_DST(REG_FTMP1, REG_SP, var->vv.regoff * 4); + var->vv.regoff = cd->stackframesize + s1; } else { M_FLD(REG_FTMP1, REG_SP, (cd->stackframesize + s1) * 4); - M_FST(REG_FTMP1, REG_SP, var->regoff * 4); + M_FST(REG_FTMP1, REG_SP, var->vv.regoff * 4); } #else /* Reuse Memory Position on Caller Stack */ - var->regoff = cd->stackframesize + s1; + var->vv.regoff = cd->stackframesize + s1; #endif } } @@ -410,13 +415,13 @@ bool codegen(jitdata *jd) } /* handle replacement points */ - +#if 0 if (bptr->bitflags & BBFLAG_REPLACEMENT) { replacementpoint->pc = (u1*)(ptrint)bptr->mpc; /* will be resolved later */ replacementpoint++; } - +#endif /* generate basicblock profiling code */ if (JITDATA_HAS_FLAG_INSTRUMENT(jd)) { @@ -436,7 +441,6 @@ bool codegen(jitdata *jd) /* copy interface registers to their destination */ - src = bptr->instack; len = bptr->indepth; MCODECHECK(64+len); @@ -447,7 +451,7 @@ bool codegen(jitdata *jd) if ((len == 0) && (bptr->type != BBTYPE_STD)) { /* d = reg_of_var(m, src, REG_ITMP1); */ if (!IS_INMEMORY(src->flags)) - d = src->regoff; + d = src->vv.regoff; else d = REG_ITMP1; M_INTMOVE(REG_ITMP1, d); @@ -457,58 +461,22 @@ bool codegen(jitdata *jd) } } else { #endif - while (src != NULL) { + while (len > 0) { len--; - if ((len == 0) && (bptr->type != BBTYPE_STD)) { - d = codegen_reg_of_var(rd, 0, src, REG_ITMP1); + varindex = bptr->invars[len]; + var = VAR(varindex); + if ((len == bptr->indepth-1) && (bptr->type != BBTYPE_STD)) { + d = codegen_reg_of_var(0, var, REG_ITMP1); M_INTMOVE(REG_ITMP1, d); - emit_store(jd, NULL, src, d); + emit_store(jd, NULL, var, d); } else { - if (src->type == TYPE_LNG) - d = codegen_reg_of_var(rd, 0, src, REG_ITMP12_PACKED); - else - d = codegen_reg_of_var(rd, 0, src, REG_IFTMP); - if ((src->varkind != STACKVAR)) { - s2 = src->type; - if (IS_FLT_DBL_TYPE(s2)) { - if (!IS_INMEMORY(rd->interfaces[len][s2].flags)) { - s1 = rd->interfaces[len][s2].regoff; - M_FLTMOVE(s1, d); - } - else { - if (IS_2_WORD_TYPE(s2)) { - M_DLD(d, REG_SP, - rd->interfaces[len][s2].regoff * 4); - } - else { - M_FLD(d, REG_SP, - rd->interfaces[len][s2].regoff * 4); - } - } - emit_store(jd, NULL, src, d); - } - else { - if (!IS_INMEMORY(rd->interfaces[len][s2].flags)) { - s1 = rd->interfaces[len][s2].regoff; - if (IS_2_WORD_TYPE(s2)) - M_LNGMOVE(s1, d); - else - M_INTMOVE(s1, d); - } - else { - if (IS_2_WORD_TYPE(s2)) - M_LLD(d, REG_SP, - rd->interfaces[len][s2].regoff * 4); - else - M_ILD(d, REG_SP, - rd->interfaces[len][s2].regoff * 4); - } - emit_store(jd, NULL, src, d); - } - } + assert((var->flags & OUTVAR)); + /* will be done directly in simplereg lateron */ + /* for now codegen_reg_of_var has to be called here to */ + /* set the regoff and flags for all bptr->invars[] */ + d = codegen_reg_of_var(0, var, REG_ITMP1); } - src = src->prev; } #if defined(ENABLE_LSRA) @@ -516,7 +484,6 @@ bool codegen(jitdata *jd) #endif /* walk through all instructions */ - src = bptr->instack; len = bptr->icount; currentline = 0; @@ -600,131 +567,20 @@ bool codegen(jitdata *jd) /* load/store operations **********************************************/ case ICMD_ILOAD: /* ... ==> ..., content of local variable */ - case ICMD_ALOAD: /* op1 = local variable */ - - var = &(rd->locals[iptr->s1.localindex][iptr->opc - ICMD_ILOAD]); - d = codegen_reg_of_dst(jd, iptr, REG_ITMP1); - if ((iptr->dst.var->varkind == LOCALVAR) && - (iptr->dst.var->varnum == iptr->s1.localindex)) - break; - if (IS_INMEMORY(var->flags)) - M_ILD(d, REG_SP, var->regoff * 4); - else - M_INTMOVE(var->regoff, d); - emit_store_dst(jd, iptr, d); - break; - - case ICMD_LLOAD: /* ... ==> ..., content of local variable */ - /* s1.localindex = local variable */ - - var = &(rd->locals[iptr->s1.localindex][iptr->opc - ICMD_ILOAD]); - d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED); - if ((iptr->dst.var->varkind == LOCALVAR) && - (iptr->dst.var->varnum == iptr->s1.localindex)) - break; - if (IS_INMEMORY(var->flags)) - M_LLD(d, REG_SP, var->regoff * 4); - else - M_LNGMOVE(var->regoff, d); - emit_store_dst(jd, iptr, d); - break; - - case ICMD_FLOAD: /* ... ==> ..., content of local variable */ - /* s1.localindex = local variable */ - - d = codegen_reg_of_dst(jd, iptr, REG_FTMP1); - if ((iptr->dst.var->varkind == LOCALVAR) && - (iptr->dst.var->varnum == iptr->s1.localindex)) - break; - var = &(rd->locals[iptr->s1.localindex][iptr->opc - ICMD_ILOAD]); - if (IS_INMEMORY(var->flags)) - M_FLD(d, REG_SP, var->regoff * 4); - else - M_FLTMOVE(var->regoff, d); - emit_store_dst(jd, iptr, d); - break; - - case ICMD_DLOAD: /* ... ==> ..., content of local variable */ - /* s1.localindex = local variable */ - - d = codegen_reg_of_dst(jd, iptr, REG_FTMP1); - if ((iptr->dst.var->varkind == LOCALVAR) && - (iptr->dst.var->varnum == iptr->s1.localindex)) - break; - var = &(rd->locals[iptr->s1.localindex][iptr->opc - ICMD_ILOAD]); - if (IS_INMEMORY(var->flags)) - M_DLD(d, REG_SP, var->regoff * 4); - else - M_FLTMOVE(var->regoff, d); - emit_store_dst(jd, iptr, d); - break; - - + case ICMD_ALOAD: /* s1 = local variable */ + case ICMD_LLOAD: + case ICMD_FLOAD: + case ICMD_DLOAD: case ICMD_ISTORE: /* ..., value ==> ... */ - case ICMD_ASTORE: /* op1 = local variable */ - - if ((iptr->s1.var->varkind == LOCALVAR) && - (iptr->s1.var->varnum == iptr->dst.localindex)) - break; - var = &(rd->locals[iptr->dst.localindex][iptr->opc - ICMD_ISTORE]); - if (IS_INMEMORY(var->flags)) { - s1 = emit_load_s1(jd, iptr, REG_ITMP1); - M_IST(s1, REG_SP, var->regoff * 4); - } else { - s1 = emit_load_s1(jd, iptr, var->regoff); - M_INTMOVE(s1, var->regoff); - } - break; - - case ICMD_LSTORE: /* ..., value ==> ... */ - /* dst.localindex = local variable */ - - if ((iptr->s1.var->varkind == LOCALVAR) && - (iptr->s1.var->varnum == iptr->dst.localindex)) - break; - var = &(rd->locals[iptr->dst.localindex][iptr->opc - ICMD_ISTORE]); - if (IS_INMEMORY(var->flags)) { - s1 = emit_load_s1(jd, iptr, REG_ITMP12_PACKED); - M_LST(s1, REG_SP, var->regoff * 4); - } else { - s1 = emit_load_s1(jd, iptr, var->regoff); - M_LNGMOVE(s1, var->regoff); - } - break; - - case ICMD_FSTORE: /* ..., value ==> ... */ - /* dst.localindex = local variable */ - - if ((iptr->s1.var->varkind == LOCALVAR) && - (iptr->s1.var->varnum == iptr->dst.localindex)) - break; - var = &(rd->locals[iptr->dst.localindex][iptr->opc - ICMD_ISTORE]); - if (IS_INMEMORY(var->flags)) { - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - M_FST(s1, REG_SP, var->regoff * 4); - } else { - s1 = emit_load_s1(jd, iptr, var->regoff); - M_FLTMOVE(s1, var->regoff); - } - break; - - case ICMD_DSTORE: /* ..., value ==> ... */ - /* dst.localindex = local variable */ - - if ((iptr->s1.var->varkind == LOCALVAR) && - (iptr->s1.var->varnum == iptr->dst.localindex)) - break; - var = &(rd->locals[iptr->dst.localindex][iptr->opc - ICMD_ISTORE]); - if (IS_INMEMORY(var->flags)) { - s1 = emit_load_s1(jd, iptr, REG_FTMP1); - M_DST(s1, REG_SP, var->regoff * 4); - } else { - s1 = emit_load_s1(jd, iptr, var->regoff); - M_FLTMOVE(s1, var->regoff); - } + case ICMD_ASTORE: /* dst = local variable */ + case ICMD_LSTORE: + case ICMD_FSTORE: + case ICMD_DSTORE: + + emit_copy(jd, iptr, VAROP(iptr->s1), + VAROP(iptr->dst)); break; - /* pop/dup/swap operations ********************************************/ /* attention: double and longs are only one entry in CACAO ICMDs */ @@ -733,58 +589,12 @@ bool codegen(jitdata *jd) case ICMD_POP2: /* ..., value, value ==> ... */ break; - case ICMD_DUP: /* ..., a ==> ..., a, a */ - - M_COPY(iptr->s1.var, iptr->dst.var); - break; - - case ICMD_DUP_X1: /* ..., a, b ==> ..., b, a, b */ - - M_COPY(iptr->dst.dupslots[ 1], iptr->dst.dupslots[2+2]); - M_COPY(iptr->dst.dupslots[ 0], iptr->dst.dupslots[2+1]); - M_COPY(iptr->dst.dupslots[2+2], iptr->dst.dupslots[2+0]); - break; - - case ICMD_DUP_X2: /* ..., a, b, c ==> ..., c, a, b, c */ - - M_COPY(iptr->dst.dupslots[ 2], iptr->dst.dupslots[3+3]); - M_COPY(iptr->dst.dupslots[ 1], iptr->dst.dupslots[3+2]); - M_COPY(iptr->dst.dupslots[ 0], iptr->dst.dupslots[3+1]); - M_COPY(iptr->dst.dupslots[3+3], iptr->dst.dupslots[3+0]); - break; - - case ICMD_DUP2: /* ..., a, b ==> ..., a, b, a, b */ - - M_COPY(iptr->dst.dupslots[ 1], iptr->dst.dupslots[2+1]); - M_COPY(iptr->dst.dupslots[ 0], iptr->dst.dupslots[2+0]); - break; - - case ICMD_DUP2_X1: /* ..., a, b, c ==> ..., b, c, a, b, c */ - - M_COPY(iptr->dst.dupslots[ 2], iptr->dst.dupslots[3+4]); - M_COPY(iptr->dst.dupslots[ 1], iptr->dst.dupslots[3+3]); - M_COPY(iptr->dst.dupslots[ 0], iptr->dst.dupslots[3+2]); - M_COPY(iptr->dst.dupslots[3+4], iptr->dst.dupslots[3+1]); - M_COPY(iptr->dst.dupslots[3+3], iptr->dst.dupslots[3+0]); - break; - - case ICMD_DUP2_X2: /* ..., a, b, c, d ==> ..., c, d, a, b, c, d */ - - M_COPY(iptr->dst.dupslots[ 3], iptr->dst.dupslots[4+5]); - M_COPY(iptr->dst.dupslots[ 2], iptr->dst.dupslots[4+4]); - M_COPY(iptr->dst.dupslots[ 1], iptr->dst.dupslots[4+3]); - M_COPY(iptr->dst.dupslots[ 0], iptr->dst.dupslots[4+2]); - M_COPY(iptr->dst.dupslots[4+5], iptr->dst.dupslots[4+1]); - M_COPY(iptr->dst.dupslots[4+4], iptr->dst.dupslots[4+0]); - break; - - case ICMD_SWAP: /* ..., a, b ==> ..., b, a */ + case ICMD_COPY: + case ICMD_MOVE: - M_COPY(iptr->dst.dupslots[ 1], iptr->dst.dupslots[2+0]); - M_COPY(iptr->dst.dupslots[ 0], iptr->dst.dupslots[2+1]); + M_COPY(iptr->s1.varindex, iptr->dst.varindex); break; - /* integer operations *************************************************/ case ICMD_INEG: /* ..., value ==> ..., - value */ @@ -1347,17 +1157,20 @@ bool codegen(jitdata *jd) int dreg; u1 *br1; - if (IS_INMEMORY(iptr->s1.var->flags)) { + var1 = VAROP(iptr->s1); + var2 = VAROP(iptr->sx.s23.s2); + + if (IS_INMEMORY(var1->flags)) { tempreg = tempreg || (d == REG_ITMP3) || (d == REG_ITMP2); } else { - tempreg = tempreg || (d == GET_HIGH_REG(iptr->s1.var->regoff)) - || (d == GET_LOW_REG(iptr->s1.var->regoff)); + tempreg = tempreg || (d == GET_HIGH_REG(var1->vv.regoff)) + || (d == GET_LOW_REG(var1->vv.regoff)); } - if (IS_INMEMORY(iptr->sx.s23.s2.var->flags)) { + if (IS_INMEMORY(var2->flags)) { tempreg = tempreg || (d == REG_ITMP3) || (d == REG_ITMP2); } else { - tempreg = tempreg || (d == GET_HIGH_REG(iptr->sx.s23.s2.var->regoff)) - || (d == GET_LOW_REG(iptr->sx.s23.s2.var->regoff)); + tempreg = tempreg || (d == GET_HIGH_REG(var2->vv.regoff)) + || (d == GET_LOW_REG(var2->vv.regoff)); } dreg = tempreg ? REG_ITMP1 : d; @@ -1383,23 +1196,19 @@ bool codegen(jitdata *jd) case ICMD_IINC: /* ..., value ==> ..., value + constant */ /* s1.localindex = variable, sx.val.i = constant*/ - var = &(rd->locals[iptr->s1.localindex][TYPE_INT]); - if (IS_INMEMORY(var->flags)) { - s1 = REG_ITMP1; - M_ILD(s1, REG_SP, var->regoff * 4); - } else - s1 = var->regoff; + d = codegen_reg_of_dst(jd, iptr, REG_ITMP1); + s1 = emit_load_s1(jd, iptr, REG_ITMP1); + { u4 m = iptr->sx.val.i; if (m & 0x8000) m += 65536; if (m & 0xffff0000) - M_ADDIS(s1, m >> 16, s1); + M_ADDIS(s1, m >> 16, d); if (m & 0xffff) - M_IADD_IMM(s1, m & 0xffff, s1); + M_IADD_IMM(s1, m & 0xffff, d); } - if (IS_INMEMORY(var->flags)) - M_IST(s1, REG_SP, var->regoff * 4); + emit_store_dst(jd, iptr, d); break; @@ -2217,14 +2026,8 @@ bool codegen(jitdata *jd) case ICMD_RET: /* ... ==> ... */ /* s1.localindex = local variable */ - var = &(rd->locals[iptr->s1.localindex][TYPE_ADR]); - if (IS_INMEMORY(var->flags)) { - M_ALD(REG_ITMP1, REG_SP, var->regoff * 4); - M_MTCTR(REG_ITMP1); - } - else - M_MTCTR(var->regoff); - M_RTS; + M_BR(0); + codegen_addreference(cd, iptr->dst.block); ALIGNCODENOP; break; @@ -2829,33 +2632,34 @@ gen_method: /* copy arguments to registers or stack location */ for (s3 = s3 - 1; s3 >= 0; s3--) { - src = iptr->sx.s23.s2.args[s3]; + var1 = VAR(iptr->sx.s23.s2.args[s3]); - if (src->varkind == ARGVAR) + /* Already Preallocated (ARGVAR) ? */ + if (var1->flags & PREALLOC) continue; - if (IS_INT_LNG_TYPE(src->type)) { + if (IS_INT_LNG_TYPE(var1->type)) { if (!md->params[s3].inmemory) { - if (IS_2_WORD_TYPE(src->type)) { + if (IS_2_WORD_TYPE(var1->type)) { s1 = PACK_REGS( rd->argintregs[GET_LOW_REG(md->params[s3].regoff)], rd->argintregs[GET_HIGH_REG(md->params[s3].regoff)]); - d = emit_load(jd, iptr, src, s1); + d = emit_load(jd, iptr, var1, s1); M_LNGMOVE(d, s1); } else { s1 = rd->argintregs[md->params[s3].regoff]; - d = emit_load(jd, iptr, src, s1); + d = emit_load(jd, iptr, var1, s1); M_INTMOVE(d, s1); } } else { - if (IS_2_WORD_TYPE(src->type)) { - d = emit_load(jd, iptr, src, REG_ITMP12_PACKED); + if (IS_2_WORD_TYPE(var1->type)) { + d = emit_load(jd, iptr, var1, REG_ITMP12_PACKED); M_LST(d, REG_SP, md->params[s3].regoff * 4); } else { - d = emit_load(jd, iptr, src, REG_ITMP1); + d = emit_load(jd, iptr, var1, REG_ITMP1); M_IST(d, REG_SP, md->params[s3].regoff * 4); } } @@ -2863,12 +2667,12 @@ gen_method: else { if (!md->params[s3].inmemory) { s1 = rd->argfltregs[md->params[s3].regoff]; - d = emit_load(jd, iptr, src, s1); + d = emit_load(jd, iptr, var1, s1); M_FLTMOVE(d, s1); } else { - d = emit_load(jd, iptr, src, REG_FTMP1); - if (IS_2_WORD_TYPE(src->type)) + d = emit_load(jd, iptr, var1, REG_FTMP1); + if (IS_2_WORD_TYPE(var1->type)) M_DST(d, REG_SP, md->params[s3].regoff * 4); else M_FST(d, REG_SP, md->params[s3].regoff * 4); @@ -3328,12 +3132,13 @@ gen_method: MCODECHECK((iptr->s1.argcount << 1) + 64); for (s1 = iptr->s1.argcount; --s1 >= 0;) { - src = iptr->sx.s23.s2.args[s1]; + var1 = VAR(iptr->sx.s23.s2.args[s1]); /* copy SAVEDVAR sizes to stack */ - if (src->varkind != ARGVAR) { - s2 = emit_load(jd, iptr, src, REG_ITMP1); + /* Already Preallocated (ARGVAR) ? */ + if (!(var1->flags & PREALLOC)) { + s2 = emit_load(jd, iptr, var1, REG_ITMP1); #if defined(__DARWIN__) M_IST(s2, REG_SP, LA_SIZE + (s1 + INT_ARG_CNT) * 4); #else @@ -3399,41 +3204,8 @@ gen_method: /* copy values to interface registers */ - src = bptr->outstack; - len = bptr->outdepth; MCODECHECK(64 + len); -#if defined(ENABLE_LSRA) - if (!opt_lsra) -#endif - while (src) { - len--; - if ((src->varkind != STACKVAR)) { - s2 = src->type; - if (IS_FLT_DBL_TYPE(s2)) { - s1 = emit_load(jd, iptr, src, REG_FTMP1); - if (!IS_INMEMORY(rd->interfaces[len][s2].flags)) - M_FLTMOVE(s1, rd->interfaces[len][s2].regoff); - else - M_DST(s1, REG_SP, rd->interfaces[len][s2].regoff * 4); - - } else { - s1 = emit_load(jd, iptr, src, REG_ITMP1); - if (!IS_INMEMORY(rd->interfaces[len][s2].flags)) { - if (IS_2_WORD_TYPE(s2)) - M_LNGMOVE(s1, rd->interfaces[len][s2].regoff); - else - M_INTMOVE(s1, rd->interfaces[len][s2].regoff); - } else { - if (IS_2_WORD_TYPE(s2)) - M_LST(s1, REG_SP, rd->interfaces[len][s2].regoff * 4); - else - M_IST(s1, REG_SP, rd->interfaces[len][s2].regoff * 4); - } - } - } - src = src->prev; - } } /* if (bptr -> flags >= BBREACHED) */ } /* for basic block */ diff --git a/src/vm/jit/powerpc/codegen.h b/src/vm/jit/powerpc/codegen.h index ac0e191bf..8e8eb7e99 100644 --- a/src/vm/jit/powerpc/codegen.h +++ b/src/vm/jit/powerpc/codegen.h @@ -31,7 +31,7 @@ Changes: Christian Thalinger Christian Ullrich - $Id: codegen.h 4898 2006-05-10 15:51:46Z twisti $ + $Id: codegen.h 5522 2006-09-15 17:05:58Z christian $ */ @@ -115,7 +115,7 @@ } while (0) -#define M_COPY(s,d) emit_copy(jd, iptr, (s), (d)) +#define M_COPY(s,d) emit_copy(jd, iptr, (VAR(s)), (VAR(d))) #define ICONST(d,c) emit_iconst(cd, (d), (c)) #define LCONST(reg,c) \ diff --git a/src/vm/jit/powerpc/darwin/md-abi.c b/src/vm/jit/powerpc/darwin/md-abi.c index 88abd1e01..2f069ab99 100644 --- a/src/vm/jit/powerpc/darwin/md-abi.c +++ b/src/vm/jit/powerpc/darwin/md-abi.c @@ -28,7 +28,7 @@ Changes: Christian Ullrich - $Id: md-abi.c 5231 2006-08-11 10:13:28Z twisti $ + $Id: md-abi.c 5522 2006-09-15 17:05:58Z christian $ */ @@ -218,12 +218,12 @@ void md_param_alloc(methoddesc *md) --- out if precoloring was possible: - stackslot->varkind =ARGVAR - ->varnum =-1 - ->flags =0 - ->regoff =[REG_RESULT, (REG_RESULT2/REG_RESULT), REG_FRESULT] + jd->var[stackslot->varnum]->flags = PREALLOC + ->regoff =[REG_RESULT|REG_FRESULT] rd->arg[flt|int]reguse set to a value according the register usage + NOTE: Do not pass a LOCALVAR in stackslot->varnum. + *******************************************************************************/ void md_return_alloc(jitdata *jd, stackptr stackslot) @@ -248,29 +248,33 @@ void md_return_alloc(jitdata *jd, stackptr stackslot) has not to survive method invokations. */ if (!(stackslot->flags & SAVEDVAR)) { - stackslot->varkind = ARGVAR; - stackslot->varnum = -1; - stackslot->flags = 0; +/* stackslot->varkind = ARGVAR; */ +/* stackslot->varnum = -1; */ +/* stackslot->flags = 0; */ + jd->var[stackslot->varnum].flags = PREALLOC; if (IS_INT_LNG_TYPE(md->returntype.type)) { if (!IS_2_WORD_TYPE(md->returntype.type)) { if (rd->argintreguse < 1) rd->argintreguse = 1; - stackslot->regoff = REG_RESULT; +/* stackslot->regoff = REG_RESULT; */ + jd->var[stackslot->varnum].vv.regoff = REG_RESULT; } else { if (rd->argintreguse < 2) rd->argintreguse = 2; - stackslot->regoff = REG_RESULT_PACKED; +/* stackslot->regoff = REG_RESULT_PACKED; */ + jd->var[stackslot->varnum].vv.regoff = REG_RESULT_PACKED; } } else { if (rd->argfltreguse < 1) rd->argfltreguse = 1; - stackslot->regoff = REG_FRESULT; +/* stackslot->regoff = REG_FRESULT; */ + jd->var[stackslot->varnum].vv.regoff = REG_FRESULT; } } } diff --git a/src/vm/jit/powerpc/emit.c b/src/vm/jit/powerpc/emit.c index b7231d56f..76c218e07 100644 --- a/src/vm/jit/powerpc/emit.c +++ b/src/vm/jit/powerpc/emit.c @@ -57,7 +57,7 @@ *******************************************************************************/ -s4 emit_load(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg) +s4 emit_load(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg) { codegendata *cd; s4 disp; @@ -67,10 +67,10 @@ s4 emit_load(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg) cd = jd->cd; - if (src->flags & INMEMORY) { + if (IS_INMEMORY(src->flags)) { COUNT_SPILLS; - disp = src->regoff * 4; + disp = src->vv.regoff * 4; if (IS_FLT_DBL_TYPE(src->type)) { if (IS_2_WORD_TYPE(src->type)) @@ -88,7 +88,7 @@ s4 emit_load(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg) reg = tempreg; } else - reg = src->regoff; + reg = src->vv.regoff; return reg; } @@ -100,7 +100,7 @@ s4 emit_load(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg) *******************************************************************************/ -s4 emit_load_low(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg) +s4 emit_load_low(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg) { codegendata *cd; s4 disp; @@ -112,17 +112,17 @@ s4 emit_load_low(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg) cd = jd->cd; - if (src->flags & INMEMORY) { + if (IS_INMEMORY(src->flags)) { COUNT_SPILLS; - disp = src->regoff * 4; + disp = src->vv.regoff * 4; M_ILD(tempreg, REG_SP, disp + 4); reg = tempreg; } else - reg = GET_LOW_REG(src->regoff); + reg = GET_LOW_REG(src->vv.regoff); return reg; } @@ -134,7 +134,7 @@ s4 emit_load_low(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg) *******************************************************************************/ -s4 emit_load_high(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg) +s4 emit_load_high(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg) { codegendata *cd; s4 disp; @@ -146,17 +146,17 @@ s4 emit_load_high(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg) cd = jd->cd; - if (src->flags & INMEMORY) { + if (IS_INMEMORY(src->flags)) { COUNT_SPILLS; - disp = src->regoff * 4; + disp = src->vv.regoff * 4; M_ILD(tempreg, REG_SP, disp); reg = tempreg; } else - reg = GET_HIGH_REG(src->regoff); + reg = GET_HIGH_REG(src->vv.regoff); return reg; } @@ -170,10 +170,10 @@ s4 emit_load_high(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg) s4 emit_load_s1(jitdata *jd, instruction *iptr, s4 tempreg) { - stackptr src; + varinfo *src; s4 reg; - src = iptr->s1.var; + src = VAROP(iptr->s1); reg = emit_load(jd, iptr, src, tempreg); @@ -189,10 +189,10 @@ s4 emit_load_s1(jitdata *jd, instruction *iptr, s4 tempreg) s4 emit_load_s2(jitdata *jd, instruction *iptr, s4 tempreg) { - stackptr src; + varinfo *src; s4 reg; - src = iptr->sx.s23.s2.var; + src = VAROP(iptr->sx.s23.s2); reg = emit_load(jd, iptr, src, tempreg); @@ -208,10 +208,10 @@ s4 emit_load_s2(jitdata *jd, instruction *iptr, s4 tempreg) s4 emit_load_s3(jitdata *jd, instruction *iptr, s4 tempreg) { - stackptr src; + varinfo *src; s4 reg; - src = iptr->sx.s23.s3.var; + src = VAROP(iptr->sx.s23.s3); reg = emit_load(jd, iptr, src, tempreg); @@ -228,10 +228,10 @@ s4 emit_load_s3(jitdata *jd, instruction *iptr, s4 tempreg) s4 emit_load_s1_low(jitdata *jd, instruction *iptr, s4 tempreg) { - stackptr src; + varinfo *src; s4 reg; - src = iptr->s1.var; + src = VAROP(iptr->s1); reg = emit_load_low(jd, iptr, src, tempreg); @@ -248,10 +248,10 @@ s4 emit_load_s1_low(jitdata *jd, instruction *iptr, s4 tempreg) s4 emit_load_s2_low(jitdata *jd, instruction *iptr, s4 tempreg) { - stackptr src; + varinfo *src; s4 reg; - src = iptr->sx.s23.s2.var; + src = VAROP(iptr->sx.s23.s2); reg = emit_load_low(jd, iptr, src, tempreg); @@ -268,10 +268,10 @@ s4 emit_load_s2_low(jitdata *jd, instruction *iptr, s4 tempreg) s4 emit_load_s3_low(jitdata *jd, instruction *iptr, s4 tempreg) { - stackptr src; + varinfo *src; s4 reg; - src = iptr->sx.s23.s3.var; + src = VAROP(iptr->sx.s23.s3); reg = emit_load_low(jd, iptr, src, tempreg); @@ -288,10 +288,10 @@ s4 emit_load_s3_low(jitdata *jd, instruction *iptr, s4 tempreg) s4 emit_load_s1_high(jitdata *jd, instruction *iptr, s4 tempreg) { - stackptr src; + varinfo *src; s4 reg; - src = iptr->s1.var; + src = VAROP(iptr->s1); reg = emit_load_high(jd, iptr, src, tempreg); @@ -308,10 +308,10 @@ s4 emit_load_s1_high(jitdata *jd, instruction *iptr, s4 tempreg) s4 emit_load_s2_high(jitdata *jd, instruction *iptr, s4 tempreg) { - stackptr src; + varinfo *src; s4 reg; - src = iptr->sx.s23.s2.var; + src = VAROP(iptr->sx.s23.s2); reg = emit_load_high(jd, iptr, src, tempreg); @@ -328,10 +328,10 @@ s4 emit_load_s2_high(jitdata *jd, instruction *iptr, s4 tempreg) s4 emit_load_s3_high(jitdata *jd, instruction *iptr, s4 tempreg) { - stackptr src; + varinfo *src; s4 reg; - src = iptr->sx.s23.s3.var; + src = VAROP(iptr->sx.s23.s3); reg = emit_load_high(jd, iptr, src, tempreg); @@ -345,7 +345,7 @@ s4 emit_load_s3_high(jitdata *jd, instruction *iptr, s4 tempreg) *******************************************************************************/ -void emit_store(jitdata *jd, instruction *iptr, stackptr dst, s4 d) +void emit_store(jitdata *jd, instruction *iptr, varinfo *dst, s4 d) { codegendata *cd; @@ -353,20 +353,20 @@ void emit_store(jitdata *jd, instruction *iptr, stackptr dst, s4 d) cd = jd->cd; - if (dst->flags & INMEMORY) { + if (IS_INMEMORY(dst->flags)) { COUNT_SPILLS; if (IS_FLT_DBL_TYPE(dst->type)) { if (IS_2_WORD_TYPE(dst->type)) - M_DST(d, REG_SP, dst->regoff * 4); + M_DST(d, REG_SP, dst->vv.regoff * 4); else - M_FST(d, REG_SP, dst->regoff * 4); + M_FST(d, REG_SP, dst->vv.regoff * 4); } else { if (IS_2_WORD_TYPE(dst->type)) - M_LST(d, REG_SP, dst->regoff * 4); + M_LST(d, REG_SP, dst->vv.regoff * 4); else - M_IST(d, REG_SP, dst->regoff * 4); + M_IST(d, REG_SP, dst->vv.regoff * 4); } } } @@ -383,7 +383,11 @@ void emit_store(jitdata *jd, instruction *iptr, stackptr dst, s4 d) void emit_store_dst(jitdata *jd, instruction *iptr, s4 d) { - emit_store(jd, iptr, iptr->dst.var, d); + varinfo *dst; + + dst = VAROP(iptr->dst); + + emit_store(jd, iptr, dst, d); } @@ -393,19 +397,17 @@ void emit_store_dst(jitdata *jd, instruction *iptr, s4 d) *******************************************************************************/ -void emit_copy(jitdata *jd, instruction *iptr, stackptr src, stackptr dst) +void emit_copy(jitdata *jd, instruction *iptr, varinfo *src, varinfo *dst) { codegendata *cd; - registerdata *rd; s4 s1, d; /* get required compiler data */ cd = jd->cd; - rd = jd->rd; - if ((src->regoff != dst->regoff) || - ((src->flags ^ dst->flags) & INMEMORY)) { + if ((src->vv.regoff != dst->vv.regoff) || + (IS_INMEMORY(src->flags ^ dst->flags))) { /* If one of the variables resides in memory, we can eliminate the register move from/to the temporary register with the @@ -413,9 +415,9 @@ void emit_copy(jitdata *jd, instruction *iptr, stackptr src, stackptr dst) if (IS_INMEMORY(src->flags)) { if (IS_LNG_TYPE(src->type)) - d = codegen_reg_of_var(rd, iptr->opc, dst, REG_ITMP12_PACKED); + d = codegen_reg_of_var(iptr->opc, dst, REG_ITMP12_PACKED); else - d = codegen_reg_of_var(rd, iptr->opc, dst, REG_IFTMP); + d = codegen_reg_of_var(iptr->opc, dst, REG_IFTMP); s1 = emit_load(jd, iptr, src, d); } @@ -425,7 +427,7 @@ void emit_copy(jitdata *jd, instruction *iptr, stackptr src, stackptr dst) else s1 = emit_load(jd, iptr, src, REG_IFTMP); - d = codegen_reg_of_var(rd, iptr->opc, dst, s1); + d = codegen_reg_of_var(iptr->opc, dst, s1); } if (s1 != d) { @@ -917,12 +919,12 @@ void emit_verbosecall_enter(jitdata *jd) if (IS_INT_LNG_TYPE(t)) { if (!md->params[p].inmemory) { if (IS_2_WORD_TYPE(t)) { - M_ILD(rd->argintregs[GET_HIGH_REG(md->params[p].regoff)] + M_ILD(rd->argintregs[GET_HIGH_REG(md->params[p].vv.regoff)] , REG_SP, stack_off); - M_ILD(rd->argintregs[GET_LOW_REG(md->params[p].regoff)] + M_ILD(rd->argintregs[GET_LOW_REG(md->params[p].vv.regoff)] , REG_SP, stack_off + 4); } else { - M_ILD(rd->argintregs[md->params[p].regoff] + M_ILD(rd->argintregs[md->params[p].vv.regoff] , REG_SP, stack_off + 4); } } diff --git a/src/vm/jit/powerpc/linux/md-abi.c b/src/vm/jit/powerpc/linux/md-abi.c index 0dec1e5ea..33c5ce3f5 100644 --- a/src/vm/jit/powerpc/linux/md-abi.c +++ b/src/vm/jit/powerpc/linux/md-abi.c @@ -28,7 +28,7 @@ Changes: Christian Ullrich - $Id: md-abi.c 5231 2006-08-11 10:13:28Z twisti $ + $Id: md-abi.c 5522 2006-09-15 17:05:58Z christian $ */ @@ -212,12 +212,12 @@ void md_param_alloc(methoddesc *md) --- out if precoloring was possible: - stackslot->varkind =ARGVAR - ->varnum =-1 - ->flags =0 - ->regoff =[REG_RESULT, (REG_RESULT2/REG_RESULT), REG_FRESULT] + jd->var[stackslot->varnum]->flags = PREALLOC + ->regoff =[REG_RESULT|REG_FRESULT] rd->arg[flt|int]reguse set to a value according the register usage + NOTE: Do not pass a LOCALVAR in stackslot->varnum. + *******************************************************************************/ void md_return_alloc(jitdata *jd, stackptr stackslot) @@ -242,29 +242,33 @@ void md_return_alloc(jitdata *jd, stackptr stackslot) has not to survive method invokations. */ if (!(stackslot->flags & SAVEDVAR)) { - stackslot->varkind = ARGVAR; - stackslot->varnum = -1; - stackslot->flags = 0; +/* stackslot->varkind = ARGVAR; */ +/* stackslot->varnum = -1; */ +/* stackslot->flags = 0; */ + jd->var[stackslot->varnum].flags = PREALLOC; if (IS_INT_LNG_TYPE(md->returntype.type)) { if (!IS_2_WORD_TYPE(md->returntype.type)) { if (rd->argintreguse < 1) rd->argintreguse = 1; - stackslot->regoff = REG_RESULT; +/* stackslot->regoff = REG_RESULT; */ + jd->var[stackslot->varnum].vv.regoff = REG_RESULT; } else { if (rd->argintreguse < 2) rd->argintreguse = 2; - stackslot->regoff = REG_RESULT_PACKED; +/* stackslot->regoff = REG_RESULT_PACKED; */ + jd->var[stackslot->varnum].vv.regoff = REG_RESULT_PACKED; } } else { /* float/double */ if (rd->argfltreguse < 1) rd->argfltreguse = 1; - stackslot->regoff = REG_FRESULT; +/* stackslot->regoff = REG_FRESULT; */ + jd->var[stackslot->varnum].vv.regoff = REG_FRESULT; } } } -- 2.25.1