added fallback st-code (for rel5 migration)
authorClaus Gittinger <cg@exept.de>
Sun, 02 Jul 2000 14:49:01 +0200
changeset 5437 4d49a24f861b
parent 5436 f67d84b60f38
child 5438 00e3c22156c3
added fallback st-code (for rel5 migration)
LargeInteger.st
--- a/LargeInteger.st	Fri Jun 30 18:59:32 2000 +0200
+++ b/LargeInteger.st	Sun Jul 02 14:49:01 2000 +0200
@@ -1298,7 +1298,17 @@
     [(index > 0) and:[(digitByteArray at:index) == 0]] whileTrue:[
         index := index - 1
     ].
-
+"/    ((index < SmallInteger maxBytes) 
+"/    or:[(index == SmallInteger maxBytes) 
+"/            and:[(digitByteArray at:index) < 16r20]])
+"/    ifTrue:[
+"/        val := 0.
+"/        1 to:index do:[:i |
+"/            val := val bitShift:8.
+"/            val := val bitOr:(digitByteArray at:i).
+"/        ].
+"/        ^ val * sign
+"/    ].
     (index ~~ index0) ifTrue:[
         digitByteArray := digitByteArray copyFrom:1 to:index
     ].
@@ -2098,14 +2108,17 @@
      (could also do a primitiveFailure here)
     "
     ok ifFalse:[
-        self primitiveFailed
+        ^ self absDivMod:(LargeInteger value:aPositiveSmallInteger).
     ].
 
     ^ Array with:(result compressed) with:prevRest
 
     "
-     ((16r1234 asLargeInteger absFastDiv:16rffff) at:2) printStringRadix:16
-     ((16r00123456 asLargeInteger absFastDiv:16rffffff) at:2) printStringRadix:16
+     16r123412341234 asLargeInteger absDivMod:(LargeInteger value:10) 
+     ((16r1234 asLargeInteger absFastDivMod:16rffff) at:2) printStringRadix:16
+     ((16r00123456 asLargeInteger absFastDivMod:16rffffff) at:2) printStringRadix:16  
+     ((666666666666666666 asLargeInteger absFastDivMod:16r3))  
+     ((1666666666 asLargeInteger absFastDivMod:16r3))  
     "
 !
 
@@ -4043,35 +4056,34 @@
         RETURN (anyBitNonZero ? true : false);
     }
 %}.
-    self halt:'should not happen'.
-
-"/    index := 1.
-"/    borrow := 0.
-"/
-"/    [index <= len1] whileTrue:[
-"/        diff := borrow.
-"/        diff := diff + (digitByteArray basicAt:index).
-"/        index <= len2 ifTrue:[
-"/            diff := diff - (otherDigitByteArray basicAt:index).
-"/        ].
-"/
-"/        "/ workaround for
-"/        "/ gcc code generator bug
-"/
-"/        (diff >= 0) ifTrue:[
-"/            borrow := 0
-"/        ] ifFalse:[
-"/            borrow := -1.
-"/            diff := diff + 16r100
-"/        ].
-"/        diff ~~ 0 ifTrue:[
-"/            notZero := true
-"/        ].
-"/        digitByteArray basicAt:index put:diff.
-"/        index := index + 1
-"/    ].
-"/
-"/    ^ notZero
+
+    index := 1.
+    borrow := 0.
+
+    [index <= len1] whileTrue:[
+        diff := borrow.
+        diff := diff + (digitByteArray basicAt:index).
+        index <= len2 ifTrue:[
+            diff := diff - (otherDigitByteArray basicAt:index).
+        ].
+
+        "/ workaround for
+        "/ gcc code generator bug
+
+        (diff >= 0) ifTrue:[
+            borrow := 0
+        ] ifFalse:[
+            borrow := -1.
+            diff := diff + 16r100
+        ].
+        diff ~~ 0 ifTrue:[
+            notZero := true
+        ].
+        digitByteArray basicAt:index put:diff.
+        index := index + 1
+    ].
+
+    ^ notZero
 
     "Created: / 5.11.1996 / 16:23:47 / cg"
     "Modified: / 5.11.1996 / 18:56:50 / cg"
@@ -4082,6 +4094,8 @@
     "private helper for division:
        destructively divide the receiver by 2."
 
+    |prevBit|
+
 %{  /* NOCONTEXT */
     OBJ __digits = __INST(digitByteArray);
 
@@ -4172,12 +4186,20 @@
         RETURN (self);
     }
 %}.
-    self primitiveFailed
+
+    prevBit := 0.
+    digitByteArray size to:1 by:-1 do:[:idx |
+        |thisByte|
+
+        thisByte := digitByteArray at:idx.
+        digitByteArray at:idx put:((thisByte bitShift:-1) bitOr:prevBit).
+        prevBit := (thisByte bitAnd:1) bitShift:7.
+    ].
 
     "
      100000 asLargeInteger div2           
-     1000000000000000000000000000 div2 
-     10000000000000000000000000000000000000000000 div2 
+     1000000000000000000000000000 div2  
+     10000000000000000000000000000000000000000000 div2
     "                                                     
 
     "Modified: 5.11.1996 / 16:12:56 / cg"
@@ -4189,7 +4211,7 @@
 
     |nBytes "{ Class: SmallInteger }"
      b      "{ Class: SmallInteger }"
-     t|
+     t prevBit|
 
     nBytes := digitByteArray size.
 
@@ -4248,10 +4270,22 @@
         RETURN (self);
     }
 %}.
-    self primitiveFailed
+
+    prevBit := 0.
+    1 to:digitByteArray size do:[:idx |
+        |thisByte|
+
+        thisByte := digitByteArray at:idx.
+        digitByteArray at:idx put:(((thisByte bitShift:1) bitAnd:16rFF) bitOr:prevBit).
+        prevBit := (thisByte bitShift:-7) bitAnd:1.
+    ].
 
     "
      100000 asLargeInteger mul2 
+     16r7FFFFFFFFFFF copy mul2 hexPrintString
+     16rFFFFFFFFFFFF copy mul2 hexPrintString 
+     16r7FFFFFFFFFFFFF copy mul2 hexPrintString 
+     16rFFFFFFFFFFFFFF copy mul2 hexPrintString 
      10000000000000000000000000000 mul2 
     "
 
@@ -4332,5 +4366,5 @@
 !LargeInteger class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.154 2000-05-10 09:40:25 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.155 2000-07-02 12:49:01 cg Exp $'
 ! !