--- a/LargeInt.st Sat Jul 26 19:09:30 1997 +0200
+++ b/LargeInt.st Sat Jul 26 19:18:49 1997 +0200
@@ -699,12 +699,74 @@
if (__isByteArray(t)) {
unsigned char *_digitBytes = __ByteArrayInstPtr(t)->ba_element;
int _idx, _idx0;
- int _val;
+ INT _val;
_idx = _idx0 = _byteArraySize(t);
while ((_idx > 0) && (_digitBytes[_idx - 1] == 0)) {
_idx--;
}
+#if INT == long
+ switch (_idx) {
+ case 7:
+ _val = (_digitBytes[6]<<8);
+ _val = (_val + _digitBytes[5]) << 8;
+ _val = (_val + _digitBytes[4]) << 8;
+ _val = (_val + _digitBytes[3]) << 8;
+ _val = (_val + _digitBytes[2]) << 8;
+ _val = (_val + _digitBytes[1]) << 8;
+ _val += _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 6:
+ _val = (_digitBytes[5]<<8);
+ _val = (_val + _digitBytes[4]) << 8;
+ _val = (_val + _digitBytes[3]) << 8;
+ _val = (_val + _digitBytes[2]) << 8;
+ _val = (_val + _digitBytes[1]) << 8;
+ _val += _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 5:
+ _val = (_digitBytes[4]<<8);
+ _val = (_val + _digitBytes[3]) << 8;
+ _val = (_val + _digitBytes[2]) << 8;
+ _val = (_val + _digitBytes[1]) << 8;
+ _val += _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 4:
+ _val = (_digitBytes[3]<<8);
+ _val = (_val + _digitBytes[2]) << 8;
+ _val = (_val + _digitBytes[1]) << 8;
+ _val += _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 3:
+ _val = (_digitBytes[2]<<8);
+ _val = (_val + _digitBytes[1]) << 8;
+ _val += _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 2:
+ _val = (_digitBytes[1]<<8) + _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 1:
+ _val = _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 0:
+ RETURN (__MKSMALLINT(0));
+
+ }
+#else
if (_idx <= 4) {
if (_idx <= 2) {
if (_idx == 0) {
@@ -737,6 +799,7 @@
}
}
}
+#endif
if (_idx == _idx0) {
RETURN (self);
@@ -791,7 +854,11 @@
|absValue
b1 "{ Class: SmallInteger }"
b2 "{ Class: SmallInteger }"
- b3 "{ Class: SmallInteger }"|
+ b3 "{ Class: SmallInteger }"
+ b4 "{ Class: SmallInteger }"
+ b5 "{ Class: SmallInteger }"
+ b6 "{ Class: SmallInteger }"
+ b7 "{ Class: SmallInteger }"|
"
could have simply created a 4-byte largeinteger and normalize
@@ -825,7 +892,57 @@
absValue == 0 ifTrue:[
digitByteArray := ByteArray with:b1 with:b2 with:b3
] ifFalse:[
- digitByteArray := ByteArray with:b1 with:b2 with:b3 with:absValue
+ b4 := absValue bitAnd:16rFF.
+ absValue := absValue bitShift:-8.
+ absValue == 0 ifTrue:[
+ digitByteArray := ByteArray with:b1 with:b2 with:b3 with:b4
+ ] ifFalse:[
+ b5 := absValue bitAnd:16rFF.
+ absValue := absValue bitShift:-8.
+ absValue == 0 ifTrue:[
+ digitByteArray := ByteArray new:5.
+ digitByteArray at:1 put:b1.
+ digitByteArray at:2 put:b2.
+ digitByteArray at:3 put:b3.
+ digitByteArray at:4 put:b4.
+ digitByteArray at:5 put:b5.
+ ] ifFalse:[
+ b6 := absValue bitAnd:16rFF.
+ absValue := absValue bitShift:-8.
+ absValue == 0 ifTrue:[
+ digitByteArray := ByteArray new:6.
+ digitByteArray at:1 put:b1.
+ digitByteArray at:2 put:b2.
+ digitByteArray at:3 put:b3.
+ digitByteArray at:4 put:b4.
+ digitByteArray at:5 put:b5.
+ digitByteArray at:6 put:b6.
+ ] ifFalse:[
+ b7 := absValue bitAnd:16rFF.
+ absValue := absValue bitShift:-8.
+ absValue == 0 ifTrue:[
+ digitByteArray := ByteArray new:7.
+ digitByteArray at:1 put:b1.
+ digitByteArray at:2 put:b2.
+ digitByteArray at:3 put:b3.
+ digitByteArray at:4 put:b4.
+ digitByteArray at:5 put:b5.
+ digitByteArray at:6 put:b6.
+ digitByteArray at:7 put:b7.
+ ] ifFalse:[
+ digitByteArray := ByteArray new:8.
+ digitByteArray at:1 put:b1.
+ digitByteArray at:2 put:b2.
+ digitByteArray at:3 put:b3.
+ digitByteArray at:4 put:b4.
+ digitByteArray at:5 put:b5.
+ digitByteArray at:6 put:b6.
+ digitByteArray at:7 put:b7.
+ digitByteArray at:7 put:absValue.
+ ]
+ ]
+ ]
+ ]
]
]
]
@@ -991,10 +1108,10 @@
if (__isSmallInteger(len)
&& __isByteArray(__digitByteArray)
&& __isByteArray(resultDigitByteArray)) {
- int _l = __intVal(len);
- int _v = __intVal(val);
- unsigned _carry = 0;
- unsigned _prod;
+ 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;
@@ -1028,6 +1145,31 @@
}
# else
+# ifdef alpha64
+ if (_v <= 0xFFFFFFFFL) {
+ /* can do it int-wise
+ *
+ * max: 0xFFFFFFFF * 0xFFFFFFFF -> 0xFFFFFFFE.0001
+ * + maxCarry (0xFFFFFFFF) -> 0xFFFFFFFF.0000
+ */
+ while (_l > 3) {
+ _prod = ((unsigned *)digitP)[0] * _v + _carry;
+ ((unsigned *)resultP)[0] = _prod & 0xFFFFFFFFL;
+ _carry = _prod >> 32;
+ digitP += 4;
+ resultP += 4;
+ _l -= 4;
+ }
+ if (_l > 1) {
+ _prod = ((unsigned short *)digitP)[0] * _v + _carry;
+ ((unsigned short *)resultP)[0] = _prod & 0xFFFF;
+ _carry = _prod >> 16;
+ digitP += 2;
+ resultP += 2;
+ _l -= 2;
+ }
+ }
+# else
if (_v <= 0xFFFF) {
/* can do it short-wise
*
@@ -1043,6 +1185,7 @@
_l -= 2;
}
}
+# endif
# endif
#endif
{
@@ -1248,10 +1391,10 @@
if (__isByteArray(__digits)
&& __isByteArray(newDigitByteArray)
&& __bothSmallInteger(count, aPositiveSmallInteger)) {
- unsigned int rest = 0;
+ unsigned INT rest = 0;
int index = __intVal(count);
int index0;
- unsigned divisor = __intVal(aPositiveSmallInteger);
+ unsigned INT divisor = __intVal(aPositiveSmallInteger);
unsigned char *digitBytes = __ByteArrayInstPtr(__digits)->ba_element;
unsigned char *resultBytes = __ByteArrayInstPtr(newDigitByteArray)->ba_element;
@@ -1260,8 +1403,8 @@
/*
if (divisor < 0xFFFF) {
while (index > 1) {
- unsigned int t;
- unsigned div;
+ unsigned INT t;
+ unsigned INT div;
index--;
t = digitBytes[index];
@@ -1276,7 +1419,7 @@
}
*/
while (index > 0) {
- unsigned int t;
+ unsigned INT t;
index--;
t = digitBytes[index];
@@ -1567,7 +1710,7 @@
unsigned char *otherBytes = __ByteArrayInstPtr(otherDigitByteArray)->ba_element;
unsigned char *resultBytes = __ByteArrayInstPtr(resultDigitByteArray)->ba_element;
int _index1, _index2, _dstIndex, _idx;
- unsigned _prod, _carry, _v;
+ unsigned INT _prod, _carry, _v;
for (_index1 = 0; _index1 < __intVal(len1); _index1++) {
for (_index2 = 0; _index2 < __intVal(len2); _index2++) {
@@ -1745,13 +1888,13 @@
__idx = 1;
if ((__idx+4) < __nBytes) {
- __this = ((unsigned long *)__bp)[0];
+ __this = ((unsigned *)__bp)[0];
while ((__idx+4) < __nBytes) {
- __next = ((unsigned long *)__bp)[1];
+ __next = ((unsigned *)__bp)[1];
__this >>= 1;
__this |= __next << 31;
- ((unsigned long *)__bp)[0] = __this;
+ ((unsigned *)__bp)[0] = __this;
__this = __next;
__bp += 4;
__idx += 4;
@@ -1812,9 +1955,9 @@
int __idx;
while (__nBytes >= 4) {
- __this = ((unsigned long *)__bp)[0];
+ __this = ((unsigned *)__bp)[0];
__newCarry = __this >> 31;
- ((unsigned long *)__bp)[0] = (__this << 1) | __carry;
+ ((unsigned *)__bp)[0] = (__this << 1) | __carry;
__carry = __newCarry;
__bp += 4;
__nBytes -= 4;
@@ -1909,5 +2052,5 @@
!LargeInteger class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/Attic/LargeInt.st,v 1.44 1997-04-02 21:34:41 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/Attic/LargeInt.st,v 1.45 1997-07-26 17:18:49 cg Exp $'
! !
--- a/LargeInteger.st Sat Jul 26 19:09:30 1997 +0200
+++ b/LargeInteger.st Sat Jul 26 19:18:49 1997 +0200
@@ -699,12 +699,74 @@
if (__isByteArray(t)) {
unsigned char *_digitBytes = __ByteArrayInstPtr(t)->ba_element;
int _idx, _idx0;
- int _val;
+ INT _val;
_idx = _idx0 = _byteArraySize(t);
while ((_idx > 0) && (_digitBytes[_idx - 1] == 0)) {
_idx--;
}
+#if INT == long
+ switch (_idx) {
+ case 7:
+ _val = (_digitBytes[6]<<8);
+ _val = (_val + _digitBytes[5]) << 8;
+ _val = (_val + _digitBytes[4]) << 8;
+ _val = (_val + _digitBytes[3]) << 8;
+ _val = (_val + _digitBytes[2]) << 8;
+ _val = (_val + _digitBytes[1]) << 8;
+ _val += _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 6:
+ _val = (_digitBytes[5]<<8);
+ _val = (_val + _digitBytes[4]) << 8;
+ _val = (_val + _digitBytes[3]) << 8;
+ _val = (_val + _digitBytes[2]) << 8;
+ _val = (_val + _digitBytes[1]) << 8;
+ _val += _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 5:
+ _val = (_digitBytes[4]<<8);
+ _val = (_val + _digitBytes[3]) << 8;
+ _val = (_val + _digitBytes[2]) << 8;
+ _val = (_val + _digitBytes[1]) << 8;
+ _val += _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 4:
+ _val = (_digitBytes[3]<<8);
+ _val = (_val + _digitBytes[2]) << 8;
+ _val = (_val + _digitBytes[1]) << 8;
+ _val += _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 3:
+ _val = (_digitBytes[2]<<8);
+ _val = (_val + _digitBytes[1]) << 8;
+ _val += _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 2:
+ _val = (_digitBytes[1]<<8) + _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 1:
+ _val = _digitBytes[0];
+ if (__INST(sign) == __MKSMALLINT(-1))
+ _val = -_val;
+ RETURN (__MKSMALLINT(_val));
+ case 0:
+ RETURN (__MKSMALLINT(0));
+
+ }
+#else
if (_idx <= 4) {
if (_idx <= 2) {
if (_idx == 0) {
@@ -737,6 +799,7 @@
}
}
}
+#endif
if (_idx == _idx0) {
RETURN (self);
@@ -791,7 +854,11 @@
|absValue
b1 "{ Class: SmallInteger }"
b2 "{ Class: SmallInteger }"
- b3 "{ Class: SmallInteger }"|
+ b3 "{ Class: SmallInteger }"
+ b4 "{ Class: SmallInteger }"
+ b5 "{ Class: SmallInteger }"
+ b6 "{ Class: SmallInteger }"
+ b7 "{ Class: SmallInteger }"|
"
could have simply created a 4-byte largeinteger and normalize
@@ -825,7 +892,57 @@
absValue == 0 ifTrue:[
digitByteArray := ByteArray with:b1 with:b2 with:b3
] ifFalse:[
- digitByteArray := ByteArray with:b1 with:b2 with:b3 with:absValue
+ b4 := absValue bitAnd:16rFF.
+ absValue := absValue bitShift:-8.
+ absValue == 0 ifTrue:[
+ digitByteArray := ByteArray with:b1 with:b2 with:b3 with:b4
+ ] ifFalse:[
+ b5 := absValue bitAnd:16rFF.
+ absValue := absValue bitShift:-8.
+ absValue == 0 ifTrue:[
+ digitByteArray := ByteArray new:5.
+ digitByteArray at:1 put:b1.
+ digitByteArray at:2 put:b2.
+ digitByteArray at:3 put:b3.
+ digitByteArray at:4 put:b4.
+ digitByteArray at:5 put:b5.
+ ] ifFalse:[
+ b6 := absValue bitAnd:16rFF.
+ absValue := absValue bitShift:-8.
+ absValue == 0 ifTrue:[
+ digitByteArray := ByteArray new:6.
+ digitByteArray at:1 put:b1.
+ digitByteArray at:2 put:b2.
+ digitByteArray at:3 put:b3.
+ digitByteArray at:4 put:b4.
+ digitByteArray at:5 put:b5.
+ digitByteArray at:6 put:b6.
+ ] ifFalse:[
+ b7 := absValue bitAnd:16rFF.
+ absValue := absValue bitShift:-8.
+ absValue == 0 ifTrue:[
+ digitByteArray := ByteArray new:7.
+ digitByteArray at:1 put:b1.
+ digitByteArray at:2 put:b2.
+ digitByteArray at:3 put:b3.
+ digitByteArray at:4 put:b4.
+ digitByteArray at:5 put:b5.
+ digitByteArray at:6 put:b6.
+ digitByteArray at:7 put:b7.
+ ] ifFalse:[
+ digitByteArray := ByteArray new:8.
+ digitByteArray at:1 put:b1.
+ digitByteArray at:2 put:b2.
+ digitByteArray at:3 put:b3.
+ digitByteArray at:4 put:b4.
+ digitByteArray at:5 put:b5.
+ digitByteArray at:6 put:b6.
+ digitByteArray at:7 put:b7.
+ digitByteArray at:7 put:absValue.
+ ]
+ ]
+ ]
+ ]
]
]
]
@@ -991,10 +1108,10 @@
if (__isSmallInteger(len)
&& __isByteArray(__digitByteArray)
&& __isByteArray(resultDigitByteArray)) {
- int _l = __intVal(len);
- int _v = __intVal(val);
- unsigned _carry = 0;
- unsigned _prod;
+ 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;
@@ -1028,6 +1145,31 @@
}
# else
+# ifdef alpha64
+ if (_v <= 0xFFFFFFFFL) {
+ /* can do it int-wise
+ *
+ * max: 0xFFFFFFFF * 0xFFFFFFFF -> 0xFFFFFFFE.0001
+ * + maxCarry (0xFFFFFFFF) -> 0xFFFFFFFF.0000
+ */
+ while (_l > 3) {
+ _prod = ((unsigned *)digitP)[0] * _v + _carry;
+ ((unsigned *)resultP)[0] = _prod & 0xFFFFFFFFL;
+ _carry = _prod >> 32;
+ digitP += 4;
+ resultP += 4;
+ _l -= 4;
+ }
+ if (_l > 1) {
+ _prod = ((unsigned short *)digitP)[0] * _v + _carry;
+ ((unsigned short *)resultP)[0] = _prod & 0xFFFF;
+ _carry = _prod >> 16;
+ digitP += 2;
+ resultP += 2;
+ _l -= 2;
+ }
+ }
+# else
if (_v <= 0xFFFF) {
/* can do it short-wise
*
@@ -1043,6 +1185,7 @@
_l -= 2;
}
}
+# endif
# endif
#endif
{
@@ -1248,10 +1391,10 @@
if (__isByteArray(__digits)
&& __isByteArray(newDigitByteArray)
&& __bothSmallInteger(count, aPositiveSmallInteger)) {
- unsigned int rest = 0;
+ unsigned INT rest = 0;
int index = __intVal(count);
int index0;
- unsigned divisor = __intVal(aPositiveSmallInteger);
+ unsigned INT divisor = __intVal(aPositiveSmallInteger);
unsigned char *digitBytes = __ByteArrayInstPtr(__digits)->ba_element;
unsigned char *resultBytes = __ByteArrayInstPtr(newDigitByteArray)->ba_element;
@@ -1260,8 +1403,8 @@
/*
if (divisor < 0xFFFF) {
while (index > 1) {
- unsigned int t;
- unsigned div;
+ unsigned INT t;
+ unsigned INT div;
index--;
t = digitBytes[index];
@@ -1276,7 +1419,7 @@
}
*/
while (index > 0) {
- unsigned int t;
+ unsigned INT t;
index--;
t = digitBytes[index];
@@ -1567,7 +1710,7 @@
unsigned char *otherBytes = __ByteArrayInstPtr(otherDigitByteArray)->ba_element;
unsigned char *resultBytes = __ByteArrayInstPtr(resultDigitByteArray)->ba_element;
int _index1, _index2, _dstIndex, _idx;
- unsigned _prod, _carry, _v;
+ unsigned INT _prod, _carry, _v;
for (_index1 = 0; _index1 < __intVal(len1); _index1++) {
for (_index2 = 0; _index2 < __intVal(len2); _index2++) {
@@ -1745,13 +1888,13 @@
__idx = 1;
if ((__idx+4) < __nBytes) {
- __this = ((unsigned long *)__bp)[0];
+ __this = ((unsigned *)__bp)[0];
while ((__idx+4) < __nBytes) {
- __next = ((unsigned long *)__bp)[1];
+ __next = ((unsigned *)__bp)[1];
__this >>= 1;
__this |= __next << 31;
- ((unsigned long *)__bp)[0] = __this;
+ ((unsigned *)__bp)[0] = __this;
__this = __next;
__bp += 4;
__idx += 4;
@@ -1812,9 +1955,9 @@
int __idx;
while (__nBytes >= 4) {
- __this = ((unsigned long *)__bp)[0];
+ __this = ((unsigned *)__bp)[0];
__newCarry = __this >> 31;
- ((unsigned long *)__bp)[0] = (__this << 1) | __carry;
+ ((unsigned *)__bp)[0] = (__this << 1) | __carry;
__carry = __newCarry;
__bp += 4;
__nBytes -= 4;
@@ -1909,5 +2052,5 @@
!LargeInteger class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.44 1997-04-02 21:34:41 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.45 1997-07-26 17:18:49 cg Exp $'
! !