From: cuz Date: Tue, 4 Mar 2003 10:46:27 +0000 (+0000) Subject: Fixed a bug in sign extension of constant values X-Git-Tag: V2.12.0~1692 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=c008e555b225d90550dc720585e1937ab299b665;p=cc65 Fixed a bug in sign extension of constant values git-svn-id: svn://svn.cc65.org/cc65/trunk@1998 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/src/cc65/expr.c b/src/cc65/expr.c index e5e21e3ce..df1ef8baa 100644 --- a/src/cc65/expr.c +++ b/src/cc65/expr.c @@ -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; diff --git a/src/cc65/typecast.c b/src/cc65/typecast.c index 4984192f4..ab410f668 100644 --- a/src/cc65/typecast.c +++ b/src/cc65/typecast.c @@ -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); } }