SmallInteger.st
changeset 24006 5eedbb97db6a
parent 24004 7a3254568d7f
child 24100 9949ffc76053
--- 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__ */
 %}.