RegressionTests__IntegerTest.st
changeset 2395 36ac67677f1f
parent 2333 9f171deab019
child 2397 4ad7fc96b77d
--- a/RegressionTests__IntegerTest.st	Sat Aug 31 10:17:27 2019 +0200
+++ b/RegressionTests__IntegerTest.st	Sat Aug 31 11:47:14 2019 +0200
@@ -735,45 +735,6 @@
     "Modified: / 31.10.2000 / 20:23:20 / cg"
 !
 
-testBinco
-     self assert: (10 binomialCoefficient:5) = (10 factorial / (5 factorial * 5 factorial)).
-     self assert: (100 binomialCoefficient:78) = (100 factorial / (78 factorial * (100-78) factorial)).
-     self assert: (1000 binomialCoefficient:5) = (1000 factorial / (5 factorial * (1000-5) factorial)).
-     self assert: (10000 binomialCoefficient:78) = (10000 factorial / (78 factorial * (10000-78) factorial)).
-
-    "
-     self basicNew testBinco
-    "
-!
-
-testByteSwap
-    "/ <testedMethods: #( (Integer >> #byteSwapped32) (Integer >> #byteSwapped64)) >
-
-    self assert:(16r1122 byteSwapped16) = 16r2211.
-    self assert:(16r2211 byteSwapped16) = 16r1122.
-
-    self assert:(16r11223344 byteSwapped32) = 16r44332211.
-    self assert:(16r44332211 byteSwapped32) = 16r11223344.
-
-    self assert:(16r11223344 byteSwapped64) = 16r4433221100000000.
-    self assert:(16r44332211 byteSwapped64) = 16r1122334400000000.
-
-    self assert:(16r8877665544332211 byteSwapped64) = 16r1122334455667788.
-    self assert:(16r1122334455667788 byteSwapped64) = 16r8877665544332211.
-
-    "/ higher bits are ignored!!
-    self assert:(16r33441122 byteSwapped16) = 16r2211.
-
-    self assert:(16r9911223344 byteSwapped32) = 16r44332211.
-    self assert:(16r8877665544332211 byteSwapped32) = 16r11223344.
-    self assert:(16r998877665544332211 byteSwapped64) = 16r1122334455667788.
-    self assert:(16r991122334455667788 byteSwapped64) = 16r8877665544332211.
-
-    "
-     self basicNew testByteSwap
-    "
-!
-
 testComparing
     |a b|
 
@@ -884,6 +845,813 @@
     "
 !
 
+testILC
+    "inline-cache"
+
+    self assert:((self checkIsInteger:1) == true).
+    self assert:((self checkIsInteger:nil) == false).
+    self assert:((self checkIsInteger:1) == true).
+    self assert:((self checkIsInteger:nil) == false).
+
+    self assert:((self checkIsInteger:0) == true).
+    self assert:((self checkIsInteger:nil) == false).
+    self assert:((self checkIsInteger:0) == true).
+    self assert:((self checkIsInteger:nil) == false).
+
+    "
+     self basicNew testILC
+    "
+
+    "Created: / 6.6.1999 / 14:47:51 / cg"
+    "Modified: / 9.6.1999 / 17:49:57 / cg"
+!
+
+testInline1
+    "inlined tests.
+     Notice, the arithmetic tests are both performed via regular sends
+     and via constructed performs. The reason is to test both inlined
+     JIT-compiler code AND the regular methods code."
+
+    self assert:( (self absPlusOneOf:1) = 2 ).
+    self assert:( (self absPlusOneOf:-1) = 2 ).
+    self assert:( (self absPlusOneOf:1.0) = 2 ).
+    self assert:( (self absPlusOneOf:-1.0) = 2 ).
+
+    "
+     self basicNew testInline1
+    "
+
+    "Created: / 31.10.2000 / 20:22:48 / cg"
+    "Modified: / 31.10.2000 / 20:23:06 / cg"
+!
+
+testInteger1
+    "general conversion & arithmetic tests.
+     Notice, the arithmetic tests are both performed via regular sends
+     and via constructed performs. The reason is to test both inlined
+     JIT-compiler code AND the regular method's code."
+
+    |minVal maxVal maxValPlus1 minValMinus1 halfMin halfMax t|
+
+    minVal := SmallInteger perform:('minVal' asSymbol).
+    maxVal := SmallInteger perform:('maxVal' asSymbol).
+
+    self assert:(minVal class == SmallInteger).
+    self assert:(maxVal class == SmallInteger).
+
+    self assert:(minVal == self num_smallInt_minVal).
+    self assert:(maxVal == self num_smallInt_maxVal).
+
+    self assert:(minVal == SmallInteger minVal).
+    self assert:(maxVal == SmallInteger maxVal).
+
+    t := SmallInteger perform:('maxBytes' asSymbol).
+    self assert:(t == SmallInteger maxBytes).
+    t := SmallInteger perform:('maxBits' asSymbol).
+    self assert:(t == SmallInteger maxBits).
+
+    self testPrinting1.
+
+    self assert:(SmallInteger maxBytes == ExternalAddress pointerSize).
+    "/ again, preventing inlining by compiler
+    self assert:(SmallInteger perform:#maxBytes) == (ExternalAddress perform:#pointerSize).
+    self assert:(SmallInteger perform:'maxBytes' asSymbol) == (ExternalAddress perform:'pointerSize' asSymbol).
+
+    SmallInteger maxBytes == 4 ifTrue:[
+        self assert:(minVal hexPrintString = '-40000000').
+        self assert:(maxVal hexPrintString = '3FFFFFFF').
+        self assert:(minVal == -1073741824).
+        self assert:(maxVal == 1073741823).
+        maxValPlus1 := 1073741824.
+        minValMinus1 := -1073741825.
+        self assert:(minValMinus1 hexPrintString = '-40000001').
+        self assert:(maxValPlus1 hexPrintString = '40000000').
+        halfMin := 16r-20000000.
+        halfMax := 16r20000000.
+    ].
+    SmallInteger maxBytes == 8 ifTrue:[
+        self assert:(minVal hexPrintString = '-4000000000000000').
+        self assert:(maxVal hexPrintString = '3FFFFFFFFFFFFFFF').
+        self assert:(minVal == -4611686018427387904).
+        self assert:(maxVal == 4611686018427387903).
+        maxValPlus1 := 4611686018427387904.
+        minValMinus1 := -4611686018427387905.
+        self assert:(minValMinus1 hexPrintString = '-4000000000000001').
+        self assert:(maxValPlus1 hexPrintString = '4000000000000000').
+        halfMin := 16r-2000000000000000.
+        halfMax := 16r2000000000000000.
+    ].
+    
+    self assert:(minValMinus1 class == LargeInteger).
+    self assert:(maxValPlus1 class == LargeInteger).
+
+    "arithmetic overFlow checks"
+
+"/    self assert:((maxVal + 1) inspect.maxValPlus1 inspect. true).
+    self assert:((maxVal perform:'+' asSymbol with:1) = maxValPlus1).
+    self assert:((maxVal + 1) = maxValPlus1).
+    self assert:((minVal perform:'-' asSymbol with:1) = minValMinus1).
+    self assert:((minVal - 1) = minValMinus1).
+
+    self assert:((halfMax perform:'+' asSymbol with:halfMax) = maxValPlus1).
+    self assert:((halfMax + halfMax) = maxValPlus1).
+    self assert:((halfMin perform:'+' asSymbol with:halfMin) == minVal).
+    self assert:((halfMin + halfMin) == minVal).
+    self assert:((halfMax perform:'*' asSymbol with:2) = maxValPlus1).
+    self assert:((halfMax * 2) = maxValPlus1).
+    self assert:((halfMin perform:'*' asSymbol with:2) == minVal).
+    self assert:((halfMin * 2) == minVal).
+    self assert:((maxValPlus1 perform:'//' asSymbol with:2) == halfMax).
+    self assert:((maxValPlus1 // 2) == halfMax).
+    self assert:((halfMax perform:'bitShift:' asSymbol with:1) = maxValPlus1).
+    self assert:((halfMin perform:'bitShift:' asSymbol with:1) == minVal).
+    self assert:((halfMax bitShift:1) = maxValPlus1).
+    self assert:((halfMin bitShift:1) == minVal).
+
+    "LargeInt op -> SmallInt result"
+    t := maxVal + 1.
+    self assert:(t - 1 == maxVal).
+    t := minVal - 1.
+    self assert:(t + 1 == minVal).
+
+    "
+     self basicNew testInteger1
+    "
+
+    "Modified: / 19-09-2017 / 16:27:24 / stefan"
+    "Modified: / 10-10-2017 / 12:13:02 / cg"
+!
+
+testIntegerMisc
+    "misc tests.
+     Notice, the arithmetic tests are both performed via regular sends
+     and via constructed performs. The reason is to test both inlined
+     JIT-compiler code AND the regular methods code."
+
+    |n1 n2 s|
+
+    n1 := 100000.
+    n2 := n1 negated.
+    s := 1.
+
+    self assert:(n1 printString = '100000').
+
+    self assert:(n1 negated printString = '-100000').
+    self assert:((n1 perform:'negated' asSymbol) printString = '-100000').
+
+    self assert:(n1 negated abs printString = '100000').
+    self assert:((n1 perform:'negated' asSymbol) abs printString = '100000').
+
+    self assert:(n1 abs negated printString = '-100000').
+    self assert:((n1 perform:'abs' asSymbol) negated printString = '-100000').
+
+    n1 := SmallInteger maxVal.
+    self assert:(n1 negated class == SmallInteger).
+    self assert:((n1 perform:'negated' asSymbol) class == SmallInteger).
+
+    n1 := SmallInteger minVal.
+    self assert:(n1 class == SmallInteger).
+    "/ Transcript showCR:n1 printString.
+    "/ Transcript showCR:n1 negated printString.
+    "/ Transcript showCR:n1 negated class printString.
+    self assert:(n1 negated class == LargeInteger).
+    self assert:((n1 perform:'negated' asSymbol) class == LargeInteger).
+
+    n1 := SmallInteger maxVal.
+    self assert:(n1 negated negated class == SmallInteger).
+    self assert:(((n1 perform:'negated' asSymbol) perform:'negated' asSymbol) class == SmallInteger).
+
+    n1 := SmallInteger minVal.
+    self assert:(n1 negated negated class == SmallInteger).
+    self assert:(((n1 perform:'negated' asSymbol) perform:'negated' asSymbol) class == SmallInteger).
+
+    n1 := SmallInteger minVal negated - 1.
+    self assert:(n1 negated class == SmallInteger).
+    self assert:((n1 perform:'negated' asSymbol) class == SmallInteger).
+    self assert:(n1 == SmallInteger maxVal).
+
+    "
+     self basicNew testIntegerMisc
+    "
+
+    "Created: / 6.6.1999 / 14:47:51 / cg"
+    "Modified: / 9.6.1999 / 17:49:57 / cg"
+!
+
+testIntegerMisc2
+    "misc tests.
+     Notice, the arithmetic tests are both performed via regular sends
+     and via constructed performs. The reason is to test both inlined
+     JIT-compiler code AND the regular methods code."
+
+    |n sel|
+
+    "/ fib is optional
+    (0 respondsTo:#fib) ifFalse:[^ self].
+
+    self assert:(0 fib == 0).
+    self assert:(1 fib == 1).
+    self assert:(2 fib == 1).
+    self assert:(3 fib == 2).
+    self assert:(4 fib == 3).
+    self assert:(5 fib == 5).
+    self assert:(6 fib == 8).
+    self assert:(7 fib == 13).
+
+    n := 0.
+    self assert:(n fib == 0).
+    n := 1.
+    self assert:(n fib == 1).
+    n := 2.
+    self assert:(n fib == 1).
+    n := 3.
+    self assert:(n fib == 2).
+    n := 4.
+    self assert:(n fib == 3).
+    n := 5.
+    self assert:(n fib == 5).
+    n := 6.
+    self assert:(n fib == 8).
+    n := 7.
+    self assert:(n fib == 13).
+
+    #(0 1 2 3 4 5 6 7)
+    with:#(0 1 1 2 3 5 8 13)
+    do:[:n :rslt |
+	self assert:(n fib == rslt).
+    ].
+
+"/    #(0 1 2 3 4 5 6 7)
+"/    with:#(0 1 1 2 3 5 8 13)
+"/    do:[:n :rslt |
+"/        self assert:(n fib_recursive == rslt).
+"/    ].
+
+    sel := #fib.
+    self assert:((0 perform:sel) == 0).
+    self assert:((1 perform:sel) == 1).
+    self assert:((2 perform:sel) == 1).
+    self assert:((3 perform:sel) == 2).
+    self assert:((4 perform:sel) == 3).
+    self assert:((5 perform:sel) == 5).
+    self assert:((6 perform:sel) == 8).
+    self assert:((7 perform:sel) == 13).
+
+    "
+     self basicNew testIntegerMisc2
+    "
+!
+
+testLargeCompare
+    "compare tests"
+
+    #(
+        ( 16r3fffffff 16r40000000 #less )
+        ( 16r40000000 16r3fffffff #greater )
+        ( 16r40000000 16r40000000 #equal )
+
+        ( 16r40000000 16r40000001 #less )
+        ( 16r40000001 16r40000000 #greater )
+        ( 16r40000001 16r40000001 #equal )
+        
+        ( 16r3fffffffffffffff 16r4000000000000000 #less )
+        ( 16r4000000000000000 16r3fffffffffffffff #greater )
+        ( 16r4000000000000000 16r4000000000000000 #equal )
+
+        ( 16r4000000000000000 16r4000000000000001 #less )
+        ( 16r4000000000000001 16r4000000000000000 #greater )
+        ( 16r4000000000000001 16r4000000000000001 #equal )
+
+        ( 16r3fffffffffffffffffffffff 16r400000000000000000000000 #less )
+        ( 16r400000000000000000000000 16r3fffffffffffffffffffffff #greater )
+        ( 16r400000000000000000000000 16r400000000000000000000000 #equal )
+
+        ( 16r400000000000000000000000 16r400000000000000000000001 #less )
+        ( 16r400000000000000000000001 16r400000000000000000000000 #greater )
+        ( 16r400000000000000000000001 16r400000000000000000000001 #equal )
+
+        ( 16r3fffffff 16r400000000000 #less )
+        ( 16r400000000000 16r3fffffff #greater )
+
+        ( 16r40000000 16r400000000001 #less )
+        ( 16r400000000001 16r40000000 #greater )
+
+        ( 16r3fffffffffffffff 16r40000000000000000000 #less )
+        ( 16r40000000000000000000 16r3fffffffffffffff #greater )
+
+        ( 16r4000000000000000 16r40000000000000000001 #less )
+        ( 16r40000000000000000001 16r4000000000000000 #greater )
+
+        ( 16r3fffffffffffffffffffffff 16r400000000000000000000000 #less )
+        ( 16r400000000000000000000000 16r3fffffffffffffffffffffff #greater )
+        ( 16r400000000000000000000000 16r400000000000000000000000 #equal )
+
+        ( 16r400000000000000000000000 16r400000000000000000000001 #less )
+        ( 16r400000000000000000000001 16r400000000000000000000000 #greater )
+        ( 16r400000000000000000000001 16r400000000000000000000001 #equal )
+    ) do:[:triple |
+        |v1 v2 expected rslt|
+        
+        v1 := triple at:1.
+        v2 := triple at:2.
+        expected := triple at:3.
+        expected == #less ifTrue:[
+            self assert:(v1 < v2).
+            self assert:(v1 <= v2).
+            self assert:(v1 > v2) not.
+            self assert:(v1 >= v2) not.
+            self assert:(v1 = v2) not.
+            self assert:(v1 ~= v2).
+        ].    
+        expected == #greater ifTrue:[
+            self assert:(v1 > v2).
+            self assert:(v1 >= v2).
+            self assert:(v1 < v2) not.
+            self assert:(v1 <= v2) not.
+            self assert:(v1 = v2) not.
+            self assert:(v1 ~= v2).
+        ].    
+        expected == #equal ifTrue:[
+            self assert:(v1 > v2) not.
+            self assert:(v1 >= v2).
+            self assert:(v1 < v2) not.
+            self assert:(v1 <= v2).
+            self assert:(v1 = v2).
+            self assert:(v1 ~= v2) not.
+        ].    
+    ].
+    self assert:(100 factorial < 101 factorial).
+    self assert:(100 factorial > 100 factorial negated).
+    
+    "
+     self basicNew testLargeCompare
+    "
+!
+
+testLargeCompression1
+    |l nullBytes|
+
+    #(
+	#[ 1 ]          16r01
+	#[ 1 2 ]        16r0201
+	#[ 1 2 3]       16r030201
+	#[ 1 2 3 4]     16r04030201
+    ) pairWiseDo:[:bytes :expected |
+	0 to:16 do:[:nNullBytes |
+	    nullBytes := ByteArray new:nNullBytes withAll:0.
+	    l := LargeInteger digitBytes:(bytes , nullBytes).
+	    self assert:( l compressed == expected ).
+	].
+    ].
+
+    #(
+	#[ 1 2 3 4 5]       16r0504030201
+	#[ 1 2 3 4 5 6]     16r060504030201
+	#[ 1 2 3 4 5 6 7]   16r07060504030201
+	#[ 1 2 3 4 5 6 7 8] 16r0807060504030201
+    ) pairWiseDo:[:bytes :expected |
+	0 to:16 do:[:nNullBytes |
+	    nullBytes := ByteArray new:nNullBytes withAll:0.
+	    l := LargeInteger digitBytes:(bytes , nullBytes).
+	    ExternalAddress pointerSize == 8 ifTrue:[
+		self assert:( l compressed == expected ).
+	    ] ifFalse:[
+		self assert:( l compressed = expected ).
+	    ]
+	]
+    ].
+
+    #(
+	#[ 1 2 3 4 5 6 7 8 9]       16r090807060504030201
+	#[ 1 2 3 4 5 6 7 8 9 10]    16r0a090807060504030201
+	#[ 1 2 3 4 5 6 7 8 9 10 11] 16r0b0a090807060504030201
+    ) pairWiseDo:[:bytes :expected |
+	0 to:16 do:[:nNullBytes |
+	    nullBytes := ByteArray new:nNullBytes withAll:0.
+	    l := LargeInteger digitBytes:(bytes , nullBytes).
+	    self assert:( l compressed = expected ).
+	]
+    ].
+
+    "
+     self basicNew testLargeCompression1
+    "
+!
+
+testLargeIntegerHelpers
+    |t1 t2|
+
+    "/ mul2
+
+    t1 := 16r12345678901234567890.
+    t2 := t1 deepCopy.
+    self assert:(t2 mul2 = (t1 * 2)).
+
+    t1 := 16r1234567890123456789012345678901234567890.
+    t2 := t1 deepCopy.
+    self assert:(t2 mul2 = (t1 * 2)).
+
+    t1 := 16r123456789012345678901234567890123456789012345678901234567890.
+    t2 := t1 deepCopy.
+    self assert:(t2 mul2 = (t1 * 2)).
+
+    t1 := 16r12345678901234567890123456789012345678901234567890123456789012345678901234567890.
+    t2 := t1 deepCopy.
+    self assert:(t2 mul2 = (t1 * 2)).
+
+    t1 := 10000 factorial.
+    t2 := t1 deepCopy.
+    self assert:(t2 mul2 = (t1 * 2)).
+
+    t1 := 16r123456789012345678901234567890123456789012345678901234567890.
+    t2 := t1 deepCopy.
+    self assert:(t2 mul2 = (t1 * 2)).
+
+"/    t1 := 1000 factorial.
+"/    t := Time millisecondsToRun:[ 100000 timesRepeat:[ t1 mul2. ] ].
+"/    Transcript showCR:t.
+
+    "/ div2
+
+    t1 := 16r12345678901234567890.
+    t2 := t1 deepCopy.
+
+    t2 div2.
+    "/ do not compare t2 = t1 // x, because t2 may be unnormalized
+    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
+
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 4) printStringRadix:16).
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 8) printStringRadix:16).
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 16) printStringRadix:16).
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 32) printStringRadix:16).
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 64) printStringRadix:16).
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 128) printStringRadix:16).
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 256) printStringRadix:16).
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 512) printStringRadix:16).
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 1024) printStringRadix:16).
+
+    t1 := 16r1234567890123456789012345678901234567890.
+    t2 := t1 deepCopy.
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
+
+    t1 := 16r123456789012345678901234567890123456789012345678901234567890.
+    t2 := t1 deepCopy.
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
+
+    t1 := 16r12345678901234567890123456789012345678901234567890123456789012345678901234567890.
+    t2 := t1 deepCopy.
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 4) printStringRadix:16).
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 8) printStringRadix:16).
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 16) printStringRadix:16).
+
+    t1 := 10000 factorial.
+    t2 := t1 deepCopy.
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
+
+    t1 := 16r123456789012345678901234567890123456789012345678901234567890.
+    t2 := t1 deepCopy.
+    t2 div2.
+    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
+
+    t1 := 12345678901234567890.
+    t2 := t1 divMod:1000.
+    self assert:(t2 at:1) = 12345678901234567.
+    self assert:(t2 at:2) = 890.
+
+
+    "
+     self basicNew testLargeIntegerHelpers
+    "
+
+    "Modified: / 20.5.1999 / 09:41:19 / cg"
+!
+
+testLargeIntegerHelpers2
+    |t1 r|
+
+    "/ absSubtract:
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffff.
+    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == true).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r010000000000000000.
+    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == false).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffff.
+    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == true).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r01000000000000000000.
+    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == false).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffff.
+    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == true).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r0100000000000000000000.
+    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == false).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffff.
+    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == true).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r010000000000000000000000.
+    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == false).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffff.
+    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == true).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r01000000000000000000000000.
+    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == false).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffff.
+    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == true).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r0100000000000000000000000000.
+    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == false).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffffff.
+    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == true).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r010000000000000000000000000000.
+    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == false).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffffffff.
+    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == true).
+
+    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
+    r := t1 absDestructiveSubtract:16r01000000000000000000000000000000.
+    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
+    self assert:(r == false).
+    "
+     self basicNew testLargeIntegerHelpers2
+    "
+!
+
+testLargeIntegerHelpers3
+    "/ absDivMod:
+
+     self assert:(9000000000000000000 absDivMod: 4000) = #(2250000000000000 0).
+     self assert:(-9000000000000000000 absDivMod: 4000) = #(2250000000000000 0).
+     self assert:(9000000000000000000 absDivMod: -4000) = #(2250000000000000 0).
+     self assert:(-9000000000000000000 absDivMod: -4000) = #(2250000000000000 0).
+
+     self assert:(9000000000000000001 absDivMod: 4000) = #(2250000000000000 1).
+     self assert:(-9000000000000000001 absDivMod: 4000) = #(2250000000000000 1).
+     self assert:(9000000000000000001 absDivMod: -4000) = #(2250000000000000 1).
+     self assert:(-9000000000000000001 absDivMod: -4000) = #(2250000000000000 1).
+
+     self assert:(9000000000000000000 absDivMod: 40000) = #(225000000000000 0).
+     self assert:(-9000000000000000000 absDivMod: 40000) = #(225000000000000 0).
+     self assert:(9000000000000000000 absDivMod: -40000) = #(225000000000000 0).
+     self assert:(-9000000000000000000 absDivMod: -40000) = #(225000000000000 0).
+
+     self assert:(9000000000000000000 absDivMod: 400000) = #(22500000000000 0).
+     self assert:(-9000000000000000000 absDivMod: 400000) = #(22500000000000 0).
+     self assert:(9000000000000000000 absDivMod: -400000) = #(22500000000000 0).
+     self assert:(-9000000000000000000 absDivMod: -400000) = #(22500000000000 0).
+
+     self assert:(9000000000000000000 absDivMod: 4000000) = #(2250000000000 0).
+     self assert:(-9000000000000000000 absDivMod: 4000000) = #(2250000000000 0).
+     self assert:(9000000000000000000 absDivMod: -4000000) = #(2250000000000 0).
+     self assert:(-9000000000000000000 absDivMod: -4000000) = #(2250000000000 0).
+
+     self assert:(9000000000000000000 absDivMod: 40000000) = #(225000000000 0).
+     self assert:(-9000000000000000000 absDivMod: 40000000) = #(225000000000 0).
+     self assert:(9000000000000000000 absDivMod: -40000000) = #(225000000000 0).
+     self assert:(-9000000000000000000 absDivMod: -40000000) = #(225000000000 0).
+
+     self assert:(9000000000000000000 absDivMod: 400000000) = #(22500000000 0).
+     self assert:(-9000000000000000000 absDivMod: 400000000) = #(22500000000 0).
+     self assert:(9000000000000000000 absDivMod: -400000000) = #(22500000000 0).
+     self assert:(-9000000000000000000 absDivMod: -400000000) = #(22500000000 0).
+
+     self assert:(9000000000000000000 absDivMod: 4000000000) = #(2250000000 0).
+     self assert:(-9000000000000000000 absDivMod: 4000000000) = #(2250000000 0).
+     self assert:(9000000000000000000 absDivMod: -4000000000) = #(2250000000 0).
+     self assert:(-9000000000000000000 absDivMod: -4000000000) = #(2250000000 0).
+
+     self assert:(9000000000000000000 absDivMod: 40000000000) = #(225000000 0).
+     self assert:(-9000000000000000000 absDivMod: 40000000000) = #(225000000 0).
+     self assert:(9000000000000000000 absDivMod: -40000000000) = #(225000000 0).
+     self assert:(-9000000000000000000 absDivMod: -40000000000) = #(225000000 0).
+
+     self assert:(9000000000000000000 absDivMod: 400000000000) = #(22500000 0).
+     self assert:(-9000000000000000000 absDivMod: 400000000000) = #(22500000 0).
+     self assert:(9000000000000000000 absDivMod: -400000000000) = #(22500000 0).
+     self assert:(-9000000000000000000 absDivMod: -400000000000) = #(22500000 0).
+
+     self assert:(9000000000000000000 absDivMod: 4000000000000) = #(2250000 0).
+     self assert:(-9000000000000000000 absDivMod: 4000000000000) = #(2250000 0).
+     self assert:(9000000000000000000 absDivMod: -4000000000000) = #(2250000 0).
+     self assert:(-9000000000000000000 absDivMod: -4000000000000) = #(2250000 0).
+
+     self assert:(9000000000000000000 absDivMod: 40000000000000) = #(225000 0).
+     self assert:(-9000000000000000000 absDivMod: 40000000000000) = #(225000 0).
+     self assert:(9000000000000000000 absDivMod: -40000000000000) = #(225000 0).
+     self assert:(-9000000000000000000 absDivMod: -40000000000000) = #(225000 0).
+
+     self assert:(9000000000000000000 absDivMod: 400000000000000) = #(22500 0).
+     self assert:(-9000000000000000000 absDivMod: 400000000000000) = #(22500 0).
+     self assert:(9000000000000000000 absDivMod: -400000000000000) = #(22500 0).
+     self assert:(-9000000000000000000 absDivMod: -400000000000000) = #(22500 0).
+
+     self assert:(9000000000000000000 absDivMod: 4000000000000000) = #(2250 0).
+     self assert:(-9000000000000000000 absDivMod: 4000000000000000) = #(2250 0).
+     self assert:(9000000000000000000 absDivMod: -4000000000000000) = #(2250 0).
+     self assert:(-9000000000000000000 absDivMod: -4000000000000000) = #(2250 0).
+
+     self assert:(9000000000000000000 absDivMod: 4000000000000000000) = #(2 1000000000000000000).
+     self assert:(-9000000000000000000 absDivMod: 4000000000000000000) = #(2 1000000000000000000).
+     self assert:(9000000000000000000 absDivMod: -4000000000000000000) = #(2 1000000000000000000).
+     self assert:(-9000000000000000000 absDivMod: -4000000000000000000) = #(2 1000000000000000000).
+
+    "
+     self basicNew testLargeIntegerHelpers3
+    "
+!
+
+testLargeIntegerHelpers4
+    "/ absDivMod:
+
+     self assert:(9000000000000000000 absMod: 4000) = 0.
+     self assert:(-9000000000000000000 absMod: 4000) = 0.
+     self assert:(9000000000000000000 absMod: -4000) = 0.
+     self assert:(-9000000000000000000 absMod: -4000) = 0.
+
+     self assert:(9000000000000000001 absMod: 4000) = 1.
+     self assert:(-9000000000000000001 absMod: 4000) = 1.
+     self assert:(9000000000000000001 absMod: -4000) = 1.
+     self assert:(-9000000000000000001 absMod: -4000) = 1.
+
+     self assert:(9000000000000000000 absMod: 40000) = 0.
+     self assert:(-9000000000000000000 absMod: 40000) = 0.
+     self assert:(9000000000000000000 absMod: -40000) = 0.
+     self assert:(-9000000000000000000 absMod: -40000) = 0.
+
+     self assert:(9000000000000000000 absMod: 400000) = 0.
+     self assert:(-9000000000000000000 absMod: 400000) = 0.
+     self assert:(9000000000000000000 absMod: -400000) = 0.
+     self assert:(-9000000000000000000 absMod: -400000) = 0.
+
+     self assert:(9000000000000000000 absMod: 4000000) = 0.
+     self assert:(-9000000000000000000 absMod: 4000000) = 0.
+     self assert:(9000000000000000000 absMod: -4000000) = 0.
+     self assert:(-9000000000000000000 absMod: -4000000) = 0.
+
+     self assert:(9000000000000000000 absMod: 40000000) = 0.
+     self assert:(-9000000000000000000 absMod: 40000000) = 0.
+     self assert:(9000000000000000000 absMod: -40000000) = 0.
+     self assert:(-9000000000000000000 absMod: -40000000) = 0.
+
+     self assert:(9000000000000000000 absMod: 400000000) = 0.
+     self assert:(-9000000000000000000 absMod: 400000000) = 0.
+     self assert:(9000000000000000000 absMod: -400000000) = 0.
+     self assert:(-9000000000000000000 absMod: -400000000) = 0.
+
+     self assert:(9000000000000000000 absMod: 4000000000) = 0.
+     self assert:(-9000000000000000000 absMod: 4000000000) = 0.
+     self assert:(9000000000000000000 absMod: -4000000000) = 0.
+     self assert:(-9000000000000000000 absMod: -4000000000) = 0.
+
+     self assert:(9000000000000000000 absMod: 40000000000) = 0.
+     self assert:(-9000000000000000000 absMod: 40000000000) = 0.
+     self assert:(9000000000000000000 absMod: -40000000000) = 0.
+     self assert:(-9000000000000000000 absMod: -40000000000) = 0.
+
+     self assert:(9000000000000000000 absMod: 400000000000) = 0.
+     self assert:(-9000000000000000000 absMod: 400000000000) = 0.
+     self assert:(9000000000000000000 absMod: -400000000000) = 0.
+     self assert:(-9000000000000000000 absMod: -400000000000) = 0.
+
+     self assert:(9000000000000000000 absMod: 4000000000000) = 0.
+     self assert:(-9000000000000000000 absMod: 4000000000000) = 0.
+     self assert:(9000000000000000000 absMod: -4000000000000) = 0.
+     self assert:(-9000000000000000000 absMod: -4000000000000) = 0.
+
+     self assert:(9000000000000000000 absMod: 40000000000000) = 0.
+     self assert:(-9000000000000000000 absMod: 40000000000000) = 0.
+     self assert:(9000000000000000000 absMod: -40000000000000) = 0.
+     self assert:(-9000000000000000000 absMod: -40000000000000) = 0.
+
+     self assert:(9000000000000000000 absMod: 400000000000000) = 0.
+     self assert:(-9000000000000000000 absMod: 400000000000000) = 0.
+     self assert:(9000000000000000000 absMod: -400000000000000) = 0.
+     self assert:(-9000000000000000000 absMod: -400000000000000) = 0.
+
+     self assert:(9000000000000000000 absMod: 4000000000000000) = 0.
+     self assert:(-9000000000000000000 absMod: 4000000000000000) = 0.
+     self assert:(9000000000000000000 absMod: -4000000000000000) = 0.
+     self assert:(-9000000000000000000 absMod: -4000000000000000) = 0.
+
+     self assert:(9000000000000000000 absMod: 4000000000000000000) = 1000000000000000000.
+     self assert:(-9000000000000000000 absMod: 4000000000000000000) = 1000000000000000000.
+     self assert:(9000000000000000000 absMod: -4000000000000000000) = 1000000000000000000.
+     self assert:(-9000000000000000000 absMod: -4000000000000000000) = 1000000000000000000.
+
+    "
+     self basicNew testLargeIntegerHelpers4
+    "
+
+    "Created: / 05-07-2017 / 16:15:30 / cg"
+!
+
+testMiscMath
+    self assert:(2 raisedTo:2) == 4.
+    self assert:(2 raisedTo:2.0) = 4.0.
+    self assert:(2 raisedTo:100) = 1267650600228229401496703205376.
+    
+    self assert:(((2 raisedTo:100) log:2) isAlmostEqualTo:100 nEpsilon:1) 
+         message:('(2^100)log2 is %1' bindWith:((2 raisedTo:100) log:2)).
+    self assert:(((2 raisedTo:100) integerLog2) == 100)
+         message:('(2^100)integerLog2 is %1' bindWith:((2 raisedTo:100) integerLog2)).
+
+    self assert:(((10 raisedTo:100) integerLog10) == 100)
+         message:('(10^100)integerLog10 is %1' bindWith:((10 raisedTo:100) integerLog10)).
+
+    "/ currently, integerLog10 does not work with largeInts
+    "/ self assert:(((10 raisedTo:1000) integerLog10) == 1000).
+
+    "
+     self basicNew testMiscMath
+    "
+
+    "Created: / 02-07-2017 / 00:52:25 / cg"
+    "Modified (comment): / 02-07-2017 / 14:39:26 / cg"
+    "Modified: / 22-07-2019 / 12:44:41 / Claus Gittinger"
+!
+
+testMiscMath2
+    self assert:(10000000000000000000000001 isPrime) not.
+    self assert:(76 factorial + 1) isPrime not.
+
+    "/ Would take far too long with fallback implementation.
+    PrimeNumberGenerator notNil ifTrue:[
+        self assert:(77 factorial + 1) isPrime.
+        self assert:(872 factorial + 1) isPrime.
+        self assert:(1000 factorial + 1) isPrime not.
+    ].
+
+    "
+    Time millisecondsToRun:[
+        1000000 factorial.
+    ].
+    "
+
+    "
+     self basicNew testMiscMath2
+    "
+
+    "Created: / 05-07-2017 / 16:18:54 / cg"
+    "Modified (comment): / 26-07-2017 / 12:48:11 / mawalch"
+! !
+
+!IntegerTest methodsFor:'tests-arithmetic'!
+
 testDivision1
     |a b op rslt|
 
@@ -1404,727 +2172,6 @@
     "Created: / 26-02-2016 / 20:21:47 / cg"
 !
 
-testEncodeDecode
-    self assert:(1 encodeAsBCD hexPrintString = '1').
-    self assert:(12 encodeAsBCD hexPrintString = '12').
-    self assert:(123 encodeAsBCD hexPrintString = '123').
-    self assert:(1234 encodeAsBCD hexPrintString = '1234').
-    self assert:(12345 encodeAsBCD hexPrintString = '12345').
-    self assert:(123456 encodeAsBCD hexPrintString = '123456').
-    self assert:(1234567 encodeAsBCD hexPrintString = '1234567').
-    self assert:(12345678 encodeAsBCD hexPrintString = '12345678').
-    self assert:(123456789 encodeAsBCD hexPrintString = '123456789').
-    self assert:(1234567890 encodeAsBCD hexPrintString = '1234567890').
-    self assert:(12345678901 encodeAsBCD hexPrintString = '12345678901').
-    self assert:(123456789012 encodeAsBCD hexPrintString = '123456789012').
-    self assert:(1234567890123 encodeAsBCD hexPrintString = '1234567890123').
-    self assert:(12345678901234 encodeAsBCD hexPrintString = '12345678901234').
-    self assert:(123456789012345 encodeAsBCD hexPrintString = '123456789012345').
-    self assert:(1234567890123456 encodeAsBCD hexPrintString = '1234567890123456').
-    self assert:(12345678901234567 encodeAsBCD hexPrintString = '12345678901234567').
-    self assert:(123456789012345678 encodeAsBCD hexPrintString = '123456789012345678').
-    self assert:(1234567890123456789 encodeAsBCD hexPrintString = '1234567890123456789').
-    self assert:(12345678901234567890 encodeAsBCD hexPrintString = '12345678901234567890').
-    self assert:(4611686018427387902 encodeAsBCD hexPrintString = '4611686018427387902').
-    self assert:(4611686018427387903 encodeAsBCD hexPrintString = '4611686018427387903').
-    self assert:(4611686018427387904 encodeAsBCD hexPrintString = '4611686018427387904').
-
-    self assert:(16r1 decodeFromBCD = 1).
-    self assert:(16r12 decodeFromBCD = 12).
-    self assert:(16r123 decodeFromBCD = 123).
-    self assert:(16r1234 decodeFromBCD = 1234).
-    self assert:(16r12345 decodeFromBCD = 12345).
-    self assert:(16r123456 decodeFromBCD = 123456).
-    self assert:(16r1234567 decodeFromBCD = 1234567).
-    self assert:(16r12345678 decodeFromBCD = 12345678).
-    self assert:(16r123456789 decodeFromBCD = 123456789).
-    self assert:(16r1234567890 decodeFromBCD = 1234567890).
-    self assert:(16r12345678901 decodeFromBCD = 12345678901).
-    self assert:(16r123456789012 decodeFromBCD = 123456789012).
-    self assert:(16r1000000000000 decodeFromBCD = 1000000000000).
-    self assert:(16r0000500000000 decodeFromBCD = 500000000).
-    self assert:(16r1234500000000 decodeFromBCD = 1234500000000).
-    self assert:(16r1234567890000 decodeFromBCD = 1234567890000).
-
-    self assert:(16r1234567890123 decodeFromBCD = 1234567890123).
-    self assert:(16r12345678901234 decodeFromBCD = 12345678901234).
-    self assert:(16r123456789012345 decodeFromBCD = 123456789012345).
-    self assert:(16r1234567890123456 decodeFromBCD = 1234567890123456).
-    self assert:(16r12345678901234567 decodeFromBCD = 12345678901234567).
-    self assert:(16r123456789012345678 decodeFromBCD = 123456789012345678).
-    self assert:(16r1234567890123456789 decodeFromBCD = 1234567890123456789).
-    self assert:(16r12345678901234567890 decodeFromBCD = 12345678901234567890).
-    self assert:(16r4611686018427387902 decodeFromBCD = 4611686018427387902).
-    self assert:(16r4611686018427387903 decodeFromBCD = 4611686018427387903).
-    self assert:(16r4611686018427387904 decodeFromBCD = 4611686018427387904).
-
-    "
-     self basicNew testEncodeDecode
-    "
-
-    "Modified: / 26.10.1999 / 22:01:35 / stefan"
-!
-
-testFactorial
-    "/ <testedMethods: #( (Integer >> #factorial) (Integer >> #*) ) >
-
-    self assert:(1 factorial = 1).
-    self assert:(2 factorial = 2).
-    self assert:(10 factorial = 3628800).
-    self assert:(11 factorial = 39916800).
-    self assert:(12 factorial = 479001600).
-    self assert:(13 factorial digitBytes = #[0 204 40 115 1]).
-    self assert:(13 factorial = 6227020800).
-    self assert:(14 factorial digitBytes = #[0 40 59 76 20]).
-    self assert:(14 factorial = 87178291200).
-    self assert:(15 factorial digitBytes = #[0 88 119 119 48 1]).
-    self assert:(15 factorial = 1307674368000).
-    self assert:(16 factorial digitBytes = #[0 128 117 119 7 19]).
-    self assert:(16 factorial = 20922789888000).
-    self assert:(17 factorial digitBytes = #[0 128 205 238 126 67 1]).
-    self assert:(17 factorial = 355687428096000).
-    self assert:(18 factorial digitBytes = #[0 0 115 202 236 190 22]).
-    self assert:(18 factorial = 6402373705728000).
-    self assert:(19 factorial digitBytes = #[0 0 137 6 147 43 176 1]).
-    self assert:(19 factorial = 121645100408832000).
-    self assert:(20 factorial digitBytes = #[0 0 180 130 124 103 195 33]).
-    self assert:(20 factorial = 2432902008176640000).
-    self assert:(50 factorial = 30414093201713378043612608166064768844377641568960512000000000000).
-
-    "
-     self basicNew testFactorial
-    "
-
-    "Created: / 24-04-2010 / 13:52:23 / cg"
-    "Modified: / 26-02-2016 / 15:43:16 / cg"
-!
-
-testGCD
-    "/ <testedMethods: #( (Integer >> #gcd:) ) >
-
-    self assert:(9 gcd:6) = 3.
-    self assert:(6 gcd:9) = 3.
-    self assert:(2 gcd:0) = 2.
-    self assert:(0 gcd:2) = 2.
-    self assert:(20 factorial gcd:(5*6*7)) = (5*6*7).
-    self assert:(20 factorial gcd:(20 factorial / 20)) = (19 factorial).
-
-    "
-     self basicNew testGCD
-    "
-
-    "Created: / 27-04-2010 / 09:49:31 / cg"
-!
-
-testHighBitLowBit
-    self assert:( 2r0 highBit == 0).
-    self assert:( 2r1 highBit == 1).
-    self assert:( 2r10 highBit == 2).  
-    self assert:( 2r100 highBit == 3).  
-    self assert:( 2r1000 highBit == 4).  
-    self assert:( 16r10 highBit == 5).
-    self assert:( 16r100 highBit == 9).
-    self assert:( 16r1000 highBit == 13).
-    self assert:( 16r10000 highBit == 17).
-    self assert:( 16r100000 highBit == 21).
-    self assert:( 16r1000000 highBit == 25).
-    self assert:( 16r10000000 highBit == 29).
-    self assert:( 16r20000000 highBit == 30).
-    self assert:( 16r3FFFFFFF highBit == 30).
-    self assert:( 16r40000000 highBit == 31).
-    self assert:( 16r7FFFFFFF highBit == 31).
-    self assert:( 16r80000000 highBit == 32).
-    self assert:( 16rFFFFFFFF highBit == 32).
-    self assert:( 16r100000000 highBit == 33).
-    self assert:( 16r1FFFFFFFF highBit == 33).
-    self assert:( 16r100000001 highBit == 33).
-    self assert:( 16r1000000000 highBit == 37).
-    self assert:( 16r10000000000 highBit == 41).
-    self assert:( 16r100000000000 highBit == 45).
-    self assert:( 16r1000000000000 highBit == 49).
-    self assert:( 16r1FFFFFFFFFFFF highBit == 49).
-    self assert:( 16r2000000000000 highBit == 50).
-    self assert:( 16r4000000000000 highBit == 51).
-    self assert:( 16r7FFFFFFFFFFFF highBit == 51).
-    self assert:( 16r8000000000000 highBit == 52).
-    self assert:( 16rFFFFFFFFFFFFF highBit == 52).
-    self assert:( 16r10000000000000 highBit == 53).
-    self assert:( 16r1FFFFFFFFFFFFF highBit == 53).
-    self assert:( 16r20000000000000 highBit == 54).
-    self assert:( 16r3FFFFFFFFFFFFF highBit == 54).
-    self assert:( 16r40000000000000 highBit == 55).
-    self assert:( 16r5FFFFFFFFFFFFF highBit == 55).
-    self assert:( 16r7FFFFFFFFFFFFF highBit == 55).
-    self assert:( 16r80000000000000 highBit == 56).
-    self assert:( 16r100000000000000 highBit == 57).
-    self assert:( 16r1000000000000000 highBit == 61).
-    self assert:( 16r1FFFFFFFFFFFFFFF highBit == 61).
-    self assert:( 16r2000000000000000 highBit == 62).
-    self assert:( 16r3FFFFFFFFFFFFFFF highBit == 62).
-    self assert:( 16r4000000000000000 highBit == 63).
-    self assert:( 16r7FFFFFFFFFFFFFFF highBit == 63).
-    self assert:( 16r8000000000000000 highBit == 64).
-    self assert:( 16rFFFFFFFFFFFFFFFF highBit == 64).
-    self assert:( 16r10000000000000000 highBit == 65).
-    self assert:( 16r1FFFFFFFFFFFFFFFF highBit == 65).
-    self assert:( (1 bitShift:1000) highBit == 1001).
-
-    self assert:( 2r0 lowBit == 0).
-    self assert:( 2r1 lowBit == 1).
-    self assert:( 2r10 lowBit == 2).  
-    self assert:( 2r100 lowBit == 3).  
-    self assert:( 2r1000 lowBit == 4).  
-    self assert:( 16r10 lowBit == 5).
-    self assert:( 16r100 lowBit == 9).
-    self assert:( 16r1000 lowBit == 13).
-    self assert:( 16r10000 lowBit == 17).
-    self assert:( 16r100000 lowBit == 21).
-    self assert:( 16r1000000 lowBit == 25).
-    self assert:( 16r10000000 lowBit == 29).
-    self assert:( 16r100000000 lowBit == 33).
-    self assert:( 16r1000000000 lowBit == 37).
-    self assert:( 16r10000000000 lowBit == 41).
-    self assert:( 16r100000000000 lowBit == 45).
-    self assert:( 16r1000000000000 lowBit == 49).
-    self assert:( 16r10000000000000 lowBit == 53).
-    self assert:( 16r100000000000000 lowBit == 57).
-    self assert:( 16r1000000000000000 lowBit == 61).
-    self assert:( 16r10000000000000000 lowBit == 65).
-    self assert:( (1 bitShift:1000) lowBit == 1001).
-    
-    self assert:(( 2r1 bitOr: 16r10000000000) lowBit = 1).
-    self assert:(( 2r10 bitOr: 16r10000000000) lowBit = 2).  
-    self assert:(( 2r100 bitOr: 16r10000000000) lowBit = 3).  
-    self assert:(( 2r1000 bitOr: 16r10000000000) lowBit = 4).  
-    self assert:(( 16r10 bitOr: 16r10000000000) lowBit = 5).
-    self assert:(( 16r100 bitOr: 16r10000000000) lowBit = 9).
-    self assert:(( 16r1000 bitOr: 16r10000000000) lowBit = 13).
-    self assert:(( 16r10000 bitOr: 16r10000000000) lowBit = 17).
-    self assert:(( 16r100000 bitOr: 16r10000000000) lowBit = 21).
-    self assert:(( 16r1000000 bitOr: 16r10000000000) lowBit = 25).
-    self assert:(( 16r10000000 bitOr: 16r10000000000) lowBit = 29).
-    self assert:(( 16r100000000 bitOr: 16r10000000000) lowBit = 33).
-    self assert:(( 16r1000000000 bitOr: 16r10000000000) lowBit = 37).
-    self assert:(( 16r10000000000 bitOr: 16r10000000000) lowBit = 41).
-    self assert:(( 16r100000000000 bitOr: 16r100000000000) lowBit = 45).
-    self assert:(( 16r1000000000000 bitOr: 16r1000000000000) lowBit = 49).
-    self assert:(( 16r10000000000000 bitOr: 16r10000000000000) lowBit = 53).
-    self assert:(( 16r100000000000000 bitOr: 16r100000000000000) lowBit = 57).
-    self assert:(( 16r1000000000000000 bitOr: 16r1000000000000000) lowBit = 61).
-    self assert:(( 16r10000000000000000 bitOr: 16r10000000000000000) lowBit = 65).
-    self assert:(( (1 bitShift:1000) bitOr: (1 bitShift:1001)) lowBit = 1001).
-
-    "
-     self basicNew testHighBitLowBit
-    "
-
-    "Modified: / 05-07-2017 / 16:00:51 / cg"
-!
-
-testILC
-    "inline-cache"
-
-    self assert:((self checkIsInteger:1) == true).
-    self assert:((self checkIsInteger:nil) == false).
-    self assert:((self checkIsInteger:1) == true).
-    self assert:((self checkIsInteger:nil) == false).
-
-    self assert:((self checkIsInteger:0) == true).
-    self assert:((self checkIsInteger:nil) == false).
-    self assert:((self checkIsInteger:0) == true).
-    self assert:((self checkIsInteger:nil) == false).
-
-    "
-     self basicNew testILC
-    "
-
-    "Created: / 6.6.1999 / 14:47:51 / cg"
-    "Modified: / 9.6.1999 / 17:49:57 / cg"
-!
-
-testInline1
-    "inlined tests.
-     Notice, the arithmetic tests are both performed via regular sends
-     and via constructed performs. The reason is to test both inlined
-     JIT-compiler code AND the regular methods code."
-
-    self assert:( (self absPlusOneOf:1) = 2 ).
-    self assert:( (self absPlusOneOf:-1) = 2 ).
-    self assert:( (self absPlusOneOf:1.0) = 2 ).
-    self assert:( (self absPlusOneOf:-1.0) = 2 ).
-
-    "
-     self basicNew testInline1
-    "
-
-    "Created: / 31.10.2000 / 20:22:48 / cg"
-    "Modified: / 31.10.2000 / 20:23:06 / cg"
-!
-
-testInteger1
-    "general conversion & arithmetic tests.
-     Notice, the arithmetic tests are both performed via regular sends
-     and via constructed performs. The reason is to test both inlined
-     JIT-compiler code AND the regular method's code."
-
-    |minVal maxVal maxValPlus1 minValMinus1 halfMin halfMax t|
-
-    minVal := SmallInteger perform:('minVal' asSymbol).
-    maxVal := SmallInteger perform:('maxVal' asSymbol).
-
-    self assert:(minVal class == SmallInteger).
-    self assert:(maxVal class == SmallInteger).
-
-    self assert:(minVal == self num_smallInt_minVal).
-    self assert:(maxVal == self num_smallInt_maxVal).
-
-    self assert:(minVal == SmallInteger minVal).
-    self assert:(maxVal == SmallInteger maxVal).
-
-    t := SmallInteger perform:('maxBytes' asSymbol).
-    self assert:(t == SmallInteger maxBytes).
-    t := SmallInteger perform:('maxBits' asSymbol).
-    self assert:(t == SmallInteger maxBits).
-
-    self testPrinting1.
-
-    self assert:(SmallInteger maxBytes == ExternalAddress pointerSize).
-    "/ again, preventing inlining by compiler
-    self assert:(SmallInteger perform:#maxBytes) == (ExternalAddress perform:#pointerSize).
-    self assert:(SmallInteger perform:'maxBytes' asSymbol) == (ExternalAddress perform:'pointerSize' asSymbol).
-
-    SmallInteger maxBytes == 4 ifTrue:[
-        self assert:(minVal hexPrintString = '-40000000').
-        self assert:(maxVal hexPrintString = '3FFFFFFF').
-        self assert:(minVal == -1073741824).
-        self assert:(maxVal == 1073741823).
-        maxValPlus1 := 1073741824.
-        minValMinus1 := -1073741825.
-        self assert:(minValMinus1 hexPrintString = '-40000001').
-        self assert:(maxValPlus1 hexPrintString = '40000000').
-        halfMin := 16r-20000000.
-        halfMax := 16r20000000.
-    ].
-    SmallInteger maxBytes == 8 ifTrue:[
-        self assert:(minVal hexPrintString = '-4000000000000000').
-        self assert:(maxVal hexPrintString = '3FFFFFFFFFFFFFFF').
-        self assert:(minVal == -4611686018427387904).
-        self assert:(maxVal == 4611686018427387903).
-        maxValPlus1 := 4611686018427387904.
-        minValMinus1 := -4611686018427387905.
-        self assert:(minValMinus1 hexPrintString = '-4000000000000001').
-        self assert:(maxValPlus1 hexPrintString = '4000000000000000').
-        halfMin := 16r-2000000000000000.
-        halfMax := 16r2000000000000000.
-    ].
-    
-    self assert:(minValMinus1 class == LargeInteger).
-    self assert:(maxValPlus1 class == LargeInteger).
-
-    "arithmetic overFlow checks"
-
-"/    self assert:((maxVal + 1) inspect.maxValPlus1 inspect. true).
-    self assert:((maxVal perform:'+' asSymbol with:1) = maxValPlus1).
-    self assert:((maxVal + 1) = maxValPlus1).
-    self assert:((minVal perform:'-' asSymbol with:1) = minValMinus1).
-    self assert:((minVal - 1) = minValMinus1).
-
-    self assert:((halfMax perform:'+' asSymbol with:halfMax) = maxValPlus1).
-    self assert:((halfMax + halfMax) = maxValPlus1).
-    self assert:((halfMin perform:'+' asSymbol with:halfMin) == minVal).
-    self assert:((halfMin + halfMin) == minVal).
-    self assert:((halfMax perform:'*' asSymbol with:2) = maxValPlus1).
-    self assert:((halfMax * 2) = maxValPlus1).
-    self assert:((halfMin perform:'*' asSymbol with:2) == minVal).
-    self assert:((halfMin * 2) == minVal).
-    self assert:((maxValPlus1 perform:'//' asSymbol with:2) == halfMax).
-    self assert:((maxValPlus1 // 2) == halfMax).
-    self assert:((halfMax perform:'bitShift:' asSymbol with:1) = maxValPlus1).
-    self assert:((halfMin perform:'bitShift:' asSymbol with:1) == minVal).
-    self assert:((halfMax bitShift:1) = maxValPlus1).
-    self assert:((halfMin bitShift:1) == minVal).
-
-    "LargeInt op -> SmallInt result"
-    t := maxVal + 1.
-    self assert:(t - 1 == maxVal).
-    t := minVal - 1.
-    self assert:(t + 1 == minVal).
-
-    "
-     self basicNew testInteger1
-    "
-
-    "Modified: / 19-09-2017 / 16:27:24 / stefan"
-    "Modified: / 10-10-2017 / 12:13:02 / cg"
-!
-
-testIntegerMisc
-    "misc tests.
-     Notice, the arithmetic tests are both performed via regular sends
-     and via constructed performs. The reason is to test both inlined
-     JIT-compiler code AND the regular methods code."
-
-    |n1 n2 s|
-
-    n1 := 100000.
-    n2 := n1 negated.
-    s := 1.
-
-    self assert:(n1 printString = '100000').
-
-    self assert:(n1 negated printString = '-100000').
-    self assert:((n1 perform:'negated' asSymbol) printString = '-100000').
-
-    self assert:(n1 negated abs printString = '100000').
-    self assert:((n1 perform:'negated' asSymbol) abs printString = '100000').
-
-    self assert:(n1 abs negated printString = '-100000').
-    self assert:((n1 perform:'abs' asSymbol) negated printString = '-100000').
-
-    n1 := SmallInteger maxVal.
-    self assert:(n1 negated class == SmallInteger).
-    self assert:((n1 perform:'negated' asSymbol) class == SmallInteger).
-
-    n1 := SmallInteger minVal.
-    self assert:(n1 class == SmallInteger).
-    "/ Transcript showCR:n1 printString.
-    "/ Transcript showCR:n1 negated printString.
-    "/ Transcript showCR:n1 negated class printString.
-    self assert:(n1 negated class == LargeInteger).
-    self assert:((n1 perform:'negated' asSymbol) class == LargeInteger).
-
-    n1 := SmallInteger maxVal.
-    self assert:(n1 negated negated class == SmallInteger).
-    self assert:(((n1 perform:'negated' asSymbol) perform:'negated' asSymbol) class == SmallInteger).
-
-    n1 := SmallInteger minVal.
-    self assert:(n1 negated negated class == SmallInteger).
-    self assert:(((n1 perform:'negated' asSymbol) perform:'negated' asSymbol) class == SmallInteger).
-
-    n1 := SmallInteger minVal negated - 1.
-    self assert:(n1 negated class == SmallInteger).
-    self assert:((n1 perform:'negated' asSymbol) class == SmallInteger).
-    self assert:(n1 == SmallInteger maxVal).
-
-    "
-     self basicNew testIntegerMisc
-    "
-
-    "Created: / 6.6.1999 / 14:47:51 / cg"
-    "Modified: / 9.6.1999 / 17:49:57 / cg"
-!
-
-testIntegerMisc2
-    "misc tests.
-     Notice, the arithmetic tests are both performed via regular sends
-     and via constructed performs. The reason is to test both inlined
-     JIT-compiler code AND the regular methods code."
-
-    |n sel|
-
-    "/ fib is optional
-    (0 respondsTo:#fib) ifFalse:[^ self].
-
-    self assert:(0 fib == 0).
-    self assert:(1 fib == 1).
-    self assert:(2 fib == 1).
-    self assert:(3 fib == 2).
-    self assert:(4 fib == 3).
-    self assert:(5 fib == 5).
-    self assert:(6 fib == 8).
-    self assert:(7 fib == 13).
-
-    n := 0.
-    self assert:(n fib == 0).
-    n := 1.
-    self assert:(n fib == 1).
-    n := 2.
-    self assert:(n fib == 1).
-    n := 3.
-    self assert:(n fib == 2).
-    n := 4.
-    self assert:(n fib == 3).
-    n := 5.
-    self assert:(n fib == 5).
-    n := 6.
-    self assert:(n fib == 8).
-    n := 7.
-    self assert:(n fib == 13).
-
-    #(0 1 2 3 4 5 6 7)
-    with:#(0 1 1 2 3 5 8 13)
-    do:[:n :rslt |
-	self assert:(n fib == rslt).
-    ].
-
-"/    #(0 1 2 3 4 5 6 7)
-"/    with:#(0 1 1 2 3 5 8 13)
-"/    do:[:n :rslt |
-"/        self assert:(n fib_recursive == rslt).
-"/    ].
-
-    sel := #fib.
-    self assert:((0 perform:sel) == 0).
-    self assert:((1 perform:sel) == 1).
-    self assert:((2 perform:sel) == 1).
-    self assert:((3 perform:sel) == 2).
-    self assert:((4 perform:sel) == 3).
-    self assert:((5 perform:sel) == 5).
-    self assert:((6 perform:sel) == 8).
-    self assert:((7 perform:sel) == 13).
-
-    "
-     self basicNew testIntegerMisc2
-    "
-!
-
-testIntegerShifts
-    "arithmetic tests.
-     Notice, the arithmetic tests are both performed via regular sends
-     and via constructed performs. The reason is to test both inlined
-     JIT-compiler code AND the regular methods code."
-
-    self testIntegerShifts1.
-    self testIntegerShifts2.
-
-    self assert:(
-     (((0 to:64) collect:[:s | 1 bitShift:s])
-	collect:[:n | n highBit]) = (1 to:65)
-    ).
-
-    1 to:10000 do:[:s |
-	self assert:( (1 bitShift:s) highBit == (s+1) )
-    ].
-    1 to:10000 do:[:s |
-	self assert:( ((1 bitShift:s) - 1) highBit == s )
-    ].
-
-    "
-     self basicNew testIntegerShifts
-    "
-
-    "Created: / 6.6.1999 / 14:47:51 / cg"
-    "Modified: / 9.6.1999 / 17:49:57 / cg"
-!
-
-testIntegerShifts1
-    "arithmetic tests.
-     Notice, the arithmetic tests are both performed via regular sends
-     and via constructed performs. The reason is to test both inlined
-     JIT-compiler code AND the regular methods code."
-
-    |n1 n2 s|
-
-    n1 := 100000.
-    n2 := n1 negated.
-    s := 1.
-
-    self assert:(n1 printString = '100000').
-    self assert:(n2 printString = '-100000').
-
-    self assert:((n1 bitShift:s) printString = '200000').
-    self assert:((n1 bitShift:1) printString = '200000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '200000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:1) printString = '200000').
-
-    s := s + 1.
-    self assert:((n1 bitShift:s) printString = '400000').
-    self assert:((n1 bitShift:2) printString = '400000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '400000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:2) printString = '400000').
-
-    s := s + 1.
-    self assert:((n1 bitShift:s) printString = '800000').
-    self assert:((n1 bitShift:3) printString = '800000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '800000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:3) printString = '800000').
-
-    s := s + 1.
-    self assert:((n1 bitShift:s) printString = '1600000').
-    self assert:((n1 bitShift:4) printString = '1600000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '1600000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:4) printString = '1600000').
-
-    s := s + 1.
-    self assert:((n1 bitShift:s) printString = '3200000').
-    self assert:((n1 bitShift:5) printString = '3200000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '3200000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:5) printString = '3200000').
-
-    s := s + 1.
-    self assert:((n1 bitShift:s) printString = '6400000').
-    self assert:((n1 bitShift:6) printString = '6400000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '6400000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:6) printString = '6400000').
-
-    s := s + 1.
-    self assert:((n1 bitShift:s) printString = '12800000').
-    self assert:((n1 bitShift:7) printString = '12800000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '12800000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:7) printString = '12800000').
-
-    "
-     self basicNew testIntegerShifts1
-    "
-
-    "Created: / 6.6.1999 / 14:47:51 / cg"
-    "Modified: / 9.6.1999 / 17:49:57 / cg"
-!
-
-testIntegerShifts2
-    "arithmetic tests.
-     Notice, the arithmetic tests are both performed via regular sends
-     and via constructed performs. The reason is to test both inlined
-     JIT-compiler code AND the regular methods code."
-
-    |n1 s|
-
-    n1 := 12800000.
-    s := -1.
-    self assert:((n1 bitShift:s) printString = '6400000').
-    self assert:((n1 bitShift:-1) printString = '6400000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '6400000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:-1) printString = '6400000').
-
-    s := s - 1.
-    self assert:((n1 bitShift:s) printString = '3200000').
-    self assert:((n1 bitShift:-2) printString = '3200000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '3200000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:-2) printString = '3200000').
-
-    s := s - 1.
-    self assert:((n1 bitShift:s) printString = '1600000').
-    self assert:((n1 bitShift:-3) printString = '1600000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '1600000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:-3) printString = '1600000').
-
-    s := s - 1.
-    self assert:((n1 bitShift:s) printString = '800000').
-    self assert:((n1 bitShift:-4) printString = '800000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '800000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:-4) printString = '800000').
-
-    s := s - 1.
-    self assert:((n1 bitShift:s) printString = '400000').
-    self assert:((n1 bitShift:-5) printString = '400000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '400000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:-5) printString = '400000').
-
-    s := s - 1.
-    self assert:((n1 bitShift:s) printString = '200000').
-    self assert:((n1 bitShift:-6) printString = '200000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '200000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:-6) printString = '200000').
-
-    s := s - 1.
-    self assert:((n1 bitShift:s) printString = '100000').
-    self assert:((n1 bitShift:-7) printString = '100000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '100000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:-7) printString = '100000').
-
-    s := s - 1.
-    self assert:((n1 bitShift:s) printString = '50000').
-    self assert:((n1 bitShift:-8) printString = '50000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '50000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:-8) printString = '50000').
-
-    s := s - 1.
-    self assert:((n1 bitShift:s) printString = '25000').
-    self assert:((n1 bitShift:-9) printString = '25000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '25000').
-    self assert:((n1 perform:'bitShift:' asSymbol with:-9) printString = '25000').
-
-    s := s - 1.
-    self assert:((n1 bitShift:s) printString = '12500').
-    self assert:((n1 bitShift:-10) printString = '12500').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '12500').
-    self assert:((n1 perform:'bitShift:' asSymbol with:-10) printString = '12500').
-
-    s := s - 1.
-    self assert:((n1 bitShift:s) printString = '6250').
-    self assert:((n1 bitShift:-11) printString = '6250').
-    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '6250').
-    self assert:((n1 perform:'bitShift:' asSymbol with:-11) printString = '6250').
-
-    "
-     self basicNew testIntegerShifts2
-    "
-
-    "Created: / 6.6.1999 / 14:47:51 / cg"
-    "Modified: / 9.6.1999 / 17:49:57 / cg"
-!
-
-testIntegerShifts3
-    "arithmetic tests.
-     Notice, the arithmetic tests are both performed via regular sends
-     and via constructed performs. The reason is to test both inlined
-     JIT-compiler code AND the regular methods code."
-
-    self assert:( self doConstantIntegerShift == 1).
-
-    "
-     self basicNew testIntegerShifts3
-    "
-!
-
-testIntegerShifts4
-    "arithmetic tests.
-     Notice, the arithmetic tests are both performed via regular sends
-     and via constructed performs. The reason is to test both inlined
-     JIT-compiler code AND the regular methods code."
-
-    |a|
-
-    a := 16r1234.
-
-    self assert:( ((a bitShift:-4) bitAnd:16rFF) == 16r23 ).
-    self assert:( ((a bitShift:-8) bitAnd:16rFF) == 16r12 ).
-    self assert:( ((a bitShift:-12) bitAnd:16rFF) == 16r1 ).
-    self assert:( ((a bitShift:-16) bitAnd:16rFF) == 0 ).
-
-    "/ should not shift in any sign bits ...
-    a := 16r1FFFFFFF.
-    self assert:( (a bitShift:-4) == 16r1FFFFFF ).
-    a := 16r3FFFFFFF.
-    self assert:( (a bitShift:-4) == 16r3FFFFFF ).
-    a := 16r7FFFFFFF.
-    self assert:( (a bitShift:-4) == 16r7FFFFFF ).
-    a := 16rFFFFFFFF.
-    self assert:( (a bitShift:-4) == 16rFFFFFFF ).
-    a := 16r1FFFFFFFF.
-    self assert:( (a bitShift:-4) == 16r1FFFFFFF ).
-
-    a := 16r1FFFFFFF.
-    self assert:( (a bitShift:-8) == 16r1FFFFF ).
-    a := 16r3FFFFFFF.
-    self assert:( (a bitShift:-8) == 16r3FFFFF ).
-    a := 16r7FFFFFFF.
-    self assert:( (a bitShift:-8) == 16r7FFFFF ).
-    a := 16rFFFFFFFF.
-    self assert:( (a bitShift:-8) == 16rFFFFFF ).
-    a := 16r1FFFFFFFF.
-    self assert:( (a bitShift:-8) == 16r1FFFFFF ).
-
-    "
-     self basicNew testIntegerShifts4
-    "
-!
-
-testIsPowerOfTwo
-    self assert:(1 isPowerOfTwo).
-    self assert:(2 isPowerOfTwo).
-    self assert:(4 isPowerOfTwo).
-    self assert:(3 isPowerOfTwo not).
-    self assert:(16r100000000000000000000000 isPowerOfTwo).
-    self assert:(16r300000000000000000000000 isPowerOfTwo not).
-
-    "
-     self basicNew testIsPowerOfTwo
-    "
-
-    "Created: / 27-04-2010 / 10:35:36 / cg"
-!
-
 testLargeAddition
     "general conversion & arithmetic tests.
      Notice, the arithmetic tests are both performed via regular sends
@@ -2314,225 +2361,6 @@
     "Modified: / 27.11.1999 / 16:41:54 / cg"
 !
 
-testLargeBitOperations
-    "large bit operations test."
-
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFF) hexPrintString = '2211'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFF) hexPrintString  = '332211'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFF) hexPrintString = '44332211'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFF) hexPrintString = '5544332211'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFF) hexPrintString = '665544332211'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFF) hexPrintString = '77665544332211'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFF) hexPrintString = '8877665544332211'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFFFF) hexPrintString = '998877665544332211'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'AA998877665544332211'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'BBAA998877665544332211'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'CCBBAA998877665544332211'.
-
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFF) hexPrintString = 'FFEEDDCCBBAA99887766554433FFFF'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFF) hexPrintString  = 'FFEEDDCCBBAA998877665544FFFFFF'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFF) hexPrintString = 'FFEEDDCCBBAA9988776655FFFFFFFF'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBAA99887766FFFFFFFFFF'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBAA998877FFFFFFFFFFFF'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBAA9988FFFFFFFFFFFFFF'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBAA99FFFFFFFFFFFFFFFF'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBAAFFFFFFFFFFFFFFFFFF'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBFFFFFFFFFFFFFFFFFFFF'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCFFFFFFFFFFFFFFFFFFFFFF'.
-     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDFFFFFFFFFFFFFFFFFFFFFFFF'.
-
-    Time millisecondsToRun:[
-        1000000 timesRepeat:[
-            (16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFFFFFFFFFF)
-        ]
-    ].
-    "/ bitAnd inherited via Integer:  1638 1575 1576
-    "/ bitAnd tuned in largeInteger:  172 171 172
-
-    Time millisecondsToRun:[
-        1000000 timesRepeat:[
-            (16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFFFFFFFFFF)
-        ]
-    ].
-    "/ bitOr inherited via Integer:  1903 1856 1856
-
-    self assert:( 16r800008 signExtendedFromBit:4 ) = -8. 
-    self assert:( 16r7FFF07 signExtendedFromBit:4 ) = 7.     
-    self assert:( 16r7FFF0F signExtendedFromBit:4 ) = -1.    
-
-    self assert:( 16rFFFFFF signExtendedFromBit:8 ) = -1.   
-    self assert:( 16rFFFF7F signExtendedFromBit:8 ) = 16r7F.   
-
-    self assert:( 16rFFFFFF signExtendedByteValue ) = -1.   
-    self assert:( 16rFFFF7F signExtendedByteValue ) = 16r7F.   
-
-    self assert:( 16rFFFF signExtendedShortValue ) = -1.   
-    self assert:( 16r7FFF signExtendedShortValue ) = 16r7FFF.   
-    self assert:( 16rFFFFFFFF signExtendedShortValue ) = -1.   
-    self assert:( 16rFFFF7FFF signExtendedShortValue ) = 16r7FFF.   
-    self assert:( 16rFFFFFFFFFF signExtendedShortValue ) = -1.   
-    self assert:( 16rFFFFFF7FFF signExtendedShortValue ) = 16r7FFF.   
-    self assert:( 16rFFFFFFFFFFFF signExtendedShortValue ) = -1.   
-    self assert:( 16rFFFFFFFF7FFF signExtendedShortValue ) = 16r7FFF.   
-
-    self assert:( 16rFFFFFFFF signExtendedLongValue ) = -1.   
-    self assert:( 16r7FFFFFFF signExtendedLongValue ) = 2147483647.   
-    self assert:( 16r80000000 signExtendedLongValue ) = -2147483648.   
-    self assert:( 16rFFFFFFFFFFFF signExtendedLongValue ) = -1.   
-    self assert:( 16rFFFF7FFFFFFF signExtendedLongValue ) = 2147483647.   
-    self assert:( 16rFFFF80000000 signExtendedLongValue ) = -2147483648.   
-    self assert:( 16rFFFFFFFFFFFFFFFF signExtendedLongValue ) = -1.   
-    self assert:( 16rFFFFFFFF7FFFFFFF signExtendedLongValue ) = 2147483647.   
-    self assert:( 16rFFFFFFFF80000000 signExtendedLongValue ) = -2147483648.   
-
-    self assert:( 16rFFFFFFFFFFFFFFFF signExtendedLongLongValue ) = -1.   
-    self assert:( 16r7FFFFFFFFFFFFFFF signExtendedLongLongValue ) = 16r7FFFFFFFFFFFFFFF.   
-    self assert:( 16rFFFFFFFFFFFFFFFFFFFF signExtendedLongLongValue ) = -1.   
-    self assert:( 16rFFFF7FFFFFFFFFFFFFFF signExtendedLongLongValue ) = 16r7FFFFFFFFFFFFFFF.   
-
-    "
-     self basicNew testLargeBitOperations
-    "
-
-    "Modified: / 26-02-2016 / 19:47:25 / cg"
-!
-
-testLargeCompare
-    "compare tests"
-
-    #(
-        ( 16r3fffffff 16r40000000 #less )
-        ( 16r40000000 16r3fffffff #greater )
-        ( 16r40000000 16r40000000 #equal )
-
-        ( 16r40000000 16r40000001 #less )
-        ( 16r40000001 16r40000000 #greater )
-        ( 16r40000001 16r40000001 #equal )
-        
-        ( 16r3fffffffffffffff 16r4000000000000000 #less )
-        ( 16r4000000000000000 16r3fffffffffffffff #greater )
-        ( 16r4000000000000000 16r4000000000000000 #equal )
-
-        ( 16r4000000000000000 16r4000000000000001 #less )
-        ( 16r4000000000000001 16r4000000000000000 #greater )
-        ( 16r4000000000000001 16r4000000000000001 #equal )
-
-        ( 16r3fffffffffffffffffffffff 16r400000000000000000000000 #less )
-        ( 16r400000000000000000000000 16r3fffffffffffffffffffffff #greater )
-        ( 16r400000000000000000000000 16r400000000000000000000000 #equal )
-
-        ( 16r400000000000000000000000 16r400000000000000000000001 #less )
-        ( 16r400000000000000000000001 16r400000000000000000000000 #greater )
-        ( 16r400000000000000000000001 16r400000000000000000000001 #equal )
-
-        ( 16r3fffffff 16r400000000000 #less )
-        ( 16r400000000000 16r3fffffff #greater )
-
-        ( 16r40000000 16r400000000001 #less )
-        ( 16r400000000001 16r40000000 #greater )
-
-        ( 16r3fffffffffffffff 16r40000000000000000000 #less )
-        ( 16r40000000000000000000 16r3fffffffffffffff #greater )
-
-        ( 16r4000000000000000 16r40000000000000000001 #less )
-        ( 16r40000000000000000001 16r4000000000000000 #greater )
-
-        ( 16r3fffffffffffffffffffffff 16r400000000000000000000000 #less )
-        ( 16r400000000000000000000000 16r3fffffffffffffffffffffff #greater )
-        ( 16r400000000000000000000000 16r400000000000000000000000 #equal )
-
-        ( 16r400000000000000000000000 16r400000000000000000000001 #less )
-        ( 16r400000000000000000000001 16r400000000000000000000000 #greater )
-        ( 16r400000000000000000000001 16r400000000000000000000001 #equal )
-    ) do:[:triple |
-        |v1 v2 expected rslt|
-        
-        v1 := triple at:1.
-        v2 := triple at:2.
-        expected := triple at:3.
-        expected == #less ifTrue:[
-            self assert:(v1 < v2).
-            self assert:(v1 <= v2).
-            self assert:(v1 > v2) not.
-            self assert:(v1 >= v2) not.
-            self assert:(v1 = v2) not.
-            self assert:(v1 ~= v2).
-        ].    
-        expected == #greater ifTrue:[
-            self assert:(v1 > v2).
-            self assert:(v1 >= v2).
-            self assert:(v1 < v2) not.
-            self assert:(v1 <= v2) not.
-            self assert:(v1 = v2) not.
-            self assert:(v1 ~= v2).
-        ].    
-        expected == #equal ifTrue:[
-            self assert:(v1 > v2) not.
-            self assert:(v1 >= v2).
-            self assert:(v1 < v2) not.
-            self assert:(v1 <= v2).
-            self assert:(v1 = v2).
-            self assert:(v1 ~= v2) not.
-        ].    
-    ].
-    self assert:(100 factorial < 101 factorial).
-    self assert:(100 factorial > 100 factorial negated).
-    
-    "
-     self basicNew testLargeCompare
-    "
-!
-
-testLargeCompression1
-    |l nullBytes|
-
-    #(
-	#[ 1 ]          16r01
-	#[ 1 2 ]        16r0201
-	#[ 1 2 3]       16r030201
-	#[ 1 2 3 4]     16r04030201
-    ) pairWiseDo:[:bytes :expected |
-	0 to:16 do:[:nNullBytes |
-	    nullBytes := ByteArray new:nNullBytes withAll:0.
-	    l := LargeInteger digitBytes:(bytes , nullBytes).
-	    self assert:( l compressed == expected ).
-	].
-    ].
-
-    #(
-	#[ 1 2 3 4 5]       16r0504030201
-	#[ 1 2 3 4 5 6]     16r060504030201
-	#[ 1 2 3 4 5 6 7]   16r07060504030201
-	#[ 1 2 3 4 5 6 7 8] 16r0807060504030201
-    ) pairWiseDo:[:bytes :expected |
-	0 to:16 do:[:nNullBytes |
-	    nullBytes := ByteArray new:nNullBytes withAll:0.
-	    l := LargeInteger digitBytes:(bytes , nullBytes).
-	    ExternalAddress pointerSize == 8 ifTrue:[
-		self assert:( l compressed == expected ).
-	    ] ifFalse:[
-		self assert:( l compressed = expected ).
-	    ]
-	]
-    ].
-
-    #(
-	#[ 1 2 3 4 5 6 7 8 9]       16r090807060504030201
-	#[ 1 2 3 4 5 6 7 8 9 10]    16r0a090807060504030201
-	#[ 1 2 3 4 5 6 7 8 9 10 11] 16r0b0a090807060504030201
-    ) pairWiseDo:[:bytes :expected |
-	0 to:16 do:[:nNullBytes |
-	    nullBytes := ByteArray new:nNullBytes withAll:0.
-	    l := LargeInteger digitBytes:(bytes , nullBytes).
-	    self assert:( l compressed = expected ).
-	]
-    ].
-
-    "
-     self basicNew testLargeCompression1
-    "
-!
-
 testLargeDivision
     |t a b|
 
@@ -2936,368 +2764,6 @@
     "Created: / 05-07-2017 / 16:37:06 / cg"
 !
 
-testLargeIntegerHelpers
-    |t1 t2|
-
-    "/ mul2
-
-    t1 := 16r12345678901234567890.
-    t2 := t1 deepCopy.
-    self assert:(t2 mul2 = (t1 * 2)).
-
-    t1 := 16r1234567890123456789012345678901234567890.
-    t2 := t1 deepCopy.
-    self assert:(t2 mul2 = (t1 * 2)).
-
-    t1 := 16r123456789012345678901234567890123456789012345678901234567890.
-    t2 := t1 deepCopy.
-    self assert:(t2 mul2 = (t1 * 2)).
-
-    t1 := 16r12345678901234567890123456789012345678901234567890123456789012345678901234567890.
-    t2 := t1 deepCopy.
-    self assert:(t2 mul2 = (t1 * 2)).
-
-    t1 := 10000 factorial.
-    t2 := t1 deepCopy.
-    self assert:(t2 mul2 = (t1 * 2)).
-
-    t1 := 16r123456789012345678901234567890123456789012345678901234567890.
-    t2 := t1 deepCopy.
-    self assert:(t2 mul2 = (t1 * 2)).
-
-"/    t1 := 1000 factorial.
-"/    t := Time millisecondsToRun:[ 100000 timesRepeat:[ t1 mul2. ] ].
-"/    Transcript showCR:t.
-
-    "/ div2
-
-    t1 := 16r12345678901234567890.
-    t2 := t1 deepCopy.
-
-    t2 div2.
-    "/ do not compare t2 = t1 // x, because t2 may be unnormalized
-    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
-
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 4) printStringRadix:16).
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 8) printStringRadix:16).
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 16) printStringRadix:16).
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 32) printStringRadix:16).
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 64) printStringRadix:16).
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 128) printStringRadix:16).
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 256) printStringRadix:16).
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 512) printStringRadix:16).
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 1024) printStringRadix:16).
-
-    t1 := 16r1234567890123456789012345678901234567890.
-    t2 := t1 deepCopy.
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
-
-    t1 := 16r123456789012345678901234567890123456789012345678901234567890.
-    t2 := t1 deepCopy.
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
-
-    t1 := 16r12345678901234567890123456789012345678901234567890123456789012345678901234567890.
-    t2 := t1 deepCopy.
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 4) printStringRadix:16).
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 8) printStringRadix:16).
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 16) printStringRadix:16).
-
-    t1 := 10000 factorial.
-    t2 := t1 deepCopy.
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
-
-    t1 := 16r123456789012345678901234567890123456789012345678901234567890.
-    t2 := t1 deepCopy.
-    t2 div2.
-    self assert:(t2 printStringRadix:16) = ((t1 // 2) printStringRadix:16).
-
-    t1 := 12345678901234567890.
-    t2 := t1 divMod:1000.
-    self assert:(t2 at:1) = 12345678901234567.
-    self assert:(t2 at:2) = 890.
-
-
-    "
-     self basicNew testLargeIntegerHelpers
-    "
-
-    "Modified: / 20.5.1999 / 09:41:19 / cg"
-!
-
-testLargeIntegerHelpers2
-    |t1 r|
-
-    "/ absSubtract:
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r00ffffffffffffffff.
-    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == true).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r010000000000000000.
-    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == false).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r00ffffffffffffffffff.
-    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == true).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r01000000000000000000.
-    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == false).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffff.
-    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == true).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r0100000000000000000000.
-    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == false).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffff.
-    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == true).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r010000000000000000000000.
-    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == false).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffff.
-    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == true).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r01000000000000000000000000.
-    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == false).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffff.
-    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == true).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r0100000000000000000000000000.
-    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == false).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffffff.
-    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == true).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r010000000000000000000000000000.
-    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == false).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r00ffffffffffffffffffffffffffffff.
-    self assert:(t1 digitBytes = #[16r01 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == true).
-
-    t1 := LargeInteger digitBytes:#[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r01 ] copy sign:1.
-    r := t1 absDestructiveSubtract:16r01000000000000000000000000000000.
-    self assert:(t1 digitBytes = #[16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 16r00 ]).
-    self assert:(r == false).
-    "
-     self basicNew testLargeIntegerHelpers2
-    "
-!
-
-testLargeIntegerHelpers3
-    "/ absDivMod:
-
-     self assert:(9000000000000000000 absDivMod: 4000) = #(2250000000000000 0).
-     self assert:(-9000000000000000000 absDivMod: 4000) = #(2250000000000000 0).
-     self assert:(9000000000000000000 absDivMod: -4000) = #(2250000000000000 0).
-     self assert:(-9000000000000000000 absDivMod: -4000) = #(2250000000000000 0).
-
-     self assert:(9000000000000000001 absDivMod: 4000) = #(2250000000000000 1).
-     self assert:(-9000000000000000001 absDivMod: 4000) = #(2250000000000000 1).
-     self assert:(9000000000000000001 absDivMod: -4000) = #(2250000000000000 1).
-     self assert:(-9000000000000000001 absDivMod: -4000) = #(2250000000000000 1).
-
-     self assert:(9000000000000000000 absDivMod: 40000) = #(225000000000000 0).
-     self assert:(-9000000000000000000 absDivMod: 40000) = #(225000000000000 0).
-     self assert:(9000000000000000000 absDivMod: -40000) = #(225000000000000 0).
-     self assert:(-9000000000000000000 absDivMod: -40000) = #(225000000000000 0).
-
-     self assert:(9000000000000000000 absDivMod: 400000) = #(22500000000000 0).
-     self assert:(-9000000000000000000 absDivMod: 400000) = #(22500000000000 0).
-     self assert:(9000000000000000000 absDivMod: -400000) = #(22500000000000 0).
-     self assert:(-9000000000000000000 absDivMod: -400000) = #(22500000000000 0).
-
-     self assert:(9000000000000000000 absDivMod: 4000000) = #(2250000000000 0).
-     self assert:(-9000000000000000000 absDivMod: 4000000) = #(2250000000000 0).
-     self assert:(9000000000000000000 absDivMod: -4000000) = #(2250000000000 0).
-     self assert:(-9000000000000000000 absDivMod: -4000000) = #(2250000000000 0).
-
-     self assert:(9000000000000000000 absDivMod: 40000000) = #(225000000000 0).
-     self assert:(-9000000000000000000 absDivMod: 40000000) = #(225000000000 0).
-     self assert:(9000000000000000000 absDivMod: -40000000) = #(225000000000 0).
-     self assert:(-9000000000000000000 absDivMod: -40000000) = #(225000000000 0).
-
-     self assert:(9000000000000000000 absDivMod: 400000000) = #(22500000000 0).
-     self assert:(-9000000000000000000 absDivMod: 400000000) = #(22500000000 0).
-     self assert:(9000000000000000000 absDivMod: -400000000) = #(22500000000 0).
-     self assert:(-9000000000000000000 absDivMod: -400000000) = #(22500000000 0).
-
-     self assert:(9000000000000000000 absDivMod: 4000000000) = #(2250000000 0).
-     self assert:(-9000000000000000000 absDivMod: 4000000000) = #(2250000000 0).
-     self assert:(9000000000000000000 absDivMod: -4000000000) = #(2250000000 0).
-     self assert:(-9000000000000000000 absDivMod: -4000000000) = #(2250000000 0).
-
-     self assert:(9000000000000000000 absDivMod: 40000000000) = #(225000000 0).
-     self assert:(-9000000000000000000 absDivMod: 40000000000) = #(225000000 0).
-     self assert:(9000000000000000000 absDivMod: -40000000000) = #(225000000 0).
-     self assert:(-9000000000000000000 absDivMod: -40000000000) = #(225000000 0).
-
-     self assert:(9000000000000000000 absDivMod: 400000000000) = #(22500000 0).
-     self assert:(-9000000000000000000 absDivMod: 400000000000) = #(22500000 0).
-     self assert:(9000000000000000000 absDivMod: -400000000000) = #(22500000 0).
-     self assert:(-9000000000000000000 absDivMod: -400000000000) = #(22500000 0).
-
-     self assert:(9000000000000000000 absDivMod: 4000000000000) = #(2250000 0).
-     self assert:(-9000000000000000000 absDivMod: 4000000000000) = #(2250000 0).
-     self assert:(9000000000000000000 absDivMod: -4000000000000) = #(2250000 0).
-     self assert:(-9000000000000000000 absDivMod: -4000000000000) = #(2250000 0).
-
-     self assert:(9000000000000000000 absDivMod: 40000000000000) = #(225000 0).
-     self assert:(-9000000000000000000 absDivMod: 40000000000000) = #(225000 0).
-     self assert:(9000000000000000000 absDivMod: -40000000000000) = #(225000 0).
-     self assert:(-9000000000000000000 absDivMod: -40000000000000) = #(225000 0).
-
-     self assert:(9000000000000000000 absDivMod: 400000000000000) = #(22500 0).
-     self assert:(-9000000000000000000 absDivMod: 400000000000000) = #(22500 0).
-     self assert:(9000000000000000000 absDivMod: -400000000000000) = #(22500 0).
-     self assert:(-9000000000000000000 absDivMod: -400000000000000) = #(22500 0).
-
-     self assert:(9000000000000000000 absDivMod: 4000000000000000) = #(2250 0).
-     self assert:(-9000000000000000000 absDivMod: 4000000000000000) = #(2250 0).
-     self assert:(9000000000000000000 absDivMod: -4000000000000000) = #(2250 0).
-     self assert:(-9000000000000000000 absDivMod: -4000000000000000) = #(2250 0).
-
-     self assert:(9000000000000000000 absDivMod: 4000000000000000000) = #(2 1000000000000000000).
-     self assert:(-9000000000000000000 absDivMod: 4000000000000000000) = #(2 1000000000000000000).
-     self assert:(9000000000000000000 absDivMod: -4000000000000000000) = #(2 1000000000000000000).
-     self assert:(-9000000000000000000 absDivMod: -4000000000000000000) = #(2 1000000000000000000).
-
-    "
-     self basicNew testLargeIntegerHelpers3
-    "
-!
-
-testLargeIntegerHelpers4
-    "/ absDivMod:
-
-     self assert:(9000000000000000000 absMod: 4000) = 0.
-     self assert:(-9000000000000000000 absMod: 4000) = 0.
-     self assert:(9000000000000000000 absMod: -4000) = 0.
-     self assert:(-9000000000000000000 absMod: -4000) = 0.
-
-     self assert:(9000000000000000001 absMod: 4000) = 1.
-     self assert:(-9000000000000000001 absMod: 4000) = 1.
-     self assert:(9000000000000000001 absMod: -4000) = 1.
-     self assert:(-9000000000000000001 absMod: -4000) = 1.
-
-     self assert:(9000000000000000000 absMod: 40000) = 0.
-     self assert:(-9000000000000000000 absMod: 40000) = 0.
-     self assert:(9000000000000000000 absMod: -40000) = 0.
-     self assert:(-9000000000000000000 absMod: -40000) = 0.
-
-     self assert:(9000000000000000000 absMod: 400000) = 0.
-     self assert:(-9000000000000000000 absMod: 400000) = 0.
-     self assert:(9000000000000000000 absMod: -400000) = 0.
-     self assert:(-9000000000000000000 absMod: -400000) = 0.
-
-     self assert:(9000000000000000000 absMod: 4000000) = 0.
-     self assert:(-9000000000000000000 absMod: 4000000) = 0.
-     self assert:(9000000000000000000 absMod: -4000000) = 0.
-     self assert:(-9000000000000000000 absMod: -4000000) = 0.
-
-     self assert:(9000000000000000000 absMod: 40000000) = 0.
-     self assert:(-9000000000000000000 absMod: 40000000) = 0.
-     self assert:(9000000000000000000 absMod: -40000000) = 0.
-     self assert:(-9000000000000000000 absMod: -40000000) = 0.
-
-     self assert:(9000000000000000000 absMod: 400000000) = 0.
-     self assert:(-9000000000000000000 absMod: 400000000) = 0.
-     self assert:(9000000000000000000 absMod: -400000000) = 0.
-     self assert:(-9000000000000000000 absMod: -400000000) = 0.
-
-     self assert:(9000000000000000000 absMod: 4000000000) = 0.
-     self assert:(-9000000000000000000 absMod: 4000000000) = 0.
-     self assert:(9000000000000000000 absMod: -4000000000) = 0.
-     self assert:(-9000000000000000000 absMod: -4000000000) = 0.
-
-     self assert:(9000000000000000000 absMod: 40000000000) = 0.
-     self assert:(-9000000000000000000 absMod: 40000000000) = 0.
-     self assert:(9000000000000000000 absMod: -40000000000) = 0.
-     self assert:(-9000000000000000000 absMod: -40000000000) = 0.
-
-     self assert:(9000000000000000000 absMod: 400000000000) = 0.
-     self assert:(-9000000000000000000 absMod: 400000000000) = 0.
-     self assert:(9000000000000000000 absMod: -400000000000) = 0.
-     self assert:(-9000000000000000000 absMod: -400000000000) = 0.
-
-     self assert:(9000000000000000000 absMod: 4000000000000) = 0.
-     self assert:(-9000000000000000000 absMod: 4000000000000) = 0.
-     self assert:(9000000000000000000 absMod: -4000000000000) = 0.
-     self assert:(-9000000000000000000 absMod: -4000000000000) = 0.
-
-     self assert:(9000000000000000000 absMod: 40000000000000) = 0.
-     self assert:(-9000000000000000000 absMod: 40000000000000) = 0.
-     self assert:(9000000000000000000 absMod: -40000000000000) = 0.
-     self assert:(-9000000000000000000 absMod: -40000000000000) = 0.
-
-     self assert:(9000000000000000000 absMod: 400000000000000) = 0.
-     self assert:(-9000000000000000000 absMod: 400000000000000) = 0.
-     self assert:(9000000000000000000 absMod: -400000000000000) = 0.
-     self assert:(-9000000000000000000 absMod: -400000000000000) = 0.
-
-     self assert:(9000000000000000000 absMod: 4000000000000000) = 0.
-     self assert:(-9000000000000000000 absMod: 4000000000000000) = 0.
-     self assert:(9000000000000000000 absMod: -4000000000000000) = 0.
-     self assert:(-9000000000000000000 absMod: -4000000000000000) = 0.
-
-     self assert:(9000000000000000000 absMod: 4000000000000000000) = 1000000000000000000.
-     self assert:(-9000000000000000000 absMod: 4000000000000000000) = 1000000000000000000.
-     self assert:(9000000000000000000 absMod: -4000000000000000000) = 1000000000000000000.
-     self assert:(-9000000000000000000 absMod: -4000000000000000000) = 1000000000000000000.
-
-    "
-     self basicNew testLargeIntegerHelpers4
-    "
-
-    "Created: / 05-07-2017 / 16:15:30 / cg"
-!
-
 testLargeMultiplication
     |t1 t2 p|
 
@@ -3867,56 +3333,6 @@
     "
 !
 
-testMiscMath
-    self assert:(2 raisedTo:2) == 4.
-    self assert:(2 raisedTo:2.0) = 4.0.
-    self assert:(2 raisedTo:100) = 1267650600228229401496703205376.
-    
-    self assert:(((2 raisedTo:100) log:2) isAlmostEqualTo:100 nEpsilon:1) 
-         message:('(2^100)log2 is %1' bindWith:((2 raisedTo:100) log:2)).
-    self assert:(((2 raisedTo:100) integerLog2) == 100)
-         message:('(2^100)integerLog2 is %1' bindWith:((2 raisedTo:100) integerLog2)).
-
-    self assert:(((10 raisedTo:100) integerLog10) == 100)
-         message:('(10^100)integerLog10 is %1' bindWith:((10 raisedTo:100) integerLog10)).
-
-    "/ currently, integerLog10 does not work with largeInts
-    "/ self assert:(((10 raisedTo:1000) integerLog10) == 1000).
-
-    "
-     self basicNew testMiscMath
-    "
-
-    "Created: / 02-07-2017 / 00:52:25 / cg"
-    "Modified (comment): / 02-07-2017 / 14:39:26 / cg"
-    "Modified: / 22-07-2019 / 12:44:41 / Claus Gittinger"
-!
-
-testMiscMath2
-    self assert:(10000000000000000000000001 isPrime) not.
-    self assert:(76 factorial + 1) isPrime not.
-
-    "/ Would take far too long with fallback implementation.
-    PrimeNumberGenerator notNil ifTrue:[
-        self assert:(77 factorial + 1) isPrime.
-        self assert:(872 factorial + 1) isPrime.
-        self assert:(1000 factorial + 1) isPrime not.
-    ].
-
-    "
-    Time millisecondsToRun:[
-        1000000 factorial.
-    ].
-    "
-
-    "
-     self basicNew testMiscMath2
-    "
-
-    "Created: / 05-07-2017 / 16:18:54 / cg"
-    "Modified (comment): / 26-07-2017 / 12:48:11 / mawalch"
-!
-
 testModulu
     |a b op|
 
@@ -4129,95 +3545,6 @@
     self assert:(self doNegate2:SmallInteger minVal) = (SmallInteger maxVal + 1).
 !
 
-testNextPowerOfTwo
-    "/ self assert:(0 nextPowerOf2 = 0).
-    self assert:(1 nextPowerOf2 = 1).
-    self assert:(2 nextPowerOf2 = 2).
-    self assert:(3 nextPowerOf2 = 4).
-    self assert:(4 nextPowerOf2 = 4).
-    self assert:(5 nextPowerOf2 = 8).
-    self assert:(6 nextPowerOf2 = 8).
-    self assert:(7 nextPowerOf2 = 8).
-    self assert:(8 nextPowerOf2 = 8).
-    self assert:(9 nextPowerOf2 = 16).
-
-    self assert:(22 nextPowerOf2 = 32).
-    self assert:(32 nextPowerOf2 = 32).
-    self assert:(16rFFFF nextPowerOf2 = 16r10000).  
-    self assert:(16r1FFFFFFF nextPowerOf2 = 16r20000000).  
-    self assert:(16r3FFFFFFF nextPowerOf2 = 16r40000000).  
-    self assert:(16r7FFFFFFF nextPowerOf2 = 16r80000000).  
-    self assert:(16rFFFFFFFF nextPowerOf2 = 16r100000000). 
-    self assert:(16r1FFFFFFFFFFFFFFF nextPowerOf2 = 16r2000000000000000).  
-    self assert:(16r3FFFFFFFFFFFFFFF nextPowerOf2 = 16r4000000000000000).  
-    self assert:(16r7FFFFFFFFFFFFFFF nextPowerOf2 = 16r8000000000000000).  
-    self assert:(16rFFFFFFFFFFFFFFFF nextPowerOf2 = 16r10000000000000000).  
-    self assert:(16rFFFFFFFFFFFFFFFFFFFF nextPowerOf2 = 16r100000000000000000000).  
-
-    "
-     self basicNew testNextPowerOfTwo
-    "
-!
-
-testSignExtension
-    "/ 8bit
-    self assert:( 16r80 signExtendedByteValue = -128 ).
-    self assert:( 16r7F signExtendedByteValue = 127 ).  
-    self assert:( 16rFF signExtendedByteValue = -1 ).
-
-    "/ higher bits are ignored
-    self assert:( 16rF80 signExtendedByteValue = -128 ).
-    self assert:( 16rF7F signExtendedByteValue = 127 ).  
-    self assert:( 16rFFF signExtendedByteValue = -1 ).
-
-    "/ 16bit
-    self assert:( 16r8000 signExtendedShortValue = -32768 ).
-    self assert:( 16r7FFF signExtendedShortValue = 32767 ).  
-    self assert:( 16rFFFF signExtendedShortValue = -1 ).
-
-    "/ higher bits are ignored
-    self assert:( 16rF8000 signExtendedShortValue = -32768 ).
-    self assert:( 16rF7FFF signExtendedShortValue = 32767 ).  
-    self assert:( 16rFFFFF signExtendedShortValue = -1 ).
-
-    "/ 24bit
-    self assert:( 16r800000 signExtended24BitValue = -8388608 ).
-    self assert:( 16r7FFFFF signExtended24BitValue = 8388607 ).  
-    self assert:( 16rFFFFFF signExtended24BitValue = -1 ).
-
-    "/ higher bits are ignored
-    self assert:( 16rF800000 signExtended24BitValue = -8388608 ).
-    self assert:( 16rF7FFFFF signExtended24BitValue = 8388607 ).  
-    self assert:( 16rFFFFFFF signExtended24BitValue = -1 ).
-
-    "/ 32bit
-    self assert:( 16r80000000 signExtendedLongValue = -2147483648 ).
-    self assert:( 16r7FFFFFFF signExtendedLongValue = 2147483647 ).  
-    self assert:( 16rFFFFFFFF signExtendedLongValue = -1 ).
-
-    "/ higher bits are ignored
-    self assert:( 16rF80000000 signExtendedLongValue = -2147483648 ).
-    self assert:( 16rF7FFFFFFF signExtendedLongValue = 2147483647 ).  
-    self assert:( 16rFFFFFFFFF signExtendedLongValue = -1 ).
-
-    "/ 64bit
-    self assert:( 16r8000000000000000 signExtendedLongLongValue = -9223372036854775808 ).
-    self assert:( 16r7FFFFFFFFFFFFFFF signExtendedLongLongValue = 9223372036854775807 ).  
-    self assert:( 16rFFFFFFFFFFFFFFFF signExtendedLongLongValue = -1 ).
-
-    "/ higher bits are ignored
-    self assert:( 16rF8000000000000000 signExtendedLongLongValue = -9223372036854775808 ).
-    self assert:( 16rF7FFFFFFFFFFFFFFF signExtendedLongLongValue = 9223372036854775807 ).  
-    self assert:( 16rFFFFFFFFFFFFFFFFF signExtendedLongLongValue = -1 ).
-
-    "/ arbitrary nr of bits
-    self assert:( 2r1000 signExtendedFromBit:4) = -8 .
-    self assert:( 2r0111 signExtendedFromBit:4) = 7 .  
-    self assert:( 2r1111 signExtendedFromBit:4) = -1 .
-
-    "Created: / 21-07-2017 / 15:15:53 / cg"
-!
-
 testSmallIntegerArithmetic
     "arithmetic tests.
      Notice, the arithmetic tests are both performed via regular sends
@@ -5065,6 +4392,454 @@
     "Created: / 04-06-2019 / 00:58:47 / Claus Gittinger"
 !
 
+testByteSwap
+    "/ <testedMethods: #( (Integer >> #byteSwapped32) (Integer >> #byteSwapped64)) >
+
+    self assert:(16r1122 byteSwapped16) = 16r2211.
+    self assert:(16r2211 byteSwapped16) = 16r1122.
+
+    self assert:(16r11223344 byteSwapped32) = 16r44332211.
+    self assert:(16r44332211 byteSwapped32) = 16r11223344.
+
+    self assert:(16r11223344 byteSwapped64) = 16r4433221100000000.
+    self assert:(16r44332211 byteSwapped64) = 16r1122334400000000.
+
+    self assert:(16r8877665544332211 byteSwapped64) = 16r1122334455667788.
+    self assert:(16r1122334455667788 byteSwapped64) = 16r8877665544332211.
+
+    "/ higher bits are ignored!!
+    self assert:(16r33441122 byteSwapped16) = 16r2211.
+
+    self assert:(16r9911223344 byteSwapped32) = 16r44332211.
+    self assert:(16r8877665544332211 byteSwapped32) = 16r11223344.
+    self assert:(16r998877665544332211 byteSwapped64) = 16r1122334455667788.
+    self assert:(16r991122334455667788 byteSwapped64) = 16r8877665544332211.
+
+    "
+     self basicNew testByteSwap
+    "
+!
+
+testHighBitLowBit
+    self assert:( 2r0 highBit == 0).
+    self assert:( 2r1 highBit == 1).
+    self assert:( 2r10 highBit == 2).  
+    self assert:( 2r100 highBit == 3).  
+    self assert:( 2r1000 highBit == 4).  
+    self assert:( 16r10 highBit == 5).
+    self assert:( 16r100 highBit == 9).
+    self assert:( 16r1000 highBit == 13).
+    self assert:( 16r10000 highBit == 17).
+    self assert:( 16r100000 highBit == 21).
+    self assert:( 16r1000000 highBit == 25).
+    self assert:( 16r10000000 highBit == 29).
+    self assert:( 16r20000000 highBit == 30).
+    self assert:( 16r3FFFFFFF highBit == 30).
+    self assert:( 16r40000000 highBit == 31).
+    self assert:( 16r7FFFFFFF highBit == 31).
+    self assert:( 16r80000000 highBit == 32).
+    self assert:( 16rFFFFFFFF highBit == 32).
+    self assert:( 16r100000000 highBit == 33).
+    self assert:( 16r1FFFFFFFF highBit == 33).
+    self assert:( 16r100000001 highBit == 33).
+    self assert:( 16r1000000000 highBit == 37).
+    self assert:( 16r10000000000 highBit == 41).
+    self assert:( 16r100000000000 highBit == 45).
+    self assert:( 16r1000000000000 highBit == 49).
+    self assert:( 16r1FFFFFFFFFFFF highBit == 49).
+    self assert:( 16r2000000000000 highBit == 50).
+    self assert:( 16r4000000000000 highBit == 51).
+    self assert:( 16r7FFFFFFFFFFFF highBit == 51).
+    self assert:( 16r8000000000000 highBit == 52).
+    self assert:( 16rFFFFFFFFFFFFF highBit == 52).
+    self assert:( 16r10000000000000 highBit == 53).
+    self assert:( 16r1FFFFFFFFFFFFF highBit == 53).
+    self assert:( 16r20000000000000 highBit == 54).
+    self assert:( 16r3FFFFFFFFFFFFF highBit == 54).
+    self assert:( 16r40000000000000 highBit == 55).
+    self assert:( 16r5FFFFFFFFFFFFF highBit == 55).
+    self assert:( 16r7FFFFFFFFFFFFF highBit == 55).
+    self assert:( 16r80000000000000 highBit == 56).
+    self assert:( 16r100000000000000 highBit == 57).
+    self assert:( 16r1000000000000000 highBit == 61).
+    self assert:( 16r1FFFFFFFFFFFFFFF highBit == 61).
+    self assert:( 16r2000000000000000 highBit == 62).
+    self assert:( 16r3FFFFFFFFFFFFFFF highBit == 62).
+    self assert:( 16r4000000000000000 highBit == 63).
+    self assert:( 16r7FFFFFFFFFFFFFFF highBit == 63).
+    self assert:( 16r8000000000000000 highBit == 64).
+    self assert:( 16rFFFFFFFFFFFFFFFF highBit == 64).
+    self assert:( 16r10000000000000000 highBit == 65).
+    self assert:( 16r1FFFFFFFFFFFFFFFF highBit == 65).
+    self assert:( (1 bitShift:1000) highBit == 1001).
+
+    self assert:( 2r0 lowBit == 0).
+    self assert:( 2r1 lowBit == 1).
+    self assert:( 2r10 lowBit == 2).  
+    self assert:( 2r100 lowBit == 3).  
+    self assert:( 2r1000 lowBit == 4).  
+    self assert:( 16r10 lowBit == 5).
+    self assert:( 16r100 lowBit == 9).
+    self assert:( 16r1000 lowBit == 13).
+    self assert:( 16r10000 lowBit == 17).
+    self assert:( 16r100000 lowBit == 21).
+    self assert:( 16r1000000 lowBit == 25).
+    self assert:( 16r10000000 lowBit == 29).
+    self assert:( 16r100000000 lowBit == 33).
+    self assert:( 16r1000000000 lowBit == 37).
+    self assert:( 16r10000000000 lowBit == 41).
+    self assert:( 16r100000000000 lowBit == 45).
+    self assert:( 16r1000000000000 lowBit == 49).
+    self assert:( 16r10000000000000 lowBit == 53).
+    self assert:( 16r100000000000000 lowBit == 57).
+    self assert:( 16r1000000000000000 lowBit == 61).
+    self assert:( 16r10000000000000000 lowBit == 65).
+    self assert:( (1 bitShift:1000) lowBit == 1001).
+    
+    self assert:(( 2r1 bitOr: 16r10000000000) lowBit = 1).
+    self assert:(( 2r10 bitOr: 16r10000000000) lowBit = 2).  
+    self assert:(( 2r100 bitOr: 16r10000000000) lowBit = 3).  
+    self assert:(( 2r1000 bitOr: 16r10000000000) lowBit = 4).  
+    self assert:(( 16r10 bitOr: 16r10000000000) lowBit = 5).
+    self assert:(( 16r100 bitOr: 16r10000000000) lowBit = 9).
+    self assert:(( 16r1000 bitOr: 16r10000000000) lowBit = 13).
+    self assert:(( 16r10000 bitOr: 16r10000000000) lowBit = 17).
+    self assert:(( 16r100000 bitOr: 16r10000000000) lowBit = 21).
+    self assert:(( 16r1000000 bitOr: 16r10000000000) lowBit = 25).
+    self assert:(( 16r10000000 bitOr: 16r10000000000) lowBit = 29).
+    self assert:(( 16r100000000 bitOr: 16r10000000000) lowBit = 33).
+    self assert:(( 16r1000000000 bitOr: 16r10000000000) lowBit = 37).
+    self assert:(( 16r10000000000 bitOr: 16r10000000000) lowBit = 41).
+    self assert:(( 16r100000000000 bitOr: 16r100000000000) lowBit = 45).
+    self assert:(( 16r1000000000000 bitOr: 16r1000000000000) lowBit = 49).
+    self assert:(( 16r10000000000000 bitOr: 16r10000000000000) lowBit = 53).
+    self assert:(( 16r100000000000000 bitOr: 16r100000000000000) lowBit = 57).
+    self assert:(( 16r1000000000000000 bitOr: 16r1000000000000000) lowBit = 61).
+    self assert:(( 16r10000000000000000 bitOr: 16r10000000000000000) lowBit = 65).
+    self assert:(( (1 bitShift:1000) bitOr: (1 bitShift:1001)) lowBit = 1001).
+
+    "
+     self basicNew testHighBitLowBit
+    "
+
+    "Modified: / 05-07-2017 / 16:00:51 / cg"
+!
+
+testIntegerShifts
+    "arithmetic tests.
+     Notice, the arithmetic tests are both performed via regular sends
+     and via constructed performs. The reason is to test both inlined
+     JIT-compiler code AND the regular methods code."
+
+    self testIntegerShifts1.
+    self testIntegerShifts2.
+
+    self assert:(
+     (((0 to:64) collect:[:s | 1 bitShift:s])
+	collect:[:n | n highBit]) = (1 to:65)
+    ).
+
+    1 to:10000 do:[:s |
+	self assert:( (1 bitShift:s) highBit == (s+1) )
+    ].
+    1 to:10000 do:[:s |
+	self assert:( ((1 bitShift:s) - 1) highBit == s )
+    ].
+
+    "
+     self basicNew testIntegerShifts
+    "
+
+    "Created: / 6.6.1999 / 14:47:51 / cg"
+    "Modified: / 9.6.1999 / 17:49:57 / cg"
+!
+
+testIntegerShifts1
+    "arithmetic tests.
+     Notice, the arithmetic tests are both performed via regular sends
+     and via constructed performs. The reason is to test both inlined
+     JIT-compiler code AND the regular methods code."
+
+    |n1 n2 s|
+
+    n1 := 100000.
+    n2 := n1 negated.
+    s := 1.
+
+    self assert:(n1 printString = '100000').
+    self assert:(n2 printString = '-100000').
+
+    self assert:((n1 bitShift:s) printString = '200000').
+    self assert:((n1 bitShift:1) printString = '200000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '200000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:1) printString = '200000').
+
+    s := s + 1.
+    self assert:((n1 bitShift:s) printString = '400000').
+    self assert:((n1 bitShift:2) printString = '400000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '400000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:2) printString = '400000').
+
+    s := s + 1.
+    self assert:((n1 bitShift:s) printString = '800000').
+    self assert:((n1 bitShift:3) printString = '800000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '800000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:3) printString = '800000').
+
+    s := s + 1.
+    self assert:((n1 bitShift:s) printString = '1600000').
+    self assert:((n1 bitShift:4) printString = '1600000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '1600000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:4) printString = '1600000').
+
+    s := s + 1.
+    self assert:((n1 bitShift:s) printString = '3200000').
+    self assert:((n1 bitShift:5) printString = '3200000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '3200000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:5) printString = '3200000').
+
+    s := s + 1.
+    self assert:((n1 bitShift:s) printString = '6400000').
+    self assert:((n1 bitShift:6) printString = '6400000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '6400000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:6) printString = '6400000').
+
+    s := s + 1.
+    self assert:((n1 bitShift:s) printString = '12800000').
+    self assert:((n1 bitShift:7) printString = '12800000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '12800000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:7) printString = '12800000').
+
+    "
+     self basicNew testIntegerShifts1
+    "
+
+    "Created: / 6.6.1999 / 14:47:51 / cg"
+    "Modified: / 9.6.1999 / 17:49:57 / cg"
+!
+
+testIntegerShifts2
+    "arithmetic tests.
+     Notice, the arithmetic tests are both performed via regular sends
+     and via constructed performs. The reason is to test both inlined
+     JIT-compiler code AND the regular methods code."
+
+    |n1 s|
+
+    n1 := 12800000.
+    s := -1.
+    self assert:((n1 bitShift:s) printString = '6400000').
+    self assert:((n1 bitShift:-1) printString = '6400000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '6400000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:-1) printString = '6400000').
+
+    s := s - 1.
+    self assert:((n1 bitShift:s) printString = '3200000').
+    self assert:((n1 bitShift:-2) printString = '3200000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '3200000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:-2) printString = '3200000').
+
+    s := s - 1.
+    self assert:((n1 bitShift:s) printString = '1600000').
+    self assert:((n1 bitShift:-3) printString = '1600000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '1600000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:-3) printString = '1600000').
+
+    s := s - 1.
+    self assert:((n1 bitShift:s) printString = '800000').
+    self assert:((n1 bitShift:-4) printString = '800000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '800000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:-4) printString = '800000').
+
+    s := s - 1.
+    self assert:((n1 bitShift:s) printString = '400000').
+    self assert:((n1 bitShift:-5) printString = '400000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '400000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:-5) printString = '400000').
+
+    s := s - 1.
+    self assert:((n1 bitShift:s) printString = '200000').
+    self assert:((n1 bitShift:-6) printString = '200000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '200000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:-6) printString = '200000').
+
+    s := s - 1.
+    self assert:((n1 bitShift:s) printString = '100000').
+    self assert:((n1 bitShift:-7) printString = '100000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '100000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:-7) printString = '100000').
+
+    s := s - 1.
+    self assert:((n1 bitShift:s) printString = '50000').
+    self assert:((n1 bitShift:-8) printString = '50000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '50000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:-8) printString = '50000').
+
+    s := s - 1.
+    self assert:((n1 bitShift:s) printString = '25000').
+    self assert:((n1 bitShift:-9) printString = '25000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '25000').
+    self assert:((n1 perform:'bitShift:' asSymbol with:-9) printString = '25000').
+
+    s := s - 1.
+    self assert:((n1 bitShift:s) printString = '12500').
+    self assert:((n1 bitShift:-10) printString = '12500').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '12500').
+    self assert:((n1 perform:'bitShift:' asSymbol with:-10) printString = '12500').
+
+    s := s - 1.
+    self assert:((n1 bitShift:s) printString = '6250').
+    self assert:((n1 bitShift:-11) printString = '6250').
+    self assert:((n1 perform:'bitShift:' asSymbol with:s) printString = '6250').
+    self assert:((n1 perform:'bitShift:' asSymbol with:-11) printString = '6250').
+
+    "
+     self basicNew testIntegerShifts2
+    "
+
+    "Created: / 6.6.1999 / 14:47:51 / cg"
+    "Modified: / 9.6.1999 / 17:49:57 / cg"
+!
+
+testIntegerShifts3
+    "arithmetic tests.
+     Notice, the arithmetic tests are both performed via regular sends
+     and via constructed performs. The reason is to test both inlined
+     JIT-compiler code AND the regular methods code."
+
+    self assert:( self doConstantIntegerShift == 1).
+
+    "
+     self basicNew testIntegerShifts3
+    "
+!
+
+testIntegerShifts4
+    "arithmetic tests.
+     Notice, the arithmetic tests are both performed via regular sends
+     and via constructed performs. The reason is to test both inlined
+     JIT-compiler code AND the regular methods code."
+
+    |a|
+
+    a := 16r1234.
+
+    self assert:( ((a bitShift:-4) bitAnd:16rFF) == 16r23 ).
+    self assert:( ((a bitShift:-8) bitAnd:16rFF) == 16r12 ).
+    self assert:( ((a bitShift:-12) bitAnd:16rFF) == 16r1 ).
+    self assert:( ((a bitShift:-16) bitAnd:16rFF) == 0 ).
+
+    "/ should not shift in any sign bits ...
+    a := 16r1FFFFFFF.
+    self assert:( (a bitShift:-4) == 16r1FFFFFF ).
+    a := 16r3FFFFFFF.
+    self assert:( (a bitShift:-4) == 16r3FFFFFF ).
+    a := 16r7FFFFFFF.
+    self assert:( (a bitShift:-4) == 16r7FFFFFF ).
+    a := 16rFFFFFFFF.
+    self assert:( (a bitShift:-4) == 16rFFFFFFF ).
+    a := 16r1FFFFFFFF.
+    self assert:( (a bitShift:-4) == 16r1FFFFFFF ).
+
+    a := 16r1FFFFFFF.
+    self assert:( (a bitShift:-8) == 16r1FFFFF ).
+    a := 16r3FFFFFFF.
+    self assert:( (a bitShift:-8) == 16r3FFFFF ).
+    a := 16r7FFFFFFF.
+    self assert:( (a bitShift:-8) == 16r7FFFFF ).
+    a := 16rFFFFFFFF.
+    self assert:( (a bitShift:-8) == 16rFFFFFF ).
+    a := 16r1FFFFFFFF.
+    self assert:( (a bitShift:-8) == 16r1FFFFFF ).
+
+    "
+     self basicNew testIntegerShifts4
+    "
+!
+
+testLargeBitOperations
+    "large bit operations test."
+
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFF) hexPrintString = '2211'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFF) hexPrintString  = '332211'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFF) hexPrintString = '44332211'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFF) hexPrintString = '5544332211'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFF) hexPrintString = '665544332211'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFF) hexPrintString = '77665544332211'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFF) hexPrintString = '8877665544332211'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFFFF) hexPrintString = '998877665544332211'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'AA998877665544332211'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'BBAA998877665544332211'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'CCBBAA998877665544332211'.
+
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFF) hexPrintString = 'FFEEDDCCBBAA99887766554433FFFF'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFF) hexPrintString  = 'FFEEDDCCBBAA998877665544FFFFFF'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFF) hexPrintString = 'FFEEDDCCBBAA9988776655FFFFFFFF'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBAA99887766FFFFFFFFFF'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBAA998877FFFFFFFFFFFF'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBAA9988FFFFFFFFFFFFFF'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBAA99FFFFFFFFFFFFFFFF'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBAAFFFFFFFFFFFFFFFFFF'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCBBFFFFFFFFFFFFFFFFFFFF'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDCCFFFFFFFFFFFFFFFFFFFFFF'.
+     self assert:(16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFFFFFFFFFF) hexPrintString = 'FFEEDDFFFFFFFFFFFFFFFFFFFFFFFF'.
+
+    Time millisecondsToRun:[
+        1000000 timesRepeat:[
+            (16rFFEEDDCCBBAA998877665544332211 bitAnd:16rFFFFFFFFFFFFFFFFFFFFFFFF)
+        ]
+    ].
+    "/ bitAnd inherited via Integer:  1638 1575 1576
+    "/ bitAnd tuned in largeInteger:  172 171 172
+
+    Time millisecondsToRun:[
+        1000000 timesRepeat:[
+            (16rFFEEDDCCBBAA998877665544332211 bitOr:16rFFFFFFFFFFFFFFFFFFFFFFFF)
+        ]
+    ].
+    "/ bitOr inherited via Integer:  1903 1856 1856
+
+    self assert:( 16r800008 signExtendedFromBit:4 ) = -8. 
+    self assert:( 16r7FFF07 signExtendedFromBit:4 ) = 7.     
+    self assert:( 16r7FFF0F signExtendedFromBit:4 ) = -1.    
+
+    self assert:( 16rFFFFFF signExtendedFromBit:8 ) = -1.   
+    self assert:( 16rFFFF7F signExtendedFromBit:8 ) = 16r7F.   
+
+    self assert:( 16rFFFFFF signExtendedByteValue ) = -1.   
+    self assert:( 16rFFFF7F signExtendedByteValue ) = 16r7F.   
+
+    self assert:( 16rFFFF signExtendedShortValue ) = -1.   
+    self assert:( 16r7FFF signExtendedShortValue ) = 16r7FFF.   
+    self assert:( 16rFFFFFFFF signExtendedShortValue ) = -1.   
+    self assert:( 16rFFFF7FFF signExtendedShortValue ) = 16r7FFF.   
+    self assert:( 16rFFFFFFFFFF signExtendedShortValue ) = -1.   
+    self assert:( 16rFFFFFF7FFF signExtendedShortValue ) = 16r7FFF.   
+    self assert:( 16rFFFFFFFFFFFF signExtendedShortValue ) = -1.   
+    self assert:( 16rFFFFFFFF7FFF signExtendedShortValue ) = 16r7FFF.   
+
+    self assert:( 16rFFFFFFFF signExtendedLongValue ) = -1.   
+    self assert:( 16r7FFFFFFF signExtendedLongValue ) = 2147483647.   
+    self assert:( 16r80000000 signExtendedLongValue ) = -2147483648.   
+    self assert:( 16rFFFFFFFFFFFF signExtendedLongValue ) = -1.   
+    self assert:( 16rFFFF7FFFFFFF signExtendedLongValue ) = 2147483647.   
+    self assert:( 16rFFFF80000000 signExtendedLongValue ) = -2147483648.   
+    self assert:( 16rFFFFFFFFFFFFFFFF signExtendedLongValue ) = -1.   
+    self assert:( 16rFFFFFFFF7FFFFFFF signExtendedLongValue ) = 2147483647.   
+    self assert:( 16rFFFFFFFF80000000 signExtendedLongValue ) = -2147483648.   
+
+    self assert:( 16rFFFFFFFFFFFFFFFF signExtendedLongLongValue ) = -1.   
+    self assert:( 16r7FFFFFFFFFFFFFFF signExtendedLongLongValue ) = 16r7FFFFFFFFFFFFFFF.   
+    self assert:( 16rFFFFFFFFFFFFFFFFFFFF signExtendedLongLongValue ) = -1.   
+    self assert:( 16rFFFF7FFFFFFFFFFFFFFF signExtendedLongLongValue ) = 16r7FFFFFFFFFFFFFFF.   
+
+    "
+     self basicNew testLargeBitOperations
+    "
+
+    "Modified: / 26-02-2016 / 19:47:25 / cg"
+!
+
 testRightShift
     "right shifts must preserve the sign - even for large integers"
     
@@ -5083,6 +4858,65 @@
     "Created: / 04-06-2019 / 01:05:30 / Claus Gittinger"
 !
 
+testSignExtension
+    "/ 8bit
+    self assert:( 16r80 signExtendedByteValue = -128 ).
+    self assert:( 16r7F signExtendedByteValue = 127 ).  
+    self assert:( 16rFF signExtendedByteValue = -1 ).
+
+    "/ higher bits are ignored
+    self assert:( 16rF80 signExtendedByteValue = -128 ).
+    self assert:( 16rF7F signExtendedByteValue = 127 ).  
+    self assert:( 16rFFF signExtendedByteValue = -1 ).
+
+    "/ 16bit
+    self assert:( 16r8000 signExtendedShortValue = -32768 ).
+    self assert:( 16r7FFF signExtendedShortValue = 32767 ).  
+    self assert:( 16rFFFF signExtendedShortValue = -1 ).
+
+    "/ higher bits are ignored
+    self assert:( 16rF8000 signExtendedShortValue = -32768 ).
+    self assert:( 16rF7FFF signExtendedShortValue = 32767 ).  
+    self assert:( 16rFFFFF signExtendedShortValue = -1 ).
+
+    "/ 24bit
+    self assert:( 16r800000 signExtended24BitValue = -8388608 ).
+    self assert:( 16r7FFFFF signExtended24BitValue = 8388607 ).  
+    self assert:( 16rFFFFFF signExtended24BitValue = -1 ).
+
+    "/ higher bits are ignored
+    self assert:( 16rF800000 signExtended24BitValue = -8388608 ).
+    self assert:( 16rF7FFFFF signExtended24BitValue = 8388607 ).  
+    self assert:( 16rFFFFFFF signExtended24BitValue = -1 ).
+
+    "/ 32bit
+    self assert:( 16r80000000 signExtendedLongValue = -2147483648 ).
+    self assert:( 16r7FFFFFFF signExtendedLongValue = 2147483647 ).  
+    self assert:( 16rFFFFFFFF signExtendedLongValue = -1 ).
+
+    "/ higher bits are ignored
+    self assert:( 16rF80000000 signExtendedLongValue = -2147483648 ).
+    self assert:( 16rF7FFFFFFF signExtendedLongValue = 2147483647 ).  
+    self assert:( 16rFFFFFFFFF signExtendedLongValue = -1 ).
+
+    "/ 64bit
+    self assert:( 16r8000000000000000 signExtendedLongLongValue = -9223372036854775808 ).
+    self assert:( 16r7FFFFFFFFFFFFFFF signExtendedLongLongValue = 9223372036854775807 ).  
+    self assert:( 16rFFFFFFFFFFFFFFFF signExtendedLongLongValue = -1 ).
+
+    "/ higher bits are ignored
+    self assert:( 16rF8000000000000000 signExtendedLongLongValue = -9223372036854775808 ).
+    self assert:( 16rF7FFFFFFFFFFFFFFF signExtendedLongLongValue = 9223372036854775807 ).  
+    self assert:( 16rFFFFFFFFFFFFFFFFF signExtendedLongLongValue = -1 ).
+
+    "/ arbitrary nr of bits
+    self assert:( 2r1000 signExtendedFromBit:4) = -8 .
+    self assert:( 2r0111 signExtendedFromBit:4) = 7 .  
+    self assert:( 2r1111 signExtendedFromBit:4) = -1 .
+
+    "Created: / 21-07-2017 / 15:15:53 / cg"
+!
+
 testZigZagCoding
     "zigzag is used by google's protocol buffer encoding"
     
