operand *right;
symbol *func = NULL;
int lineno = ic->lineno;
+ int bytesPushed=0;
ip = ic->next; /* insertion point */
/* remove it from the iCode */
{
/* first one */
- if (IS_REGPARM (func->args->etype))
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
{
newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
}
else
{
newic = newiCode ('=', NULL, IC_LEFT (ic));
- IC_RESULT (newic) = operandFromValue (func->args);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
/* second one */
- if (IS_REGPARM (func->args->next->etype))
+ if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
{
- newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
}
else
{
newic = newiCode ('=', NULL, IC_RIGHT (ic));
- IC_RESULT (newic) = operandFromValue (func->args->next);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)->next);
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
{
/* push right */
- if (IS_REGPARM (func->args->next->etype))
+ if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
{
newic = newiCode (SEND, right, NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
}
else
{
newic = newiCode (IPUSH, right, NULL);
newic->parmPush = 1;
+ bytesPushed+=4;
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
/* insert push left */
- if (IS_REGPARM (func->args->etype))
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
{
newic = newiCode (SEND, left, NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
}
else
{
newic = newiCode (IPUSH, left, NULL);
newic->parmPush = 1;
+ bytesPushed+=4;
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
/* insert the call */
newic = newiCode (CALL, operandFromSymbol (func), NULL);
IC_RESULT (newic) = IC_RESULT (ic);
- addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
+ newic->parmBytes+=bytesPushed;
+ addiCodeToeBBlock (ebp, newic, ip);
}
/*-----------------------------------------------------------------*/
{
for (su = 0; su < 2; su++)
{
- if (checkType (type, __multypes[bwd][su]) == 1)
+ if (compareType (type, __multypes[bwd][su]) == 1)
{
func = __conv[0][bwd][su];
goto found;
if (!options.float_rent)
{
/* first one */
- if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
+ {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+ }
else
{
newic = newiCode ('=', NULL, IC_RIGHT (ic));
- IC_RESULT (newic) = operandFromValue (func->args);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = linenno;
else
{
/* push the left */
- if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+ }
else
{
newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
{
for (su = 0; su < 2; su++)
{
- if (checkType (type, __multypes[bwd][su]) == 1)
+ if (compareType (type, __multypes[bwd][su]) == 1)
{
func = __conv[1][bwd][su];
goto found;
if (!options.float_rent)
{
/* first one */
- if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+ }
else
{
newic = newiCode ('=', NULL, IC_RIGHT (ic));
- IC_RESULT (newic) = operandFromValue (func->args);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
{
/* push the left */
- if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+ }
else
{
newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
int lineno = ic->lineno;
int bwd;
int su;
+ int bytesPushed=0;
+
remiCodeFromeBBlock (ebp, ic);
/* depending on the type */
{
for (su = 0; su < 2; su++)
{
- if (checkType (type, __multypes[bwd][su]) == 1)
+ if (compareType (type, __multypes[bwd][su]) == 1)
{
if (op == '*')
func = __muldiv[0][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;
if (!options.intlong_rent)
{
/* first one */
- if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+ newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+ }
else
{
newic = newiCode ('=', NULL, IC_LEFT (ic));
- IC_RESULT (newic) = operandFromValue (func->args);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
/* second one */
- if (IS_REGPARM (func->args->next->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype)) {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
+ }
else
{
newic = newiCode ('=', NULL, IC_RIGHT (ic));
- IC_RESULT (newic) = operandFromValue (func->args->next);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)->next);
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
-
}
else
{
-
/* compiled as reentrant then push */
/* push right */
- if (IS_REGPARM (func->args->next->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
+ {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
+ }
else
{
newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
newic->parmPush = 1;
+
+ bytesPushed += getSize(operandType(IC_RIGHT(ic)));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
/* insert push left */
- if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
+ {
+ newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+ }
else
{
newic = newiCode (IPUSH, IC_LEFT (ic), NULL);
newic->parmPush = 1;
+
+ bytesPushed += getSize(operandType(IC_LEFT(ic)));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
/* for the result */
newic = newiCode (CALL, operandFromSymbol (func), NULL);
IC_RESULT (newic) = IC_RESULT (ic);
- addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
-
+ newic->parmBytes+=bytesPushed; // to clear the stack after the call
+ addiCodeToeBBlock (ebp, newic, ip);
}
/*-----------------------------------------------------------------*/
/* if long / int mult or divide or mod */
if (ic->op == '*' || ic->op == '/' || ic->op == '%')
{
-
- sym_link *type = operandType (IC_LEFT (ic));
- if (IS_INTEGRAL (type) && getSize (type) > port->muldiv.native_below)
- convilong (ic, ebbs[i], type, ic->op);
+ sym_link *leftType = operandType (IC_LEFT (ic));
+
+ if (IS_INTEGRAL (leftType) && getSize (leftType) > port->support.muldiv)
+ {
+ sym_link *rightType = operandType (IC_RIGHT (ic));
+
+ if (port->hasNativeMulFor != NULL &&
+ port->hasNativeMulFor (ic, leftType, rightType))
+ {
+ /* Leave as native */
+ }
+ else
+ {
+ convilong (ic, ebbs[i], leftType, 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);
+ }
+ }
}
}
}
subexpression once more */
if (lchange || kchange)
{
-
computeDataFlow (ebbs, saveCount);
change += cseAllBlocks (ebbs, saveCount);
if (options.dump_loop)
}
-
/* sort it back by block number */
qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare);
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);
-
/* compute the live ranges */
computeLiveRanges (ebbs, count);
setToNull ((void **) &graphEdges);
ebbs = NULL;
-
return NULL;
}