X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCopt.c;h=0ffaa5f24b9fca8d0371c9c944a8b5c1e1b0ff21;hb=ef203f08aa15a9f5e4f2ad806374a6a1667dcff1;hp=0a21e032896b8ec4a8077b12df842a9af8e49d55;hpb=677acf94ea50645d09ce1f764aba4679de762bd8;p=fw%2Fsdcc diff --git a/src/SDCCopt.c b/src/SDCCopt.c index 0a21e032..0ffaa5f2 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 */ @@ -105,28 +106,28 @@ cnvToFcall (iCode * ic, eBBlock * ebp) { /* first one */ - if (IS_REGPARM (func->args->etype)) + if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) { newic = newiCode (SEND, IC_LEFT (ic), NULL); } 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); } 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; @@ -136,7 +137,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp) { /* push right */ - if (IS_REGPARM (func->args->next->etype)) + if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype)) { newic = newiCode (SEND, right, NULL); } @@ -144,13 +145,14 @@ cnvToFcall (iCode * ic, eBBlock * ebp) { 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); } @@ -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; @@ -203,12 +207,12 @@ found: if (!options.float_rent) { /* first one */ - if (IS_REGPARM (func->args->etype)) + if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) newic = newiCode (SEND, IC_RIGHT (ic), NULL); 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; @@ -217,7 +221,7 @@ found: else { /* push the left */ - if (IS_REGPARM (func->args->etype)) + if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) newic = newiCode (SEND, IC_RIGHT (ic), NULL); else { @@ -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; @@ -272,12 +276,12 @@ found: if (!options.float_rent) { /* first one */ - if (IS_REGPARM (func->args->etype)) + if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) newic = newiCode (SEND, IC_RIGHT (ic), NULL); 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; @@ -287,7 +291,7 @@ found: { /* push the left */ - if (IS_REGPARM (func->args->etype)) + if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) newic = newiCode (SEND, IC_RIGHT (ic), NULL); else { @@ -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; @@ -346,51 +360,57 @@ found: if (!options.intlong_rent) { /* first one */ - if (IS_REGPARM (func->args->etype)) + if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) newic = newiCode (SEND, IC_LEFT (ic), NULL); 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_RIGHT (ic), NULL); 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); + } 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); + } 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,33 @@ 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); + 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); + } + } } } } @@ -809,7 +851,6 @@ eBBlockFromiCode (iCode * ic) subexpression once more */ if (lchange || kchange) { - computeDataFlow (ebbs, saveCount); change += cseAllBlocks (ebbs, saveCount); if (options.dump_loop) @@ -826,7 +867,6 @@ eBBlockFromiCode (iCode * ic) } - /* sort it back by block number */ qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare); @@ -834,14 +874,12 @@ eBBlockFromiCode (iCode * ic) 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); @@ -860,7 +898,6 @@ eBBlockFromiCode (iCode * ic) setToNull ((void **) &graphEdges); ebbs = NULL; - return NULL; }