* src/SDCCsymt.c (initCSupport): fix compile warning on Cygwin
[fw/sdcc] / src / SDCCopt.c
index a884ab9a457aad15cd7dff9ee515485386816b5c..d9183695512c6b1eb5ffa5e856800ffff9db9fca 100644 (file)
@@ -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);
+                    }
                 }
            }
           
@@ -863,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);
 
@@ -889,7 +917,6 @@ eBBlockFromiCode (iCode * ic)
   setToNull ((void **) &graphEdges);
   ebbs = NULL;
 
-
   return NULL;
 }