-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) {
* 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;
/* */
/* */
/* (C) 2002 Ullrich von Bassewitz */
-/* Wacholderweg 14 */
-/* D-70597 Stuttgart */
+/* Römerstrasse 52 */
+/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
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);
}
}