alpha64 changes
authorClaus Gittinger <cg@exept.de>
Sat, 26 Jul 1997 19:18:49 +0200
changeset 2786 8f05ce0a14e1
parent 2785 3d222249bd61
child 2787 e58b466c02a7
alpha64 changes
LargeInt.st
LargeInteger.st
--- 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 $'
 ! !