# HG changeset patch # User Claus Gittinger # Date 962542141 -7200 # Node ID 4d49a24f861bdb55f0f7e5ef647e23dde1cb2767 # Parent f67d84b60f384284764cf55513eb08b0f56ace55 added fallback st-code (for rel5 migration) diff -r f67d84b60f38 -r 4d49a24f861b 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 $' ! !