LargeInteger.st
changeset 4211 1727ceb45fbe
parent 4194 09e5aac580d8
child 4213 a66f711d86df
--- a/LargeInteger.st	Wed May 19 21:51:24 1999 +0200
+++ b/LargeInteger.st	Wed May 19 22:13:52 1999 +0200
@@ -53,12 +53,12 @@
     LargeNegativeInteger). This may change.
 
     [author:]
-        Claus Gittinger
+	Claus Gittinger
 
     [see also:]
-        Number
-        Float Fraction FixedPoint 
-        SmallInteger
+	Number
+	Float Fraction FixedPoint 
+	SmallInteger
 "
 !
 
@@ -1112,8 +1112,7 @@
 		bcopy(__ByteArrayInstPtr(oldDigits)->ba_element,
 		      __ByteArrayInstPtr(newDigits)->ba_element,
 		      _idx);
-		__INST(digitByteArray) = newDigits;
-		__STORE(self, newDigits);
+		__INST(digitByteArray) = newDigits; __STORE(self, newDigits);
 		RETURN (self);
 	    }
 	    /*
@@ -1377,38 +1376,38 @@
 
     num := anInteger abs.
     (num > 16r3FFFFF) ifTrue:[
-        "if num is too big (so that multiplying by a byte could create a Large)"
-
-        ^ anInteger retry:#* coercing:self
+	"if num is too big (so that multiplying by a byte could create a Large)"
+
+	^ anInteger retry:#* coercing:self
     ].
 
     len := digitByteArray size.
 
     val := num.
     val <= 16rFF ifTrue:[
-        lResult := len + 1.
+	lResult := len + 1.
     ] ifFalse:[
-        val <= 16rFFFF ifTrue:[
-            lResult := len + 2
-        ] ifFalse:[
-            val <= 16rFFFFFF ifTrue:[
-                lResult := len + 4.
-            ] ifFalse:[
-                lResult := len + 6.
-            ]
-        ]
+	val <= 16rFFFF ifTrue:[
+	    lResult := len + 2
+	] ifFalse:[
+	    val <= 16rFFFFFF ifTrue:[
+		lResult := len + 4.
+	    ] ifFalse:[
+		lResult := len + 6.
+	    ]
+	]
     ].
     resultDigitByteArray := ByteArray uninitializedNew:lResult.
     result := self class basicNew setDigits:resultDigitByteArray.
 
     anInteger < 0 ifTrue:[
-        sign > 0 ifTrue:[
-            result sign:-1
-        ].
+	sign > 0 ifTrue:[
+	    result sign:-1
+	].
     ] ifFalse:[
-        sign < 0 ifTrue:[
-            result sign:sign
-        ]
+	sign < 0 ifTrue:[
+	    result sign:sign
+	]
     ].
 
     ok := false.
@@ -1418,154 +1417,154 @@
     if (__isSmallInteger(len)
      && __isByteArray(__digitByteArray)
      && __isByteArray(resultDigitByteArray)) {
-        INT _l = __intVal(len);
-        INT _v = __intVal(val);
-        unsigned INT _carry = 0;
-        unsigned INT _prod;
-        unsigned char *digitP = __ByteArrayInstPtr(__digitByteArray)->ba_element;
-        unsigned char *resultP = __ByteArrayInstPtr(resultDigitByteArray)->ba_element;
-
-        /*
-         * skipping zeros does not help much (a few percent) on
-         * a P5 or other CPUS with a fast multiplier. 
-         * It may make more of a difference on CPUs with slower 0-multiply.
-         */
-        while ((_l >= sizeof(INT)) && (((unsigned INT *)digitP)[0] == 0)) {
-             ((unsigned long *)resultP)[0] = 0;
-            digitP += sizeof(INT);
-            resultP += sizeof(INT);
-            _l -= sizeof(INT);
-        }
+	INT _l = __intVal(len);
+	INT _v = __intVal(val);
+	unsigned INT _carry = 0;
+	unsigned INT _prod;
+	unsigned char *digitP = __ByteArrayInstPtr(__digitByteArray)->ba_element;
+	unsigned char *resultP = __ByteArrayInstPtr(resultDigitByteArray)->ba_element;
+
+	/*
+	 * skipping zeros does not help much (a few percent) on
+	 * a P5 or other CPUS with a fast multiplier. 
+	 * It may make more of a difference on CPUs with slower 0-multiply.
+	 */
+	while ((_l >= sizeof(INT)) && (((unsigned INT *)digitP)[0] == 0)) {
+	     ((unsigned long *)resultP)[0] = 0;
+	    digitP += sizeof(INT);
+	    resultP += sizeof(INT);
+	    _l -= sizeof(INT);
+	}
 
 #if defined(i386) || defined(alpha) /* XXX actually: LSB_FIRST */
 # if defined (__GNUC__) && defined(i386)
-        /*
-         * can do it long-word-wise;
-         * 32*32 -> 64 multiplication
-         */
-        while (_l > 3) {
-            unsigned __pHi, __pLow;
-
-            /* 
-             * max: 0xFFFF.FFFF * 0xFFFF.FFFF -> 0xFFFF.FFFE.0000.0001
-             * + maxCarry (0xFFFF.FFFF)  -> 0xFFFF.FFFF.0000.0000
-             */
-            asm ("mull %3               \n
-                  addl %4,%%eax         \n
-                  adcl $0,%%edx"    
-                    : "=a"  ((unsigned long)(__pLow)),
-                      "=d"  ((unsigned long)(__pHi))
-                    : "0"   ((unsigned long)(((unsigned long *)digitP)[0])),
-                      "1"   ((unsigned long)(_v)),
-                      "rm"  ((unsigned long)(_carry)) );
-
-            ((unsigned long *)resultP)[0] = __pLow;
-            _carry = __pHi;
-            digitP += 4;
-            resultP += 4;
-            _l -= 4;
-        }
+	/*
+	 * can do it long-word-wise;
+	 * 32*32 -> 64 multiplication
+	 */
+	while (_l > 3) {
+	    unsigned __pHi, __pLow;
+
+	    /* 
+	     * max: 0xFFFF.FFFF * 0xFFFF.FFFF -> 0xFFFF.FFFE.0000.0001
+	     * + maxCarry (0xFFFF.FFFF)  -> 0xFFFF.FFFF.0000.0000
+	     */
+	    asm ("mull %3               \n
+		  addl %4,%%eax         \n
+		  adcl $0,%%edx"    
+		    : "=a"  ((unsigned long)(__pLow)),
+		      "=d"  ((unsigned long)(__pHi))
+		    : "0"   ((unsigned long)(((unsigned long *)digitP)[0])),
+		      "1"   ((unsigned long)(_v)),
+		      "rm"  ((unsigned long)(_carry)) );
+
+	    ((unsigned long *)resultP)[0] = __pLow;
+	    _carry = __pHi;
+	    digitP += 4;
+	    resultP += 4;
+	    _l -= 4;
+	}
 # else /* not GNU-i386 */
 #  if defined (WIN32) && defined(i386)
