Fixed promotion, it should be done on AST level:
authorbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 27 Jan 2004 09:40:04 +0000 (09:40 +0000)
committerbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 27 Jan 2004 09:40:04 +0000 (09:40 +0000)
* src/SDCCast.c (addCast): added promotion to int
(decorateType): updated call to upCast()
* src/SDCCicode.c (geniCodeLeftShift): removed call usualUnaryConversions()

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3152 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/SDCCast.c
src/SDCCicode.c

index 9197149e86d3828c0db0d442d4911439ff8741f3..4cf445c54fdbc9cbd552bbf9796554f23a5c4052 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2004-01-27 Bernhard Held <bernhard@bernhardheld.de>
+
+       Fixed promotion, it should be done on AST level:
+       * src/SDCCast.c (addCast): added promotion to int
+       (decorateType): updated call to upCast()
+       * src/SDCCicode.c (geniCodeLeftShift): removed call to
+       usualUnaryConversions()
+
 2004-01-26  Michael Hope  <michaelh@juju.net.nz>
 
        * support/regression/tests/literalop.c (mulWrapper): Added a
index 7cb2e49bb65f86c95a5f2f4be39bca762272bd6f..979dcfe225868fb1da8d4f06c920330caf1c503f 100644 (file)
@@ -2027,7 +2027,7 @@ getResultTypeFromType (sym_link *type)
 /* addCast - adds casts to a type specified by RESULT_TYPE         */
 /*-----------------------------------------------------------------*/
 static void
-addCast (ast **tree, RESULT_TYPE resultType)
+addCast (ast **tree, RESULT_TYPE resultType, bool upcast)
 {
   sym_link *newLink;
   
@@ -2040,15 +2040,26 @@ addCast (ast **tree, RESULT_TYPE resultType)
        break;
       case RESULT_TYPE_INT:
 #if 0
-        /* casting from long to int costs additional 4 bytes dram! */
-       if (getSize ((*tree)->etype) <= INTSIZE)
+       if (getSize ((*tree)->etype) > INTSIZE)
+          {
+            /* warn ("Loosing significant digits"); */
+           return;
+         }
+#endif
+       /* char: promote to int */
+       if (!upcast ||
+           getSize ((*tree)->etype) >= INTSIZE)
+         return;
+       newLink = newIntLink();
+       break;
+      case RESULT_TYPE_OTHER:
+       if (!upcast)
+         return;
+        /* long, float: promote to int */
+       if (getSize ((*tree)->etype) >= INTSIZE)
          return;
        newLink = newIntLink();
        break;
-#else
-        /* warn ("Loosing significant digits"); */
-       return;
-#endif
       default:
        return;
     }
@@ -2508,8 +2519,8 @@ decorateType (ast * tree, RESULT_TYPE resultType)
 
          if (getenv ("SDCC_NEWTYPEFLOW"))
            {
-             addCast (&tree->left,  resultType);
-             addCast (&tree->right, resultType);
+             addCast (&tree->left,  resultType, FALSE);
+             addCast (&tree->right, resultType, FALSE);
            }
          TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), FALSE);
          TETYPE (tree) = getSpec (TTYPE (tree));
@@ -2726,8 +2737,8 @@ decorateType (ast * tree, RESULT_TYPE resultType)
       LRVAL (tree) = RRVAL (tree) = 1;
       if (getenv ("SDCC_NEWTYPEFLOW"))
         {
-          addCast (&tree->left,  resultType);
-          addCast (&tree->right, resultType);
+          addCast (&tree->left,  resultType, FALSE);
+          addCast (&tree->right, resultType, FALSE);
         }
       TETYPE (tree) = getSpec (TTYPE (tree) =
                               computeType (LTYPE (tree),
@@ -2946,8 +2957,8 @@ decorateType (ast * tree, RESULT_TYPE resultType)
                                              TRUE));
       else
        {
-          addCast (&tree->left,  resultType);
-          addCast (&tree->right, resultType);
+          addCast (&tree->left,  resultType, FALSE);
+          addCast (&tree->right, resultType, FALSE);
          TETYPE (tree) = getSpec (TTYPE (tree) =
                                   computeType (LTYPE (tree),
                                                RTYPE (tree),
@@ -3088,8 +3099,8 @@ decorateType (ast * tree, RESULT_TYPE resultType)
                                                FALSE));
        else
           {
-           addCast (&tree->left,  resultType);
-            addCast (&tree->right, resultType);
+           addCast (&tree->left,  resultType, TRUE);
+            addCast (&tree->right, resultType, TRUE);
             TETYPE (tree) = getSpec (TTYPE (tree) =
                                     computeType (LTYPE (tree),
                                                  RTYPE (tree),
@@ -3199,8 +3210,8 @@ decorateType (ast * tree, RESULT_TYPE resultType)
                                                FALSE));
        else
          {
-           addCast (&tree->left,  resultType);
-           addCast (&tree->right, resultType);
+           addCast (&tree->left,  resultType, TRUE);
+           addCast (&tree->right, resultType, TRUE);
            TETYPE (tree) = getSpec (TTYPE (tree) =
                                     computeType (LTYPE (tree),
                                                  RTYPE (tree),
@@ -3356,7 +3367,7 @@ decorateType (ast * tree, RESULT_TYPE resultType)
                                                  TRUE));
          else
            {
-             addCast (&tree->left,  resultType);
+             addCast (&tree->left,  resultType, TRUE);
              TETYPE (tree) = getSpec (TTYPE (tree) =
                                       computeType (LTYPE (tree),
                                                    RTYPE (tree),
index d166b186643f7ecd168bda05c92453a905692b0d..82aa2cff3a7238d6ffb73ed4d5bba20e4decf576 100644 (file)
@@ -1733,6 +1733,7 @@ getArraySizePtr (operand * op)
 /*-----------------------------------------------------------------*/
 /* perform "usual unary conversions"                               */
 /*-----------------------------------------------------------------*/
+#if 0
 static operand *
 usualUnaryConversions (operand * op)
 {
@@ -1746,6 +1747,7 @@ usualUnaryConversions (operand * op)
     }
   return op;
 }
+#endif
 
 /*-----------------------------------------------------------------*/
 /* perform "usual binary conversions"                              */
@@ -2745,7 +2747,6 @@ geniCodeLeftShift (operand * left, operand * right)
 {
   iCode *ic;
 
-  left = usualUnaryConversions (left);
   ic = newiCode (LEFT_OP, left, right);
   IC_RESULT (ic) = newiTempOperand (operandType (left), 0);
   ADDTOCHAIN (ic);