* support/Util/NewAlloc.c (freeTrace): Changed free for the gc case to not free...
[fw/sdcc] / src / SDCCopt.c
index 0a67c5bd9491a7fb494eae0002b2637b2ef37780..1fd2e6cb408cea90fc46989949c547e84dfad4c4 100644 (file)
@@ -58,6 +58,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
   operand *right;
   symbol *func = NULL;
   int lineno = ic->lineno;
+  int bytesPushed=0;
 
   ip = ic->next;               /* insertion point */
   /* remove it from the iCode */
@@ -144,6 +145,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
        {
          newic = newiCode (IPUSH, right, NULL);
          newic->parmPush = 1;
+         bytesPushed+=4;
        }
 
       addiCodeToeBBlock (ebp, newic, ip);
@@ -158,6 +160,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
        {
          newic = newiCode (IPUSH, left, NULL);
          newic->parmPush = 1;
+         bytesPushed+=4;
        }
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
@@ -165,8 +168,9 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
   /* insert the call */
   newic = newiCode (CALL, operandFromSymbol (func), NULL);
   IC_RESULT (newic) = IC_RESULT (ic);
-  addiCodeToeBBlock (ebp, newic, ip);
   newic->lineno = lineno;
+  newic->parmBytes+=bytesPushed;
+  addiCodeToeBBlock (ebp, newic, ip);
 }
 
 /*-----------------------------------------------------------------*/
@@ -189,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;
@@ -258,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;
@@ -319,6 +323,8 @@ convilong (iCode * ic, eBBlock * ebp, sym_link * type, int op)
   int lineno = ic->lineno;
   int bwd;
   int su;
+  int bytesPushed=0;
+
   remiCodeFromeBBlock (ebp, ic);
 
   /* depending on the type */
@@ -326,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];
@@ -334,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;
@@ -367,30 +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(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(operandType(IC_LEFT(ic)));
        }
       addiCodeToeBBlock (ebp, newic, ip);
       newic->lineno = lineno;
@@ -400,9 +420,9 @@ found:
   /* for the result */
   newic = newiCode (CALL, operandFromSymbol (func), NULL);
   IC_RESULT (newic) = IC_RESULT (ic);
-  addiCodeToeBBlock (ebp, newic, ip);
   newic->lineno = lineno;
-
+  newic->parmBytes+=bytesPushed; // to clear the stack after the call
+  addiCodeToeBBlock (ebp, newic, ip);
 }
 
 /*-----------------------------------------------------------------*/
@@ -444,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);
+                }
+            }
        }
     }
 }
@@ -753,7 +784,7 @@ eBBlockFromiCode (iCode * ic)
 
   /* dumpraw if asked for */
   if (options.dump_raw)
-    dumpEbbsToFileExt (".dumpraw0", ebbs, count);
+    dumpEbbsToFileExt (DUMP_RAW0, ebbs, count);
 
   /* replace the local variables with their
      register equivalents : the liveRange computation
@@ -766,39 +797,39 @@ eBBlockFromiCode (iCode * ic)
 
   /* dumpraw if asked for */
   if (options.dump_raw)
-    dumpEbbsToFileExt (".dumpraw1", ebbs, count);
+    dumpEbbsToFileExt (DUMP_RAW1, ebbs, count);
 
   /* do common subexpression elimination for each block */
   change = cseAllBlocks (ebbs, saveCount);
 
   /* dumpraw if asked for */
   if (options.dump_raw)
-    dumpEbbsToFileExt (".dumpcse", ebbs, count);
+    dumpEbbsToFileExt (DUMP_CSE, ebbs, count);
 
   /* compute the data flow */
   computeDataFlow (ebbs, saveCount);
 
   /* dumpraw if asked for */
   if (options.dump_raw)
-    dumpEbbsToFileExt (".dumpdflow", ebbs, count);
+    dumpEbbsToFileExt (DUMP_DFLOW, ebbs, count);
 
   /* global common subexpression elimination  */
   if (optimize.global_cse)
     {
       change += cseAllBlocks (ebbs, saveCount);
       if (options.dump_gcse)
-       dumpEbbsToFileExt (".dumpgcse", ebbs, saveCount);
+       dumpEbbsToFileExt (DUMP_GCSE, ebbs, saveCount);
     }
   /* kill dead code */
   kchange = killDeadCode (ebbs, saveCount);
 
   if (options.dump_kill)
-    dumpEbbsToFileExt (".dumpdeadcode", ebbs, count);
+    dumpEbbsToFileExt (DUMP_DEADCODE, ebbs, count);
 
   /* do loop optimizations */
   change += (lchange = loopOptimizations (loops, ebbs, count));
   if (options.dump_loop)
-    dumpEbbsToFileExt (".dumploop", ebbs, count);
+    dumpEbbsToFileExt (DUMP_LOOP, ebbs, count);
 
   /* recompute the data flow and apply global cse again 
      if loops optimizations or dead code caused a change:
@@ -809,11 +840,10 @@ eBBlockFromiCode (iCode * ic)
      subexpression once more */
   if (lchange || kchange)
     {
-
       computeDataFlow (ebbs, saveCount);
       change += cseAllBlocks (ebbs, saveCount);
       if (options.dump_loop)
-       dumpEbbsToFileExt (".dumploopg", ebbs, count);
+       dumpEbbsToFileExt (DUMP_LOOPG, ebbs, count);
 
       /* if loop optimizations caused a change then do
          dead code elimination once more : this will
@@ -822,11 +852,10 @@ eBBlockFromiCode (iCode * ic)
       killDeadCode (ebbs, saveCount);
 
       if (options.dump_loop)
-       dumpEbbsToFileExt (".dumploopd", ebbs, count);
+       dumpEbbsToFileExt (DUMP_LOOPD, ebbs, count);
 
     }
 
-
   /* sort it back by block number */
   qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare);
 
@@ -834,19 +863,17 @@ 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);
 
   if (options.dump_range)
-    dumpEbbsToFileExt (".dumprange", ebbs, count);
+    dumpEbbsToFileExt (DUMP_RANGE, ebbs, count);
 
   /* Now that we have the live ranges, discard parameter
    * receives for unused parameters.
@@ -860,7 +887,6 @@ eBBlockFromiCode (iCode * ic)
   setToNull ((void **) &graphEdges);
   ebbs = NULL;
 
-
   return NULL;
 }