1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-09 22:29:35 +00:00

Use safe shift routines

git-svn-id: svn://svn.cc65.org/cc65/trunk@2637 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2003-11-11 09:44:19 +00:00
parent 7e9b389428
commit 3d1e244a8a

View File

@ -33,6 +33,9 @@
/* common */
#include "shift.h"
/* cc65 */
#include "codegen.h"
#include "datatype.h"
@ -144,16 +147,8 @@ static int DoConversion (ExprDesc* Expr, int k, type* NewType)
/* If the new type is signed, sign extend the value */
if (!IsSignUnsigned (NewType)) {
if (Expr->ConstVal & (0x01UL << (NewBits-1))) {
/* Beware: NewBits may be 32, in which case a shift
* creates undefined behaviour if a long does also
* have 32 bits. So apply a somewhat complex special
* handling.
*/
unsigned long SignBits = ~0UL;
SignBits <<= (NewBits / 2);
NewBits -= (NewBits / 2);
SignBits <<= NewBits;
Expr->ConstVal |= SignBits;
/* Beware: Use the safe shift routine here. */
Expr->ConstVal |= shl_l (~0UL, NewBits);
}
}
}
@ -304,3 +299,4 @@ int TypeCast (ExprDesc* Expr)