X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCopt.c;h=a884ab9a457aad15cd7dff9ee515485386816b5c;hb=9d987adf0d2298b519678530591903eb2c141cd3;hp=0a21e032896b8ec4a8077b12df842a9af8e49d55;hpb=677acf94ea50645d09ce1f764aba4679de762bd8;p=fw%2Fsdcc diff --git a/src/SDCCopt.c b/src/SDCCopt.c index 0a21e032..a884ab9a 100644 --- a/src/SDCCopt.c +++ b/src/SDCCopt.c @@ -58,6 +58,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp) operand *right; symbol *func = NULL; int lineno = ic->lineno; + int bytesPushed=0; ip = ic->next; /* insertion point */ /* remove it from the iCode */ @@ -144,6 +145,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp) { newic = newiCode (IPUSH, right, NULL); newic->parmPush = 1; + bytesPushed+=4; } addiCodeToeBBlock (ebp, newic, ip); @@ -158,6 +160,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp) { newic = newiCode (IPUSH, left, NULL); newic->parmPush = 1; + bytesPushed+=4; } addiCodeToeBBlock (ebp, newic, ip); newic->lineno = lineno; @@ -165,8 +168,9 @@ cnvToFcall (iCode * ic, eBBlock * ebp) /* 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); } /*-----------------------------------------------------------------*/ @@ -189,7 +193,7 @@ cnvToFloatCast (iCode * ic, eBBlock * ebp) { 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; @@ -258,7 +262,7 @@ cnvFromFloatCast (iCode * ic, eBBlock * ebp) { 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; @@ -319,6 +323,8 @@ convilong (iCode * ic, eBBlock * ebp, sym_link * type, int op) int lineno = ic->lineno; int bwd; int su; + int bytesPushed=0; + remiCodeFromeBBlock (ebp, ic); /* depending on the type */ @@ -326,7 +332,7 @@ convilong (iCode * ic, eBBlock * ebp, sym_link * type, int op) { 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]; @@ -334,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]; + 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; @@ -367,30 +381,36 @@ found: 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); + { + newic = newiCode (SEND, IC_RIGHT (ic), NULL); + } 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); + { + newic = newiCode (SEND, IC_LEFT (ic), NULL); + } else { newic = newiCode (IPUSH, IC_LEFT (ic), NULL); newic->parmPush = 1; + + bytesPushed += getSize(operandType(IC_LEFT(ic))); } addiCodeToeBBlock (ebp, newic, ip); newic->lineno = lineno; @@ -400,9 +420,9 @@ found: /* 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); } /*-----------------------------------------------------------------*/ @@ -444,11 +464,22 @@ convertToFcall (eBBlock ** ebbs, int count) /* 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); + 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); + } + } } } } @@ -809,7 +840,6 @@ eBBlockFromiCode (iCode * ic) subexpression once more */ if (lchange || kchange) { - computeDataFlow (ebbs, saveCount); change += cseAllBlocks (ebbs, saveCount); if (options.dump_loop) @@ -826,7 +856,6 @@ eBBlockFromiCode (iCode * ic) } - /* sort it back by block number */ qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare);