--- a/SmallInteger.st Thu Mar 28 09:35:12 2019 +0100
+++ b/SmallInteger.st Thu Mar 28 12:46:22 2019 +0100
@@ -1472,18 +1472,18 @@
}
# else
# if __POINTER_SIZE__ == 8
-# define HALF_INT_MAX 0xFFFFFFFFFFFFFFFF
-# define M55555555 0x5555555555555555
-# define M33333333 0x3333333333333333
-# define M0F0F0F0F 0x0F0F0F0F0F0F0F0F
-# define M00FF00FF 0x00FF00FF00FF00FF
-# define M0000FFFF 0x0000FFFF0000FFFF
+# define HALF_INT_MAX 0xFFFFFFFFFFFFFFFFLL
+# define M55555555 0x5555555555555555LL
+# define M33333333 0x3333333333333333LL
+# define M0F0F0F0F 0x0F0F0F0F0F0F0F0FLL
+# define M00FF00FF 0x00FF00FF00FF00FFLL
+# define M0000FFFF 0x0000FFFF0000FFFFLL
# else
-# define HALF_INT_MAX 0xFFFFFFFF
-# define M55555555 0x55555555
-# define M33333333 0x33333333
-# define M0F0F0F0F 0x0F0F0F0F
-# define M00FF00FF 0x00FF00FF
+# define HALF_INT_MAX 0xFFFFFFFFL
+# define M55555555 0x55555555L
+# define M33333333 0x33333333L
+# define M0F0F0F0F 0x0F0F0F0FL
+# define M00FF00FF 0x00FF00FFL
# define M0000FFFF 0
# endif
@@ -1491,9 +1491,10 @@
INT _a = __intVal(self);
INT _b = __intVal(anInteger);
- if ( (((unsigned)_a)<=HALF_INT_MAX) && (((unsigned)_b)<=HALF_INT_MAX) ) {
+ if ( (((unsigned INT)_a)<=HALF_INT_MAX) && (((unsigned INT)_b)<=HALF_INT_MAX) ) {
unsigned INT val;
+ // spread the bits (...xxx -> ...0x0x0x)
_a = (_a | (_a << 16)) & M0000FFFF;
_a = (_a | (_a << 8)) & M00FF00FF;
_a = (_a | (_a << 4)) & M0F0F0F0F;
@@ -1506,6 +1507,7 @@
_b = (_b | (_b << 2)) & M33333333;
_b = (_b | (_b << 1)) & M55555555;
+ // merge the bits (...0a0a0a and ...0b0b0b => ...bababa)
val = _a | (_b << 1);
RETURN (__MKUINT(val) );
}
@@ -1759,11 +1761,7 @@
RETURN ( __mkSmallInteger(v) );
}
RETURN (__MKUINT(v));
-# elseif 0
- // DISABLED, BECAUSE THIS CODE DOES NOT WORK!
- // It ignores the high 64 bits!
- // See RegressionTests::IntegerTest >> #testBitReversed
-
+# else
// swap odd and even bits
v = ((v >> 1) & 0x55555555UL) | ((v & 0x55555555UL) << 1);
// swap consecutive pairs
@@ -1775,8 +1773,7 @@
// swap 16bit words
v = ((v >> 16) & 0x0000FFFFUL) | ((v & 0x0000FFFFUL) << 16);
// swap 32bit words
-
- RETURN (__MKLARGEINT64(1, (INT)v, (INT)0));
+ RETURN (__MKLARGEINT64(1, (INT)0, (INT)v));
# endif
#endif /* not __SCHTEAM__ */
%}.