--- a/LargeInteger.st Sat Feb 28 12:20:37 2009 +0100
+++ b/LargeInteger.st Sat Feb 28 12:36:19 2009 +0100
@@ -871,28 +871,26 @@
"return the bitwise-and of the receiver and the argument, anInteger"
%{ /* NOCONTEXT */
-
if (__isSmallInteger(anInteger)) {
- INT v2 = __intVal(anInteger);
- INT v1;
+ INT v2 = __intVal(anInteger);
+ INT v1;
#if defined(__LSBFIRST__)
- v1 = *(INT *)(__stringVal(__INST(digitByteArray)));
+ v1 = *(INT *)(__byteArrayVal(__INST(digitByteArray)));
#else
- unsigned char *digits = (unsigned char *)(__stringVal(__INST(digitByteArray)));
-
- v1 = digits[0] & 0xFF;
- v1 = v1 | ((digits[1] & 0xFF)<<8);
- v1 = v1 | ((digits[2] & 0xFF)<<16);
- v1 = v1 | ((digits[3] & 0xFF)<<24);
- if (sizeof(unsigned INT) == 8) {
- v1 = v1 | ((digits[4] & 0xFF)<<32);
- v1 = v1 | ((digits[5] & 0xFF)<<40);
- v1 = v1 | ((digits[6] & 0xFF)<<48);
- v1 = v1 | ((digits[7] & 0xFF)<<56);
- }
+ unsigned char *digits = (unsigned char *)(__byteArrayVal(__INST(digitByteArray)));
+
+ v1 = digits[0] & 0xFF;
+ v1 = v1 | ((digits[1] & 0xFF)<<8);
+ v1 = v1 | ((digits[2] & 0xFF)<<16);
+ v1 = v1 | ((digits[3] & 0xFF)<<24);
+# if (__POINTER_SIZE__ == 8)
+ v1 = v1 | ((digits[4] & 0xFF)<<32);
+ v1 = v1 | ((digits[5] & 0xFF)<<40);
+ v1 = v1 | ((digits[6] & 0xFF)<<48);
+ v1 = v1 | ((digits[7] & 0xFF)<<56);
+ #endif
#endif
-
- RETURN ( __mkSmallInteger(v1 & v2) );
+ RETURN ( __mkSmallInteger(v1 & v2) );
}
%}.
^ super bitAnd:anInteger
@@ -918,9 +916,9 @@
is free to choose any internal representation for integers)"
%{ /* NOCONTEXT */
-
if (__isSmallInteger(anIntegerIndex)) {
INT idx = __smallIntegerVal(anIntegerIndex) - 1;
+
if (idx >= 0) {
int v1;
int byteOffset = idx / 8;
@@ -930,7 +928,7 @@
RETURN(__mkSmallInteger(0));
}
- v1 = ((unsigned char *)(__stringVal(__INST(digitByteArray))))[byteOffset];
+ v1 = (__byteArrayVal(__INST(digitByteArray)))[byteOffset];
if (v1 & (1 << (idx % 8))) {
RETURN(__mkSmallInteger(1));
} else {
@@ -942,14 +940,14 @@
^ super bitAt:anIntegerIndex
"
- 16rFFFFFFFFFF01 bitAt:0
- 16rFFFFFFFFFF01 bitAt:49
- 16rFFFFFFFFFF01 bitAt:1
- 16rFFFFFFFFFF01 bitAt:2
- 16rFFFFFFFFFF02 bitAt:2
- 16rFFFFFFFF01FF bitAt:8
- 16rFFFFFFFF01FF bitAt:9
- 16rFFFFFFFF01FF bitAt:10
+ TestCase should:[ 16rFFFFFFFFFF01 bitAt:0 ] raise:Error
+ TestCase assert:( 16rFFFFFFFFFF01 bitAt:49 ) == 0
+ TestCase assert:( 16rFFFFFFFFFF01 bitAt:1 ) == 1
+ TestCase assert:( 16rFFFFFFFFFF01 bitAt:2 ) == 0
+ TestCase assert:( 16rFFFFFFFFFF02 bitAt:2 ) == 1
+ TestCase assert:( 16rFFFFFFFF01FF bitAt:8 ) == 1
+ TestCase assert:( 16rFFFFFFFF01FF bitAt:9 ) == 1
+ TestCase assert:( 16rFFFFFFFF01FF bitAt:10 ) == 0
"
!
@@ -1012,99 +1010,99 @@
* quickly advance over full 0-words
*/
if (__isByteArray(__INST(digitByteArray))) {
- int __sz = __intVal(sz);
- unsigned char *__bP = (unsigned char *)(__byteArrayVal(__INST(digitByteArray)));
- unsigned char *__bP0 = __bP;
+ int __sz = __intVal(sz);
+ unsigned char *__bP = __byteArrayVal(__INST(digitByteArray));
+ unsigned char *__bP0 = __bP;
#ifdef __UNROLL_LOOPS__
- while (__sz > (sizeof(INT) * 4)) {
- if ( ((INT *)__bP)[0] != 0 ) break;
- if ( ((INT *)__bP)[1] != 0 ) {
- __sz -= sizeof(INT);
- __bP += sizeof(INT);
- break;
- }
- if ( ((INT *)__bP)[2] != 0 ) {
- __sz -= sizeof(INT) * 2;
- __bP += sizeof(INT) * 2;
- break;
- }
- if ( ((INT *)__bP)[3] != 0 ) {
- __sz -= sizeof(INT) * 3;
- __bP += sizeof(INT) * 3;
- break;
- }
- __sz -= sizeof(INT) * 4;
- __bP += sizeof(INT) * 4;
- }
+ while (__sz > (sizeof(INT) * 4)) {
+ if ( ((INT *)__bP)[0] != 0 ) break;
+ if ( ((INT *)__bP)[1] != 0 ) {
+ __sz -= sizeof(INT);
+ __bP += sizeof(INT);
+ break;
+ }
+ if ( ((INT *)__bP)[2] != 0 ) {
+ __sz -= sizeof(INT) * 2;
+ __bP += sizeof(INT) * 2;
+ break;
+ }
+ if ( ((INT *)__bP)[3] != 0 ) {
+ __sz -= sizeof(INT) * 3;
+ __bP += sizeof(INT) * 3;
+ break;
+ }
+ __sz -= sizeof(INT) * 4;
+ __bP += sizeof(INT) * 4;
+ }
#endif
- while (__sz > sizeof(INT)) {
- if ( ((INT *)__bP)[0] != 0 ) break;
- __sz -= sizeof(INT);
- __bP += sizeof(INT);
- }
- while (__sz > 0) {
- unsigned int c;
-
- if ( (c = *__bP) != 0 ) {
- int bitIdx = (__bP - __bP0) * 8;
+ while (__sz > sizeof(INT)) {
+ if ( ((INT *)__bP)[0] != 0 ) break;
+ __sz -= sizeof(INT);
+ __bP += sizeof(INT);
+ }
+ while (__sz > 0) {
+ unsigned int c;
+
+ if ( (c = *__bP) != 0 ) {
+ int bitIdx = (__bP - __bP0) * 8;
#ifdef __BSF
- {
- int index;
- int t = c;
-
- index = __BSF(t);
- RETURN ( __mkSmallInteger(index + 1 + bitIdx) );
- }
+ {
+ int index;
+ int t = c;
+
+ index = __BSF(t);
+ RETURN ( __mkSmallInteger(index + 1 + bitIdx) );
+ }
#else
- if (c & 0x0F) {
- if (c & 0x03) {
- if (c & 0x01) {
- RETURN ( __mkSmallInteger( bitIdx + 1) );
- } else {
- RETURN ( __mkSmallInteger( bitIdx + 2) );
- }
- } else {
- if (c & 0x04) {
- RETURN ( __mkSmallInteger( bitIdx + 3) );
- } else {
- RETURN ( __mkSmallInteger( bitIdx + 4) );
- }
- }
- } else {
- if (c & 0x30) {
- if (c & 0x10) {
- RETURN ( __mkSmallInteger( bitIdx + 5) );
- } else {
- RETURN ( __mkSmallInteger( bitIdx + 6) );
- }
- } else {
- if (c & 0x40) {
- RETURN ( __mkSmallInteger( bitIdx + 7) );
- } else {
- RETURN ( __mkSmallInteger( bitIdx + 8) );
- }
- }
- }
+ if (c & 0x0F) {
+ if (c & 0x03) {
+ if (c & 0x01) {
+ RETURN ( __mkSmallInteger( bitIdx + 1) );
+ } else {
+ RETURN ( __mkSmallInteger( bitIdx + 2) );
+ }
+ } else {
+ if (c & 0x04) {
+ RETURN ( __mkSmallInteger( bitIdx + 3) );
+ } else {
+ RETURN ( __mkSmallInteger( bitIdx + 4) );
+ }
+ }
+ } else {
+ if (c & 0x30) {
+ if (c & 0x10) {
+ RETURN ( __mkSmallInteger( bitIdx + 5) );
+ } else {
+ RETURN ( __mkSmallInteger( bitIdx + 6) );
+ }
+ } else {
+ if (c & 0x40) {
+ RETURN ( __mkSmallInteger( bitIdx + 7) );
+ } else {
+ RETURN ( __mkSmallInteger( bitIdx + 8) );
+ }
+ }
+ }
#endif
- break;
- }
- __sz--;
- __bP++;
- }
- idx0 = __mkSmallInteger( __bP - __bP0 + 1 );
+ break;
+ }
+ __sz--;
+ __bP++;
+ }
+ idx0 = __mkSmallInteger( __bP - __bP0 + 1 );
}
%}.
"/ never actually reached
idx0 to:sz do:[:digitIndex |
- (byte := digitByteArray at:digitIndex) ~~ 0 ifTrue:[
- ^ (digitIndex-1)*8 + (byte lowBit)
- ]
+ (byte := digitByteArray at:digitIndex) ~~ 0 ifTrue:[
+ ^ (digitIndex-1)*8 + (byte lowBit)
+ ]
].
^ 0 "/ should not happen
"
- (1 bitShift:0) lowBit
+ (1 bitShift:0) lowBit
(1 bitShift:10) lowBit
(1 bitShift:20) lowBit
(1 bitShift:30) lowBit
@@ -1116,31 +1114,31 @@
(1 bitShift:33) lowBit
(1 bitShift:33) highBit
(1 bitShift:64) lowBit
- (1 bitShift:64) highBit
+ (1 bitShift:64) highBit
(1 bitShift:1000) lowBit
(1 bitShift:1000) highBit
((1 bitShift:64)-1) lowBit
((1 bitShift:64)-1) highBit
1 to:1000 do:[:idx |
- self assert:(( 1 bitShift:idx) lowBit = (idx+1)).
- self assert:(( 1 bitShift:idx) lowBit = ( 1 bitShift:idx) highBit).
- self assert:(( 3 bitShift:idx) lowBit = (idx+1)).
- self assert:(( 7 bitShift:idx) lowBit = (idx+1)).
- self assert:(( 15 bitShift:idx) lowBit = (idx+1)).
- self assert:(( 31 bitShift:idx) lowBit = (idx+1)).
- self assert:(( 63 bitShift:idx) lowBit = (idx+1)).
- self assert:(( 127 bitShift:idx) lowBit = (idx+1)).
- self assert:(( 255 bitShift:idx) lowBit = (idx+1)).
+ self assert:(( 1 bitShift:idx) lowBit = (idx+1)).
+ self assert:(( 1 bitShift:idx) lowBit = ( 1 bitShift:idx) highBit).
+ self assert:(( 3 bitShift:idx) lowBit = (idx+1)).
+ self assert:(( 7 bitShift:idx) lowBit = (idx+1)).
+ self assert:(( 15 bitShift:idx) lowBit = (idx+1)).
+ self assert:(( 31 bitShift:idx) lowBit = (idx+1)).
+ self assert:(( 63 bitShift:idx) lowBit = (idx+1)).
+ self assert:(( 127 bitShift:idx) lowBit = (idx+1)).
+ self assert:(( 255 bitShift:idx) lowBit = (idx+1)).
]
|num|
num := (1 bitShift:1000).
Time millisecondsToRun:[
- 100000 timesRepeat:[
- num lowBit
- ]
+ 100000 timesRepeat:[
+ num lowBit
+ ]
]
"
@@ -4824,5 +4822,5 @@
!LargeInteger class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.191 2009-02-28 11:20:37 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.192 2009-02-28 11:36:19 cg Exp $'
! !