X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCopt.c;h=d9183695512c6b1eb5ffa5e856800ffff9db9fca;hb=24db07e65dc37c465c586f173fcf7d591d5bd7bc;hp=33d7a3515dd766d14ff51d5682b3b8c59b27ee23;hpb=d46b4a50e1b8b1819d974533a9012b013090f8fd;p=fw%2Fsdcc diff --git a/src/SDCCopt.c b/src/SDCCopt.c index 33d7a351..d9183695 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); @@ -360,23 +373,27 @@ 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; @@ -386,9 +403,10 @@ found: { /* compiled as reentrant then push */ /* push right */ - if (IS_REGPARM (func->args->next->etype)) + 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 { @@ -401,9 +419,10 @@ found: newic->lineno = lineno; /* insert push left */ - 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 { @@ -464,10 +483,21 @@ 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->support.muldiv) + sym_link *leftType = operandType (IC_LEFT (ic)); + + if (IS_INTEGRAL (leftType) && getSize (leftType) > port->support.muldiv) { - convilong (ic, ebbs[i], type, ic->op); + 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); + } } } @@ -840,7 +870,6 @@ eBBlockFromiCode (iCode * ic) subexpression once more */ if (lchange || kchange) { - computeDataFlow (ebbs, saveCount); change += cseAllBlocks (ebbs, saveCount); if (options.dump_loop) @@ -857,7 +886,6 @@ eBBlockFromiCode (iCode * ic) } - /* sort it back by block number */ qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare); @@ -865,14 +893,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); @@ -891,7 +917,6 @@ eBBlockFromiCode (iCode * ic) setToNull ((void **) &graphEdges); ebbs = NULL; - return NULL; }