-        /*
-         * can do it long-word-wise;
-         * 32*32 -> 64 multiplication
-         */
-        while (_l > 3) {
-            unsigned __pLow;
-            unsigned digit; 
-
-            /* 
-             * max: 0xFFFF.FFFF * 0xFFFF.FFFF -> 0xFFFF.FFFE.0000.0001
-             * + maxCarry (0xFFFF.FFFF)  -> 0xFFFF.FFFF.0000.0000
-             */
+	/*
+	 * can do it long-word-wise;
+	 * 32*32 -> 64 multiplication
+	 */
+	while (_l > 3) {
+	    unsigned __pLow;
+	    unsigned digit; 
+
+	    /* 
+	     * max: 0xFFFF.FFFF * 0xFFFF.FFFF -> 0xFFFF.FFFE.0000.0001
+	     * + maxCarry (0xFFFF.FFFF)  -> 0xFFFF.FFFF.0000.0000
+	     */
 /*
-            digit = ((unsigned long *)digitP)[0]; 
-            edx::eax = (digit * _v);
-            edx::eax += _carry;
-            ((unsigned long *)resultP)[0] = eax; -- pLow
-            _carry = edx; -- pHigh
-            digitP += 4;
-            resultP += 4;
+	    digit = ((unsigned long *)digitP)[0]; 
+	    edx::eax = (digit * _v);
+	    edx::eax += _carry;
+	    ((unsigned long *)resultP)[0] = eax; -- pLow
+	    _carry = edx; -- pHigh
+	    digitP += 4;
+	    resultP += 4;
 */
-            digit = ((unsigned long *)digitP)[0];
-            asm {
-                mov   eax, digit
-                mov   edx, _v
-                mul   edx
-                add   eax, _carry
-                adc   edx, 0 
-                mov   __pLow, eax
-                mov   _carry, edx
-            }
-
-            ((unsigned long *)resultP)[0] = __pLow; 
-            digitP += 4; 
-            resultP += 4; 
-            _l -= 4;
-        }
+	    digit = ((unsigned long *)digitP)[0];
+	    asm {
+		mov   eax, digit
+		mov   edx, _v
+		mul   edx
+		add   eax, _carry
+		adc   edx, 0 
+		mov   __pLow, eax
+		mov   _carry, edx
+	    }
+
+	    ((unsigned long *)resultP)[0] = __pLow; 
+	    digitP += 4; 
+	    resultP += 4; 
+	    _l -= 4;
+	}
 #  else /* not WIN32-i386 */
 #   if defined(INT64)
-        if (_v <= 0xFFFFFFFFL) {
-            /*
-             * have a 64bit int type ... good
-             */
-            UINT64 _prod64;
-
-            /* have 64bit ints; can do it int-wise
-             *
-             * max: 0xFFFFFFFF * 0xFFFFFFFF -> 0xFFFFFFFE.0001
-             * + maxCarry (0xFFFFFFFF)  -> 0xFFFFFFFF.0000
-             */
-            while (_l > 3) {
-                unsigned __t;
-
-                __t = ((unsigned *)digitP)[0];
-                digitP += 4;
-                _prod64 = (INT64)_v;
-                _prod64 *= __t;
-                _prod64 += _carry;
-                ((unsigned *)resultP)[0] = _prod64 /* & 0xFFFFFFFFL */;
-                _carry = _prod64 >> 32;
-                resultP += 4;
-                _l -= 4;
-            }
-            if (_l > 1) {
-                unsigned short __t;
-
-                __t = ((unsigned short *)digitP)[0];
-                digitP += 2;
-                _prod64 = (INT64)_v;
-                _prod64 *= __t;
-                _prod64 += _carry;
-                ((unsigned short *)resultP)[0] = _prod64 /* & 0xFFFF */;
-                _carry = _prod64 >> 16;
-                resultP += 2;
-                _l -= 2;
-            }
-            if (_l > 0) {
-                _prod64 = *digitP++ * _v + _carry;
-                *resultP++ = _prod64 /* & 0xFF */;
-                _carry = _prod64 >> 8;
-                _l--;
-            }
-        }
+	if (_v <= 0xFFFFFFFFL) {
+	    /*
+	     * have a 64bit int type ... good
+	     */
+	    UINT64 _prod64;
+
+	    /* have 64bit ints; can do it int-wise
+	     *
+	     * max: 0xFFFFFFFF * 0xFFFFFFFF -> 0xFFFFFFFE.0001
+	     * + maxCarry (0xFFFFFFFF)  -> 0xFFFFFFFF.0000
+	     */
+	    while (_l > 3) {
+		unsigned __t;
+
+		__t = ((unsigned *)digitP)[0];
+		digitP += 4;
+		_prod64 = (INT64)_v;
+		_prod64 *= __t;
+		_prod64 += _carry;
+		((unsigned *)resultP)[0] = _prod64 /* & 0xFFFFFFFFL */;
+		_carry = _prod64 >> 32;
+		resultP += 4;
+		_l -= 4;
+	    }
+	    if (_l > 1) {
+		unsigned short __t;
+
+		__t = ((unsigned short *)digitP)[0];
+		digitP += 2;
+		_prod64 = (INT64)_v;
+		_prod64 *= __t;
+		_prod64 += _carry;
+		((unsigned short *)resultP)[0] = _prod64 /* & 0xFFFF */;
+		_carry = _prod64 >> 16;
+		resultP += 2;
+		_l -= 2;
+	    }
+	    if (_l > 0) {
+		_prod64 = *digitP++ * _v + _carry;
+		*resultP++ = _prod64 /* & 0xFF */;
+		_carry = _prod64 >> 8;
+		_l--;
+	    }
+	}
 #   else /* no INT64 type */
-        if (_v <= 0xFFFF) {
-            /* can do it short-wise 
-             * 
-             * max: 0xFFFF * 0xFFFF -> 0xFFFE.0001
-             * + maxCarry (0xFFFF)  -> 0xFFFF.0000
-             */
-            while (_l > 1) {
-                _prod = ((unsigned short *)digitP)[0] * _v + _carry;
-                ((unsigned short *)resultP)[0] = _prod /* & 0xFFFF */;
-                _carry = _prod >> 16;
-                digitP += 2;
-                resultP += 2;
-                _l -= 2;
-            }
-        }
+	if (_v <= 0xFFFF) {
+	    /* can do it short-wise 
+	     * 
+	     * max: 0xFFFF * 0xFFFF -> 0xFFFE.0001
+	     * + maxCarry (0xFFFF)  -> 0xFFFF.0000
+	     */
+	    while (_l > 1) {
+		_prod = ((unsigned short *)digitP)[0] * _v + _carry;
+		((unsigned short *)resultP)[0] = _prod /* & 0xFFFF */;
+		_carry = _prod >> 16;
+		digitP += 2;
+		resultP += 2;
+		_l -= 2;
+	    }
+	}
 #   endif /* no INT64 */
 #  endif /* not WIN32-i386 */
 # endif /* not GNU-i386 */
@@ -1576,80 +1575,80 @@
    /* no, STORE_WORD_WISE makes it slower */
 # endif
 
-        if (_v <= 0xFFFF) {
-            /* can do it short-wise 
-             * 
-             * max: 0xFFFF * 0xFFFF -> 0xFFFE.0001
-             * + maxCarry (0xFFFF)  -> 0xFFFF.0000
-             */
-            while (_l > 1) {
-                unsigned int t;
+	if (_v <= 0xFFFF) {
+	    /* can do it short-wise 
+	     * 
+	     * max: 0xFFFF * 0xFFFF -> 0xFFFE.0001
+	     * + maxCarry (0xFFFF)  -> 0xFFFF.0000
+	     */
+	    while (_l > 1) {
+		unsigned int t;
 
 #if defined(LOAD_WORD_WISE)
-                /* better fetch short-wise */
-                t = ((unsigned short *)digitP)[0];
-                digitP += 2;
-                t = ((t >> 8) | (t << 8)) & 0xFFFF;
+		/* better fetch short-wise */
+		t = ((unsigned short *)digitP)[0];
+		digitP += 2;
+		t = ((t >> 8) | (t << 8)) & 0xFFFF;
 #else
-                t = (digitP[1]<<8) + digitP[0];
-                digitP += 2;
+		t = (digitP[1]<<8) + digitP[0];
+		digitP += 2;
 #endif
-                _prod = t * _v + _carry;
-                _carry = _prod >> 16;
+		_prod = t * _v + _carry;
+		_carry = _prod >> 16;
 #if defined(STORE_WORD_WISE)
-                /* better store short-wise */
-                _prod = ((_prod >> 8) | (_prod << 8)) & 0xFFFF;
-                ((unsigned short *)resultP)[0] = _prod;
+		/* better store short-wise */
+		_prod = ((_prod >> 8) | (_prod << 8)) & 0xFFFF;
+		((unsigned short *)resultP)[0] = _prod;
 #else
-                resultP[0] = _prod /* & 0xFF */;
-                resultP[1] = (_prod>>8) /* & 0xFF */;
+		resultP[0] = _prod /* & 0xFF */;
+		resultP[1] = (_prod>>8) /* & 0xFF */;
 #endif
-                resultP += 2;
-                _l -= 2;
-            }
-        }
+		resultP += 2;
+		_l -= 2;
+	    }
+	}
 
 #endif /* LSB_FIRST */
 
-        /*
-         * rest is done byte-wise
-         */
-        while (_l > 0) {
-            _prod = *digitP++ * _v + _carry;
-            *resultP++ = _prod /* & 0xFF */;
-            _carry = _prod >> 8;
-            _l--;
-        }
-
-        _l = __intVal(lResult) - __intVal(len);
-
-        /*
-         * remaining carry
-         */
-        while (_carry) {
-            *resultP++ = _carry /* & 0xFF */;
-            _carry >>= 8;
-            _l--;
-        }
-
-        /*
-         * remaining zeros
-         */
-        while (_l--) {
-            *resultP++ = 0;
-        }
-
-        /*
-         * need compress ?
-         */
-        if (resultP[-1]) {
-            /*
-             * no
-             */
-            RETURN(result);
-        }
-
-        ok = true;
+	/*
+	 * rest is done byte-wise
+	 */
+	while (_l > 0) {
+	    _prod = *digitP++ * _v + _carry;
+	    *resultP++ = _prod /* & 0xFF */;
+	    _carry = _prod >> 8;
+	    _l--;
+	}
+
+	_l = __intVal(lResult) - __intVal(len);
+
+	/*
+	 * remaining carry
+	 */
+	while (_carry) {
+	    *resultP++ = _carry /* & 0xFF */;
+	    _carry >>= 8;
+	    _l--;
+	}
+
+	/*
+	 * remaining zeros
+	 */
+	while (_l--) {
+	    *resultP++ = 0;
+	}
+
+	/*
+	 * need compress ?
+	 */
+	if (resultP[-1]) {
+	    /*
+	     * no
+	     */
+	    RETURN(result);
+	}
+
+	ok = true;
     }
 %}.
     "
@@ -1657,21 +1656,21 @@
      (could make it a primitive-failure as well)
     "
     ok ifFalse:[
-        carry := 0.
-        1 to:len do:[:i |
-            prod := (digitByteArray basicAt:i) * val + carry.
-            resultDigitByteArray basicAt:i put:(prod bitAnd:16rFF).
-            carry := prod bitShift:-8.
-        ].
-        [carry ~~ 0] whileTrue:[
-            len := len + 1.
-            resultDigitByteArray basicAt:len put:(carry bitAnd:16rFF).
-            carry := carry bitShift:-8
-        ].
-        [len < lResult] whileTrue:[
-            len := len + 1.
-            resultDigitByteArray basicAt:len put:0
-        ]
+	carry := 0.
+	1 to:len do:[:i |
+	    prod := (digitByteArray basicAt:i) * val + carry.
+	    resultDigitByteArray basicAt:i put:(prod bitAnd:16rFF).
+	    carry := prod bitShift:-8.
+	].
+	[carry ~~ 0] whileTrue:[
+	    len := len + 1.
+	    resultDigitByteArray basicAt:len put:(carry bitAnd:16rFF).
+	    carry := carry bitShift:-8
+	].
+	[len < lResult] whileTrue:[
+	    len := len + 1.
+	    resultDigitByteArray basicAt:len put:0
+	]
     ].
     ^ result compressed
 !
