X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCopt.c;h=fd7fadc6a321a1b0fc9369517e229f1415042f4d;hb=c6be32c901f14e299c0d0dbcca0cded0d928cec6;hp=8ed9c5979396b7cc4f29439cc08f03f1e93bf32d;hpb=fc4727437bf580144b7373bc377ad7734509929d;p=fw%2Fsdcc diff --git a/src/SDCCopt.c b/src/SDCCopt.c index 8ed9c597..fd7fadc6 100644 --- a/src/SDCCopt.c +++ b/src/SDCCopt.c @@ -106,28 +106,30 @@ 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); + 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; @@ -137,9 +139,10 @@ 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); + newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype); } else { @@ -152,9 +155,10 @@ cnvToFcall (iCode * ic, eBBlock * ebp) 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 { @@ -180,7 +184,7 @@ static void cnvToFloatCast (iCode * ic, eBBlock * ebp) { iCode *ip, *newic; - symbol *func; + symbol *func = NULL; sym_link *type = operandType (IC_RIGHT (ic)); int linenno = ic->lineno; int bwd, su; @@ -207,12 +211,15 @@ 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; @@ -221,8 +228,10 @@ found: 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); @@ -248,7 +257,7 @@ static void cnvFromFloatCast (iCode * ic, eBBlock * ebp) { iCode *ip, *newic; - symbol *func; + symbol *func = NULL; sym_link *type = operandType (IC_LEFT (ic)); int lineno = ic->lineno; int bwd, su; @@ -276,12 +285,14 @@ 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; @@ -291,8 +302,10 @@ found: { /* 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); @@ -340,6 +353,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; @@ -352,53 +373,63 @@ 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(type); + + 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(type); + + bytesPushed += getSize(operandType(IC_LEFT(ic))); } addiCodeToeBBlock (ebp, newic, ip); newic->lineno = lineno; @@ -452,11 +483,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); + } + } } } } @@ -777,7 +830,7 @@ eBBlockFromiCode (iCode * ic) dumpEbbsToFileExt (DUMP_RAW1, ebbs, count); /* do common subexpression elimination for each block */ - change = cseAllBlocks (ebbs, saveCount); + change = cseAllBlocks (ebbs, saveCount, FALSE); /* dumpraw if asked for */ if (options.dump_raw) @@ -793,10 +846,15 @@ eBBlockFromiCode (iCode * ic) /* global common subexpression elimination */ if (optimize.global_cse) { - change += cseAllBlocks (ebbs, saveCount); + change += cseAllBlocks (ebbs, saveCount, FALSE); if (options.dump_gcse) dumpEbbsToFileExt (DUMP_GCSE, ebbs, saveCount); } + else + { + // compute the dataflow only + assert(cseAllBlocks (ebbs, saveCount, TRUE)==0); + } /* kill dead code */ kchange = killDeadCode (ebbs, saveCount); @@ -817,9 +875,8 @@ eBBlockFromiCode (iCode * ic) subexpression once more */ if (lchange || kchange) { - computeDataFlow (ebbs, saveCount); - change += cseAllBlocks (ebbs, saveCount); + change += cseAllBlocks (ebbs, saveCount, FALSE); if (options.dump_loop) dumpEbbsToFileExt (DUMP_LOOPG, ebbs, count); @@ -834,22 +891,36 @@ eBBlockFromiCode (iCode * ic) } - /* sort it back by block number */ qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare); + if (!options.lessPedantic) { + // this is a good place to check missing return values + if (currFunc) { + if (!IS_VOID(currFunc->etype)) { + eBBlock *bp; + // make sure all predecessors of the last block end in a return + for (bp=setFirstItem(ebbs[saveCount-1]->predList); + bp; + bp=setNextItem(ebbs[saveCount-1]->predList)) { + if (bp->ech->op != RETURN) { + werror (W_VOID_FUNC, currFunc->name); + } + } + } + } + } + /* if cyclomatic info requested then print it */ 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); @@ -867,8 +938,7 @@ eBBlockFromiCode (iCode * ic) /* throw away blocks */ setToNull ((void **) &graphEdges); ebbs = NULL; - - + return NULL; }