#endif
/*-----------------------------------------------------------------*/
-/* pcDistance - afinds a label back ward or forward */
+/* pcDistance - finds a label backward or forward */
/*-----------------------------------------------------------------*/
static int
SNPRINTF (buff, sizeof(buff), "%s:", lbl);
while (pl)
{
-
if (pl->line &&
!pl->isComment &&
!pl->isLabel &&
- !pl->isDebug) {
- if (port->peep.getSize) {
- dist += port->peep.getSize(pl);
- } else {
- dist += 3;
- }
+ !pl->isDebug)
+ {
+ if (port->peep.getSize)
+ {
+ dist += port->peep.getSize(pl);
+ }
+ else
+ {
+ dist += 3;
+ }
}
if (strncmp (pl->line, buff, strlen (buff)) == 0)
return 0;
}
-/*-----------------------------------------------------------------*/
-/* flat24bitModeAndPortDS390 - */
-/*-----------------------------------------------------------------*/
-FBYNAME (flat24bitModeAndPortDS390)
-{
- return (((strcmp(port->target,"ds390") == 0) ||
- (strcmp(port->target,"ds400") == 0)) &&
- (options.model == MODEL_FLAT24));
-}
-
/*-----------------------------------------------------------------*/
/* portIsDS390 - return true if port is DS390 */
/*-----------------------------------------------------------------*/
return (options.acall_ajmp && (strcmp(port->target,"mcs51") == 0));
}
-
-
/*-----------------------------------------------------------------*/
/* labelInRange - will check to see if label %5 is within range */
/*-----------------------------------------------------------------*/
return FALSE;
/* calculate the label distance : the jump for reladdr can be
- +/- 127 bytes, here Iam assuming that an average 8051
+ +/- 127 bytes, here I am assuming that an average 8051
instruction is 2 bytes long, so if the label is more than
63 intructions away, the label is considered out of range
for a relative jump. we could get more precise this will
return TRUE;
}
-
/*-----------------------------------------------------------------*/
/* labelJTInRange - will check to see if label %5 and up are */
/* within range. */
return TRUE;
}
-
/*-----------------------------------------------------------------*/
/* labelIsReturnOnly - Check if label %5 is followed by RET */
/*-----------------------------------------------------------------*/
return FALSE;
}
-
/*-----------------------------------------------------------------*/
/* labelIsUncondJump - Check if label %5 is followed by an */
/* unconditional jump and put the destination of that jump in %6 */
return TRUE;
}
-
/*-----------------------------------------------------------------*/
/* okToRemoveSLOC - Check if label %1 is a SLOC and not other */
/* usage of it in the code depends on a value from this section */
if (port->peep.deadMove)
return port->peep.deadMove (reg, currPl, head);
- fprintf (stderr, "Function deadMove not initialized in port structure\n");
+ fprintf (stderr, "Function deadMove not initialized in port structure\n");
return FALSE;
}
return TRUE;
}
-
/*-----------------------------------------------------------------*/
/* operandsNotSame7- check if any pair of %1,%2,%3,.. are the same */
/*-----------------------------------------------------------------*/
return rc;
}
-
/* labelRefCountChange:
* takes two parameters: a variable (bound to a label name)
* and a signed int for changing the reference count.
return rc;
}
-
/* Within the context of the lines currPl through endPl, determine
** if the variable var contains a symbol that is volatile. Returns
** TRUE only if it is certain that this was not volatile (the symbol
{
case IFX:
op = IC_COND (cl->ic);
- if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
- return !op->isvolatile;
+ if (IS_SYMOP (op) &&
+ ( !strcmp(OP_SYMBOL (op)->rname, symname) ||
+ (OP_SYMBOL (op)->isspilt &&
+ SPIL_LOC (op) &&
+ !strcmp(SPIL_LOC (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;
+ if (IS_SYMOP (op) &&
+ ( !strcmp(OP_SYMBOL (op)->rname, symname) ||
+ (OP_SYMBOL (op)->isspilt &&
+ SPIL_LOC (op) &&
+ !strcmp(SPIL_LOC (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;
+ if (IS_SYMOP (op) &&
+ ( !strcmp(OP_SYMBOL (op)->rname, symname) ||
+ (OP_SYMBOL (op)->isspilt &&
+ SPIL_LOC (op) &&
+ !strcmp(SPIL_LOC (op)->rname, symname)) ))
+ {
+ return !op->isvolatile;
+ }
op = IC_RIGHT (cl->ic);
- if (IS_SYMOP (op) && !strcmp(OP_SYMBOL (op)->rname,symname) )
- return !op->isvolatile;
+ if (IS_SYMOP (op) &&
+ ( !strcmp(OP_SYMBOL (op)->rname, symname) ||
+ (OP_SYMBOL (op)->isspilt &&
+ SPIL_LOC (op) &&
+ !strcmp(SPIL_LOC (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 (IS_SYMOP (op) &&
+ ( !strcmp(OP_SYMBOL (op)->rname, symname) ||
+ (OP_SYMBOL (op)->isspilt &&
+ SPIL_LOC (op) &&
+ !strcmp(SPIL_LOC (op)->rname, symname)) ))
+ {
+ return !op->isvolatile;
+ }
}
}
}
return TRUE;
-
error:
fprintf (stderr,
"*** internal error: notVolatile peephole restriction"
return FALSE;
}
-
/*------------------------------------------------------------------*/
/* setFromConditionArgs - parse a peephole condition's arguments */
/* to produce a set of strings, one per argument. Variables %x will */
return "a";
if (!strncmp (op, "ar", 2) && ISCHARDIGIT(*(op+2)) && !*(op+3))
return op+1;
+ // bug 1739475, temp fix
+ if (op[0] == '@')
+ return operandBaseName(op+1);
}
return op;
}
-
/*-------------------------------------------------------------------*/
/* operandsNotRelated - returns true if the condition's operands are */
/* not related (taking into account register name aliases). N-way */
return TRUE;
}
-
/*-------------------------------------------------------------------*/
/* operandsLiteral - returns true of the condition's operands are */
/* literals. */
return TRUE;
}
-
+static const struct ftab
+{
+ char *fname;
+ int (*func) (hTab *, lineNode *, lineNode *, lineNode *, char *);
+}
+ftab[] = // sorted on the number of times used
+{ // in the peephole rules on 2007-10-29
+ {
+ "labelRefCount", labelRefCount //105
+ },
+ {
+ "notVolatile", notVolatile //85
+ },
+ {
+ "labelRefCountChange", labelRefCountChange //74
+ },
+ {
+ "labelInRange", labelInRange //37
+ },
+ {
+ "labelJTInRange", labelJTInRange //13
+ },
+ {
+ "operandsNotRelated", operandsNotRelated //9
+ },
+ {
+ "24bitMode", flat24bitMode //9
+ },
+ {
+ "operandsNotSame", operandsNotSame //8
+ },
+ {
+ "operandsNotSame3", operandsNotSame3
+ },
+ {
+ "operandsNotSame4", operandsNotSame4
+ },
+ {
+ "operandsNotSame5", operandsNotSame5
+ },
+ {
+ "operandsNotSame6", operandsNotSame6
+ },
+ {
+ "operandsNotSame7", operandsNotSame7
+ },
+ {
+ "operandsNotSame8", operandsNotSame8
+ },
+ {
+ "xramMovcOption", xramMovcOption
+ },
+ {
+ "portIsDS390", portIsDS390
+ },
+ {
+ "labelIsReturnOnly", labelIsReturnOnly
+ },
+ {
+ "labelIsUncondJump", labelIsUncondJump
+ },
+ {
+ "okToRemoveSLOC", okToRemoveSLOC
+ },
+ {
+ "deadMove", deadMove
+ },
+ {
+ "operandsLiteral", operandsLiteral
+ },
+ {
+ "useAcallAjmp", useAcallAjmp
+ }
+};
/*-----------------------------------------------------------------*/
/* callFuncByName - calls a function as defined in the table */
/*-----------------------------------------------------------------*/
static int
callFuncByName (char *fname,
hTab * vars,
- lineNode * currPl,
- lineNode * endPl,
+ lineNode * currPl, /* first source line matched */
+ lineNode * endPl, /* last source line matched */
lineNode * head)
{
- struct ftab
- {
- char *fname;
- int (*func) (hTab *, lineNode *, lineNode *, lineNode *, char *);
- }
- ftab[] =
- {
- {
- "labelInRange", labelInRange
- }
- ,
- {
- "labelJTInRange", labelJTInRange
- }
- ,
- {
- "operandsNotSame", operandsNotSame
- }
- ,
- {
- "operandsNotSame3", operandsNotSame3
- }
- ,
- {
- "operandsNotSame4", operandsNotSame4
- }
- ,
- {
- "operandsNotSame5", operandsNotSame5
- }
- ,
- {
- "operandsNotSame6", operandsNotSame6
- }
- ,
- {
- "operandsNotSame7", operandsNotSame7
- }
- ,
- {
- "operandsNotSame8", operandsNotSame8
- }
- ,
- {
- "24bitMode", flat24bitMode
- }
- ,
- {
- "xramMovcOption", xramMovcOption
- }
- ,
- {
- "labelRefCount", labelRefCount
- }
- ,
- {
- "portIsDS390", portIsDS390
- },
- {
- "labelIsReturnOnly", labelIsReturnOnly
- },
- {
- "labelIsUncondJump", labelIsUncondJump
- },
- {
- "okToRemoveSLOC", okToRemoveSLOC
- },
- {
- "deadMove", deadMove
- },
- {
- "24bitModeAndPortDS390", flat24bitModeAndPortDS390
- },
- {
- "notVolatile", notVolatile
- },
- {
- "operandsNotRelated", operandsNotRelated
- },
- {
- "operandsLiteral", operandsLiteral
- },
- {
- "labelRefCountChange", labelRefCountChange
- },
- {
- "useAcallAjmp", useAcallAjmp
- }
- };
int i;
char *cmdCopy, *funcName, *funcArgs, *cmdTerm;
char c;
newPeepRule (match, replace, lines, restart);
}
else
- {
+ {
if (*bp && strncmp (bp, "replace", 7))
{
/* not the start of a new peeprule, so "if" should be here */
-
+
char strbuff[1000];
char *cp;
-
+
/* go to the start of the line following "{" of the "by" token */
while (*rp && (*rp == '\n'))
rp++;
-
+
/* copy text of rule starting with line after "by {" */
cp = strbuff;
while (*rp && (rp < bp) && ((cp - strbuff) < sizeof(strbuff)))
return;
}
newPeepRule (match, replace, NULL, restart);
- }
+ }
goto top;
}