@@ -1943,7 +1942,7 @@
 
     ((aSmallInteger < (SmallInteger minVal + 255))
     or:[aSmallInteger > (SmallInteger maxVal - 255)]) ifTrue:[
-        ^ self absMinus:(LargeInteger value:aSmallInteger) sign:newSign.
+	^ self absMinus:(LargeInteger value:aSmallInteger) sign:newSign.
     ]. 
 
     len := digitByteArray size.
@@ -1958,72 +1957,72 @@
 %{
     if (__isByteArray(__INST(digitByteArray))
      && __isByteArray(resultDigitByteArray)) {
-        unsigned int __borrow = __intVal(borrow);
-        int __diff;
-        int __index = 1;
-        int __len = __intVal(len);
-        unsigned char *__digitP = __ByteArrayInstPtr(__INST(digitByteArray))->ba_element;
-        unsigned char *__resultP = __ByteArrayInstPtr(resultDigitByteArray)->ba_element;
+	unsigned int __borrow = __intVal(borrow);
+	int __diff;
+	int __index = 1;
+	int __len = __intVal(len);
+	unsigned char *__digitP = __ByteArrayInstPtr(__INST(digitByteArray))->ba_element;
+	unsigned char *__resultP = __ByteArrayInstPtr(resultDigitByteArray)->ba_element;
 
 #if defined(__LSBFIRST) || defined(i386)
-        /* subtract short-wise */
-        while (__index < __len) {
-            __diff = ((unsigned short *)(__digitP+__index-1))[0] - (__borrow & 0xFFFF);
-            __borrow >>= 16;
-            if (__diff < 0) {
-                __diff += 0x10000;
-                __borrow++;
-            }
-            ((unsigned short *)(__resultP+__index-1))[0] = __diff;
-            __index += 2;
-        }
+	/* subtract short-wise */
+	while (__index < __len) {
+	    __diff = ((unsigned short *)(__digitP+__index-1))[0] - (__borrow & 0xFFFF);
+	    __borrow >>= 16;
+	    if (__diff < 0) {
+		__diff += 0x10000;
+		__borrow++;
+	    }
+	    ((unsigned short *)(__resultP+__index-1))[0] = __diff;
+	    __index += 2;
+	}
 #endif
-        while (__index <= __len) {
-            __diff = __digitP[__index-1] - (__borrow & 0xFF);
-            __borrow >>= 8;
-            if (__diff < 0) {
-                __diff += 0x100;
-                __borrow++;
-            }
-            __resultP[__index-1] = __diff;
-            __index++;
-        }
-        lastDigit = __MKSMALLINT( __resultP[__index-1-1] );
-        ok = true;
+	while (__index <= __len) {
+	    __diff = __digitP[__index-1] - (__borrow & 0xFF);
+	    __borrow >>= 8;
+	    if (__diff < 0) {
+		__diff += 0x100;
+		__borrow++;
+	    }
+	    __resultP[__index-1] = __diff;
+	    __index++;
+	}
+	lastDigit = __MKSMALLINT( __resultP[__index-1-1] );
+	ok = true;
     }
 %}.
 
     ok == true ifFalse:[        "/ cannot happen
-        index := 1.
-        [borrow ~~ 0] whileTrue:[
-            (index <= len) ifTrue:[
-                diff := (digitByteArray basicAt:index) - (borrow bitAnd:16rFF).
-                borrow := borrow bitShift:-8.
-                diff < 0 ifTrue:[
-                    diff := diff + 256.
-                    borrow := borrow + 1.
-                ]
-            ] ifFalse:[
-                diff := borrow bitAnd:255.
-                borrow := borrow bitShift:-8.
-            ].
-            resultDigitByteArray basicAt:index put:(lastDigit := diff).
-            index := index + 1
-        ].
-        [index <= len] whileTrue:[
-            resultDigitByteArray basicAt:index put:(lastDigit := digitByteArray basicAt:index).
-            index := index + 1
-        ].
-        (index <= rsltLen) ifTrue:[
-            lastDigit := 0.
-        ]
+	index := 1.
+	[borrow ~~ 0] whileTrue:[
+	    (index <= len) ifTrue:[
+		diff := (digitByteArray basicAt:index) - (borrow bitAnd:16rFF).
+		borrow := borrow bitShift:-8.
+		diff < 0 ifTrue:[
+		    diff := diff + 256.
+		    borrow := borrow + 1.
+		]
+	    ] ifFalse:[
+		diff := borrow bitAnd:255.
+		borrow := borrow bitShift:-8.
+	    ].
+	    resultDigitByteArray basicAt:index put:(lastDigit := diff).
+	    index := index + 1
+	].
+	[index <= len] whileTrue:[
+	    resultDigitByteArray basicAt:index put:(lastDigit := digitByteArray basicAt:index).
+	    index := index + 1
+	].
+	(index <= rsltLen) ifTrue:[
+	    lastDigit := 0.
+	]
     ].
 
 "/ Transcript showCR:SmallInteger maxBytes.
 "/ self halt.
     (lastDigit == 0 or:[rsltLen == SmallInteger maxBytes]) ifTrue:[ 
 "/ self halt.
-        ^ result compressed.
+	^ result compressed.
     ]. 
     ^ result
 
@@ -2057,7 +2056,7 @@
 
     ((aSmallInteger < (SmallInteger minVal + 255))
     or:[aSmallInteger > (SmallInteger maxVal - 255)]) ifTrue:[
-        ^ self absPlus:(LargeInteger value:aSmallInteger) sign:newSign.
+	^ self absPlus:(LargeInteger value:aSmallInteger) sign:newSign.
     ]. 
 
     len := digitByteArray size.
