1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-27 00:29:31 +00:00

Fixed a bug in sign extension of constant values

git-svn-id: svn://svn.cc65.org/cc65/trunk@1998 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2003-03-04 10:46:27 +00:00
parent 0fd653c416
commit c008e555b2
2 changed files with 13 additions and 10 deletions

View File

@ -365,7 +365,7 @@ static void LoadConstant (unsigned Flags, ExprDesc* Expr)
static int kcalc (int tok, long val1, long val2)
static int kcalc (token_t tok, long val1, long val2)
/* Calculate an operation with left and right operand constant. */
{
switch (tok) {
@ -554,7 +554,7 @@ static unsigned FunctionParamList (FuncDesc* Func)
* each parameter separately, or creating the parameter frame once and then
* storing into this frame.
* The function returns the size of the parameters pushed.
*/
*/
{
ExprDesc lval;

View File

@ -7,8 +7,8 @@
/* */
/* */
/* (C) 2002 Ullrich von Bassewitz */
/* Wacholderweg 14 */
/* D-70597 Stuttgart */
/* Römerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
@ -144,24 +144,27 @@ int TypeCast (ExprDesc* lval)
unsigned OldBits = OldSize * 8;
unsigned NewBits = NewSize * 8;
/* Remember if the old value was negative */
int Negative = (lval->ConstVal & (0x01UL << (OldBits-1))) != 0UL;
/* Check if the new datatype will have a smaller range */
if (NewBits <= OldBits) {
/* Cut the value to the new size */
lval->ConstVal &= (0xFFFFFFFFUL >> (32 - NewBits));
/* If the new type is signed, sign extend the value */
if (!IsSignUnsigned (NewType)) {
/* If the new type is signed and negative, sign extend the
* value
*/
if (Negative && !IsSignUnsigned (NewType)) {
lval->ConstVal |= ((~0L) << NewBits);
}
} else {
/* Sign extend the value if needed */
if (!IsSignUnsigned (OldType) && !IsSignUnsigned (NewType)) {
if (lval->ConstVal & (0x01UL << (OldBits-1))) {
lval->ConstVal |= ((~0L) << OldBits);
}
if (Negative && !IsSignUnsigned (OldType) && !IsSignUnsigned (NewType)) {
lval->ConstVal |= ((~0L) << OldBits);
}
}