From: bernhardheld Date: Tue, 27 Jan 2004 09:40:04 +0000 (+0000) Subject: Fixed promotion, it should be done on AST level: X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=8ca3f40b43c15b0903435e340163ddca7f5d8b15;p=fw%2Fsdcc 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 usualUnaryConversions() git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3152 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/ChangeLog b/ChangeLog index 9197149e..4cf445c5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2004-01-27 Bernhard Held + + 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 * support/regression/tests/literalop.c (mulWrapper): Added a diff --git a/src/SDCCast.c b/src/SDCCast.c index 7cb2e49b..979dcfe2 100644 --- a/src/SDCCast.c +++ b/src/SDCCast.c @@ -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), diff --git a/src/SDCCicode.c b/src/SDCCicode.c index d166b186..82aa2cff 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -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);