@@ -2071,172 +2070,172 @@
     if (__isByteArray(__INST(digitByteArray))
      && __isByteArray(resultDigitByteArray)
      && __isSmallInteger(aSmallInteger)) {
-        /* carry is NOT unsigned (see negation below) */
-        INT __carry = __intVal(aSmallInteger);
-        int __index = 1;
-        int __len = __intVal(len);
-        unsigned char *__src = (unsigned char *)(__ByteArrayInstPtr(__INST(digitByteArray))->ba_element);
-        unsigned char *__dst = (unsigned char *)(__ByteArrayInstPtr(resultDigitByteArray)->ba_element);
-        unsigned int __lastDigit = 0;
-        INT __ptrDelta = __dst - __src;
-        unsigned char *__srcLast = __src + __len - 1;
-        unsigned char *__dstLast = __dst + __intVal(rsltLen) - 1;
-
-        if (__carry < 0) {
-            __carry = -__carry;
-        }
+	/* carry is NOT unsigned (see negation below) */
+	INT __carry = __intVal(aSmallInteger);
+	int __index = 1;
+	int __len = __intVal(len);
+	unsigned char *__src = (unsigned char *)(__ByteArrayInstPtr(__INST(digitByteArray))->ba_element);
+	unsigned char *__dst = (unsigned char *)(__ByteArrayInstPtr(resultDigitByteArray)->ba_element);
+	unsigned int __lastDigit = 0;
+	INT __ptrDelta = __dst - __src;
+	unsigned char *__srcLast = __src + __len - 1;
+	unsigned char *__dstLast = __dst + __intVal(rsltLen) - 1;
+
+	if (__carry < 0) {
+	    __carry = -__carry;
+	}
 
 #if defined(__LSBFIRST) || defined(i386) || defined(alpha)
 # if defined(i386) && defined(__GNUC__)
-        /*
-         * add long-wise
-         */
-        while (__src <= __srcLast-3) {
-            int __sum;
-
-            asm ("addl %%edx,%%eax      \n
-                  movl $0,%%edx         \n
-                  adcl $0,%%edx"    
-                    : "=d"  ((unsigned long)(__carry)),
-                      "=a"  ((unsigned long)(__sum))
-                    : "0"   ((unsigned long)(__carry)),
-                      "1"   ((unsigned long)(((unsigned *)__src)[0])) );
-
-            ((unsigned *)(__src + __ptrDelta))[0] = __lastDigit = __sum;
-            __src += 4;  
-            if (__carry == 0) {
-                while (__src <= __srcLast-3) {
-                    /* copy over */
-                    ((unsigned *)(__src + __ptrDelta))[0] = ((unsigned *)__src)[0];
-                    __src += 4;
-                }
-                __lastDigit = 0;
-                break;
-            }
-        }
-        __lastDigit >>= 24; /* only the high-byte counts */
+	/*
+	 * add long-wise
+	 */
+	while (__src <= __srcLast-3) {
+	    int __sum;
+
+	    asm ("addl %%edx,%%eax      \n
+		  movl $0,%%edx         \n
+		  adcl $0,%%edx"    
+		    : "=d"  ((unsigned long)(__carry)),
+		      "=a"  ((unsigned long)(__sum))
+		    : "0"   ((unsigned long)(__carry)),
+		      "1"   ((unsigned long)(((unsigned *)__src)[0])) );
+
+	    ((unsigned *)(__src + __ptrDelta))[0] = __lastDigit = __sum;
+	    __src += 4;  
+	    if (__carry == 0) {
+		while (__src <= __srcLast-3) {
+		    /* copy over */
+		    ((unsigned *)(__src + __ptrDelta))[0] = ((unsigned *)__src)[0];
+		    __src += 4;
+		}
+		__lastDigit = 0;
+		break;
+	    }
+	}
+	__lastDigit >>= 24; /* only the high-byte counts */
 # else 
 #  if defined(i386) && defined(WIN32)
-        /*
-         * add long-wise
-         */
-        while (__src <= __srcLast-3) {
-            unsigned int __sum;
-
-            __sum = ((unsigned int *)__src)[0];    
-            asm {
-                  mov eax, __sum
-                  add eax, __carry
-                  mov edx, 0
-                  adc edx, 0
-                  mov __sum, eax
-                  mov __carry, edx
-                }
-
-            ((unsigned *)(__src + __ptrDelta))[0] = __lastDigit = __sum;
-            __src += 4;  
-            if (__carry == 0) {
-                while (__src <= __srcLast-3) {
-                    /* copy over */
-                    ((unsigned *)(__src + __ptrDelta))[0] = ((unsigned *)__src)[0];
-                    __src += 4;
-                }
-                __lastDigit = 0;
-                break;
-            }
-        }
-        __lastDigit >>= 24; /* only the high-byte counts */
+	/*
+	 * add long-wise
+	 */
+	while (__src <= __srcLast-3) {
+	    unsigned int __sum;
+
+	    __sum = ((unsigned int *)__src)[0];    
+	    asm {
+		  mov eax, __sum
+		  add eax, __carry
+		  mov edx, 0
+		  adc edx, 0
+		  mov __sum, eax
+		  mov __carry, edx
+		}
+
+	    ((unsigned *)(__src + __ptrDelta))[0] = __lastDigit = __sum;
+	    __src += 4;  
+	    if (__carry == 0) {
+		while (__src <= __srcLast-3) {
+		    /* copy over */
+		    ((unsigned *)(__src + __ptrDelta))[0] = ((unsigned *)__src)[0];
+		    __src += 4;
+		}
+		__lastDigit = 0;
+		break;
+	    }
+	}
+	__lastDigit >>= 24; /* only the high-byte counts */
 #  else 
 #   ifdef alpha64
-        /*
-         * add long-wise
-         */
-        while (__src <= (__srcLast-3)) {
-            unsigned INT __sum;
-
-            __sum = ((unsigned int *)__src)[0] + __carry;
-            ((unsigned int *)(__src + __ptrDelta))[0] = __lastDigit = __sum /* & 0xFFFF */;
-            __src += 4;  
-            __carry = __sum >> 32;
-            if (__carry == 0) {
-                while (__src <= (__srcLast-3)) {
-                    /* copy over */
-                    ((unsigned int *)(__src + __ptrDelta))[0] = ((unsigned int *)__src)[0];
-                    __src += 4;
-                }
-                __lastDigit = 0;
-                break;
-            }
-        }
-        __lastDigit >>= 24; /* only the high-byte counts */
+	/*
+	 * add long-wise
+	 */
+	while (__src <= (__srcLast-3)) {
+	    unsigned INT __sum;
+
+	    __sum = ((unsigned int *)__src)[0] + __carry;
+	    ((unsigned int *)(__src + __ptrDelta))[0] = __lastDigit = __sum /* & 0xFFFF */;
+	    __src += 4;  
+	    __carry = __sum >> 32;
+	    if (__carry == 0) {
+		while (__src <= (__srcLast-3)) {
+		    /* copy over */
+		    ((unsigned int *)(__src + __ptrDelta))[0] = ((unsigned int *)__src)[0];
+		    __src += 4;
+		}
+		__lastDigit = 0;
+		break;
+	    }
+	}
+	__lastDigit >>= 24; /* only the high-byte counts */
 #   endif /* alpha64 */
 #  endif /* i386 & WIN32 */
 # endif /* i386 & GNUC */
 
-        /*
-         * add short-wise
-         */
-        while (__src < __srcLast) {
-            __carry += ((unsigned short *)__src)[0];
-            ((unsigned short *)(__src + __ptrDelta))[0] = __lastDigit = __carry /* & 0xFFFF */;
-            __carry >>= 16;
-            __src += 2;
-        }
-        if (__src <= __srcLast) {
-            __carry += __src[0];
-            __src[__ptrDelta] = __lastDigit = __carry /* & 0xFF */;
-            __carry >>= 8;
-            __src++;
-        } else {
-            __lastDigit >>= 8;  /* only the high-byte counts */
-        }
+	/*
+	 * add short-wise
+	 */
+	while (__src < __srcLast) {
+	    __carry += ((unsigned short *)__src)[0];
+	    ((unsigned short *)(__src + __ptrDelta))[0] = __lastDigit = __carry /* & 0xFFFF */;
+	    __carry >>= 16;
+	    __src += 2;
+	}
+	if (__src <= __srcLast) {
+	    __carry += __src[0];
+	    __src[__ptrDelta] = __lastDigit = __carry /* & 0xFF */;
+	    __carry >>= 8;
+	    __src++;
+	} else {
+	    __lastDigit >>= 8;  /* only the high-byte counts */
+	}
 #else /* not __LSBFIRST */
-        while (__src <= __srcLast) {
-            __carry += __src[0];
-            __src[__ptrDelta] = __lastDigit = __carry /* & 0xFF */;
-            __carry >>= 8;
-            __src++;
-        }
+	while (__src <= __srcLast) {
+	    __carry += __src[0];
+	    __src[__ptrDelta] = __lastDigit = __carry /* & 0xFF */;
+	    __carry >>= 8;
+	    __src++;
+	}
 #endif /* __LSBFIRST */
 
-        __dst = __src + __ptrDelta;
-        while (__dst <= __dstLast) {
-            __dst[0] = __lastDigit = __carry /* & 0xFF */;
-            __carry >>= 8;
-            __dst++;
-        }
-
-        if (lastDigit) {
-            RETURN (result);
-        }
-        ok = true;
+	__dst = __src + __ptrDelta;
+	while (__dst <= __dstLast) {
+	    __dst[0] = __lastDigit = __carry /* & 0xFF */;
+	    __carry >>= 8;
+	    __dst++;
+	}
+
+	if (lastDigit) {
+	    RETURN (result);
+	}
+	ok = true;
     }
 %}.
 
     ok ~~ true ifTrue:[
-        index := 1.
-        carry := aSmallInteger abs.
-
-        [carry ~~ 0] whileTrue:[
-            (index <= len) ifTrue:[
-                carry := (digitByteArray basicAt:index) + carry.
-            ].
-            resultDigitByteArray basicAt:index put:(lastDigit := carry bitAnd:16rFF).
-            carry := carry bitShift:-8.
-            index := index + 1
-        ].
-
-        (index <= rsltLen) ifTrue:[
-            [index <= len] whileTrue:[
-                resultDigitByteArray basicAt:index put:(digitByteArray basicAt:index).
-                index := index + 1
-            ].
-            lastDigit := 0.
-        ].
-
-        lastDigit ~~ 0 ifTrue:[
-            ^ result
-        ].
+	index := 1.
+	carry := aSmallInteger abs.
+
+	[carry ~~ 0] whileTrue:[
+	    (index <= len) ifTrue:[
+		carry := (digitByteArray basicAt:index) + carry.
+	    ].
+	    resultDigitByteArray basicAt:index put:(lastDigit := carry bitAnd:16rFF).
+	    carry := carry bitShift:-8.
+	    index := index + 1
+	].
+
+	(index <= rsltLen) ifTrue:[
+	    [index <= len] whileTrue:[
+		resultDigitByteArray basicAt:index put:(digitByteArray basicAt:index).
+		index := index + 1
+	    ].
+	    lastDigit := 0.
+	].
+
+	lastDigit ~~ 0 ifTrue:[
+	    ^ result
+	].
     ].
 
     ^ result compressed
