projects
/
fw
/
sdcc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
* support/Util/NewAlloc.c (freeTrace): Changed free for the gc case to not free...
[fw/sdcc]
/
src
/
SDCCopt.c
diff --git
a/src/SDCCopt.c
b/src/SDCCopt.c
index 8ed9c5979396b7cc4f29439cc08f03f1e93bf32d..1fd2e6cb408cea90fc46989949c547e84dfad4c4 100644
(file)
--- a/
src/SDCCopt.c
+++ b/
src/SDCCopt.c
@@
-340,6
+340,14
@@
convilong (iCode * ic, eBBlock * ebp, sym_link * type, int op)
func = __muldiv[1][bwd][su];
else if (op == '%')
func = __muldiv[2][bwd][su];
func = __muldiv[1][bwd][su];
else if (op == '%')
func = __muldiv[2][bwd][su];
+ else if (op == RRC)
+ func = __rlrr[1][bwd][su];
+ else if (op == RLC)
+ func = __rlrr[0][bwd][su];
+ else if (op == RIGHT_OP)
+ func = __rlrr[1][bwd][su];
+ else if (op == LEFT_OP)
+ func = __rlrr[0][bwd][su];
else
assert (0);
goto found;
else
assert (0);
goto found;
@@
-373,32
+381,36
@@
found:
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
-
}
else
{
}
else
{
-
/* compiled as reentrant then push */
/* push right */
if (IS_REGPARM (func->args->next->etype))
/* compiled as reentrant then push */
/* push right */
if (IS_REGPARM (func->args->next->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ }
else
{
newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
newic->parmPush = 1;
else
{
newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
newic->parmPush = 1;
- bytesPushed += getSize(type);
+
+ bytesPushed += getSize(operandType(IC_RIGHT(ic)));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
/* insert push left */
if (IS_REGPARM (func->args->etype))
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
/* insert push left */
if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ {
+ newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ }
else
{
newic = newiCode (IPUSH, IC_LEFT (ic), NULL);
newic->parmPush = 1;
else
{
newic = newiCode (IPUSH, IC_LEFT (ic), NULL);
newic->parmPush = 1;
- bytesPushed += getSize(type);
+
+ bytesPushed += getSize(operandType(IC_LEFT(ic)));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
@@
-452,11
+464,22
@@
convertToFcall (eBBlock ** ebbs, int count)
/* if long / int mult or divide or mod */
if (ic->op == '*' || ic->op == '/' || ic->op == '%')
{
/* if long / int mult or divide or mod */
if (ic->op == '*' || ic->op == '/' || ic->op == '%')
{
-
sym_link *type = operandType (IC_LEFT (ic));
sym_link *type = operandType (IC_LEFT (ic));
- if (IS_INTEGRAL (type) && getSize (type) > port->muldiv.native_below)
- convilong (ic, ebbs[i], type, ic->op);
+ if (IS_INTEGRAL (type) && getSize (type) > port->support.muldiv)
+ {
+ convilong (ic, ebbs[i], type, ic->op);
+ }
}
}
+
+ if (ic->op == RRC || ic->op == RLC || ic->op == LEFT_OP || ic->op == RIGHT_OP)
+ {
+ sym_link *type = operandType (IC_LEFT (ic));
+
+ if (IS_INTEGRAL (type) && getSize (type) > port->support.shift && port->support.shift >= 0)
+ {
+ convilong (ic, ebbs[i], type, ic->op);
+ }
+ }
}
}
}
}
}
}
@@
-817,7
+840,6
@@
eBBlockFromiCode (iCode * ic)
subexpression once more */
if (lchange || kchange)
{
subexpression once more */
if (lchange || kchange)
{
-
computeDataFlow (ebbs, saveCount);
change += cseAllBlocks (ebbs, saveCount);
if (options.dump_loop)
computeDataFlow (ebbs, saveCount);
change += cseAllBlocks (ebbs, saveCount);
if (options.dump_loop)
@@
-834,7
+856,6
@@
eBBlockFromiCode (iCode * ic)
}
}
-
/* sort it back by block number */
qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare);
/* sort it back by block number */
qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare);
@@
-842,14
+863,12
@@
eBBlockFromiCode (iCode * ic)
if (options.cyclomatic)
printCyclomatic (ebbs, saveCount);
if (options.cyclomatic)
printCyclomatic (ebbs, saveCount);
-
/* convert operations with support routines
written in C to function calls : Iam doing
this at this point since I want all the
operations to be as they are for optimzations */
convertToFcall (ebbs, count);
/* convert operations with support routines
written in C to function calls : Iam doing
this at this point since I want all the
operations to be as they are for optimzations */
convertToFcall (ebbs, count);
-
/* compute the live ranges */
computeLiveRanges (ebbs, count);
/* compute the live ranges */
computeLiveRanges (ebbs, count);
@@
-868,7
+887,6
@@
eBBlockFromiCode (iCode * ic)
setToNull ((void **) &graphEdges);
ebbs = NULL;
setToNull ((void **) &graphEdges);
ebbs = NULL;
-
return NULL;
}
return NULL;
}