Changed /Zm1000 to /Zm1500
[fw/sdcc] / src / SDCCicode.c
index 6e7dcb262fc52ef06ae40921282ef80f0e7cb759..b989c88dd6fd79ab1e2724fc72971947bfc8f240 100644 (file)
@@ -233,7 +233,7 @@ printOperand (operand * op, FILE * file)
 
     case SYMBOL:
 #define REGA 1
-#ifdef REGA
+#if REGA
       fprintf (file, "%s [k%d lr%d:%d so:%d]{ ia%d a2p%d re%d rm%d nos%d ru%d dp%d}",          /*{ar%d rm%d ru%d p%d a%d u%d i%d au%d k%d ks%d}"  , */
               (OP_SYMBOL (op)->rname[0] ? OP_SYMBOL (op)->rname : OP_SYMBOL (op)->name),
               op->key,
@@ -277,18 +277,51 @@ printOperand (operand * op, FILE * file)
            }
        }
 #else
-      fprintf (file, "%s", (OP_SYMBOL (op)->rname[0] ?
-                           OP_SYMBOL (op)->rname : OP_SYMBOL (op)->name));
+
+      fprintf (file, "%s ", (OP_SYMBOL (op)->rname[0] ? OP_SYMBOL (op)->rname : OP_SYMBOL (op)->name));
+
+#if 0
+
+      fprintf (file, "[lr%d:%d so:%d]",
+              OP_LIVEFROM (op), OP_LIVETO (op),
+              OP_SYMBOL (op)->stack
+       );
+#endif
+
+#if 1
+      {
+       fprintf (file, "{");
+       printTypeChain (operandType (op), file);
+       if (SPIL_LOC (op) && IS_ITEMP (op))
+         fprintf (file, "}{ sir@ %s", SPIL_LOC (op)->rname);
+       fprintf (file, "}");
+
+      }
+#endif
+
       /* if assigned to registers */
-      if (OP_SYMBOL (op)->nRegs && !OP_SYMBOL (op)->isspilt)
+      if (OP_SYMBOL (op)->nRegs)
        {
-         int i;
-         fprintf (file, "[");
-         for (i = 0; i < OP_SYMBOL (op)->nRegs; i++)
-           fprintf (file, "%s ", (OP_SYMBOL (op)->regs[i] ?
-                                  OP_SYMBOL (op)->regs[i]->name :
-                                  "err"));
-         fprintf (file, "]");
+         if (OP_SYMBOL (op)->isspilt)
+           {
+             if (!OP_SYMBOL (op)->remat)
+               if (OP_SYMBOL (op)->usl.spillLoc)
+                 fprintf (file, "[%s]", (OP_SYMBOL (op)->usl.spillLoc->rname[0] ?
+                                      OP_SYMBOL (op)->usl.spillLoc->rname :
+                                      OP_SYMBOL (op)->usl.spillLoc->name));
+               else
+                 fprintf (file, "[err]");
+             else
+               fprintf (file, "[remat]");
+           }
+         else
+           {
+             int i;
+             fprintf (file, "[");
+             for (i = 0; i < OP_SYMBOL (op)->nRegs; i++)
+               fprintf (file, "%s ", port->getRegName (OP_SYMBOL (op)->regs[i]));
+             fprintf (file, "]");
+           }
        }
 #endif
       break;
@@ -666,7 +699,7 @@ newiTempLabel (char *s)
 
   if (s)
     {
-       itmplbl = newSymbol (s, 1);
+      itmplbl = newSymbol (s, 1);
     }
   else
     {
@@ -1967,7 +2000,12 @@ geniCodeCast (sym_link * type, operand * op, bool implicit)
        // if not a pointer to a function
        if (!(IS_CODEPTR(type) && IS_FUNC(type->next) && IS_FUNC(optype))) {
          if (implicit) { // if not to generic, they have to match
-           if ((!IS_GENPTR(type) && (DCL_TYPE(optype) != DCL_TYPE(type)))) {
+           if (!IS_GENPTR(type) &&
+                !((DCL_TYPE(optype) == DCL_TYPE(type)) ||
+                  ((DCL_TYPE(optype) == POINTER) && (DCL_TYPE(type) == IPOINTER))
+                 )
+               )
+            {
              werror(E_INCOMPAT_PTYPES);
              errors++;
            }
@@ -2095,8 +2133,8 @@ geniCodeMultiply (operand * left, operand * right, RESULT_TYPE resultType)
   if (p2 && !IS_FLOAT (letype)
       && !((resultType == RESULT_TYPE_INT) && (getSize (resType) != getSize (ltype))
            && (port->support.muldiv == 1))
-      && strcmp (port->target, "pic14") != 0  /* don't shift for pic */
-      && strcmp (port->target, "pic16") != 0)
+      && strcmp (port->target, "pic16") != 0  /* don't shift for pic */
+      && strcmp (port->target, "pic14") != 0)
     {
       if ((resultType == RESULT_TYPE_INT) && (getSize (resType) != getSize (ltype)))
        {
@@ -3341,6 +3379,8 @@ geniCodeCall (operand * left, ast * parms,int lvl)
 static void 
 geniCodeReceive (value * args)
 {
+  unsigned char paramByteCounter = 0;
+
   /* for all arguments that are passed in registers */
   while (args)
     {
@@ -3381,6 +3421,17 @@ geniCodeReceive (value * args)
              first = 0;
          }
          IC_RESULT (ic) = opr;
+         
+         /* misuse of parmBytes (normally used for functions) 
+          * to save estimated stack position of this argument.
+          * Normally this should be zero for RECEIVE iCodes.
+          * No idea if this causes side effects on other ports. - dw
+          */
+         ic->parmBytes = paramByteCounter;
+         
+         /* what stack position do we have? */
+         paramByteCounter += getSize (sym->type);
+
          ADDTOCHAIN (ic);
        }