--- a/SmallInteger.st Wed Mar 27 18:38:28 2019 +0100
+++ b/SmallInteger.st Wed Mar 27 18:42:53 2019 +0100
@@ -1741,8 +1741,8 @@
%{ /* NOCONTEXT */
#ifndef __SCHTEAM__
- __uint64__ v = __intVal(self);
-
+ unsigned INT v = __intVal(self);
+# if __POINTER_SIZE__ == 8
// swap odd and even bits
v = ((v >> 1) & 0x5555555555555555ULL) | ((v & 0x5555555555555555ULL) << 1);
// swap consecutive pairs
@@ -1756,13 +1756,24 @@
// swap 32bit words
v = ((v >> 32) & 0x00000000FFFFFFFFULL) | ((v & 0x00000000FFFFFFFFULL) << 32);
-# if __POINTER_SIZE__ == 8
if (v <= _MAX_INT) {
RETURN ( __mkSmallInteger(v) );
}
RETURN (__MKUINT(v));
# else
- RETURN (__MKLARGEINT64(1, (INT)(v >> 32), (INT)(v & 0xFFFFFFFF)));
+ // swap odd and even bits
+ v = ((v >> 1) & 0x55555555UL) | ((v & 0x55555555UL) << 1);
+ // swap consecutive pairs
+ v = ((v >> 2) & 0x33333333UL) | ((v & 0x33333333UL) << 2);
+ // swap nibbles ...
+ v = ((v >> 4) & 0x0F0F0F0FUL) | ((v & 0x0F0F0F0FUL) << 4);
+ // swap bytes
+ v = ((v >> 8) & 0x00FF00FFUL) | ((v & 0x00FF00FFUL) << 8);
+ // swap 16bit words
+ v = ((v >> 16) & 0x0000FFFFUL) | ((v & 0x0000FFFFUL) << 16);
+ // swap 32bit words
+
+ RETURN (__MKLARGEINT64(1, (INT)v, (INT)0));
# endif
#endif /* not __SCHTEAM__ */
%}.