X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCopt.c;h=33d7a3515dd766d14ff51d5682b3b8c59b27ee23;hb=f0a07164d083f179eded5dd981dcaa5fd4ca594a;hp=cb7c6bc3d6885b4704f9002eeba603162bf2fb13;hpb=3f26b7d9381cd2399e95d2ccb88ecc77ae0458d0;p=fw%2Fsdcc diff --git a/src/SDCCopt.c b/src/SDCCopt.c index cb7c6bc3..33d7a351 100644 --- a/src/SDCCopt.c +++ b/src/SDCCopt.c @@ -193,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; @@ -262,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; @@ -332,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]; @@ -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; @@ -373,32 +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(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); + { + 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,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); + } + } } } }