@@ -5283,6 +5117,207 @@
 
 !IntegerTest methodsFor:'tests-misc'!
 
+testBinco
+     self assert: (10 binomialCoefficient:5) = (10 factorial / (5 factorial * 5 factorial)).
+     self assert: (100 binomialCoefficient:78) = (100 factorial / (78 factorial * (100-78) factorial)).
+     self assert: (1000 binomialCoefficient:5) = (1000 factorial / (5 factorial * (1000-5) factorial)).
+     self assert: (10000 binomialCoefficient:78) = (10000 factorial / (78 factorial * (10000-78) factorial)).
+     self assert: (0 binomialCoefficient:0) = 1.
+     self assert: (10 binomialCoefficient:10) = 1.
+
+    "
+     self basicNew testBinco
+    "
+!
+
+testEncodeDecode
+    self assert:(1 encodeAsBCD hexPrintString = '1').
+    self assert:(12 encodeAsBCD hexPrintString = '12').
+    self assert:(123 encodeAsBCD hexPrintString = '123').
+    self assert:(1234 encodeAsBCD hexPrintString = '1234').
+    self assert:(12345 encodeAsBCD hexPrintString = '12345').
+    self assert:(123456 encodeAsBCD hexPrintString = '123456').
+    self assert:(1234567 encodeAsBCD hexPrintString = '1234567').
+    self assert:(12345678 encodeAsBCD hexPrintString = '12345678').
+    self assert:(123456789 encodeAsBCD hexPrintString = '123456789').
+    self assert:(1234567890 encodeAsBCD hexPrintString = '1234567890').
+    self assert:(12345678901 encodeAsBCD hexPrintString = '12345678901').
+    self assert:(123456789012 encodeAsBCD hexPrintString = '123456789012').
+    self assert:(1234567890123 encodeAsBCD hexPrintString = '1234567890123').
+    self assert:(12345678901234 encodeAsBCD hexPrintString = '12345678901234').
+    self assert:(123456789012345 encodeAsBCD hexPrintString = '123456789012345').
+    self assert:(1234567890123456 encodeAsBCD hexPrintString = '1234567890123456').
+    self assert:(12345678901234567 encodeAsBCD hexPrintString = '12345678901234567').
+    self assert:(123456789012345678 encodeAsBCD hexPrintString = '123456789012345678').
+    self assert:(1234567890123456789 encodeAsBCD hexPrintString = '1234567890123456789').
+    self assert:(12345678901234567890 encodeAsBCD hexPrintString = '12345678901234567890').
+    self assert:(4611686018427387902 encodeAsBCD hexPrintString = '4611686018427387902').
+    self assert:(4611686018427387903 encodeAsBCD hexPrintString = '4611686018427387903').
+    self assert:(4611686018427387904 encodeAsBCD hexPrintString = '4611686018427387904').
+
+    self assert:(16r1 decodeFromBCD = 1).
+    self assert:(16r12 decodeFromBCD = 12).
+    self assert:(16r123 decodeFromBCD = 123).
+    self assert:(16r1234 decodeFromBCD = 1234).
+    self assert:(16r12345 decodeFromBCD = 12345).
+    self assert:(16r123456 decodeFromBCD = 123456).
+    self assert:(16r1234567 decodeFromBCD = 1234567).
+    self assert:(16r12345678 decodeFromBCD = 12345678).
+    self assert:(16r123456789 decodeFromBCD = 123456789).
+    self assert:(16r1234567890 decodeFromBCD = 1234567890).
+    self assert:(16r12345678901 decodeFromBCD = 12345678901).
+    self assert:(16r123456789012 decodeFromBCD = 123456789012).
+    self assert:(16r1000000000000 decodeFromBCD = 1000000000000).
+    self assert:(16r0000500000000 decodeFromBCD = 500000000).
+    self assert:(16r1234500000000 decodeFromBCD = 1234500000000).
+    self assert:(16r1234567890000 decodeFromBCD = 1234567890000).
+
+    self assert:(16r1234567890123 decodeFromBCD = 1234567890123).
+    self assert:(16r12345678901234 decodeFromBCD = 12345678901234).
+    self assert:(16r123456789012345 decodeFromBCD = 123456789012345).
+    self assert:(16r1234567890123456 decodeFromBCD = 1234567890123456).
+    self assert:(16r12345678901234567 decodeFromBCD = 12345678901234567).
+    self assert:(16r123456789012345678 decodeFromBCD = 123456789012345678).
+    self assert:(16r1234567890123456789 decodeFromBCD = 1234567890123456789).
+    self assert:(16r12345678901234567890 decodeFromBCD = 12345678901234567890).
+    self assert:(16r4611686018427387902 decodeFromBCD = 4611686018427387902).
+    self assert:(16r4611686018427387903 decodeFromBCD = 4611686018427387903).
+    self assert:(16r4611686018427387904 decodeFromBCD = 4611686018427387904).
+
+    "
+     self basicNew testEncodeDecode
+    "
+
+    "Modified: / 26.10.1999 / 22:01:35 / stefan"
+!
+
+testFactorial
+    "/ <testedMethods: #( (Integer >> #factorial) (Integer >> #*) ) >
+
+    self assert:(0 factorial = 1).
+    self assert:(1 factorial = 1).
+    self assert:(2 factorial = 2).
+    self assert:(10 factorial = 3628800).
+    self assert:(11 factorial = 39916800).
+    self assert:(12 factorial = 479001600).
+    self assert:(13 factorial digitBytes = #[0 204 40 115 1]).
+    self assert:(13 factorial = 6227020800).
+    self assert:(14 factorial digitBytes = #[0 40 59 76 20]).
+    self assert:(14 factorial = 87178291200).
+    self assert:(15 factorial digitBytes = #[0 88 119 119 48 1]).
+    self assert:(15 factorial = 1307674368000).
+    self assert:(16 factorial digitBytes = #[0 128 117 119 7 19]).
+    self assert:(16 factorial = 20922789888000).
+    self assert:(17 factorial digitBytes = #[0 128 205 238 126 67 1]).
+    self assert:(17 factorial = 355687428096000).
+    self assert:(18 factorial digitBytes = #[0 0 115 202 236 190 22]).
+    self assert:(18 factorial = 6402373705728000).
+    self assert:(19 factorial digitBytes = #[0 0 137 6 147 43 176 1]).
+    self assert:(19 factorial = 121645100408832000).
+    self assert:(20 factorial digitBytes = #[0 0 180 130 124 103 195 33]).
+    self assert:(20 factorial = 2432902008176640000).
+    self assert:(50 factorial = 30414093201713378043612608166064768844377641568960512000000000000).
+
+    "
+     self basicNew testFactorial
+    "
+
+    "Created: / 24-04-2010 / 13:52:23 / cg"
+    "Modified: / 26-02-2016 / 15:43:16 / cg"
+!
+
+testGCD
+    "/ <testedMethods: #( (Integer >> #gcd:) ) >
+
+    self assert:(9 gcd:6) = 3.
+    self assert:(6 gcd:9) = 3.
+    self assert:(2 gcd:0) = 2.
+    self assert:(0 gcd:2) = 2.
+    self assert:(20 factorial gcd:(5*6*7)) = (5*6*7).
+    self assert:(20 factorial gcd:(20 factorial / 20)) = (19 factorial).
+
+    "
+     self basicNew testGCD
+    "
+
+    "Created: / 27-04-2010 / 09:49:31 / cg"
+!
+
+testIsPowerOfTwo
+    self assert:(1 isPowerOfTwo).
+    self assert:(2 isPowerOfTwo).
+    self assert:(4 isPowerOfTwo).
+    self assert:(3 isPowerOfTwo not).
+    self assert:(16r100000000000000000000000 isPowerOfTwo).
+    self assert:(16r300000000000000000000000 isPowerOfTwo not).
+
+    "
+     self basicNew testIsPowerOfTwo
+    "
+
+    "Created: / 27-04-2010 / 10:35:36 / cg"
+!
+
+testNextPowerOfTwo
+    "/ self assert:(0 nextPowerOf2 = 0).
+    self assert:(1 nextPowerOf2 = 1).
+    self assert:(2 nextPowerOf2 = 2).
+    self assert:(3 nextPowerOf2 = 4).
+    self assert:(4 nextPowerOf2 = 4).
+    self assert:(5 nextPowerOf2 = 8).
+    self assert:(6 nextPowerOf2 = 8).
+    self assert:(7 nextPowerOf2 = 8).
+    self assert:(8 nextPowerOf2 = 8).
+    self assert:(9 nextPowerOf2 = 16).
+
+    self assert:(22 nextPowerOf2 = 32).
+    self assert:(32 nextPowerOf2 = 32).
+    self assert:(16rFFFF nextPowerOf2 = 16r10000).  
+    self assert:(16r1FFFFFFF nextPowerOf2 = 16r20000000).  
+    self assert:(16r3FFFFFFF nextPowerOf2 = 16r40000000).  
+    self assert:(16r7FFFFFFF nextPowerOf2 = 16r80000000).  
+    self assert:(16rFFFFFFFF nextPowerOf2 = 16r100000000). 
+    self assert:(16r1FFFFFFFFFFFFFFF nextPowerOf2 = 16r2000000000000000).  
+    self assert:(16r3FFFFFFFFFFFFFFF nextPowerOf2 = 16r4000000000000000).  
+    self assert:(16r7FFFFFFFFFFFFFFF nextPowerOf2 = 16r8000000000000000).  
+    self assert:(16rFFFFFFFFFFFFFFFF nextPowerOf2 = 16r10000000000000000).  
+    self assert:(16rFFFFFFFFFFFFFFFFFFFF nextPowerOf2 = 16r100000000000000000000).  
+
+    "
+     self basicNew testNextPowerOfTwo
+    "
+!
+
+testProduct
+    self assert:(1 to:1) product = 1.
+    self assert:(1 to:100) product = 100 factorial.
+    self assert:(1 to:0) product = 1.
+
+    self assert:(1 to:1) asArray product = 1.
+    self assert:(1 to:100) asArray product = 100 factorial.
+    self assert:#() product = 1.
+    self assert:#(2) product = 2.
+
+    "
+     self basicNew testSum
+    "
+!
+
+testSum
+    self assert:(1 to:1) sum = 1.
+    self assert:(1 to:100) sum = 5050.
+    self assert:(1 to:0) sum = 0.
+
+    self assert:(1 to:1) asArray sum = 1.
+    self assert:(1 to:100) asArray sum = 5050.
+    self assert:#() sum = 0.
+    self assert:#(2) sum = 2.
+
+    "
+     self basicNew testSum
+    "
+!
+
 test_primes
     self 
         assert: ((1 to: 30) select: [:i | i isPrime] as:Array)