@@ -2363,91 +2362,91 @@
     if (__isByteArray(_digitByteArray)
      && __isByteArray(otherDigitByteArray)
      && __isByteArray(resultDigitByteArray)) {
-        int __len1 = __intVal(len1);
-        int __len2 = __intVal(len2);
-        int __minLen = __len1 < __len2 ? __len1 : __len2;
-        int __index, __borrow = 0, __diff;
-        unsigned char *__myDigits, *__otherDigits, *__resultDigits;
+	int __len1 = __intVal(len1);
+	int __len2 = __intVal(len2);
+	int __minLen = __len1 < __len2 ? __len1 : __len2;
+	int __index, __borrow = 0, __diff;
+	unsigned char *__myDigits, *__otherDigits, *__resultDigits;
         
-        ok = true;
-
-        __resultDigits = __ByteArrayInstPtr(resultDigitByteArray)->ba_element;
-        __otherDigits = __ByteArrayInstPtr(otherDigitByteArray)->ba_element;
-        __myDigits = __ByteArrayInstPtr(_digitByteArray)->ba_element;
-
-        __index = 1;
-        while (__index <= __minLen) {
-            __diff = __borrow + __myDigits[__index-1] - __otherDigits[__index-1];
-            if (__diff >= 0) {
-                __borrow = 0;
-            } else {
-                __borrow = -1;
-                __diff += 0x100;
-            }
-            __resultDigits[__index-1] = __diff;
-            __index++;
-        }
-        if (__len1 > __len2) {
-            while (__index <= __len1) {
-                __diff = __borrow + __myDigits[__index-1];
-                if (__diff >= 0) {
-                    __borrow = 0;
-                } else {
-                    __borrow = -1;
-                    __diff += 0x100;
-                }
-                __resultDigits[__index-1] = __diff;
-                __index++;
-            }
-        } else {
-            if (__len2 > __len1) {
-                while (__index <= __len2) {
-                    __diff = __borrow - __otherDigits[__index-1];
-                    if (__diff >= 0) {
-                        __borrow = 0;
-                    } else {
-                        __borrow = -1;
-                        __diff += 0x100;
-                    }
-                    __resultDigits[__index-1] = __diff;
-                    __index++;
-                }
-            }
-        }
-        borrow = __MKSMALLINT(__borrow);
-        index = __MKSMALLINT(__index);
+	ok = true;
+
+	__resultDigits = __ByteArrayInstPtr(resultDigitByteArray)->ba_element;
+	__otherDigits = __ByteArrayInstPtr(otherDigitByteArray)->ba_element;
+	__myDigits = __ByteArrayInstPtr(_digitByteArray)->ba_element;
+
+	__index = 1;
+	while (__index <= __minLen) {
+	    __diff = __borrow + __myDigits[__index-1] - __otherDigits[__index-1];
+	    if (__diff >= 0) {
+		__borrow = 0;
+	    } else {
+		__borrow = -1;
+		__diff += 0x100;
+	    }
+	    __resultDigits[__index-1] = __diff;
+	    __index++;
+	}
+	if (__len1 > __len2) {
+	    while (__index <= __len1) {
+		__diff = __borrow + __myDigits[__index-1];
+		if (__diff >= 0) {
+		    __borrow = 0;
+		} else {
+		    __borrow = -1;
+		    __diff += 0x100;
+		}
+		__resultDigits[__index-1] = __diff;
+		__index++;
+	    }
+	} else {
+	    if (__len2 > __len1) {
+		while (__index <= __len2) {
+		    __diff = __borrow - __otherDigits[__index-1];
+		    if (__diff >= 0) {
+			__borrow = 0;
+		    } else {
+			__borrow = -1;
+			__diff += 0x100;
+		    }
+		    __resultDigits[__index-1] = __diff;
+		    __index++;
+		}
+	    }
+	}
+	borrow = __MKSMALLINT(__borrow);
+	index = __MKSMALLINT(__index);
     }
 %}.
     ok == true ifFalse:[
-        index := 1.
-        borrow := 0.
-
-        done := false.
-        [done] whileFalse:[
-            diff := borrow.
-            (index <= len1) ifTrue:[
-                diff := diff + (digitByteArray basicAt:index).
-                (index <= len2) ifTrue:[
-                    diff := diff - (otherDigitByteArray basicAt:index)
-                ]
-            ] ifFalse:[
-                (index <= len2) ifTrue:[
-                    diff := diff - (otherDigitByteArray basicAt:index)
-                ] ifFalse:[
-                    "end reached"
-                    done := true
-                ]
-            ].
-
-            "/ workaround for
-            "/ gcc code generator bug
-
-            (diff >= 0) ifTrue:[
-                borrow := 0
-            ] ifFalse:[
-                borrow := -1.
-                diff := diff + 16r100
-            ].
+	index := 1.
+	borrow := 0.
+
+	done := false.
+	[done] whileFalse:[
+	    diff := borrow.
+	    (index <= len1) ifTrue:[
+		diff := diff + (digitByteArray basicAt:index).
+		(index <= len2) ifTrue:[
+		    diff := diff - (otherDigitByteArray basicAt:index)
+		]
+	    ] ifFalse:[
+		(index <= len2) ifTrue:[
+		    diff := diff - (otherDigitByteArray basicAt:index)
+		] ifFalse:[
+		    "end reached"
+		    done := true
+		]
+	    ].
+
+	    "/ workaround for
+	    "/ gcc code generator bug
+
+	    (diff >= 0) ifTrue:[
+		borrow := 0
+	    ] ifFalse:[
+		borrow := -1.
+		diff := diff + 16r100
+	    ].
 
     "/        (diff < 0) ifTrue:[
     "/            borrow := -1.
@@ -2456,35 +2455,35 @@
     "/            borrow := 0
     "/        ].
 
-            resultDigitByteArray basicAt:index put:diff.
-            index := index + 1
-        ].
+	    resultDigitByteArray basicAt:index put:diff.
+	    index := index + 1
+	].
     ].
 
     (borrow ~~ 0) ifTrue:[
-        "/ must generate 255's complement
-
-        result sign:-1.
-        [index <= lResult] whileTrue:[
-            resultDigitByteArray basicAt:index put:16rFF.
-            index := index + 1.
-        ].
-        index := resultDigitByteArray size.
-        [index > 0] whileTrue:[
-            resultDigitByteArray basicAt:index put:(255 - (resultDigitByteArray at:index)).
-            index := index -1.
-        ].
-
-        index := 1.
-        carry := 1.
-        [carry ~~ 0] whileTrue:[
-            (index <= lResult) ifTrue:[
-                carry := (resultDigitByteArray basicAt:index) + carry.
-            ].
-            resultDigitByteArray basicAt:index put:(carry bitAnd:16rFF).
-            carry := carry bitShift:-8.
-            index := index + 1
-        ].
+	"/ must generate 255's complement
+
+	result sign:-1.
+	[index <= lResult] whileTrue:[
+	    resultDigitByteArray basicAt:index put:16rFF.
+	    index := index + 1.
+	].
+	index := resultDigitByteArray size.
+	[index > 0] whileTrue:[
+	    resultDigitByteArray basicAt:index put:(255 - (resultDigitByteArray at:index)).
+	    index := index -1.
+	].
+
+	index := 1.
+	carry := 1.
+	[carry ~~ 0] whileTrue:[
+	    (index <= lResult) ifTrue:[
+		carry := (resultDigitByteArray basicAt:index) + carry.
+	    ].
+	    resultDigitByteArray basicAt:index put:(carry bitAnd:16rFF).
+	    carry := carry bitShift:-8.
+	    index := index + 1
+	].
     ].
     ^ result compressed
 
