#BUGFIX by cg
authorClaus Gittinger <cg@exept.de>
Wed, 27 Mar 2019 18:42:53 +0100
changeset 23996 0e2c9990b86f
parent 23995 978c5a1b5b78
child 23997 da5e329759dc
#BUGFIX by cg class: SmallInteger changed: #bitReversed64 32bit code
SmallInteger.st
--- 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__ */
 %}.