+2003-08-31 Erik Petrich <epetrich@ivorytower.norman.ok.us>
+
+ * src/SDCCpeeph.c (notVolatile, notVolatileVariable): handle IFX
+ and JUMPTABLE iCodes properly now (worked by accident before)
+ * src/mcs51/gen.c (leftRightUseAcc),
+ * src/ds390/gen.c (leftRightUseAcc): handle IFX and JUMPTABLE
+ iCode properly now. Use getSize instead of nRegs since a & b
+ aren't part of the nRegs tally.
+
2003-08-31 Vangelis Rokas <vrokas@otenet.gr>
* src/pic16/main.c: corrected offsets of interrupt vectors in _pic16_genIVT()
* src/pic16/pcode.c: fix to disable inserting BANKSEL directive
if (cl->ic && (cl->ic!=last_ic))
{
last_ic = cl->ic;
- op = IC_LEFT (cl->ic);
- if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
- return !op->isvolatile;
- op = IC_RIGHT (cl->ic);
- if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
- return !op->isvolatile;
- op = IC_RESULT (cl->ic);
- if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
- return !op->isvolatile;
+ switch (cl->ic->op)
+ {
+ case IFX:
+ op = IC_COND (cl->ic);
+ if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
+ return !op->isvolatile;
+ case JUMPTABLE:
+ op = IC_JTCOND (cl->ic);
+ if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
+ return !op->isvolatile;
+ default:
+ op = IC_LEFT (cl->ic);
+ if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
+ return !op->isvolatile;
+ op = IC_RIGHT (cl->ic);
+ if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
+ return !op->isvolatile;
+ op = IC_RESULT (cl->ic);
+ if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
+ return !op->isvolatile;
+ }
}
}
{
if (cl->ic)
{
- op = IC_LEFT (cl->ic);
- if (IS_SYMOP (op) && op->isvolatile)
- return FALSE;
- op = IC_RIGHT (cl->ic);
- if (IS_SYMOP (op) && op->isvolatile)
- return FALSE;
- op = IC_RESULT (cl->ic);
- if (IS_SYMOP (op) && op->isvolatile)
- return FALSE;
+ switch (cl->ic->op)
+ {
+ case IFX:
+ op = IC_COND (cl->ic);
+ if (IS_SYMOP (op) && op->isvolatile)
+ return FALSE;
+ case JUMPTABLE:
+ op = IC_JTCOND (cl->ic);
+ if (IS_SYMOP (op) && op->isvolatile)
+ return FALSE;
+ default:
+ op = IC_LEFT (cl->ic);
+ if (IS_SYMOP (op) && op->isvolatile)
+ return FALSE;
+ op = IC_RIGHT (cl->ic);
+ if (IS_SYMOP (op) && op->isvolatile)
+ return FALSE;
+ op = IC_RESULT (cl->ic);
+ if (IS_SYMOP (op) && op->isvolatile)
+ return FALSE;
+ }
}
}
return TRUE;
static int
leftRightUseAcc(iCode *ic)
{
+ operand *op;
+ int size;
+ int accuseSize = 0;
int accuse = 0;
- if (ic && IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic))
- && OP_SYMBOL (IC_LEFT (ic)) && OP_SYMBOL (IC_LEFT (ic))->accuse)
- accuse = (accuse < OP_SYMBOL (IC_LEFT (ic))->nRegs)
- ? OP_SYMBOL (IC_LEFT (ic))->nRegs : accuse;
-
- if (ic && IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic))
- && OP_SYMBOL (IC_RIGHT (ic)) && OP_SYMBOL (IC_RIGHT (ic))->accuse)
- accuse = (accuse < OP_SYMBOL (IC_RIGHT (ic))->nRegs)
- ? OP_SYMBOL (IC_RIGHT (ic))->nRegs : accuse;
+ if (!ic)
+ {
+ werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
+ "null iCode pointer");
+ return 0;
+ }
- return accuse;
+ if (ic->op == IFX)
+ {
+ op = IC_COND (ic);
+ if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+ {
+ accuse = 1;
+ size = getSize (OP_SYMBOL (op)->type);
+ if (size>accuseSize)
+ accuseSize = size;
+ }
+ }
+ else if (ic->op == JUMPTABLE)
+ {
+ op = IC_JTCOND (ic);
+ if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+ {
+ accuse = 1;
+ size = getSize (OP_SYMBOL (op)->type);
+ if (size>accuseSize)
+ accuseSize = size;
+ }
+ }
+ else
+ {
+ op = IC_LEFT (ic);
+ if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+ {
+ accuse = 1;
+ size = getSize (OP_SYMBOL (op)->type);
+ if (size>accuseSize)
+ accuseSize = size;
+ }
+ op = IC_RIGHT (ic);
+ if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+ {
+ accuse = 1;
+ size = getSize (OP_SYMBOL (op)->type);
+ if (size>accuseSize)
+ accuseSize = size;
+ }
+ }
+
+ if (accuseSize)
+ return accuseSize;
+ else
+ return accuse;
}
/*-----------------------------------------------------------------*/
static int
leftRightUseAcc(iCode *ic)
{
+ operand *op;
+ int size;
+ int accuseSize = 0;
int accuse = 0;
+
+ if (!ic)
+ {
+ werror (E_INTERNAL_ERROR, __FILE__, __LINE__,
+ "null iCode pointer");
+ return 0;
+ }
- if (ic && IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic))
- && OP_SYMBOL (IC_LEFT (ic)) && OP_SYMBOL (IC_LEFT (ic))->accuse)
- accuse = (accuse < OP_SYMBOL (IC_LEFT (ic))->nRegs)
- ? OP_SYMBOL (IC_LEFT (ic))->nRegs : accuse;
-
- if (ic && IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic))
- && OP_SYMBOL (IC_RIGHT (ic)) && OP_SYMBOL (IC_RIGHT (ic))->accuse)
- accuse = (accuse < OP_SYMBOL (IC_RIGHT (ic))->nRegs)
- ? OP_SYMBOL (IC_RIGHT (ic))->nRegs : accuse;
-
- return accuse;
+ if (ic->op == IFX)
+ {
+ op = IC_COND (ic);
+ if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+ {
+ accuse = 1;
+ size = getSize (OP_SYMBOL (op)->type);
+ if (size>accuseSize)
+ accuseSize = size;
+ }
+ }
+ else if (ic->op == JUMPTABLE)
+ {
+ op = IC_JTCOND (ic);
+ if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+ {
+ accuse = 1;
+ size = getSize (OP_SYMBOL (op)->type);
+ if (size>accuseSize)
+ accuseSize = size;
+ }
+ }
+ else
+ {
+ op = IC_LEFT (ic);
+ if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+ {
+ accuse = 1;
+ size = getSize (OP_SYMBOL (op)->type);
+ if (size>accuseSize)
+ accuseSize = size;
+ }
+ op = IC_RIGHT (ic);
+ if (IS_SYMOP (op) && OP_SYMBOL (op) && OP_SYMBOL (op)->accuse)
+ {
+ accuse = 1;
+ size = getSize (OP_SYMBOL (op)->type);
+ if (size>accuseSize)
+ accuseSize = size;
+ }
+ }
+
+ if (accuseSize)
+ return accuseSize;
+ else
+ return accuse;
}