@@ -2972,12 +2971,12 @@
     otherDigitByteArray := aLargeInteger digits.
     len2 := otherDigitByteArray size.
     len2 > len1 ifTrue:[
-        [(otherDigitByteArray at:len2) == 0] whileTrue:[
-            len2 := len2 - 1
-        ].
-        len2 > len1 ifTrue:[
-            self halt "/ may not be called that way
-        ].
+	[(otherDigitByteArray at:len2) == 0] whileTrue:[
+	    len2 := len2 - 1
+	].
+	len2 > len1 ifTrue:[
+	    self halt "/ may not be called that way
+	].
     ].
     "/ knowing that len2 is <= len1
 %{
@@ -2986,51 +2985,51 @@
 
     if (__isByteArray(_digitByteArray)
      && __isByteArray(otherDigitByteArray)) {
-        int _len1 = __intVal(len1), 
-            _len2 = __intVal(len2);
-        unsigned char *_myDigits, *_otherDigits;
-        int _index = 1, _borrow = 0;
-        int _diff;
-        int anyBitNonZero = 0;
-
-        _otherDigits = __ByteArrayInstPtr(otherDigitByteArray)->ba_element;
-        _myDigits = __ByteArrayInstPtr(_digitByteArray)->ba_element;
-
-        while (_index <= _len2) {
-            _diff = _borrow + _myDigits[_index - 1];
-            _diff -= _otherDigits[_index - 1];
-            if (_diff >= 0) {
-                _borrow = 0;
-            } else {
-                _borrow = -1;
-                _diff += 0x100;
-            }
-            _myDigits[_index - 1] = _diff;
-            anyBitNonZero |= (_diff & 0xFF);
-            _index++;
-        }
-
-        while (_index <= _len1) {
-            _diff = _borrow + _myDigits[_index - 1];
-            if (_diff >= 0) {
-                /* _borrow = 0; */
-                _myDigits[_index - 1] = _diff;
-                anyBitNonZero |= (_diff & 0xFF);
-                _index++;
-                while (_index <= _len1) {
-                    anyBitNonZero |= _myDigits[_index - 1];
-                    _index++;
-                }
-                break;
-            }
-            _borrow = -1;
-            _diff += 0x100;
-
-            _myDigits[_index - 1] = _diff;
-            anyBitNonZero |= (_diff & 0xFF);
-            _index++;
-        }
-        RETURN (anyBitNonZero ? true : false);
+	int _len1 = __intVal(len1), 
+	    _len2 = __intVal(len2);
+	unsigned char *_myDigits, *_otherDigits;
+	int _index = 1, _borrow = 0;
+	int _diff;
+	int anyBitNonZero = 0;
+
+	_otherDigits = __ByteArrayInstPtr(otherDigitByteArray)->ba_element;
+	_myDigits = __ByteArrayInstPtr(_digitByteArray)->ba_element;
+
+	while (_index <= _len2) {
+	    _diff = _borrow + _myDigits[_index - 1];
+	    _diff -= _otherDigits[_index - 1];
+	    if (_diff >= 0) {
+		_borrow = 0;
+	    } else {
+		_borrow = -1;
+		_diff += 0x100;
+	    }
+	    _myDigits[_index - 1] = _diff;
+	    anyBitNonZero |= (_diff & 0xFF);
+	    _index++;
+	}
+
+	while (_index <= _len1) {
+	    _diff = _borrow + _myDigits[_index - 1];
+	    if (_diff >= 0) {
+		/* _borrow = 0; */
+		_myDigits[_index - 1] = _diff;
+		anyBitNonZero |= (_diff & 0xFF);
+		_index++;
+		while (_index <= _len1) {
+		    anyBitNonZero |= _myDigits[_index - 1];
+		    _index++;
+		}
+		break;
+	    }
+	    _borrow = -1;
+	    _diff += 0x100;
+
+	    _myDigits[_index - 1] = _diff;
+	    anyBitNonZero |= (_diff & 0xFF);
+	    _index++;
+	}
+	RETURN (anyBitNonZero ? true : false);
     }
 %}.
     self halt.
