From: johanknol Date: Thu, 8 Nov 2001 19:32:47 +0000 (+0000) Subject: commited Sandeep's ptr inc/dec opts after his disc crashed X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=ecb743f95f51372295752e39b08c9ae407c2af4c;p=fw%2Fsdcc commited Sandeep's ptr inc/dec opts after his disc crashed git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1533 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/src/ds390/gen.c b/src/ds390/gen.c index 6f1f6e13..ea5009fb 100644 --- a/src/ds390/gen.c +++ b/src/ds390/gen.c @@ -5373,6 +5373,39 @@ ifxForOp (operand * op, iCode * ic) return NULL; } +/*-----------------------------------------------------------------*/ +/* hasInc - operand is incremented before any other use */ +/*-----------------------------------------------------------------*/ +static iCode * +hasInc (operand *op, iCode *ic) +{ + sym_link *type = operandType(op); + sym_link *retype = getSpec (type); + iCode *lic = ic->next; + int isize ; + + /* this could from a cast, e.g.: "(char xdata *) 0x7654;" */ + if (!IS_SYMOP(op)) return NULL; + + if (IS_BITVAR(retype)||!IS_PTR(type)) return NULL; + isize = getSize(type->next); + while (lic) { + /* if operand of the form op = op + */ + if (lic->op == '+' && isOperandEqual(IC_LEFT(lic),op) && + isOperandEqual(IC_RESULT(lic),op) && + isOperandLiteral(IC_RIGHT(lic)) && + operandLitValue(IC_RIGHT(lic)) == isize) { + return lic; + } + /* if the operand used or deffed */ + if (bitVectBitValue(OP_USES(op),lic->key) || (unsigned) lic->defKey == op->key) { + return NULL; + } + lic = lic->next; + } + return NULL; +} + /*-----------------------------------------------------------------*/ /* genAndOp - for && operation */ /*-----------------------------------------------------------------*/ @@ -8537,7 +8570,8 @@ genDataPointerGet (operand * left, static void genNearPointerGet (operand * left, operand * result, - iCode * ic) + iCode * ic, + iCode *pi) { asmop *aop = NULL; regs *preg = NULL; @@ -8606,7 +8640,7 @@ genNearPointerGet (operand * left, aopPut (AOP (result), buffer, offset); } offset++; - if (size) + if (size || pi) emitcode ("inc", "%s", rname); } } @@ -8615,6 +8649,9 @@ genNearPointerGet (operand * left, if (aop) { /* we had to allocate for this iCode */ + if (pi) { /* post increment present */ + aopPut(AOP ( left ),rname,0); + } freeAsmop (NULL, aop, ic, TRUE); } else @@ -8627,7 +8664,8 @@ genNearPointerGet (operand * left, if (AOP_SIZE (result) > 1 && !OP_SYMBOL (left)->remat && (OP_SYMBOL (left)->liveTo > ic->seq || - ic->depth)) + ic->depth) && + !pi) { int size = AOP_SIZE (result) - 1; while (size--) @@ -8637,7 +8675,7 @@ genNearPointerGet (operand * left, /* done */ freeAsmop (result, NULL, ic, TRUE); - + if (pi) pi->generated = 1; } /*-----------------------------------------------------------------*/ @@ -8646,7 +8684,8 @@ genNearPointerGet (operand * left, static void genPagedPointerGet (operand * left, operand * result, - iCode * ic) + iCode * ic, + iCode * pi) { asmop *aop = NULL; regs *preg = NULL; @@ -8693,7 +8732,7 @@ genPagedPointerGet (operand * left, offset++; - if (size) + if (size || pi) emitcode ("inc", "%s", rname); } } @@ -8702,6 +8741,7 @@ genPagedPointerGet (operand * left, if (aop) { /* we had to allocate for this iCode */ + if (pi) aopPut ( AOP (left), rname, 0); freeAsmop (NULL, aop, ic, TRUE); } else @@ -8714,7 +8754,8 @@ genPagedPointerGet (operand * left, if (AOP_SIZE (result) > 1 && !OP_SYMBOL (left)->remat && (OP_SYMBOL (left)->liveTo > ic->seq || - ic->depth)) + ic->depth) && + !pi) { int size = AOP_SIZE (result) - 1; while (size--) @@ -8724,8 +8765,7 @@ genPagedPointerGet (operand * left, /* done */ freeAsmop (result, NULL, ic, TRUE); - - + if (pi) pi->generated = 1; } /*-----------------------------------------------------------------*/ @@ -8733,7 +8773,7 @@ genPagedPointerGet (operand * left, /*-----------------------------------------------------------------*/ static void genFarPointerGet (operand * left, - operand * result, iCode * ic) + operand * result, iCode * ic, iCode *pi) { int size, offset; sym_link *retype = getSpec (operandType (result)); @@ -8798,13 +8838,20 @@ genFarPointerGet (operand * left, _flushLazyDPS (); emitcode ("movx", "a,@dptr"); - if (size) + if (size || pi) emitcode ("inc", "dptr"); aopPut (AOP (result), "a", offset++); } _endLazyDPSEvaluation (); } + if (pi && AOP_TYPE (left) != AOP_IMMD && AOP_TYPE (left) != AOP_STR) { + aopPut ( AOP (left), "dpl", 0); + aopPut ( AOP (left), "dph", 1); + if (options.model == MODEL_FLAT24) + aopPut ( AOP (left), "dpx", 2); + pi->generated = 1; + } freeAsmop (result, NULL, ic, TRUE); } @@ -8814,7 +8861,7 @@ genFarPointerGet (operand * left, /*-----------------------------------------------------------------*/ static void emitcodePointerGet (operand * left, - operand * result, iCode * ic) + operand * result, iCode * ic, iCode *pi) { int size, offset; sym_link *retype = getSpec (operandType (result)); @@ -8856,7 +8903,6 @@ emitcodePointerGet (operand * left, } } /* so dptr know contains the address */ - freeAsmop (left, NULL, ic, TRUE); aopOp (result, ic, FALSE, TRUE); /* if bit then unpack */ @@ -8875,13 +8921,21 @@ emitcodePointerGet (operand * left, emitcode ("clr", "a"); emitcode ("movc", "a,@a+dptr"); - if (size) + if (size || pi) emitcode ("inc", "dptr"); aopPut (AOP (result), "a", offset++); } _endLazyDPSEvaluation (); } + if (pi && AOP_TYPE (left) != AOP_IMMD && AOP_TYPE (left) != AOP_STR) { + aopPut ( AOP (left), "dpl", 0); + aopPut ( AOP (left), "dph", 1); + if (options.model == MODEL_FLAT24) + aopPut ( AOP (left), "dpx", 2); + pi->generated = 1; + } + freeAsmop (left, NULL, ic, TRUE); freeAsmop (result, NULL, ic, TRUE); } @@ -8890,7 +8944,7 @@ emitcodePointerGet (operand * left, /*-----------------------------------------------------------------*/ static void genGenPointerGet (operand * left, - operand * result, iCode * ic) + operand * result, iCode * ic, iCode * pi) { int size, offset; sym_link *retype = getSpec (operandType (result)); @@ -8949,7 +9003,6 @@ genGenPointerGet (operand * left, } } /* so dptr know contains the address */ - freeAsmop (left, NULL, ic, TRUE); aopOp (result, ic, FALSE, TRUE); /* if bit then unpack */ @@ -8964,11 +9017,21 @@ genGenPointerGet (operand * left, { emitcode ("lcall", "__gptrget"); aopPut (AOP (result), "a", offset++); - if (size) + if (size || pi) emitcode ("inc", "dptr"); } } + if (pi && AOP_TYPE (left) != AOP_IMMD && AOP_TYPE (left) != AOP_STR) { + aopPut ( AOP (left), "dpl", 0); + aopPut ( AOP (left), "dph", 1); + if (options.model == MODEL_FLAT24) { + aopPut ( AOP (left), "dpx", 2); + aopPut ( AOP (left), "b", 3); + } else aopPut ( AOP (left), "b", 2); + pi->generated = 1; + } + freeAsmop (left, NULL, ic, TRUE); freeAsmop (result, NULL, ic, TRUE); } @@ -8976,7 +9039,7 @@ genGenPointerGet (operand * left, /* genPointerGet - generate code for pointer get */ /*-----------------------------------------------------------------*/ static void -genPointerGet (iCode * ic) +genPointerGet (iCode * ic, iCode *pi) { operand *left, *result; sym_link *type, *etype; @@ -9014,23 +9077,23 @@ genPointerGet (iCode * ic) case POINTER: case IPOINTER: - genNearPointerGet (left, result, ic); + genNearPointerGet (left, result, ic, pi); break; case PPOINTER: - genPagedPointerGet (left, result, ic); + genPagedPointerGet (left, result, ic, pi); break; case FPOINTER: - genFarPointerGet (left, result, ic); + genFarPointerGet (left, result, ic, pi); break; case CPOINTER: - emitcodePointerGet (left, result, ic); + emitcodePointerGet (left, result, ic, pi); break; case GPOINTER: - genGenPointerGet (left, result, ic); + genGenPointerGet (left, result, ic, pi); break; } @@ -9577,7 +9640,7 @@ genGenPointerSet (operand * right, /* genPointerSet - stores the value into a pointer location */ /*-----------------------------------------------------------------*/ static void -genPointerSet (iCode * ic) +genPointerSet (iCode * ic, iCode *pi) { operand *right, *result; sym_link *type, *etype; @@ -10691,12 +10754,12 @@ gen390Code (iCode * lic) break; case GET_VALUE_AT_ADDRESS: - genPointerGet (ic); + genPointerGet (ic,hasInc(IC_LEFT(ic),ic)); break; case '=': if (POINTER_SET (ic)) - genPointerSet (ic); + genPointerSet (ic,hasInc(IC_RESULT(ic),ic)); else genAssign (ic); break; diff --git a/src/mcs51/gen.c b/src/mcs51/gen.c index 7ce9ef41..56cd50ac 100644 --- a/src/mcs51/gen.c +++ b/src/mcs51/gen.c @@ -377,7 +377,7 @@ aopForRemat (symbol * sym) { iCode *ic = sym->rematiCode; asmop *aop = newAsmop (AOP_IMMD); - int ptr_type=0 ; + int ptr_type ; int val = 0; for (;;) @@ -2735,6 +2735,8 @@ genPlusIncr (iCode * ic) unsigned int icount; unsigned int size = getDataSize (IC_RESULT (ic)); + D(emitcode (";", "genPlusIncr")); + /* will try to generate an increment */ /* if the right side is not a literal we cannot */ @@ -2746,8 +2748,6 @@ genPlusIncr (iCode * ic) if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4) return FALSE; - D(emitcode (";", "genPlusIncr")); - /* if increment 16 bits in register */ if (sameRegs (AOP (IC_LEFT (ic)), AOP (IC_RESULT (ic))) && (size > 1) && @@ -2883,8 +2883,6 @@ outBitAcc (operand * result) static void genPlusBits (iCode * ic) { - D(emitcode (";", "genPlusBits")); - if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY) { symbol *lbl = newiTempLabel (NULL); @@ -3089,6 +3087,8 @@ genMinusDec (iCode * ic) unsigned int icount; unsigned int size = getDataSize (IC_RESULT (ic)); + D(emitcode (";", "genMinusDec")); + /* will try to generate an increment */ /* if the right side is not a literal we cannot */ @@ -3100,8 +3100,6 @@ genMinusDec (iCode * ic) if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4) return FALSE; - D(emitcode (";", "genMinusDec")); - /* if decrement 16 bits in register */ if (sameRegs (AOP (IC_LEFT (ic)), AOP (IC_RESULT (ic))) && (size > 1) && @@ -3229,9 +3227,6 @@ static void genMinusBits (iCode * ic) { symbol *lbl = newiTempLabel (NULL); - - D(emitcode (";", "genMinusBits")); - if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY) { emitcode ("mov", "c,%s", AOP (IC_LEFT (ic))->aopu.aop_dir); @@ -3261,8 +3256,6 @@ genMinus (iCode * ic) int size, offset = 0; unsigned long lit = 0L; - D(emitcode (";", "genMinus")); - aopOp (IC_LEFT (ic), ic, FALSE); aopOp (IC_RIGHT (ic), ic, FALSE); aopOp (IC_RESULT (ic), ic, TRUE); @@ -3335,8 +3328,6 @@ genMultbits (operand * left, operand * right, operand * result) { - D(emitcode (";", "genMultbits")); - emitcode ("mov", "c,%s", AOP (left)->aopu.aop_dir); emitcode ("anl", "c,%s", AOP (right)->aopu.aop_dir); outBitC (result); @@ -3355,8 +3346,6 @@ genMultOneByte (operand * left, symbol *lbl; int size=AOP_SIZE(result); - D(emitcode (";", "genMultOneByte")); - if (size<1 || size>2) { // this should never happen fprintf (stderr, "size!=1||2 (%d) in %s at line:%d \n", @@ -3459,8 +3448,6 @@ genMult (iCode * ic) operand *right = IC_RIGHT (ic); operand *result = IC_RESULT (ic); - D(emitcode (";", "genMult")); - /* assign the amsops */ aopOp (left, ic, FALSE); aopOp (right, ic, FALSE); @@ -3509,8 +3496,6 @@ genDivbits (operand * left, char *l; - D(emitcode (";", "genDivbits")); - /* the result must be bit */ emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE)); l = aopGet (AOP (left), 0, FALSE, FALSE); @@ -3535,8 +3520,6 @@ genDivOneByte (operand * left, symbol *lbl; int size, offset; - D(emitcode (";", "genDivOneByte")); - size = AOP_SIZE (result) - 1; offset = 1; /* signed or unsigned */ @@ -3620,8 +3603,6 @@ genDiv (iCode * ic) operand *right = IC_RIGHT (ic); operand *result = IC_RESULT (ic); - D(emitcode (";", "genDiv")); - /* assign the amsops */ aopOp (left, ic, FALSE); aopOp (right, ic, FALSE); @@ -3663,8 +3644,6 @@ genModbits (operand * left, char *l; - D(emitcode (";", "genModbits")); - /* the result must be bit */ emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE)); l = aopGet (AOP (left), 0, FALSE, FALSE); @@ -3689,8 +3668,6 @@ genModOneByte (operand * left, char *l; symbol *lbl; - D(emitcode (";", "genModOneByte")); - /* signed or unsigned */ if (SPEC_USIGN (opetype)) { @@ -3764,8 +3741,6 @@ genMod (iCode * ic) operand *right = IC_RIGHT (ic); operand *result = IC_RESULT (ic); - D(emitcode (";", "genMod")); - /* assign the amsops */ aopOp (left, ic, FALSE); aopOp (right, ic, FALSE); @@ -3807,8 +3782,6 @@ genIfxJump (iCode * ic, char *jval) symbol *tlbl = newiTempLabel (NULL); char *inst; - D(emitcode (";", "genIfxJump")); - /* if true label then we jump if condition supplied is true */ if (IC_TRUE (ic)) @@ -3845,8 +3818,6 @@ genCmp (operand * left, operand * right, int size, offset = 0; unsigned long lit = 0L; - D(emitcode (";", "genCmp")); - /* if left & right are bit variables */ if (AOP_TYPE (left) == AOP_CRY && AOP_TYPE (right) == AOP_CRY) @@ -3955,8 +3926,6 @@ genCmpGt (iCode * ic, iCode * ifx) sym_link *letype, *retype; int sign; - D(emitcode (";", "genCmpGt")); - left = IC_LEFT (ic); right = IC_RIGHT (ic); result = IC_RESULT (ic); @@ -3984,8 +3953,6 @@ genCmpLt (iCode * ic, iCode * ifx) sym_link *letype, *retype; int sign; - D(emitcode (";", "genCmpLt")); - left = IC_LEFT (ic); right = IC_RIGHT (ic); result = IC_RESULT (ic); @@ -4101,8 +4068,6 @@ genCmpEq (iCode * ic, iCode * ifx) { operand *left, *right, *result; - D(emitcode (";", "genCmpEq")); - aopOp ((left = IC_LEFT (ic)), ic, FALSE); aopOp ((right = IC_RIGHT (ic)), ic, FALSE); aopOp ((result = IC_RESULT (ic)), ic, TRUE); @@ -4324,8 +4289,6 @@ genAndOp (iCode * ic) operand *left, *right, *result; symbol *tlbl; - D(emitcode (";", "genAndOp")); - /* note here that && operations that are in an if statement are taken away by backPatchLabels only those used in arthmetic operations remain */ @@ -4366,8 +4329,6 @@ genOrOp (iCode * ic) operand *left, *right, *result; symbol *tlbl; - D(emitcode (";", "genOrOp")); - /* note here that || operations that are in an if statement are taken away by backPatchLabels only those used in arthmetic operations remain */ @@ -4477,8 +4438,6 @@ genAnd (iCode * ic, iCode * ifx) int bytelit = 0; char buffer[10]; - D(emitcode (";", "genAnd")); - aopOp ((left = IC_LEFT (ic)), ic, FALSE); aopOp ((right = IC_RIGHT (ic)), ic, FALSE); aopOp ((result = IC_RESULT (ic)), ic, TRUE); @@ -4781,8 +4740,6 @@ genOr (iCode * ic, iCode * ifx) int size, offset = 0; unsigned long lit = 0L; - D(emitcode (";", "genOr")); - aopOp ((left = IC_LEFT (ic)), ic, FALSE); aopOp ((right = IC_RIGHT (ic)), ic, FALSE); aopOp ((result = IC_RESULT (ic)), ic, TRUE); @@ -7398,7 +7355,10 @@ genGenPointerGet (operand * left, if (AOP_TYPE (left) == AOP_IMMD) { emitcode ("mov", "dptr,%s", aopGet (AOP (left), 0, TRUE, FALSE)); - emitcode ("mov", "b,#%d", pointerCode (retype)); + if (AOP(left)->aopu.aop_immd.from_cast_remat) + emitcode ("mov", "b,%s",aopGet(AOP (left), AOP_SIZE(left)-1, FALSE, FALSE)); + else + emitcode ("mov", "b,#%d", pointerCode (retype)); } else { /* we need to get it byte by byte */ @@ -7430,6 +7390,7 @@ genGenPointerGet (operand * left, if (pi && AOP_TYPE (left) != AOP_IMMD && AOP_TYPE (left) != AOP_STR) { aopPut ( AOP (left), "dpl", 0); aopPut ( AOP (left), "dph", 1); + aopPut ( AOP (left), "b", 2); pi->generated = 1; } freeAsmop (left, NULL, ic, TRUE); @@ -7464,6 +7425,13 @@ genPointerGet (iCode * ic, iCode *pi) p_type = PTR_TYPE (SPEC_OCLS (etype)); } + /* special case when cast remat */ + if (p_type == GPOINTER && OP_SYMBOL(left)->remat && + IS_CAST_ICODE(OP_SYMBOL(left)->rematiCode)) { + left = IC_RIGHT(OP_SYMBOL(left)->rematiCode); + type = type = operandType (left); + p_type = DCL_TYPE (type); + } /* now that we have the pointer type we assign the pointer values */ switch (p_type) @@ -7995,7 +7963,10 @@ genGenPointerSet (operand * right, if (AOP_TYPE (result) == AOP_IMMD) { emitcode ("mov", "dptr,%s", aopGet (AOP (result), 0, TRUE, FALSE)); - emitcode ("mov", "b,%s + 1", aopGet (AOP (result), 0, TRUE, FALSE)); + if (AOP(result)->aopu.aop_immd.from_cast_remat) + emitcode ("mov", "b,%s",aopGet(AOP (result), AOP_SIZE(result)-1, FALSE, FALSE)); + else + emitcode ("mov", "b,%s + 1", aopGet (AOP (result), 0, TRUE, FALSE)); } else { /* we need to get it byte by byte */ @@ -8064,6 +8035,13 @@ genPointerSet (iCode * ic, iCode *pi) p_type = PTR_TYPE (SPEC_OCLS (etype)); } + /* special case when cast remat */ + if (p_type == GPOINTER && OP_SYMBOL(result)->remat && + IS_CAST_ICODE(OP_SYMBOL(result)->rematiCode)) { + result = IC_RIGHT(OP_SYMBOL(result)->rematiCode); + type = type = operandType (result); + p_type = DCL_TYPE (type); + } /* now that we have the pointer type we assign the pointer values */ switch (p_type)