X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fmcs51%2Fgen.c;h=6825ec2eda447731b3ecc62beeaa6e979f385901;hb=6d6039133e612284f032da8b1baaa1a5088b6765;hp=8b816f10f8280136078215ce0436d15aedec0c50;hpb=78ee1c4db56a72002884411196225f4c2d48204e;p=fw%2Fsdcc diff --git a/src/mcs51/gen.c b/src/mcs51/gen.c index 8b816f10..6825ec2e 100644 --- a/src/mcs51/gen.c +++ b/src/mcs51/gen.c @@ -38,23 +38,6 @@ #include "SDCCglobl.h" #include "newalloc.h" -#ifdef HAVE_SYS_ISA_DEFS_H -#include -#else -#ifdef HAVE_MACHINE_ENDIAN_H -#include -#else -#ifdef HAVE_ENDIAN_H -#include -#else -#if !defined(__BORLANDC__) && !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__CYGWIN__) -#warning "Cannot determine ENDIANESS of this machine assuming LITTLE_ENDIAN" -#warning "If you running sdcc on an INTEL 80x86 Platform you are okay" -#endif -#endif -#endif -#endif - #include "common.h" #include "SDCCpeeph.h" #include "ralloc.h" @@ -79,7 +62,7 @@ char **fReturn = fReturn8051; static char *accUse[] = {"a", "b"}; -static short rbank = -1; +static unsigned short rbank = -1; static struct { @@ -128,7 +111,7 @@ static unsigned char SRMask[] = /* emitcode - writes the code into a file : for now it is simple */ /*-----------------------------------------------------------------*/ static void -emitcode (char *inst, char *fmt,...) +emitcode (char *inst, const char *fmt,...) { va_list ap; char lb[INITIAL_INLINEASM]; @@ -163,7 +146,7 @@ emitcode (char *inst, char *fmt,...) /* mova - moves specified value into accumulator */ /*-----------------------------------------------------------------*/ static void -mova (char *x) +mova (const char *x) { /* do some early peephole optimization */ if (!strcmp(x, "a") || !strcmp(x, "acc")) @@ -247,17 +230,26 @@ getFreePtr (iCode * ic, asmop ** aopp, bool result) (*aopp)->type = AOP_R1; return mcs51_regWithIdx (R1_IDX); } - endOfWorld: - /* I said end of world but not quite end of world yet */ - /* if this is a result then we can push it on the stack */ - if (result) - { - (*aopp)->type = AOP_STK; - return NULL; + /* I said end of world, but not quite end of world yet */ + if (result) { + /* we can push it on the stack */ + (*aopp)->type = AOP_STK; + return NULL; + } else { + /* in the case that result AND left AND right needs a pointer reg + we can safely use the result's */ + if (bitVectBitValue (mcs51_rUmaskForOp(IC_RESULT(ic)), R0_IDX)) { + (*aopp)->type = AOP_R0; + return mcs51_regWithIdx (R0_IDX); } + if (bitVectBitValue (mcs51_rUmaskForOp(IC_RESULT(ic)), R1_IDX)) { + (*aopp)->type = AOP_R1; + return mcs51_regWithIdx (R1_IDX); + } + } - /* other wise this is true end of the world */ + /* now this is REALLY the end of the world */ werror (E_INTERNAL_ERROR, __FILE__, __LINE__, "getFreePtr should never reach here"); exit (1); @@ -859,6 +851,12 @@ aopGet (asmop * aop, int offset, bool bit16, bool dname) return rs; case AOP_DPTR: + if (aop->code && aop->coff==0 && offset>=1) { + emitcode ("mov", "a,#0x%02x", offset); + emitcode ("movc", "a,@a+dptr"); + return (dname ? "acc" : "a"); + } + while (offset > aop->coff) { emitcode ("inc", "dptr"); @@ -949,7 +947,7 @@ aopGet (asmop * aop, int offset, bool bit16, bool dname) /* aopPut - puts a string for a aop */ /*-----------------------------------------------------------------*/ static void -aopPut (asmop * aop, char *s, int offset) +aopPut (asmop * aop, const char *s, int offset, bool bvolatile) { char *d = buffer; @@ -971,7 +969,8 @@ aopPut (asmop * aop, char *s, int offset) else sprintf (d, "%s", aop->aopu.aop_dir); - if (strcmp (d, s)) + if (strcmp (d, s) || + bvolatile) emitcode ("mov", "%s,%s", d, s); break; @@ -1001,7 +1000,7 @@ aopPut (asmop * aop, char *s, int offset) if (aop->code) { werror (E_INTERNAL_ERROR, __FILE__, __LINE__, - "aopPut writting to code space"); + "aopPut writing to code space"); exit (1); } @@ -1114,16 +1113,19 @@ aopPut (asmop * aop, char *s, int offset) case AOP_STR: aop->coff = offset; - if (strcmp (aop->aopu.aop_str[offset], s)) + if (strcmp (aop->aopu.aop_str[offset], s) || + bvolatile) emitcode ("mov", "%s,%s", aop->aopu.aop_str[offset], s); break; case AOP_ACC: aop->coff = offset; - if (!offset && (strcmp (s, "acc") == 0)) + if (!offset && (strcmp (s, "acc") == 0) && + !bvolatile) break; - if (strcmp (aop->aopu.aop_str[offset], s)) + if (strcmp (aop->aopu.aop_str[offset], s) && + !bvolatile) emitcode ("mov", "%s,%s", aop->aopu.aop_str[offset], s); break; @@ -1213,11 +1215,11 @@ genNotFloat (operand * op, operand * res) char *l; symbol *tlbl; - D(emitcode (";", "genNotFloat")); + D(emitcode ("; genNotFloat","")); /* we will put 127 in the first byte of the result */ - aopPut (AOP (res), "#127", 0); + aopPut (AOP (res), "#127", 0, isOperandVolatile (op, FALSE)); size = AOP_SIZE (op) - 1; offset = 1; @@ -1232,16 +1234,16 @@ genNotFloat (operand * op, operand * res) } tlbl = newiTempLabel (NULL); - aopPut (res->aop, one, 1); + aopPut (res->aop, one, 1, isOperandVolatile (op, FALSE)); emitcode ("jz", "%05d$", (tlbl->key + 100)); - aopPut (res->aop, zero, 1); + aopPut (res->aop, zero, 1, isOperandVolatile (op, FALSE)); emitcode ("", "%05d$:", (tlbl->key + 100)); size = res->aop->size - 2; offset = 2; /* put zeros in the rest */ while (size--) - aopPut (res->aop, zero, offset++); + aopPut (res->aop, zero, offset++, isOperandVolatile (op, FALSE)); } /*-----------------------------------------------------------------*/ @@ -1292,13 +1294,13 @@ outAcc (operand * result) size = getDataSize (result); if (size) { - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); size--; offset = 1; /* unsigned or positive */ while (size--) { - aopPut (AOP (result), zero, offset++); + aopPut (AOP (result), zero, offset++, isOperandVolatile (result, FALSE)); } } } @@ -1311,7 +1313,7 @@ outBitC (operand * result) { /* if the result is bit */ if (AOP_TYPE (result) == AOP_CRY) - aopPut (AOP (result), "c", 0); + aopPut (AOP (result), "c", 0, isOperandVolatile (result, FALSE)); else { emitcode ("clr", "a"); @@ -1343,7 +1345,7 @@ genNot (iCode * ic) symbol *tlbl; sym_link *optype = operandType (IC_LEFT (ic)); - D(emitcode (";", "genNot")); + D(emitcode ("; genNot","")); /* assign asmOps to operand & result */ aopOp (IC_LEFT (ic), ic, FALSE); @@ -1389,7 +1391,7 @@ genCpl (iCode * ic) int size; symbol *tlbl; - D(emitcode (";", "genCpl")); + D(emitcode ("; genCpl","")); /* assign asmOps to operand & result */ aopOp (IC_LEFT (ic), ic, FALSE); @@ -1417,7 +1419,7 @@ genCpl (iCode * ic) char *l = aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE); MOVA (l); emitcode ("cpl", "a"); - aopPut (AOP (IC_RESULT (ic)), "a", offset++); + aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); } @@ -1436,25 +1438,27 @@ genUminusFloat (operand * op, operand * result) int size, offset = 0; char *l; - D(emitcode (";", "genUminusFloat")); - - /* for this we just need to flip the - first it then copy the rest in place */ - size = AOP_SIZE (op) - 1; - l = aopGet (AOP (op), 3, FALSE, FALSE); + D(emitcode ("; genUminusFloat","")); - MOVA (l); + /* for this we just copy and then flip the bit */ - emitcode ("cpl", "acc.7"); - aopPut (AOP (result), "a", 3); + size = AOP_SIZE (op) - 1; while (size--) { aopPut (AOP (result), aopGet (AOP (op), offset, FALSE, FALSE), - offset); + offset, + isOperandVolatile (result, FALSE)); offset++; } + + l = aopGet (AOP (op), offset, FALSE, FALSE); + + MOVA (l); + + emitcode ("cpl", "acc.7"); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } /*-----------------------------------------------------------------*/ @@ -1467,7 +1471,7 @@ genUminus (iCode * ic) sym_link *optype, *rtype; - D(emitcode (";", "genUminus")); + D(emitcode ("; genUminus","")); /* assign asmops */ aopOp (IC_LEFT (ic), ic, FALSE); @@ -1516,7 +1520,7 @@ genUminus (iCode * ic) emitcode ("clr", "a"); emitcode ("subb", "a,%s", l); } - aopPut (AOP (IC_RESULT (ic)), "a", offset++); + aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); } /* if any remaining bytes in the result */ @@ -1526,7 +1530,7 @@ genUminus (iCode * ic) emitcode ("rlc", "a"); emitcode ("subb", "a,acc"); while (size--) - aopPut (AOP (IC_RESULT (ic)), "a", offset++); + aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); } release: @@ -1558,10 +1562,13 @@ saveRegisters (iCode * lic) /* if the registers have been saved already or don't need to be then do nothing */ - if (ic->regsSaved || IFFUNC_CALLEESAVES(OP_SYMBOL(IC_LEFT(ic))->type) || - IFFUNC_ISNAKED(OP_SYM_TYPE(IC_LEFT (ic)))) + if (ic->regsSaved) return; - + if (IS_SYMOP(IC_LEFT(ic)) && + (IFFUNC_CALLEESAVES(OP_SYMBOL(IC_LEFT(ic))->type) || + IFFUNC_ISNAKED(OP_SYM_TYPE(IC_LEFT (ic))))) + return; + /* safe the registers in use at this time but skip the ones for the result */ rsave = bitVectCplAnd (bitVectCopy (ic->rMask), @@ -1673,7 +1680,7 @@ assignResultValue (operand * oper) int size = AOP_SIZE (oper); while (size--) { - aopPut (AOP (oper), fReturn[offset], offset); + aopPut (AOP (oper), fReturn[offset], offset, isOperandVolatile (oper, FALSE)); offset++; } } @@ -1689,7 +1696,7 @@ genXpush (iCode * ic) regs *r; int size, offset = 0; - D(emitcode (";", "genXpush")); + D(emitcode ("; genXpush","")); aopOp (IC_LEFT (ic), ic, FALSE); r = getFreePtr (ic, &aop, FALSE); @@ -1725,7 +1732,7 @@ genIpush (iCode * ic) int size, offset = 0; char *l; - D(emitcode (";", "genIpush")); + D(emitcode ("; genIpush","")); /* if this is not a parm push : ie. it is spill push and spill push is always done on the local stack */ @@ -1797,7 +1804,7 @@ genIpop (iCode * ic) { int size, offset; - D(emitcode (";", "genIpop")); + D(emitcode ("; genIpop","")); /* if the temp was not pushed then */ if (OP_SYMBOL (IC_LEFT (ic))->isspilt) @@ -1989,7 +1996,7 @@ genCall (iCode * ic) // bool restoreBank = FALSE; bool swapBanks = FALSE; - D(emitcode(";", "genCall")); + D(emitcode("; genCall","")); dtype = operandType (IC_LEFT (ic)); /* if send set is not empty the assign */ @@ -2089,7 +2096,7 @@ genPcall (iCode * ic) // bool restoreBank=FALSE; bool swapBanks = FALSE; - D(emitcode(";", "genPCall")); + D(emitcode("; genPCall","")); /* if caller saves & we have not saved then */ if (!ic->regsSaved) @@ -2217,22 +2224,22 @@ resultRemat (iCode * ic) /*-----------------------------------------------------------------*/ /* inExcludeList - return 1 if the string is in exclude Reg list */ /*-----------------------------------------------------------------*/ +static int +regsCmp(void *p1, void *p2) +{ + return (STRCASECMP((char *)p1, (char *)(p2)) == 0); +} + static bool inExcludeList (char *s) { - int i = 0; + const char *p = setFirstItem(options.excludeRegsSet); - if (options.excludeRegs[i] && - STRCASECMP (options.excludeRegs[i], "none") == 0) + if (p == NULL || STRCASECMP(p, "none") == 0) return FALSE; - for (i = 0; options.excludeRegs[i]; i++) - { - if (options.excludeRegs[i] && - STRCASECMP (s, options.excludeRegs[i]) == 0) - return TRUE; - } - return FALSE; + + return isinSetWith(options.excludeRegsSet, s, regsCmp); } /*-----------------------------------------------------------------*/ @@ -2427,7 +2434,7 @@ genFunction (iCode * ic) } } } - // jwk: this needs a closer look + // TODO: this needs a closer look SPEC_ISR_SAVED_BANKS(currFunc->etype) = banksToSave; } } @@ -2652,7 +2659,6 @@ genEndFunction (iCode * ic) * Restore any register banks saved by genFunction * in reverse order. */ - // jwk: this needs a closer look unsigned savedBanks = SPEC_ISR_SAVED_BANKS(currFunc->etype); int ix; @@ -2751,7 +2757,7 @@ genRet (iCode * ic) { int size, offset = 0, pushed = 0; - D(emitcode (";", "genRet")); + D(emitcode ("; genRet","")); /* if we have no return value then just generate the "ret" */ @@ -2880,10 +2886,10 @@ genPlusIncr (iCode * ic) if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4) return FALSE; - D(emitcode (";", "genPlusIncr")); + D(emitcode ("; genPlusIncr","")); - /* if increment 16 bits in register */ - if (AOP_TYPE(IC_LEFT(ic)) == AOP_REG && + /* if increment >=16 bits in register or direct space */ + if ((AOP_TYPE(IC_LEFT(ic)) == AOP_REG || AOP_TYPE(IC_LEFT(ic)) == AOP_DIR ) && sameRegs (AOP (IC_LEFT (ic)), AOP (IC_RESULT (ic))) && (size > 1) && (icount == 1)) @@ -2976,7 +2982,7 @@ genPlusIncr (iCode * ic) { MOVA (aopGet (AOP (IC_LEFT (ic)), 0, FALSE, FALSE)); emitcode ("add", "a,#0x%02x", ((char) icount) & 0xff); - aopPut (AOP (IC_RESULT (ic)), "a", 0); + aopPut (AOP (IC_RESULT (ic)), "a", 0, isOperandVolatile (IC_RESULT (ic), FALSE)); } else { @@ -3001,7 +3007,7 @@ outBitAcc (operand * result) /* if the result is a bit */ if (AOP_TYPE (result) == AOP_CRY) { - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); } else { @@ -3018,7 +3024,7 @@ outBitAcc (operand * result) static void genPlusBits (iCode * ic) { - D(emitcode (";", "genPlusBits")); + D(emitcode ("; genPlusBits","")); if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY) { @@ -3054,14 +3060,16 @@ adjustArithmeticResult (iCode * ic) !sameRegs (AOP (IC_RESULT (ic)), AOP (IC_LEFT (ic)))) aopPut (AOP (IC_RESULT (ic)), aopGet (AOP (IC_LEFT (ic)), 2, FALSE, FALSE), - 2); + 2, + isOperandVolatile (IC_RESULT (ic), FALSE)); if (AOP_SIZE (IC_RESULT (ic)) == 3 && AOP_SIZE (IC_RIGHT (ic)) == 3 && !sameRegs (AOP (IC_RESULT (ic)), AOP (IC_RIGHT (ic)))) aopPut (AOP (IC_RESULT (ic)), aopGet (AOP (IC_RIGHT (ic)), 2, FALSE, FALSE), - 2); + 2, + isOperandVolatile (IC_RESULT (ic), FALSE)); if (AOP_SIZE (IC_RESULT (ic)) == 3 && AOP_SIZE (IC_LEFT (ic)) < 3 && @@ -3071,7 +3079,7 @@ adjustArithmeticResult (iCode * ic) { char buffer[5]; sprintf (buffer, "#%d", pointerCode (getSpec (operandType (IC_LEFT (ic))))); - aopPut (AOP (IC_RESULT (ic)), buffer, 2); + aopPut (AOP (IC_RESULT (ic)), buffer, 2, isOperandVolatile (IC_RESULT (ic), FALSE)); } } #else @@ -3088,7 +3096,8 @@ adjustArithmeticResult (iCode * ic) { aopPut (AOP (IC_RESULT (ic)), aopGet (AOP (IC_LEFT (ic)), GPTRSIZE - 1, FALSE, FALSE), - GPTRSIZE - 1); + GPTRSIZE - 1, + isOperandVolatile (IC_RESULT (ic), FALSE)); } if (opIsGptr (IC_RESULT (ic)) && @@ -3097,7 +3106,8 @@ adjustArithmeticResult (iCode * ic) { aopPut (AOP (IC_RESULT (ic)), aopGet (AOP (IC_RIGHT (ic)), GPTRSIZE - 1, FALSE, FALSE), - GPTRSIZE - 1); + GPTRSIZE - 1, + isOperandVolatile (IC_RESULT (ic), FALSE)); } if (opIsGptr (IC_RESULT (ic)) && @@ -3108,7 +3118,7 @@ adjustArithmeticResult (iCode * ic) { char buffer[5]; sprintf (buffer, "#%d", pointerCode (getSpec (operandType (IC_LEFT (ic))))); - aopPut (AOP (IC_RESULT (ic)), buffer, GPTRSIZE - 1); + aopPut (AOP (IC_RESULT (ic)), buffer, GPTRSIZE - 1, isOperandVolatile (IC_RESULT (ic), FALSE)); } } #endif @@ -3125,7 +3135,7 @@ genPlus (iCode * ic) /* special cases :- */ - D(emitcode (";", "genPlus")); + D(emitcode ("; genPlus","")); aopOp (IC_LEFT (ic), ic, FALSE); aopOp (IC_RIGHT (ic), ic, FALSE); @@ -3171,7 +3181,7 @@ genPlus (iCode * ic) { MOVA (aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE)); emitcode ("addc", "a,#00"); - aopPut (AOP (IC_RESULT (ic)), "a", offset++); + aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); } } goto release; @@ -3208,7 +3218,7 @@ genPlus (iCode * ic) MOVA (aopGet (rightOp, offset, FALSE, TRUE)); emitcode (add, "a,%s", aopGet (leftOp, offset, FALSE, TRUE)); } - aopPut (AOP (IC_RESULT (ic)), "a", offset++); + aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); add = "addc"; /* further adds must propagate carry */ } @@ -3240,10 +3250,10 @@ genMinusDec (iCode * ic) if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4) return FALSE; - D(emitcode (";", "genMinusDec")); + D(emitcode ("; genMinusDec","")); - /* if decrement 16 bits in register */ - if (AOP_TYPE(IC_LEFT(ic)) == AOP_REG && + /* if decrement >=16 bits in register or direct space */ + if ((AOP_TYPE(IC_LEFT(ic)) == AOP_REG || AOP_TYPE(IC_LEFT(ic)) == AOP_DIR) && sameRegs (AOP (IC_LEFT (ic)), AOP (IC_RESULT (ic))) && (size > 1) && (icount == 1)) @@ -3355,11 +3365,11 @@ addSign (operand * result, int offset, int sign) emitcode ("rlc", "a"); emitcode ("subb", "a,acc"); while (size--) - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); } else while (size--) - aopPut (AOP (result), zero, offset++); + aopPut (AOP (result), zero, offset++, isOperandVolatile (result, FALSE)); } } @@ -3371,7 +3381,7 @@ genMinusBits (iCode * ic) { symbol *lbl = newiTempLabel (NULL); - D(emitcode (";", "genMinusBits")); + D(emitcode ("; genMinusBits","")); if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY) { @@ -3388,7 +3398,7 @@ genMinusBits (iCode * ic) emitcode ("jnb", "%s,%05d$", AOP (IC_LEFT (ic))->aopu.aop_dir, (lbl->key + 100)); emitcode ("inc", "a"); emitcode ("", "%05d$:", (lbl->key + 100)); - aopPut (AOP (IC_RESULT (ic)), "a", 0); + aopPut (AOP (IC_RESULT (ic)), "a", 0, isOperandVolatile (IC_RESULT (ic), FALSE)); addSign (IC_RESULT (ic), MSB16, SPEC_USIGN (getSpec (operandType (IC_RESULT (ic))))); } } @@ -3401,7 +3411,7 @@ genMinus (iCode * ic) { int size, offset = 0; - D(emitcode (";", "genMinus")); + D(emitcode ("; genMinus","")); aopOp (IC_LEFT (ic), ic, FALSE); aopOp (IC_RIGHT (ic), ic, FALSE); @@ -3436,17 +3446,17 @@ genMinus (iCode * ic) MOVA (aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE)); /* first add without previous c */ if (!offset) { - if (!size && lit==-1) { + if (!size && lit== (unsigned long) -1) { emitcode ("dec", "a"); } else { - emitcode ("add", "a,#0x%02x", + emitcode ("add", "a,#0x%02x", (unsigned int) (lit & 0x0FFL)); } } else { emitcode ("addc", "a,#0x%02x", (unsigned int) ((lit >> (offset * 8)) & 0x0FFL)); } - aopPut (AOP (IC_RESULT (ic)), "a", offset++); + aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); } } else @@ -3461,9 +3471,7 @@ genMinus (iCode * ic) if (aopGetUsesAcc(rightOp, offset)) { wassertl(!aopGetUsesAcc(leftOp, offset), "accumulator clash"); MOVA (aopGet(rightOp, offset, FALSE, TRUE)); - if (offset > 0) { - emitcode( "cpl", "c"); - } else { + if (offset == 0) { emitcode( "setb", "c"); } emitcode("subb", "a,%s", aopGet(leftOp, offset, FALSE, TRUE)); @@ -3476,7 +3484,7 @@ genMinus (iCode * ic) aopGet(rightOp, offset, FALSE, TRUE)); } - aopPut (AOP (IC_RESULT (ic)), "a", offset++); + aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); } } @@ -3498,7 +3506,7 @@ genMultbits (operand * left, operand * right, operand * result) { - D(emitcode (";", "genMultbits")); + D(emitcode ("; genMultbits","")); emitcode ("mov", "c,%s", AOP (left)->aopu.aop_dir); emitcode ("anl", "c,%s", AOP (right)->aopu.aop_dir); @@ -3518,11 +3526,11 @@ genMultOneByte (operand * left, symbol *lbl; int size=AOP_SIZE(result); - D(emitcode (";", "genMultOneByte")); + D(emitcode ("; genMultOneByte","")); if (size<1 || size>2) { // this should never happen - fprintf (stderr, "size!=1||2 (%d) in %s at line:%d \n", + fprintf (stderr, "size!=1||2 (%d) in %s at line:%d \n", AOP_SIZE(result), __FILE__, lineno); exit (1); } @@ -3547,9 +3555,9 @@ genMultOneByte (operand * left, emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE)); MOVA (aopGet (AOP (left), 0, FALSE, FALSE)); emitcode ("mul", "ab"); - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); if (size==2) { - aopPut (AOP (result), "b", 1); + aopPut (AOP (result), "b", 1, isOperandVolatile (result, FALSE)); } return; } @@ -3571,7 +3579,7 @@ genMultOneByte (operand * left, /* if literal */ if (AOP_TYPE(right)==AOP_LIT) { - signed char val=floatFromVal (AOP (right)->aopu.aop_lit); + signed char val=(signed char)floatFromVal (AOP (right)->aopu.aop_lit); /* AND literal negative */ if (val < 0) { emitcode ("cpl", "F0"); // complement sign flag @@ -3607,9 +3615,9 @@ genMultOneByte (operand * left, } emitcode ("", "%05d$:", lbl->key+100); - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); if (size==2) { - aopPut (AOP (result), "b", 1); + aopPut (AOP (result), "b", 1, isOperandVolatile (result, FALSE)); } } @@ -3623,7 +3631,7 @@ genMult (iCode * ic) operand *right = IC_RIGHT (ic); operand *result = IC_RESULT (ic); - D(emitcode (";", "genMult")); + D(emitcode ("; genMult","")); /* assign the amsops */ aopOp (left, ic, FALSE); @@ -3673,7 +3681,7 @@ genDivbits (operand * left, char *l; - D(emitcode (";", "genDivbits")); + D(emitcode ("; genDivbits","")); /* the result must be bit */ emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE)); @@ -3683,7 +3691,7 @@ genDivbits (operand * left, emitcode ("div", "ab"); emitcode ("rrc", "a"); - aopPut (AOP (result), "c", 0); + aopPut (AOP (result), "c", 0, isOperandVolatile (result, FALSE)); } /*-----------------------------------------------------------------*/ @@ -3699,7 +3707,7 @@ genDivOneByte (operand * left, symbol *lbl; int size, offset; - D(emitcode (";", "genDivOneByte")); + D(emitcode ("; genDivOneByte","")); size = AOP_SIZE (result) - 1; offset = 1; @@ -3711,9 +3719,9 @@ genDivOneByte (operand * left, l = aopGet (AOP (left), 0, FALSE, FALSE); MOVA (l); emitcode ("div", "ab"); - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); while (size--) - aopPut (AOP (result), zero, offset++); + aopPut (AOP (result), zero, offset++, isOperandVolatile (result, FALSE)); return; } @@ -3763,14 +3771,14 @@ genDivOneByte (operand * left, emitcode ("", "%05d$:", (lbl->key + 100)); /* now we are done */ - aopPut (AOP (result), "b", 0); + aopPut (AOP (result), "b", 0, isOperandVolatile (result, FALSE)); if (size > 0) { emitcode ("mov", "c,b.7"); emitcode ("subb", "a,acc"); } while (size--) - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); } @@ -3784,7 +3792,7 @@ genDiv (iCode * ic) operand *right = IC_RIGHT (ic); operand *result = IC_RESULT (ic); - D(emitcode (";", "genDiv")); + D(emitcode ("; genDiv","")); /* assign the amsops */ aopOp (left, ic, FALSE); @@ -3827,7 +3835,7 @@ genModbits (operand * left, char *l; - D(emitcode (";", "genModbits")); + D(emitcode ("; genModbits","")); /* the result must be bit */ emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE)); @@ -3838,7 +3846,7 @@ genModbits (operand * left, emitcode ("div", "ab"); emitcode ("mov", "a,b"); emitcode ("rrc", "a"); - aopPut (AOP (result), "c", 0); + aopPut (AOP (result), "c", 0, isOperandVolatile (result, FALSE)); } /*-----------------------------------------------------------------*/ @@ -3853,7 +3861,7 @@ genModOneByte (operand * left, char *l; symbol *lbl; - D(emitcode (";", "genModOneByte")); + D(emitcode ("; genModOneByte","")); /* signed or unsigned */ if (SPEC_USIGN (opetype)) @@ -3863,7 +3871,7 @@ genModOneByte (operand * left, l = aopGet (AOP (left), 0, FALSE, FALSE); MOVA (l); emitcode ("div", "ab"); - aopPut (AOP (result), "b", 0); + aopPut (AOP (result), "b", 0, isOperandVolatile (result, FALSE)); return; } @@ -3914,7 +3922,7 @@ genModOneByte (operand * left, emitcode ("", "%05d$:", (lbl->key + 100)); /* now we are done */ - aopPut (AOP (result), "b", 0); + aopPut (AOP (result), "b", 0, isOperandVolatile (result, FALSE)); } @@ -3928,7 +3936,7 @@ genMod (iCode * ic) operand *right = IC_RIGHT (ic); operand *result = IC_RESULT (ic); - D(emitcode (";", "genMod")); + D(emitcode ("; genMod","")); /* assign the amsops */ aopOp (left, ic, FALSE); @@ -3971,7 +3979,7 @@ genIfxJump (iCode * ic, char *jval) symbol *tlbl = newiTempLabel (NULL); char *inst; - D(emitcode (";", "genIfxJump")); + D(emitcode ("; genIfxJump","")); /* if true label then we jump if condition supplied is true */ @@ -4008,15 +4016,16 @@ genCmp (operand * left, operand * right, { int size, offset = 0; unsigned long lit = 0L; + bool rightInB; - D(emitcode (";", "genCmp")); + D(emitcode ("; genCmp","")); /* if left & right are bit variables */ if (AOP_TYPE (left) == AOP_CRY && AOP_TYPE (right) == AOP_CRY) { emitcode ("mov", "c,%s", AOP (right)->aopu.aop_dir); - emitcode ("anl", "c,/%s", AOP (left)->aopu.aop_dir); + emitcode ("anl", "c,%s", AOP (left)->aopu.aop_dir); } else { @@ -4065,6 +4074,9 @@ genCmp (operand * left, operand * right, CLRC; while (size--) { + rightInB = aopGetUsesAcc(AOP (right), offset); + if (rightInB) + emitcode ("mov", "b,%s", aopGet (AOP (right), offset, FALSE, FALSE)); MOVA (aopGet (AOP (left), offset, FALSE, FALSE)); if (sign && size == 0) { @@ -4078,13 +4090,20 @@ genCmp (operand * left, operand * right, } else { - emitcode ("mov", "b,%s", aopGet (AOP (right), offset++, FALSE, FALSE)); + if (!rightInB) + emitcode ("mov", "b,%s", aopGet (AOP (right), offset, FALSE, FALSE)); emitcode ("xrl", "b,#0x80"); emitcode ("subb", "a,b"); } } else - emitcode ("subb", "a,%s", aopGet (AOP (right), offset++, FALSE, FALSE)); + { + if (rightInB) + emitcode ("subb", "a,b"); + else + emitcode ("subb", "a,%s", aopGet (AOP (right), offset, FALSE, FALSE)); + } + offset++; } } } @@ -4119,7 +4138,7 @@ genCmpGt (iCode * ic, iCode * ifx) sym_link *letype, *retype; int sign; - D(emitcode (";", "genCmpGt")); + D(emitcode ("; genCmpGt","")); left = IC_LEFT (ic); right = IC_RIGHT (ic); @@ -4148,7 +4167,7 @@ genCmpLt (iCode * ic, iCode * ifx) sym_link *letype, *retype; int sign; - D(emitcode (";", "genCmpLt")); + D(emitcode ("; genCmpLt","")); left = IC_LEFT (ic); right = IC_RIGHT (ic); @@ -4193,7 +4212,8 @@ gencjneshort (operand * left, operand * right, symbol * lbl) /* if the right side is a literal then anything goes */ if (AOP_TYPE (right) == AOP_LIT && - AOP_TYPE (left) != AOP_DIR) + AOP_TYPE (left) != AOP_DIR && + AOP_TYPE (left) != AOP_IMMD) { while (size--) { @@ -4209,6 +4229,7 @@ gencjneshort (operand * left, operand * right, symbol * lbl) if the left is a pointer register & right is not */ else if (AOP_TYPE (right) == AOP_REG || AOP_TYPE (right) == AOP_DIR || + AOP_TYPE (right) == AOP_LIT || (AOP_TYPE (left) == AOP_DIR && AOP_TYPE (right) == AOP_LIT) || (IS_AOP_PREG (left) && !IS_AOP_PREG (right))) { @@ -4265,7 +4286,7 @@ genCmpEq (iCode * ic, iCode * ifx) { operand *left, *right, *result; - D(emitcode (";", "genCmpEq")); + D(emitcode ("; genCmpEq","")); aopOp ((left = IC_LEFT (ic)), ic, FALSE); aopOp ((right = IC_RIGHT (ic)), ic, FALSE); @@ -4403,7 +4424,7 @@ genCmpEq (iCode * ic, iCode * ifx) gencjne (left, right, newiTempLabel (NULL)); if (AOP_TYPE (result) == AOP_CRY && AOP_SIZE (result)) { - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); goto release; } if (ifx) @@ -4492,7 +4513,7 @@ genAndOp (iCode * ic) operand *left, *right, *result; symbol *tlbl; - D(emitcode (";", "genAndOp")); + D(emitcode ("; genAndOp","")); /* note here that && operations that are in an if statement are taken away by backPatchLabels @@ -4534,7 +4555,7 @@ genOrOp (iCode * ic) operand *left, *right, *result; symbol *tlbl; - D(emitcode (";", "genOrOp")); + D(emitcode ("; genOrOp","")); /* note here that || operations that are in an if statement are taken away by backPatchLabels @@ -4645,7 +4666,7 @@ genAnd (iCode * ic, iCode * ifx) int bytelit = 0; char buffer[10]; - D(emitcode (";", "genAnd")); + D(emitcode ("; genAnd","")); aopOp ((left = IC_LEFT (ic)), ic, FALSE); aopOp ((right = IC_RIGHT (ic)), ic, FALSE); @@ -4825,12 +4846,14 @@ genAnd (iCode * ic, iCode * ifx) if ((bytelit = (int) ((lit >> (offset * 8)) & 0x0FFL)) == 0x0FF) continue; else if (bytelit == 0) - aopPut (AOP (result), zero, offset); + { + aopPut (AOP (result), zero, offset, isOperandVolatile (result, FALSE)); + } else if (IS_AOP_PREG (result)) { MOVA (aopGet (AOP (right), offset, FALSE, FALSE)); emitcode ("anl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE)); - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } else emitcode ("anl", "%s,%s", @@ -4847,7 +4870,7 @@ genAnd (iCode * ic, iCode * ifx) if (IS_AOP_PREG (result)) { emitcode ("anl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE)); - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } else @@ -4909,12 +4932,16 @@ genAnd (iCode * ic, iCode * ifx) { aopPut (AOP (result), aopGet (AOP (left), offset, FALSE, FALSE), - offset); + offset, + isOperandVolatile (result, FALSE)); continue; } else if (bytelit == 0) { - aopPut (AOP (result), zero, offset); + /* dummy read of volatile operand */ + if (isOperandVolatile (left, FALSE)) + MOVA (aopGet (AOP (left), offset, FALSE, FALSE)); + aopPut (AOP (result), zero, offset, isOperandVolatile (result, FALSE)); continue; } } @@ -4928,7 +4955,7 @@ genAnd (iCode * ic, iCode * ifx) emitcode ("anl", "a,%s", aopGet (AOP (left), offset, FALSE, FALSE)); } - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } } } @@ -4949,7 +4976,7 @@ genOr (iCode * ic, iCode * ifx) int size, offset = 0; unsigned long lit = 0L; - D(emitcode (";", "genOr")); + D(emitcode ("; genOr","")); aopOp ((left = IC_LEFT (ic)), ic, FALSE); aopOp ((right = IC_RIGHT (ic)), ic, FALSE); @@ -5108,12 +5135,18 @@ genOr (iCode * ic, iCode * ifx) if (AOP_TYPE (right) == AOP_LIT) { if (((lit >> (offset * 8)) & 0x0FFL) == 0x00L) - continue; + { + /* dummy read of volatile operand */ + if (isOperandVolatile (left, FALSE)) + MOVA (aopGet (AOP (left), offset, FALSE, FALSE)); + else + continue; + } else if (IS_AOP_PREG (left)) { MOVA (aopGet (AOP (right), offset, FALSE, FALSE)); emitcode ("orl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE)); - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } else emitcode ("orl", "%s,%s", @@ -5130,7 +5163,7 @@ genOr (iCode * ic, iCode * ifx) if (IS_AOP_PREG (left)) { emitcode ("orl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE)); - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } else emitcode ("orl", "%s,a", @@ -5184,7 +5217,8 @@ genOr (iCode * ic, iCode * ifx) { aopPut (AOP (result), aopGet (AOP (left), offset, FALSE, FALSE), - offset); + offset, + isOperandVolatile (result, FALSE)); continue; } } @@ -5198,7 +5232,7 @@ genOr (iCode * ic, iCode * ifx) emitcode ("orl", "a,%s", aopGet (AOP (left), offset, FALSE, FALSE)); } - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } } @@ -5218,7 +5252,7 @@ genXor (iCode * ic, iCode * ifx) int size, offset = 0; unsigned long lit = 0L; - D(emitcode (";", "genXor")); + D(emitcode ("; genXor","")); aopOp ((left = IC_LEFT (ic)), ic, FALSE); aopOp ((right = IC_RIGHT (ic)), ic, FALSE); @@ -5365,7 +5399,7 @@ genXor (iCode * ic, iCode * ifx) { MOVA (aopGet (AOP (right), offset, FALSE, FALSE)); emitcode ("xrl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE)); - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } else emitcode ("xrl", "%s,%s", @@ -5382,7 +5416,7 @@ genXor (iCode * ic, iCode * ifx) if (IS_AOP_PREG (left)) { emitcode ("xrl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE)); - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } else emitcode ("xrl", "%s,a", @@ -5444,7 +5478,8 @@ genXor (iCode * ic, iCode * ifx) { aopPut (AOP (result), aopGet (AOP (left), offset, FALSE, FALSE), - offset); + offset, + isOperandVolatile (result, FALSE)); continue; } } @@ -5458,7 +5493,7 @@ genXor (iCode * ic, iCode * ifx) emitcode ("xrl", "a,%s", aopGet (AOP (left), offset, FALSE, TRUE)); } - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } } @@ -5476,7 +5511,7 @@ genInline (iCode * ic) { char *buffer, *bp, *bp1; - D(emitcode (";", "genInline")); + D(emitcode ("; genInline","")); _G.inLine += (!options.asmpeep); @@ -5522,7 +5557,7 @@ genRRC (iCode * ic) int size, offset = 0; char *l; - D(emitcode (";", "genRRC")); + D(emitcode ("; genRRC","")); /* rotate right with carry */ left = IC_LEFT (ic); @@ -5546,7 +5581,7 @@ genRRC (iCode * ic) MOVA (l); emitcode ("rrc", "a"); if (AOP_SIZE (result) > 1) - aopPut (AOP (result), "a", offset--); + aopPut (AOP (result), "a", offset--, isOperandVolatile (result, FALSE)); } /* now we need to put the carry into the highest order byte of the result */ @@ -5557,7 +5592,7 @@ genRRC (iCode * ic) } emitcode ("mov", "acc.7,c"); release: - aopPut (AOP (result), "a", AOP_SIZE (result) - 1); + aopPut (AOP (result), "a", AOP_SIZE (result) - 1, isOperandVolatile (result, FALSE)); freeAsmop (left, NULL, ic, TRUE); freeAsmop (result, NULL, ic, TRUE); } @@ -5572,7 +5607,7 @@ genRLC (iCode * ic) int size, offset = 0; char *l; - D(emitcode (";", "genRLC")); + D(emitcode ("; genRLC","")); /* rotate right with carry */ left = IC_LEFT (ic); @@ -5593,14 +5628,14 @@ genRLC (iCode * ic) } emitcode ("add", "a,acc"); if (AOP_SIZE (result) > 1) - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); while (size--) { l = aopGet (AOP (left), offset, FALSE, FALSE); MOVA (l); emitcode ("rlc", "a"); if (AOP_SIZE (result) > 1) - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); } } /* now we need to put the carry into the @@ -5612,7 +5647,7 @@ genRLC (iCode * ic) } emitcode ("mov", "acc.0,c"); release: - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); freeAsmop (left, NULL, ic, TRUE); freeAsmop (result, NULL, ic, TRUE); } @@ -5625,7 +5660,7 @@ genGetHbit (iCode * ic) { operand *left, *result; - D(emitcode (";", "genGetHbit")); + D(emitcode ("; genGetHbit","")); left = IC_LEFT (ic); result = IC_RESULT (ic); @@ -5789,7 +5824,7 @@ shiftR1Left2Result (operand * left, int offl, AccSRsh (shCount); else AccRsh (shCount); - aopPut (AOP (result), "a", offr); + aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE)); } /*-----------------------------------------------------------------*/ @@ -5804,7 +5839,7 @@ shiftL1Left2Result (operand * left, int offl, MOVA (l); /* shift left accumulator */ AccLsh (shCount); - aopPut (AOP (result), "a", offr); + aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE)); } /*-----------------------------------------------------------------*/ @@ -5822,19 +5857,19 @@ movLeft2Result (operand * left, int offl, if (*l == '@' && (IS_AOP_PREG (result))) { emitcode ("mov", "a,%s", l); - aopPut (AOP (result), "a", offr); + aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE)); } else { if (!sign) - aopPut (AOP (result), l, offr); + aopPut (AOP (result), l, offr, isOperandVolatile (result, FALSE)); else { /* MSB sign in acc.7 ! */ if (getDataSize (left) == offl + 1) { emitcode ("mov", "a,%s", l); - aopPut (AOP (result), "a", offr); + aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE)); } } } @@ -6014,6 +6049,7 @@ AccAXRsh (char *x, int shCount) emitcode ("mov", "c,acc.7"); AccAXLrl1 (x); // ABBBBBBC:CDDDDDDA + emitcode ("mov", "c,acc.7"); AccAXLrl1 (x); // BBBBBBCC:DDDDDDAA emitcode ("xch", "a,%s", x); // DDDDDDAA:BBBBBBCC @@ -6103,6 +6139,7 @@ AccAXRshS (char *x, int shCount) emitcode ("mov", "c,acc.7"); AccAXLrl1 (x); // ABBBBBBC:CDDDDDDA + emitcode ("mov", "c,acc.7"); AccAXLrl1 (x); // BBBBBBCC:DDDDDDAA emitcode ("xch", "a,%s", x); // DDDDDDAA:BBBBBBCC @@ -6160,7 +6197,7 @@ shiftL2Left2Result (operand * left, int offl, } /* ax << shCount (x = lsb(result)) */ AccAXLsh (aopGet (AOP (result), offr, FALSE, FALSE), shCount); - aopPut (AOP (result), "a", offr + MSB16); + aopPut (AOP (result), "a", offr + MSB16, isOperandVolatile (result, FALSE)); } @@ -6190,7 +6227,7 @@ shiftR2Left2Result (operand * left, int offl, else AccAXRsh (aopGet (AOP (result), offr, FALSE, FALSE), shCount); if (getDataSize (result) > 1) - aopPut (AOP (result), "a", offr + MSB16); + aopPut (AOP (result), "a", offr + MSB16, isOperandVolatile (result, FALSE)); } /*-----------------------------------------------------------------*/ @@ -6206,7 +6243,7 @@ shiftLLeftOrResult (operand * left, int offl, /* or with result */ emitcode ("orl", "a,%s", aopGet (AOP (result), offr, FALSE, FALSE)); /* back to result */ - aopPut (AOP (result), "a", offr); + aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE)); } /*-----------------------------------------------------------------*/ @@ -6222,7 +6259,7 @@ shiftRLeftOrResult (operand * left, int offl, /* or with result */ emitcode ("orl", "a,%s", aopGet (AOP (result), offr, FALSE, FALSE)); /* back to result */ - aopPut (AOP (result), "a", offr); + aopPut (AOP (result), "a", offr, isOperandVolatile (result, FALSE)); } /*-----------------------------------------------------------------*/ @@ -6231,7 +6268,7 @@ shiftRLeftOrResult (operand * left, int offl, static void genlshOne (operand * result, operand * left, int shCount) { - D(emitcode (";", "genlshOne")); + D(emitcode ("; genlshOne","")); shiftL1Left2Result (left, LSB, result, LSB, shCount); } @@ -6244,7 +6281,7 @@ genlshTwo (operand * result, operand * left, int shCount) { int size; - D(emitcode (";", "genlshTwo")); + D(emitcode ("; genlshTwo","")); size = getDataSize (result); @@ -6260,7 +6297,7 @@ genlshTwo (operand * result, operand * left, int shCount) else movLeft2Result (left, LSB, result, MSB16, 0); } - aopPut (AOP (result), zero, LSB); + aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE)); } /* 1 <= shCount <= 7 */ @@ -6293,7 +6330,7 @@ shiftLLong (operand * left, operand * result, int offr) emitcode ("xch", "a,%s", aopGet (AOP (left), LSB + offr, FALSE, FALSE)); else - aopPut (AOP (result), "a", LSB + offr); + aopPut (AOP (result), "a", LSB + offr, isOperandVolatile (result, FALSE)); } if (size >= MSB16 + offr) @@ -6309,7 +6346,7 @@ shiftLLong (operand * left, operand * result, int offr) emitcode ("xch", "a,%s", aopGet (AOP (left), MSB16 + offr, FALSE, FALSE)); else - aopPut (AOP (result), "a", MSB16 + offr); + aopPut (AOP (result), "a", MSB16 + offr, isOperandVolatile (result, FALSE)); } if (size >= MSB24 + offr) @@ -6325,7 +6362,7 @@ shiftLLong (operand * left, operand * result, int offr) emitcode ("xch", "a,%s", aopGet (AOP (left), MSB24 + offr, FALSE, FALSE)); else - aopPut (AOP (result), "a", MSB24 + offr); + aopPut (AOP (result), "a", MSB24 + offr, isOperandVolatile (result, FALSE)); } if (size > MSB32 + offr) @@ -6336,10 +6373,10 @@ shiftLLong (operand * left, operand * result, int offr) MOVA (l); } emitcode ("rlc", "a"); - aopPut (AOP (result), "a", MSB32 + offr); + aopPut (AOP (result), "a", MSB32 + offr, isOperandVolatile (result, FALSE)); } if (offr != LSB) - aopPut (AOP (result), zero, LSB); + aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE)); } /*-----------------------------------------------------------------*/ @@ -6350,7 +6387,7 @@ genlshFour (operand * result, operand * left, int shCount) { int size; - D(emitcode (";", "genlshFour")); + D(emitcode ("; genlshFour","")); size = AOP_SIZE (result); @@ -6364,9 +6401,9 @@ genlshFour (operand * result, operand * left, int shCount) shiftL1Left2Result (left, LSB, result, MSB32, shCount); else movLeft2Result (left, LSB, result, MSB32, 0); - aopPut (AOP (result), zero, LSB); - aopPut (AOP (result), zero, MSB16); - aopPut (AOP (result), zero, MSB24); + aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE)); + aopPut (AOP (result), zero, MSB16, isOperandVolatile (result, FALSE)); + aopPut (AOP (result), zero, MSB24, isOperandVolatile (result, FALSE)); return; } @@ -6383,8 +6420,8 @@ genlshFour (operand * result, operand * left, int shCount) movLeft2Result (left, MSB16, result, MSB32, 0); movLeft2Result (left, LSB, result, MSB24, 0); } - aopPut (AOP (result), zero, MSB16); - aopPut (AOP (result), zero, LSB); + aopPut (AOP (result), zero, MSB16, isOperandVolatile (result, FALSE)); + aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE)); return; } @@ -6407,7 +6444,7 @@ genlshFour (operand * result, operand * left, int shCount) movLeft2Result (left, MSB24, result, MSB32, 0); movLeft2Result (left, MSB16, result, MSB24, 0); movLeft2Result (left, LSB, result, MSB16, 0); - aopPut (AOP (result), zero, LSB); + aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE)); } else if (shCount == 1) shiftLLong (left, result, MSB16); @@ -6416,7 +6453,7 @@ genlshFour (operand * result, operand * left, int shCount) shiftL2Left2Result (left, MSB16, result, MSB24, shCount); shiftL1Left2Result (left, LSB, result, MSB16, shCount); shiftRLeftOrResult (left, LSB, result, MSB24, 8 - shCount); - aopPut (AOP (result), zero, LSB); + aopPut (AOP (result), zero, LSB, isOperandVolatile (result, FALSE)); } } } @@ -6449,7 +6486,7 @@ genLeftShiftLiteral (operand * left, int shCount = (int) floatFromVal (AOP (right)->aopu.aop_lit); int size; - D(emitcode (";", "genLeftShiftLiteral")); + D(emitcode ("; genLeftShiftLiteral","")); freeAsmop (right, NULL, ic, TRUE); @@ -6474,7 +6511,7 @@ genLeftShiftLiteral (operand * left, else if (shCount >= (size * 8)) while (size--) - aopPut (AOP (result), zero, size); + aopPut (AOP (result), zero, size, isOperandVolatile (result, FALSE)); else { switch (size) @@ -6511,7 +6548,7 @@ genLeftShift (iCode * ic) char *l; symbol *tlbl, *tlbl1; - D(emitcode (";", "genLeftShift")); + D(emitcode ("; genLeftShift","")); right = IC_RIGHT (ic); left = IC_LEFT (ic); @@ -6554,10 +6591,10 @@ genLeftShift (iCode * ic) { emitcode ("mov", "a,%s", l); - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } else - aopPut (AOP (result), l, offset); + aopPut (AOP (result), l, offset, isOperandVolatile (result, FALSE)); offset++; } } @@ -6579,7 +6616,7 @@ genLeftShift (iCode * ic) emitcode ("add", "a,acc"); emitcode ("", "%05d$:", tlbl1->key + 100); emitcode ("djnz", "b,%05d$", tlbl->key + 100); - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); goto release; } @@ -6590,13 +6627,13 @@ genLeftShift (iCode * ic) l = aopGet (AOP (result), offset, FALSE, FALSE); MOVA (l); emitcode ("add", "a,acc"); - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); while (--size) { l = aopGet (AOP (result), offset, FALSE, FALSE); MOVA (l); emitcode ("rlc", "a"); - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); } reAdjustPreg (AOP (result)); @@ -6614,7 +6651,7 @@ static void genrshOne (operand * result, operand * left, int shCount, int sign) { - D(emitcode (";", "genrshOne")); + D(emitcode ("; genrshOne","")); shiftR1Left2Result (left, LSB, result, LSB, shCount, sign); } @@ -6626,7 +6663,7 @@ static void genrshTwo (operand * result, operand * left, int shCount, int sign) { - D(emitcode (";", "genrshTwo")); + D(emitcode ("; genrshTwo","")); /* if shCount >= 8 */ if (shCount >= 8) @@ -6667,9 +6704,14 @@ shiftRLong (operand * left, int offl, if (sign) { emitcode ("rlc", "a"); emitcode ("subb", "a,acc"); - emitcode ("xch", "a,%s", aopGet(AOP(left), MSB32, FALSE, FALSE)); + if (isSameRegs) + emitcode ("xch", "a,%s", aopGet(AOP(left), MSB32, FALSE, FALSE)); + else { + aopPut (AOP (result), "a", MSB32, isOperandVolatile (result, FALSE)); + MOVA (aopGet (AOP (left), MSB32, FALSE, FALSE)); + } } else { - aopPut (AOP(result), zero, MSB32); + aopPut (AOP(result), zero, MSB32, isOperandVolatile (result, FALSE)); } } @@ -6684,7 +6726,7 @@ shiftRLong (operand * left, int offl, if (isSameRegs && offl==MSB16) { emitcode ("xch", "a,%s",aopGet (AOP (left), MSB24, FALSE, FALSE)); } else { - aopPut (AOP (result), "a", MSB32); + aopPut (AOP (result), "a", MSB32-offl, isOperandVolatile (result, FALSE)); MOVA (aopGet (AOP (left), MSB24, FALSE, FALSE)); } @@ -6692,17 +6734,17 @@ shiftRLong (operand * left, int offl, if (isSameRegs && offl==1) { emitcode ("xch", "a,%s",aopGet (AOP (left), MSB16, FALSE, FALSE)); } else { - aopPut (AOP (result), "a", MSB24); + aopPut (AOP (result), "a", MSB24-offl, isOperandVolatile (result, FALSE)); MOVA (aopGet (AOP (left), MSB16, FALSE, FALSE)); } emitcode ("rrc", "a"); - aopPut (AOP (result), "a", MSB16 - offl); + aopPut (AOP (result), "a", MSB16 - offl, isOperandVolatile (result, FALSE)); if (offl == LSB) { MOVA (aopGet (AOP (left), LSB, FALSE, FALSE)); emitcode ("rrc", "a"); - aopPut (AOP (result), "a", LSB); + aopPut (AOP (result), "a", LSB, isOperandVolatile (result, FALSE)); } } @@ -6713,7 +6755,7 @@ static void genrshFour (operand * result, operand * left, int shCount, int sign) { - D(emitcode (";", "genrshFour")); + D(emitcode ("; genrshFour","")); /* if shifting more that 3 bytes */ if (shCount >= 24) @@ -6788,7 +6830,7 @@ genRightShiftLiteral (operand * left, int shCount = (int) floatFromVal (AOP (right)->aopu.aop_lit); int size; - D(emitcode (";", "genRightShiftLiteral")); + D(emitcode ("; genRightShiftLiteral","")); freeAsmop (right, NULL, ic, TRUE); @@ -6813,9 +6855,10 @@ genRightShiftLiteral (operand * left, else if (shCount >= (size * 8)) { - if (sign) + if (sign) { /* get sign in acc.7 */ MOVA (aopGet (AOP (left), size - 1, FALSE, FALSE)); + } addSign (result, LSB, sign); } else @@ -6836,10 +6879,9 @@ genRightShiftLiteral (operand * left, default: break; } - - freeAsmop (left, NULL, ic, TRUE); - freeAsmop (result, NULL, ic, TRUE); } + freeAsmop (left, NULL, ic, TRUE); + freeAsmop (result, NULL, ic, TRUE); } /*-----------------------------------------------------------------*/ @@ -6853,7 +6895,7 @@ genSignedRightShift (iCode * ic) char *l; symbol *tlbl, *tlbl1; - D(emitcode (";", "genSignedRightShift")); + D(emitcode ("; genSignedRightShift","")); /* we do it the hard way put the shift count in b and loop thru preserving the sign */ @@ -6897,10 +6939,10 @@ genSignedRightShift (iCode * ic) { emitcode ("mov", "a,%s", l); - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } else - aopPut (AOP (result), l, offset); + aopPut (AOP (result), l, offset, isOperandVolatile (result, FALSE)); offset++; } } @@ -6925,7 +6967,7 @@ genSignedRightShift (iCode * ic) emitcode ("rrc", "a"); emitcode ("", "%05d$:", tlbl1->key + 100); emitcode ("djnz", "b,%05d$", tlbl->key + 100); - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); goto release; } @@ -6938,7 +6980,7 @@ genSignedRightShift (iCode * ic) l = aopGet (AOP (result), offset, FALSE, FALSE); MOVA (l); emitcode ("rrc", "a"); - aopPut (AOP (result), "a", offset--); + aopPut (AOP (result), "a", offset--, isOperandVolatile (result, FALSE)); } reAdjustPreg (AOP (result)); emitcode ("", "%05d$:", tlbl1->key + 100); @@ -6961,7 +7003,7 @@ genRightShift (iCode * ic) char *l; symbol *tlbl, *tlbl1; - D(emitcode (";", "genRightShift")); + D(emitcode ("; genRightShift","")); /* if signed then we do it the hard way preserve the sign bit moving it inwards */ @@ -7021,10 +7063,10 @@ genRightShift (iCode * ic) { emitcode ("mov", "a,%s", l); - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } else - aopPut (AOP (result), l, offset); + aopPut (AOP (result), l, offset, isOperandVolatile (result, FALSE)); offset++; } } @@ -7045,7 +7087,7 @@ genRightShift (iCode * ic) emitcode ("rrc", "a"); emitcode ("", "%05d$:", tlbl1->key + 100); emitcode ("djnz", "b,%05d$", tlbl->key + 100); - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); goto release; } @@ -7058,7 +7100,7 @@ genRightShift (iCode * ic) l = aopGet (AOP (result), offset, FALSE, FALSE); MOVA (l); emitcode ("rrc", "a"); - aopPut (AOP (result), "a", offset--); + aopPut (AOP (result), "a", offset--, isOperandVolatile (result, FALSE)); } reAdjustPreg (AOP (result)); @@ -7082,7 +7124,7 @@ genUnpackBits (operand * result, char *rname, int ptype) int offset = 0; int rsize; - D(emitcode (";", "genUnpackBits")); + D(emitcode ("; genUnpackBits","")); etype = getSpec (operandType (result)); rsize = getSize (operandType (result)); @@ -7127,12 +7169,12 @@ genUnpackBits (operand * result, char *rname, int ptype) emitcode ("anl", "a,#0x%02x", ((unsigned char) -1) >> (8 - SPEC_BLEN (etype))); - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); goto finish; } /* bit field did not fit in a byte */ - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); while (1) { @@ -7172,7 +7214,7 @@ genUnpackBits (operand * result, char *rname, int ptype) if (rlen < 8) break; - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); } @@ -7180,7 +7222,7 @@ genUnpackBits (operand * result, char *rname, int ptype) { // emitcode("anl","a,#0x%02x",((unsigned char)-1)>>(rlen)); AccLsh (8 - rlen); - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); } finish: @@ -7188,7 +7230,7 @@ finish: { rsize -= offset; while (rsize--) - aopPut (AOP (result), zero, offset++); + aopPut (AOP (result), zero, offset++, isOperandVolatile (result, FALSE)); } return; } @@ -7206,7 +7248,7 @@ genDataPointerGet (operand * left, char buffer[256]; int size, offset = 0; - D(emitcode (";", "genDataPointerGet")); + D(emitcode ("; genDataPointerGet","")); aopOp (result, ic, TRUE); @@ -7219,7 +7261,7 @@ genDataPointerGet (operand * left, sprintf (buffer, "(%s + %d)", l + 1, offset); else sprintf (buffer, "%s", l + 1); - aopPut (AOP (result), buffer, offset++); + aopPut (AOP (result), buffer, offset++, isOperandVolatile (result, FALSE)); } freeAsmop (left, NULL, ic, TRUE); @@ -7242,7 +7284,7 @@ genNearPointerGet (operand * left, sym_link *ltype = operandType (left); char buffer[80]; - D(emitcode (";", "genNearPointerGet")); + D(emitcode ("; genNearPointerGet","")); rtype = operandType (result); retype = getSpec (rtype); @@ -7294,12 +7336,12 @@ genNearPointerGet (operand * left, { emitcode ("mov", "a,@%s", rname); - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); } else { sprintf (buffer, "@%s", rname); - aopPut (AOP (result), buffer, offset); + aopPut (AOP (result), buffer, offset, isOperandVolatile (result, FALSE)); } offset++; if (size || pi) @@ -7311,7 +7353,7 @@ genNearPointerGet (operand * left, if (aop) /* we had to allocate for this iCode */ { if (pi) { /* post increment present */ - aopPut(AOP ( left ),rname,0); + aopPut(AOP ( left ),rname,0, isOperandVolatile (left, FALSE)); } freeAsmop (NULL, aop, ic, TRUE); } @@ -7354,7 +7396,7 @@ genPagedPointerGet (operand * left, char *rname; sym_link *rtype, *retype; - D(emitcode (";", "genPagedPointerGet")); + D(emitcode ("; genPagedPointerGet","")); rtype = operandType (result); retype = getSpec (rtype); @@ -7391,7 +7433,7 @@ genPagedPointerGet (operand * left, { emitcode ("movx", "a,@%s", rname); - aopPut (AOP (result), "a", offset); + aopPut (AOP (result), "a", offset, isOperandVolatile (result, FALSE)); offset++; @@ -7403,7 +7445,7 @@ genPagedPointerGet (operand * left, /* now some housekeeping stuff */ if (aop) /* we had to allocate for this iCode */ { - if (pi) aopPut ( AOP (left), rname, 0); + if (pi) aopPut ( AOP (left), rname, 0, isOperandVolatile (left, FALSE)); freeAsmop (NULL, aop, ic, TRUE); } else @@ -7442,7 +7484,7 @@ genFarPointerGet (operand * left, int size, offset; sym_link *retype = getSpec (operandType (result)); - D(emitcode (";", "genFarPointerGet")); + D(emitcode ("; genFarPointerGet","")); aopOp (left, ic, FALSE); @@ -7473,15 +7515,15 @@ genFarPointerGet (operand * left, while (size--) { emitcode ("movx", "a,@dptr"); - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); 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); + aopPut ( AOP (left), "dpl", 0, isOperandVolatile (left, FALSE)); + aopPut ( AOP (left), "dph", 1, isOperandVolatile (left, FALSE)); pi->generated = 1; } freeAsmop (left, NULL, ic, TRUE); @@ -7498,7 +7540,7 @@ genCodePointerGet (operand * left, int size, offset; sym_link *retype = getSpec (operandType (result)); - D(emitcode (";", "genCodePointerGet")); + D(emitcode ("; genCodePointerGet","")); aopOp (left, ic, FALSE); @@ -7528,17 +7570,25 @@ genCodePointerGet (operand * left, while (size--) { - emitcode ("clr", "a"); - emitcode ("movc", "a,@a+dptr"); - aopPut (AOP (result), "a", offset++); - if (size || pi) - emitcode ("inc", "dptr"); + if (pi) + { + emitcode ("clr", "a"); + emitcode ("movc", "a,@a+dptr"); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); + emitcode ("inc", "dptr"); + } + else + { + emitcode ("mov", "a,#0x%02x", offset); + emitcode ("movc", "a,@a+dptr"); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); + } } } 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), "dpl", 0, isOperandVolatile (left, FALSE)); + aopPut ( AOP (left), "dph", 1, isOperandVolatile (left, FALSE)); pi->generated = 1; } freeAsmop (left, NULL, ic, TRUE); @@ -7555,7 +7605,7 @@ genGenPointerGet (operand * left, int size, offset; sym_link *retype = getSpec (operandType (result)); - D(emitcode (";", "genGenPointerGet")); + D(emitcode ("; genGenPointerGet","")); aopOp (left, ic, FALSE); @@ -7593,16 +7643,15 @@ genGenPointerGet (operand * left, while (size--) { emitcode ("lcall", "__gptrget"); - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); 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); - aopPut ( AOP (left), "b", 2); + aopPut ( AOP (left), "dpl", 0, isOperandVolatile (left, FALSE)); + aopPut ( AOP (left), "dph", 1, isOperandVolatile (left, FALSE)); pi->generated = 1; } freeAsmop (left, NULL, ic, TRUE); @@ -7619,7 +7668,7 @@ genPointerGet (iCode * ic, iCode *pi) sym_link *type, *etype; int p_type; - D(emitcode (";", "genPointerGet")); + D(emitcode ("; genPointerGet","")); left = IC_LEFT (ic); result = IC_RESULT (ic); @@ -7687,7 +7736,7 @@ genPackBits (sym_link * etype, int blen, bstr; char *l; - D(emitcode (";", "genPackBits")); + D(emitcode ("; genPackBits","")); blen = SPEC_BLEN (etype); bstr = SPEC_BSTR (etype); @@ -7854,7 +7903,7 @@ genDataPointerSet (operand * right, int size, offset = 0; char *l, buffer[256]; - D(emitcode (";", "genDataPointerSet")); + D(emitcode ("; genDataPointerSet","")); aopOp (right, ic, FALSE); @@ -7889,7 +7938,7 @@ genNearPointerSet (operand * right, sym_link *retype, *letype; sym_link *ptype = operandType (result); - D(emitcode (";", "genNearPointerSet")); + D(emitcode ("; genNearPointerSet","")); retype = getSpec (operandType (right)); letype = getSpec (ptype); @@ -7974,7 +8023,8 @@ genNearPointerSet (operand * right, /* now some housekeeping stuff */ if (aop) /* we had to allocate for this iCode */ { - if (pi) aopPut (AOP (result),rname,0); + if (pi) + aopPut (AOP (result), rname, 0, isOperandVolatile (result, FALSE)); freeAsmop (NULL, aop, ic, TRUE); } else @@ -8016,7 +8066,7 @@ genPagedPointerSet (operand * right, char *rname, *l; sym_link *retype, *letype; - D(emitcode (";", "genPagedPointerSet")); + D(emitcode ("; genPagedPointerSet","")); retype = getSpec (operandType (right)); letype = getSpec (operandType (result)); @@ -8066,7 +8116,8 @@ genPagedPointerSet (operand * right, /* now some housekeeping stuff */ if (aop) /* we had to allocate for this iCode */ { - if (pi) aopPut (AOP (result),rname,0); + if (pi) + aopPut (AOP (result), rname, 0, isOperandVolatile (result, FALSE)); freeAsmop (NULL, aop, ic, TRUE); } else @@ -8106,7 +8157,7 @@ genFarPointerSet (operand * right, sym_link *retype = getSpec (operandType (right)); sym_link *letype = getSpec (operandType (result)); - D(emitcode (";", "genFarPointerSet")); + D(emitcode ("; genFarPointerSet","")); aopOp (result, ic, FALSE); @@ -8144,8 +8195,8 @@ genFarPointerSet (operand * right, } } if (pi && AOP_TYPE (result) != AOP_STR && AOP_TYPE (result) != AOP_IMMD) { - aopPut (AOP(result),"dpl",0); - aopPut (AOP(result),"dph",1); + aopPut (AOP(result), "dpl", 0, isOperandVolatile (result, FALSE)); + aopPut (AOP(result), "dph", 1, isOperandVolatile (result, FALSE)); pi->generated=1; } freeAsmop (result, NULL, ic, TRUE); @@ -8163,7 +8214,7 @@ genGenPointerSet (operand * right, sym_link *retype = getSpec (operandType (right)); sym_link *letype = getSpec (operandType (result)); - D(emitcode (";", "genGenPointerSet")); + D(emitcode ("; genGenPointerSet","")); aopOp (result, ic, FALSE); @@ -8209,9 +8260,8 @@ genGenPointerSet (operand * right, } if (pi && AOP_TYPE (result) != AOP_STR && AOP_TYPE (result) != AOP_IMMD) { - aopPut (AOP(result),"dpl",0); - aopPut (AOP(result),"dph",1); - aopPut (AOP(result),"b",2); + aopPut (AOP(result), "dpl", 0, isOperandVolatile (result, FALSE)); + aopPut (AOP(result), "dph", 1, isOperandVolatile (result, FALSE)); pi->generated=1; } freeAsmop (result, NULL, ic, TRUE); @@ -8228,7 +8278,7 @@ genPointerSet (iCode * ic, iCode *pi) sym_link *type, *etype; int p_type; - D(emitcode (";", "genPointerSet")); + D(emitcode ("; genPointerSet","")); right = IC_RIGHT (ic); result = IC_RESULT (ic); @@ -8293,7 +8343,7 @@ genIfx (iCode * ic, iCode * popIc) operand *cond = IC_COND (ic); int isbit = 0; - D(emitcode (";", "genIfx")); + D(emitcode ("; genIfx","")); aopOp (cond, ic, FALSE); @@ -8330,7 +8380,7 @@ genAddrOf (iCode * ic) symbol *sym = OP_SYMBOL (IC_LEFT (ic)); int size, offset; - D(emitcode (";", "genAddrOf")); + D(emitcode ("; genAddrOf","")); aopOp (IC_RESULT (ic), ic, FALSE); @@ -8347,12 +8397,12 @@ genAddrOf (iCode * ic) emitcode ("add", "a,#0x%02x", ((sym->stack < 0) ? ((char) (sym->stack - _G.nRegsSaved)) : ((char) sym->stack)) & 0xff); - aopPut (AOP (IC_RESULT (ic)), "a", 0); + aopPut (AOP (IC_RESULT (ic)), "a", 0, isOperandVolatile (IC_RESULT (ic), FALSE)); } else { /* we can just move _bp */ - aopPut (AOP (IC_RESULT (ic)), "_bp", 0); + aopPut (AOP (IC_RESULT (ic)), "_bp", 0, isOperandVolatile (IC_RESULT (ic), FALSE)); } /* fill the result with zero */ size = AOP_SIZE (IC_RESULT (ic)) - 1; @@ -8360,7 +8410,7 @@ genAddrOf (iCode * ic) offset = 1; while (size--) { - aopPut (AOP (IC_RESULT (ic)), zero, offset++); + aopPut (AOP (IC_RESULT (ic)), zero, offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); } goto release; @@ -8379,7 +8429,7 @@ genAddrOf (iCode * ic) offset * 8); else sprintf (s, "#%s", sym->rname); - aopPut (AOP (IC_RESULT (ic)), s, offset++); + aopPut (AOP (IC_RESULT (ic)), s, offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); } release: @@ -8397,7 +8447,7 @@ genFarFarAssign (operand * result, operand * right, iCode * ic) int offset = 0; char *l; - D(emitcode (";", "genFarFarAssign")); + D(emitcode ("; genFarFarAssign","")); /* first push the right side on to the stack */ while (size--) @@ -8414,7 +8464,7 @@ genFarFarAssign (operand * result, operand * right, iCode * ic) while (size--) { emitcode ("pop", "acc"); - aopPut (AOP (result), "a", --offset); + aopPut (AOP (result), "a", --offset, isOperandVolatile (result, FALSE)); } freeAsmop (result, NULL, ic, FALSE); @@ -8430,13 +8480,15 @@ genAssign (iCode * ic) int size, offset; unsigned long lit = 0L; - D(emitcode(";","genAssign")); + D(emitcode("; genAssign","")); result = IC_RESULT (ic); right = IC_RIGHT (ic); /* if they are the same */ - if (operandsEqu (IC_RESULT (ic), IC_RIGHT (ic))) + if (operandsEqu (result, right) && + !isOperandVolatile (result, FALSE) && + !isOperandVolatile (right, FALSE)) return; aopOp (right, ic, FALSE); @@ -8454,7 +8506,9 @@ genAssign (iCode * ic) aopOp (result, ic, TRUE); /* if they are the same registers */ - if (sameRegs (AOP (right), AOP (result))) + if (sameRegs (AOP (right), AOP (result)) && + !isOperandVolatile (result, FALSE) && + !isOperandVolatile (right, FALSE)) goto release; /* if the result is a bit */ @@ -8466,9 +8520,9 @@ genAssign (iCode * ic) if (AOP_TYPE (right) == AOP_LIT) { if (((int) operandLitValue (right))) - aopPut (AOP (result), one, 0); + aopPut (AOP (result), one, 0, isOperandVolatile (result, FALSE)); else - aopPut (AOP (result), zero, 0); + aopPut (AOP (result), zero, 0, isOperandVolatile (result, FALSE)); goto release; } @@ -8476,13 +8530,13 @@ genAssign (iCode * ic) if (AOP_TYPE (right) == AOP_CRY) { emitcode ("mov", "c,%s", AOP (right)->aopu.aop_dir); - aopPut (AOP (result), "c", 0); + aopPut (AOP (result), "c", 0, isOperandVolatile (result, FALSE)); goto release; } /* we need to or */ toBoolean (right); - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); goto release; } @@ -8502,11 +8556,12 @@ genAssign (iCode * ic) while (size--) { if ((unsigned int) ((lit >> (size * 8)) & 0x0FFL) == 0) - aopPut (AOP (result), "a", size); + aopPut (AOP (result), "a", size, isOperandVolatile (result, FALSE)); else aopPut (AOP (result), aopGet (AOP (right), size, FALSE, FALSE), - size); + size, + isOperandVolatile (result, FALSE)); } } else @@ -8515,7 +8570,8 @@ genAssign (iCode * ic) { aopPut (AOP (result), aopGet (AOP (right), offset, FALSE, FALSE), - offset); + offset, + isOperandVolatile (result, FALSE)); offset++; } } @@ -8534,7 +8590,7 @@ genJumpTab (iCode * ic) symbol *jtab; char *l; - D(emitcode (";", "genJumpTab")); + D(emitcode ("; genJumpTab","")); aopOp (IC_JTCOND (ic), ic, FALSE); /* get the condition into accumulator */ @@ -8568,7 +8624,7 @@ genCast (iCode * ic) operand *right = IC_RIGHT (ic); int size, offset; - D(emitcode(";", "genCast")); + D(emitcode("; genCast","")); /* if they are equivalent then do nothing */ if (operandsEqu (IC_RESULT (ic), IC_RIGHT (ic))) @@ -8585,9 +8641,9 @@ genCast (iCode * ic) if (AOP_TYPE (right) == AOP_LIT) { if (((int) operandLitValue (right))) - aopPut (AOP (result), one, 0); + aopPut (AOP (result), one, 0, isOperandVolatile (result, FALSE)); else - aopPut (AOP (result), zero, 0); + aopPut (AOP (result), zero, 0, isOperandVolatile (result, FALSE)); goto release; } @@ -8596,13 +8652,13 @@ genCast (iCode * ic) if (AOP_TYPE (right) == AOP_CRY) { emitcode ("mov", "c,%s", AOP (right)->aopu.aop_dir); - aopPut (AOP (result), "c", 0); + aopPut (AOP (result), "c", 0, isOperandVolatile (result, FALSE)); goto release; } /* we need to or */ toBoolean (right); - aopPut (AOP (result), "a", 0); + aopPut (AOP (result), "a", 0, isOperandVolatile (result, FALSE)); goto release; } @@ -8621,7 +8677,8 @@ genCast (iCode * ic) { aopPut (AOP (result), aopGet (AOP (right), offset, FALSE, FALSE), - offset); + offset, + isOperandVolatile (result, FALSE)); offset++; } goto release; @@ -8659,7 +8716,8 @@ genCast (iCode * ic) { aopPut (AOP (result), aopGet (AOP (right), offset, FALSE, FALSE), - offset); + offset, + isOperandVolatile (result, FALSE)); offset++; } /* the last byte depending on type */ @@ -8674,7 +8732,7 @@ genCast (iCode * ic) } sprintf(gpValStr, "#0x%d", gpVal); - aopPut (AOP (result), gpValStr, GPTRSIZE - 1); + aopPut (AOP (result), gpValStr, GPTRSIZE - 1, isOperandVolatile (result, FALSE)); } goto release; } @@ -8686,7 +8744,8 @@ genCast (iCode * ic) { aopPut (AOP (result), aopGet (AOP (right), offset, FALSE, FALSE), - offset); + offset, + isOperandVolatile (result, FALSE)); offset++; } goto release; @@ -8701,7 +8760,8 @@ genCast (iCode * ic) { aopPut (AOP (result), aopGet (AOP (right), offset, FALSE, FALSE), - offset); + offset, + isOperandVolatile (result, FALSE)); offset++; } @@ -8711,7 +8771,7 @@ genCast (iCode * ic) if (!IS_SPEC (rtype) || SPEC_USIGN (rtype) || AOP_TYPE(right)==AOP_CRY) { while (size--) - aopPut (AOP (result), zero, offset++); + aopPut (AOP (result), zero, offset++, isOperandVolatile (result, FALSE)); } else { @@ -8722,7 +8782,7 @@ genCast (iCode * ic) emitcode ("rlc", "a"); emitcode ("subb", "a,acc"); while (size--) - aopPut (AOP (result), "a", offset++); + aopPut (AOP (result), "a", offset++, isOperandVolatile (result, FALSE)); } /* we are done hurray !!!! */ @@ -8743,7 +8803,7 @@ genDjnz (iCode * ic, iCode * ifx) if (!ifx) return 0; - D(emitcode (";", "genDjnz")); + D(emitcode ("; genDjnz","")); /* if the if condition has a false label then we cannot save */ @@ -8790,7 +8850,7 @@ genDjnz (iCode * ic, iCode * ifx) return 0; } emitcode ("dec", "%s", rByte); - aopPut(AOP(IC_RESULT(ic)), rByte, 0); + aopPut(AOP(IC_RESULT(ic)), rByte, 0, isOperandVolatile (IC_RESULT (ic), FALSE)); emitcode ("jnz", "%05d$", lbl->key + 100); } else if (IS_AOP_PREG (IC_RESULT (ic))) @@ -8823,13 +8883,13 @@ genReceive (iCode * ic) { int size = getSize (operandType (IC_RESULT (ic))); int offset = 0; - D(emitcode (";", "genReceive")); + D(emitcode ("; genReceive","")); if (ic->argreg == 1) { /* first parameter */ if (isOperandInFarSpace (IC_RESULT (ic)) && (OP_SYMBOL (IC_RESULT (ic))->isspilt || IS_TRUE_SYMOP (IC_RESULT (ic)))) { - + offset = fReturnSizeMCS51 - size; while (size--) { emitcode ("push", "%s", (strcmp (fReturn[fReturnSizeMCS51 - offset - 1], "a") ? @@ -8841,9 +8901,9 @@ genReceive (iCode * ic) offset = 0; while (size--) { emitcode ("pop", "acc"); - aopPut (AOP (IC_RESULT (ic)), "a", offset++); + aopPut (AOP (IC_RESULT (ic)), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); } - + } else { _G.accInUse++; aopOp (IC_RESULT (ic), ic, FALSE); @@ -8855,12 +8915,48 @@ genReceive (iCode * ic) aopOp (IC_RESULT (ic), ic, FALSE); rb1off = ic->argreg; while (size--) { - aopPut (AOP (IC_RESULT (ic)), rb1regs[rb1off++ -5], offset++); + aopPut (AOP (IC_RESULT (ic)), rb1regs[rb1off++ -5], offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); } } freeAsmop (IC_RESULT (ic), NULL, ic, TRUE); } +/*-----------------------------------------------------------------*/ +/* genDummyRead - generate code for dummy read of volatiles */ +/*-----------------------------------------------------------------*/ +static void +genDummyRead (iCode * ic) +{ + operand *right; + int size, offset; + + D(emitcode("; genDummyRead","")); + + right = IC_RIGHT (ic); + + aopOp (right, ic, FALSE); + + /* if the result is a bit */ + if (AOP_TYPE (right) == AOP_CRY) + { + emitcode ("mov", "c,%s", AOP (right)->aopu.aop_dir); + goto release; + } + + /* bit variables done */ + /* general case */ + size = AOP_SIZE (right); + offset = 0; + while (size--) + { + emitcode ("mov", "a,%s", aopGet (AOP (right), offset, FALSE, FALSE)); + offset++; + } + +release: + freeAsmop (right, NULL, ic, TRUE); +} + /*-----------------------------------------------------------------*/ /* gen51Code - generate code for 8051 based controllers */ /*-----------------------------------------------------------------*/ @@ -8873,12 +8969,12 @@ gen51Code (iCode * lic) lineHead = lineCurr = NULL; /* print the allocation information */ - if (allocInfo) + if (allocInfo && currFunc) printAllocInfo (currFunc, codeOutFile); /* if debug information required */ if (options.debug && currFunc) { - cdbSymbol (currFunc, cdbFile, FALSE, TRUE); + debugFile->writeFunction(currFunc); _G.debugLine = 1; if (IS_STATIC (currFunc->etype)) emitcode ("", "F%s$%s$0$0 ==.", moduleName, currFunc->name); @@ -8906,10 +9002,23 @@ gen51Code (iCode * lic) ic->level, ic->block); _G.debugLine = 0; } - emitcode ("", ";\t%s:%d: %s", ic->filename, ic->lineno, - printCLine(ic->filename, ic->lineno)); + if (!options.noCcodeInAsm) { + emitcode ("", ";%s:%d: %s", ic->filename, ic->lineno, + printCLine(ic->filename, ic->lineno)); + } cln = ic->lineno; } + if (options.iCodeInAsm) { + char regsInUse[80]; + int i; + + for (i=0; i<8; i++) { + sprintf (®sInUse[i], + "%c", ic->riu & (1<seq, printILine(ic)); + } /* if the result is marked as spilt and rematerializable or code for this has already been generated then @@ -9101,6 +9210,10 @@ gen51Code (iCode * lic) addSet (&_G.sendSet, ic); break; + case DUMMY_READ_VOLATILE: + genDummyRead (ic); + break; + default: ic = ic; }