@@ -3077,66 +3076,66 @@
     OBJ __digits = __INST(digitByteArray);
 
     if (__isByteArray(__digits)) {
-        int __nBytes = __byteArraySize(__digits);
-        unsigned char *__bp = __ByteArrayInstPtr(__digits)->ba_element;
-        unsigned INT __this, __next;
-        int __idx;
-
-        if (__nBytes == 1) {
-            __bp[0] >>= 1;
-            RETURN (self);
-        }
-
-        __idx = 1;
+	int __nBytes = __byteArraySize(__digits);
+	unsigned char *__bp = __ByteArrayInstPtr(__digits)->ba_element;
+	unsigned INT __this, __next;
+	int __idx;
+
+	if (__nBytes == 1) {
+	    __bp[0] >>= 1;
+	    RETURN (self);
+	}
+
+	__idx = 1;
 
 #if defined(alpha64)
-        if (sizeof(unsigned INT) == 8) {
-            if ((__idx + 8) < __nBytes) {
-                __this = ((unsigned INT *)__bp)[0];
-
-                while ((__idx + 8) < __nBytes) {
-                    __next = ((unsigned INT *)__bp)[1];
-                    __this = (__this >> 1) /* & 0x7FFFFFFFFFFFFFF */;
-                    __this |= __next << 63;
-                    ((unsigned INT *)__bp)[0] = __this;
-                    __this = __next;
-                    __bp += 8;
-                    __idx += 8;
-                }
-            }
-        }
+	if (sizeof(unsigned INT) == 8) {
+	    if ((__idx + 8) < __nBytes) {
+		__this = ((unsigned INT *)__bp)[0];
+
+		while ((__idx + 8) < __nBytes) {
+		    __next = ((unsigned INT *)__bp)[1];
+		    __this = (__this >> 1) /* & 0x7FFFFFFFFFFFFFF */;
+		    __this |= __next << 63;
+		    ((unsigned INT *)__bp)[0] = __this;
+		    __this = __next;
+		    __bp += 8;
+		    __idx += 8;
+		}
+	    }
+	}
 #else
 # if defined(__LSBFIRST) || defined(i386) /* XXX actually: LSB_FIRST */
-        if (sizeof(unsigned INT) == 4) {
-            if ((__idx + 4) < __nBytes) {
-                __this = ((unsigned INT *)__bp)[0];
-
-                while ((__idx + 4) < __nBytes) {
-                    __next = ((unsigned INT *)__bp)[1];
-                    __this = (__this >> 1) /* & 0x7FFFFFF */;
-                    __this |= __next << 31;
-                    ((unsigned INT *)__bp)[0] = __this;
-                    __this = __next;
-                    __bp += 4;
-                    __idx += 4;
-                }
-            }
-        }
+	if (sizeof(unsigned INT) == 4) {
+	    if ((__idx + 4) < __nBytes) {
+		__this = ((unsigned INT *)__bp)[0];
+
+		while ((__idx + 4) < __nBytes) {
+		    __next = ((unsigned INT *)__bp)[1];
+		    __this = (__this >> 1) /* & 0x7FFFFFF */;
+		    __this |= __next << 31;
+		    ((unsigned INT *)__bp)[0] = __this;
+		    __this = __next;
+		    __bp += 4;
+		    __idx += 4;
+		}
+	    }
+	}
 # endif
 #endif
 
-        __this = __bp[0];
-        while (__idx < __nBytes) {
-            __next = __bp[1];
-            __this >>= 1;
-            __this |= __next << 7;
-            __bp[0] = __this;
-            __this = __next;
-            __bp++;
-            __idx++;
-        }
-        __bp[0] = __this >> 1;
-        RETURN (self);
+	__this = __bp[0];
+	while (__idx < __nBytes) {
+	    __next = __bp[1];
+	    __this >>= 1;
+	    __this |= __next << 7;
+	    __bp[0] = __this;
+	    __this = __next;
+	    __bp++;
+	    __idx++;
+	}
+	__bp[0] = __this >> 1;
+	RETURN (self);
     }
 %}.
     self primitiveFailed
@@ -3299,5 +3298,5 @@
 !LargeInteger class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.101 1999-05-16 15:33:53 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.102 1999-05-19 20:13:51 cg Exp $'
 ! !