X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCopt.c;h=c799bed2de0d887594170d6d07572d85bd821638;hb=fd94924a3d743c1c82f4b370d9401d7239172789;hp=1adb1461301fca7b0cd207fdcd76ca8d114830fb;hpb=a408d9da29a7cd633e158f65770f223a83210a90;p=fw%2Fsdcc diff --git a/src/SDCCopt.c b/src/SDCCopt.c index 1adb1461..c799bed2 100644 --- a/src/SDCCopt.c +++ b/src/SDCCopt.c @@ -58,6 +58,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp) operand *left; operand *right; symbol *func = NULL; + char *filename = ic->filename; int lineno = ic->lineno; int bytesPushed=0; @@ -162,6 +163,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp) } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; if (IS_SYMOP (left)) OP_USES (left) = bitVectSetBit (OP_USES (left), newic->key); @@ -178,6 +180,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp) IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)->next); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; if (IS_SYMOP (right)) OP_USES (right) = bitVectSetBit (OP_USES (right), newic->key); @@ -200,6 +203,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp) } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; if (IS_SYMOP (right)) OP_USES (right) = bitVectSetBit (OP_USES (right), newic->key); @@ -217,6 +221,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp) bytesPushed += getSize(operandType(left)); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; if (IS_SYMOP (left)) OP_USES (left) = bitVectSetBit (OP_USES (left), newic->key); @@ -227,6 +232,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp) IC_RESULT (newic) = IC_RESULT (ic); bitVectUnSetBit (OP_DEFS (IC_RESULT (ic)), ic->key); OP_USES (IC_RESULT (newic)) = bitVectSetBit (OP_USES (IC_RESULT (newic)), newic->key); + newic->filename = filename; newic->lineno = lineno; newic->parmBytes += bytesPushed; ebp->hasFcall = 1; @@ -301,6 +307,7 @@ found: IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = linenno; } @@ -318,8 +325,8 @@ found: bytesPushed += getSize(operandType(IC_RIGHT(ic))); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = linenno; - } /* make the call */ @@ -344,6 +351,7 @@ found: } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = linenno; } @@ -393,6 +401,7 @@ found: IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = linenno; } @@ -410,8 +419,8 @@ found: bytesPushed += getSize(operandType(IC_RIGHT(ic))); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = linenno; - } /* make the call */ @@ -436,6 +445,7 @@ found: } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = linenno; } @@ -448,6 +458,7 @@ cnvFromFloatCast (iCode * ic, eBBlock * ebp) iCode *ip, *newic; symbol *func = NULL; sym_link *type = operandType (IC_LEFT (ic)); + char *filename = ic->filename; int lineno = ic->lineno; int bwd, su; int bytesPushed=0; @@ -485,6 +496,7 @@ found: IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; } @@ -503,6 +515,7 @@ found: bytesPushed += getSize(operandType(IC_RIGHT(ic))); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; } @@ -529,6 +542,7 @@ found: } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; } @@ -541,6 +555,7 @@ cnvFromFixed16x16Cast (iCode * ic, eBBlock * ebp) iCode *ip, *newic; symbol *func = NULL; sym_link *type = operandType (IC_LEFT (ic)); + char *filename = ic->filename; int lineno = ic->lineno; int bwd, su; int bytesPushed=0; @@ -585,8 +600,8 @@ found: IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; - } else { @@ -603,8 +618,8 @@ found: bytesPushed += getSize(operandType(IC_RIGHT(ic))); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; - } /* make the call */ @@ -629,6 +644,7 @@ found: } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; } @@ -638,25 +654,59 @@ extern operand *geniCodeRValue (operand *, bool); /* convilong - converts int or long mults or divs to fcalls */ /*-----------------------------------------------------------------*/ static void -convilong (iCode * ic, eBBlock * ebp, sym_link * type, int op) +convilong (iCode * ic, eBBlock * ebp) { + int op = ic->op; symbol *func = NULL; iCode *ip = ic->next; iCode *newic; + char *filename = ic->filename; int lineno = ic->lineno; int bwd; int su; int bytesPushed=0; + sym_link *leftType = operandType (IC_LEFT (ic)); + sym_link *rightType = operandType (IC_RIGHT (ic)); remiCodeFromeBBlock (ebp, ic); + if (getSize (leftType) == 1 && getSize (rightType) == 1) + { + int muldivmod; + + if (op == '*') + muldivmod = 0; + else if (op == '/') + muldivmod = 1; + else if (op == '%') + muldivmod = 2; + else + muldivmod = -1; + + for (su = 0; su < 4 && muldivmod >= 0; su++) + { + if ((compareType (leftType, __multypes[0][su%2]) == 1) && + (compareType (rightType, __multypes[0][su/2]) == 1)) + { + func = __muldiv[muldivmod][0][su]; + goto found; + } + } + } + /* depending on the type */ for (bwd = 0; bwd < 3; bwd++) { for (su = 0; su < 2; su++) { - if (compareType (type, __multypes[bwd][su]) == 1) + if (compareType (leftType, __multypes[bwd][su]) == 1) { + if ((op=='*' || op=='/' || op=='%') && + compareType (rightType, __multypes[bwd][su]) != 1) + { + assert(0); + } + if (op == '*') func = __muldiv[0][bwd][su]; else if (op == '/') @@ -693,6 +743,7 @@ found: IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; /* second one */ @@ -706,6 +757,7 @@ found: IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)->next); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; } @@ -726,6 +778,7 @@ found: bytesPushed += getSize(operandType(IC_RIGHT(ic))); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; /* insert push left */ @@ -742,6 +795,7 @@ found: bytesPushed += getSize(operandType(IC_LEFT(ic))); } addiCodeToeBBlock (ebp, newic, ip); + newic->filename = filename; newic->lineno = lineno; } @@ -749,6 +803,7 @@ found: /* for the result */ newic = newiCode (CALL, operandFromSymbol (func), NULL); IC_RESULT (newic) = IC_RESULT (ic); + newic->filename = filename; newic->lineno = lineno; newic->parmBytes+=bytesPushed; // to clear the stack after the call ebp->hasFcall = 1; @@ -861,7 +916,7 @@ convertToFcall (eBBlock ** ebbs, int count) } else { - convilong (ic, ebbs[i], leftType, ic->op); + convilong (ic, ebbs[i]); } } } @@ -872,7 +927,7 @@ convertToFcall (eBBlock ** ebbs, int count) if (IS_INTEGRAL (type) && getSize (type) > port->support.shift && port->support.shift >= 0) { - convilong (ic, ebbs[i], type, ic->op); + convilong (ic, ebbs[i]); } } }