X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCopt.c;h=0ffaa5f24b9fca8d0371c9c944a8b5c1e1b0ff21;hb=ef203f08aa15a9f5e4f2ad806374a6a1667dcff1;hp=8ed9c5979396b7cc4f29439cc08f03f1e93bf32d;hpb=fc4727437bf580144b7373bc377ad7734509929d;p=fw%2Fsdcc diff --git a/src/SDCCopt.c b/src/SDCCopt.c index 8ed9c597..0ffaa5f2 100644 --- a/src/SDCCopt.c +++ b/src/SDCCopt.c @@ -106,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; @@ -137,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); } @@ -152,7 +152,7 @@ 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); } @@ -207,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; @@ -221,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 { @@ -276,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; @@ -291,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 { @@ -340,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; @@ -352,53 +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(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); + } 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 +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); + } + } } } } @@ -817,7 +851,6 @@ eBBlockFromiCode (iCode * ic) subexpression once more */ if (lchange || kchange) { - computeDataFlow (ebbs, saveCount); change += cseAllBlocks (ebbs, saveCount); if (options.dump_loop) @@ -834,7 +867,6 @@ eBBlockFromiCode (iCode * ic) } - /* sort it back by block number */ qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare); @@ -842,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); @@ -868,7 +898,6 @@ eBBlockFromiCode (iCode * ic) setToNull ((void **) &graphEdges); ebbs = NULL; - return NULL; }