--- 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 $'
! !