* 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
+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
2004-01-26 Michael Hope <michaelh@juju.net.nz>
* support/regression/tests/literalop.c (mulWrapper): Added a
/* addCast - adds casts to a type specified by RESULT_TYPE */
/*-----------------------------------------------------------------*/
static void
/* 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)
break;
case RESULT_TYPE_INT:
#if 0
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;
return;
newLink = newIntLink();
break;
-#else
- /* warn ("Loosing significant digits"); */
- return;
-#endif
if (getenv ("SDCC_NEWTYPEFLOW"))
{
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));
}
TTYPE (tree) = computeType (LTYPE (tree), RTYPE (tree), FALSE);
TETYPE (tree) = getSpec (TTYPE (tree));
LRVAL (tree) = RRVAL (tree) = 1;
if (getenv ("SDCC_NEWTYPEFLOW"))
{
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),
}
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
- 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),
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
- 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),
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
- 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),
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
- addCast (&tree->left, resultType);
+ addCast (&tree->left, resultType, TRUE);
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
TETYPE (tree) = getSpec (TTYPE (tree) =
computeType (LTYPE (tree),
RTYPE (tree),
/*-----------------------------------------------------------------*/
/* perform "usual unary conversions" */
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
/* perform "usual unary conversions" */
/*-----------------------------------------------------------------*/
static operand *
usualUnaryConversions (operand * op)
{
static operand *
usualUnaryConversions (operand * op)
{
/*-----------------------------------------------------------------*/
/* perform "usual binary conversions" */
/*-----------------------------------------------------------------*/
/* perform "usual binary conversions" */
- left = usualUnaryConversions (left);
ic = newiCode (LEFT_OP, left, right);
IC_RESULT (ic) = newiTempOperand (operandType (left), 0);
ADDTOCHAIN (ic);
ic = newiCode (LEFT_OP, left, right);
IC_RESULT (ic) = newiTempOperand (operandType (left), 0);
ADDTOCHAIN (ic);