#TUNING by cg
authorClaus Gittinger <cg@exept.de>
Tue, 26 Apr 2016 17:47:46 +0200
changeset 19655 8347118fe041
parent 19654 f07bf67efc5c
child 19656 2e77e4aa1575
#TUNING by cg class: LargeInteger changed: #absFastMinus:sign: #absFastPlus:sign:
LargeInteger.st
--- a/LargeInteger.st	Tue Apr 26 17:26:40 2016 +0200
+++ b/LargeInteger.st	Tue Apr 26 17:47:46 2016 +0200
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 1994 by Claus Gittinger
 	      All Rights Reserved
@@ -315,8 +317,6 @@
     "Modified: / 8.5.1998 / 21:40:41 / cg"
 ! !
 
-
-
 !LargeInteger class methodsFor:'queries'!
 
 isBuiltInClass
@@ -3327,7 +3327,7 @@
 
     ((aSmallInteger < (SmallInteger minVal + 255))
     or:[aSmallInteger > (SmallInteger maxVal - 255)]) ifTrue:[
-	^ self absMinus:(self class value:aSmallInteger) sign:newSign.
+        ^ self absMinus:(self class value:aSmallInteger) sign:newSign.
     ].
 
     len := digitByteArray size.
@@ -3341,123 +3341,133 @@
 %{
     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;
-	int __len3;
+        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;
+        int __len3;
 
 #if defined(__LSBFIRST__)
 # if (__POINTER_SIZE__ == 8)
-	/*
-	 * subtract int-wise
-	 */
-	__len3 = __len - 3;
-	while (__index < __len3) {
-	    /* do not make this into one expression - ask cg why */
-	    __diff = ((unsigned int *)(__digitP + __index-1))[0];
-	    __diff -= (__borrow & 0xFFFFFFFFL);
-	    __borrow >>= 32;
-	    if (__diff < 0) {
-		/* __diff += 0x100000000; */
-		__borrow++;
-	    }
-	    ((unsigned int *)(__resultP+__index-1))[0] = __diff;
-	    __index += 4;
-	}
+        /*
+         * subtract int-wise
+         */
+        __len3 = __len - 3;
+        while (__index < __len3) {
+            /* do not make this into one expression - ask cg why */
+            __diff = ((unsigned int *)(__digitP + __index-1))[0];
+            __diff -= (__borrow & 0xFFFFFFFFL);
+            __borrow >>= 32;
+            ((unsigned int *)(__resultP+__index-1))[0] = __diff;
+            __index += 4;
+            if (__diff < 0) {
+                /* __diff += 0x100000000; */
+                __borrow++;
+            } else {
+                if (__borrow == 0) {
+                    /* nothing more to subtract .. */
+                    while (__index < __len3) {
+                        ((unsigned int *)(__resultP+__index-1))[0] = ((unsigned int *)(__digitP+__index-1))[0];
+                        __index += 4;
+                    }
+                    if (__index < __len) {
+                        ((unsigned short *)(__resultP+__index-1))[0] = ((unsigned short *)(__digitP+__index-1))[0];
+                        __index += 2;
+                    }
+                    if (__index <= __len) {
+                        __resultP[__index-1] = __digitP[__index-1];
+                    }
+                    break;
+                }
+            }
+        }
 # endif
-	/*
-	 * subtract short-wise
-	 */
-	while (__index < __len) {
-	    /* do not make this into one expression - ask cg why */
-	    __diff = ((unsigned short *)(__digitP+__index-1))[0];
-	    __diff -= (__borrow & 0xFFFF);
-	    __borrow >>= 16;
-	    if (__diff < 0) {
-		/* __diff += 0x10000; */
-		__borrow++;
-	    } else {
-		if (__borrow == 0) {
-		    ((unsigned short *)(__resultP+__index-1))[0] = __diff;
-		    __index += 2;
-
-		    /* nothing more to subtract .. */
-		    while (__index < __len) {
-			((unsigned short *)(__resultP+__index-1))[0] = ((unsigned short *)(__digitP+__index-1))[0];
-			__index += 2;
-		    }
-		    if (__index <= __len) {
-			__resultP[__index-1] = __digitP[__index-1];
-		    }
-		    break;
-		}
-	    }
-	    ((unsigned short *)(__resultP+__index-1))[0] = __diff;
-	    __index += 2;
-	}
+        /*
+         * subtract short-wise
+         */
+        while (__index < __len) {
+            /* do not make this into one expression - ask cg why */
+            __diff = ((unsigned short *)(__digitP+__index-1))[0];
+            __diff -= (__borrow & 0xFFFF);
+            __borrow >>= 16;
+            ((unsigned short *)(__resultP+__index-1))[0] = __diff;
+            __index += 2;
+            if (__diff < 0) {
+                /* __diff += 0x10000; */
+                __borrow++;
+            } else {
+                if (__borrow == 0) {
+                    /* nothing more to subtract .. */
+                    while (__index < __len) {
+                        ((unsigned short *)(__resultP+__index-1))[0] = ((unsigned short *)(__digitP+__index-1))[0];
+                        __index += 2;
+                    }
+                    if (__index <= __len) {
+                        __resultP[__index-1] = __digitP[__index-1];
+                    }
+                    break;
+                }
+            }
+        }
 #endif
-	/*
-	 * subtract byte-wise
-	 */
-	while (__index <= __len) {
-	    __diff = __digitP[__index-1];
-	    __diff -= (__borrow & 0xFF);
-	    __borrow >>= 8;
-	    if (__diff < 0) {
-		/* __diff += 0x100; */
-		__borrow++;
-	    } else {
-		if (__borrow == 0) {
-		    __resultP[__index-1] = __diff;
-		    __index++;
-
-		    /* nothing more to subtract .. */
-		    while (__index <= __len) {
-			__resultP[__index-1] = __digitP[__index-1];
-			__index++;
-		    }
-		    break;
-		}
-	    }
-	    __resultP[__index-1] = __diff;
-	    __index++;
-	}
-	lastDigit = __mkSmallInteger( __resultP[__index-1-1] );
-	ok = true;
+        /*
+         * subtract byte-wise
+         */
+        while (__index <= __len) {
+            __diff = __digitP[__index-1];
+            __diff -= (__borrow & 0xFF);
+            __borrow >>= 8;
+            __resultP[__index-1] = __diff;
+            __index++;
+            if (__diff < 0) {
+                /* __diff += 0x100; */
+                __borrow++;
+            } else {
+                if (__borrow == 0) {
+                    /* nothing more to subtract .. */
+                    while (__index <= __len) {
+                        __resultP[__index-1] = __digitP[__index-1];
+                        __index++;
+                    }
+                    break;
+                }
+            }
+        }
+        lastDigit = __mkSmallInteger( __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.
+        ]
     ].
 
     (lastDigit == 0 or:[rsltLen <= SmallInteger maxBytes]) ifTrue:[
-	^ result compressed.
+        ^ result compressed.
     ].
     ^ result
 
@@ -3492,7 +3502,7 @@
 
     ((aSmallInteger < (SmallInteger minVal + 255))
     or:[aSmallInteger > (SmallInteger maxVal - 255)]) ifTrue:[
-	^ self absPlus:(self class value:aSmallInteger) sign:newSign.
+        ^ self absPlus:(self class value:aSmallInteger) sign:newSign.
     ].
 
     len := rsltLen := digitByteArray size.
@@ -3501,18 +3511,18 @@
     "/ if it is 255 (since the other number is definitely smaller)
     "/
     (digitByteArray at:len) == 16rFF ifTrue:[
-	rsltLen := len + 1.
+        rsltLen := len + 1.
     ] ifFalse:[
-	"/ or the argument has something in the high byte ..
+        "/ or the argument has something in the high byte ..
 %{
 #if __POINTER_SIZE__ == 8
-	if (__intVal(aSmallInteger) & 0xFF00000000000000L) {
-	    rsltLen = __mkSmallInteger(__intVal(len) + 1);
-	}
+        if (__intVal(aSmallInteger) & 0xFF00000000000000L) {
+            rsltLen = __mkSmallInteger(__intVal(len) + 1);
+        }
 #else
-	if (__intVal(aSmallInteger) & 0xFF000000) {
-	    rsltLen = __mkSmallInteger(__intVal(len) + 1);
-	}
+        if (__intVal(aSmallInteger) & 0xFF000000) {
+            rsltLen = __mkSmallInteger(__intVal(len) + 1);
+        }
 #endif
 %}
     ].
@@ -3524,307 +3534,309 @@
     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);
-	INT __ptrDelta = __dst - __src;
-	unsigned char *__srcLast = __src + __len - 1;
-	int __rsltLen = __intVal(rsltLen);
-
-	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);
+        INT __ptrDelta = __dst - __src;
+        unsigned char *__srcLast = __src + __len - 1;
+        int __rsltLen = __intVal(rsltLen);
+
+        if (__carry < 0) {
+            __carry = -__carry;
+        }
 
 #if defined(__LSBFIRST__)
 # if defined(__i386__) && defined(__GNUC__) && (__POINTER_SIZE__ == 4)
 #  if 0 /* NOTICE - the code below is 20% slower ... - why */
-	/*
-	 * add long-wise
-	 */
-	asm("  jecxz nothingToDo                                      \n\
-	       movl  %%eax, %%esi      /* __src input */              \n\
-	       movl  %%ebx, %%edi      /* __dst input */              \n\
-								      \n\
-	       /* the first 4-byte int */                             \n\
-	       lodsl                   /* fetch */                    \n\
-	       addl  %%edx, %%eax      /* add */                      \n\
-	       stosl                   /* store */                    \n\
-	       leal  -1(%%ecx),%%ecx   /* do not clobber carry */     \n\
-	       jecxz doneLoop          /* any more ? */               \n\
-	       /* remaining 4-byte ints */                            \n\
-	       jmp   addLoop                                          \n\
-								      \n\
-	       .align 8                                               \n\
-	     addLoop:                                                 \n\
-	       movl  0(%%esi), %%ebx   /* fetch  */                   \n\
-	       jnc   copyLoop2                                        \n\
-	       movl  $0, %%eax                                        \n\
-	       leal  4(%%esi), %%esi                                  \n\
-	       adcl  %%ebx, %%eax      /* & add carry from prev int */\n\
-	       leal  8(%%edi), %%edi                                  \n\
-	       movl  %%eax, -8(%%edi)  /* store */                    \n\
-	       leal  -1(%%ecx),%%ecx   /* do not clobber carry */     \n\
-	       jecxz doneLoop          /* any more ? */               \n\
-								      \n\
-	       movl  0(%%esi), %%ebx   /* fetch  */                   \n\
-	       movl  $0, %%eax                                        \n\
-	       leal  4(%%esi), %%esi                                  \
-	       adcl  %%ebx, %%eax      /* & add carry from prev int */\n\
-	       movl  %%eax, -4(%%edi)  /* store */                    \n\
-								      \n\
-	       loop  addLoop                                          \n\
-	       jmp   doneLoop                                         \n\
-								      \n\
-	       .align 8                                               \n\
-	     copyLoop:                                                \n\
-	       movl  0(%%esi), %%ebx                                  \n\
-	     copyLoop2:                                               \n\
-	       add   $4, %%esi                                        \n\
-	       add   $4, %%edi                                        \n\
-	       movl  %%ebx, -4(%%edi)                                 \n\
-	       loop  copyLoop                                         \n\
-								      \n\
-	     doneLoop:                                                \n\
-	       movl  $0, %%edx         /* do not clobber carry (xorl clears it) */   \n\
-	       adcl  $0, %%edx                                        \n\
-	       movl  %%esi, %%eax      /* __src output */             \n\
-	     nothingToDo:                                             \n\
-	    " : "=d"  ((unsigned long)(__carry)),
-		"=a"  (__src)
-	      : "1"   (__src),
-		"b"   (__dst),
-		"c"   (__len / 4),
-		"0"   (__carry)
-	      : "esi", "edi");
+        /*
+         * add long-wise
+         */
+        asm("  jecxz nothingToDo                                      \n\
+               movl  %%eax, %%esi      /* __src input */              \n\
+               movl  %%ebx, %%edi      /* __dst input */              \n\
+                                                                      \n\
+               /* the first 4-byte int */                             \n\
+               lodsl                   /* fetch */                    \n\
+               addl  %%edx, %%eax      /* add */                      \n\
+               stosl                   /* store */                    \n\
+               leal  -1(%%ecx),%%ecx   /* do not clobber carry */     \n\
+               jecxz doneLoop          /* any more ? */               \n\
+               /* remaining 4-byte ints */                            \n\
+               jmp   addLoop                                          \n\
+                                                                      \n\
+               .align 8                                               \n\
+             addLoop:                                                 \n\
+               movl  0(%%esi), %%ebx   /* fetch  */                   \n\
+               jnc   copyLoop2                                        \n\
+               movl  $0, %%eax                                        \n\
+               leal  4(%%esi), %%esi                                  \n\
+               adcl  %%ebx, %%eax      /* & add carry from prev int */\n\
+               leal  8(%%edi), %%edi                                  \n\
+               movl  %%eax, -8(%%edi)  /* store */                    \n\
+               leal  -1(%%ecx),%%ecx   /* do not clobber carry */     \n\
+               jecxz doneLoop          /* any more ? */               \n\
+                                                                      \n\
+               movl  0(%%esi), %%ebx   /* fetch  */                   \n\
+               movl  $0, %%eax                                        \n\
+               leal  4(%%esi), %%esi                                  \
+               adcl  %%ebx, %%eax      /* & add carry from prev int */\n\
+               movl  %%eax, -4(%%edi)  /* store */                    \n\
+                                                                      \n\
+               loop  addLoop                                          \n\
+               jmp   doneLoop                                         \n\
+                                                                      \n\
+               .align 8                                               \n\
+             copyLoop:                                                \n\
+               movl  0(%%esi), %%ebx                                  \n\
+             copyLoop2:                                               \n\
+               add   $4, %%esi                                        \n\
+               add   $4, %%edi                                        \n\
+               movl  %%ebx, -4(%%edi)                                 \n\
+               loop  copyLoop                                         \n\
+                                                                      \n\
+             doneLoop:                                                \n\
+               movl  $0, %%edx         /* do not clobber carry (xorl clears it) */   \n\
+               adcl  $0, %%edx                                        \n\
+               movl  %%esi, %%eax      /* __src output */             \n\
+             nothingToDo:                                             \n\
+            " : "=d"  ((unsigned long)(__carry)),
+                "=a"  (__src)
+              : "1"   (__src),
+                "b"   (__dst),
+                "c"   (__len / 4),
+                "0"   (__carry)
+              : "esi", "edi");
 
 #  else
-	{
-	    unsigned char *__srcLastX;
-
-	    __srcLastX = __srcLast - 3 - 4;
-	    while (__src <= __srcLastX) {
-		unsigned int __sum, __sum2;
-		unsigned __digit1, __digit2;
-
-		__digit1 = ((unsigned *)__src)[0];
-		__digit2 = ((unsigned *)__src)[1];
-		asm ("addl %%edx,%%ecx          \n\
-		      adcl $0, %%eax            \n\
-		      movl $0, %%edx            \n\
-		      adcl $0, %%edx"
-			: "=d"  ((unsigned long)(__carry)),
-			  "=c"  ((unsigned long)(__sum)),
-			  "=a"  ((unsigned long)(__sum2))
-			: "0"   ((unsigned long)(__carry)),
-			  "1"   (__digit1),
-			  "2"   (__digit2));
-
-		((unsigned int *)(__src + __ptrDelta))[0] = __sum;
-		((unsigned int *)(__src + __ptrDelta))[1] = __sum2;
-
-		__src += 8;
-
-		if (__carry == 0) {
-		    while (__src <= __srcLastX) {
-			/* copy over words */
-			((unsigned int *)(__src + __ptrDelta))[0] = ((unsigned int *)__src)[0];
-			((unsigned int *)(__src + __ptrDelta))[1] = ((unsigned int *)__src)[1];
-			__src += 8;
-		    }
-		    while (__src <= __srcLast) {
-			/* copy over bytes */
-			__src[__ptrDelta] = __src[0];
-			__src ++;
-		    }
-		    goto doneSource;
-		}
-	    }
-
-	    __srcLastX = __srcLastX + 4;
-	    if (__src <= __srcLastX) {
-		unsigned int __sum, __digit;
-
-		__digit = ((unsigned *)__src)[0];
-
-		asm ("addl %%eax,%%edx  \n\
-		      movl $0,%%eax     \n\
-		      adcl $0,%%eax"
-			: "=a"  ((unsigned long)(__carry)),
-			  "=d"  ((unsigned long)(__sum))
-			: "0"   ((unsigned long)(__carry)),
-			  "1"   (__digit) );
-
-		((unsigned int *)(__src + __ptrDelta))[0] = __sum;
-		__src += 4;
-
-		if (__carry == 0) {
-		    while (__src <= __srcLast) {
-			/* copy over bytes */
-			__src[__ptrDelta] = __src[0];
-			__src ++;
-		    }
-		    goto doneSource;
-		}
-	    }
-	}
+        {
+            unsigned char *__srcLastX;
+
+            __srcLastX = __srcLast - 3 - 4;
+            while (__src <= __srcLastX) {
+                unsigned int __sum, __sum2;
+                unsigned __digit1, __digit2;
+
+                __digit1 = ((unsigned *)__src)[0];
+                __digit2 = ((unsigned *)__src)[1];
+                asm ("addl %%edx,%%ecx          \n\
+                      adcl $0, %%eax            \n\
+                      movl $0, %%edx            \n\
+                      adcl $0, %%edx"
+                        : "=d"  ((unsigned long)(__carry)),
+                          "=c"  ((unsigned long)(__sum)),
+                          "=a"  ((unsigned long)(__sum2))
+                        : "0"   ((unsigned long)(__carry)),
+                          "1"   (__digit1),
+                          "2"   (__digit2));
+
+                ((unsigned int *)(__src + __ptrDelta))[0] = __sum;
+                ((unsigned int *)(__src + __ptrDelta))[1] = __sum2;
+
+                __src += 8;
+
+                if (__carry == 0) {
+                    while (__src <= __srcLastX) {
+                        /* copy over words */
+                        ((unsigned int *)(__src + __ptrDelta))[0] = ((unsigned int *)__src)[0];
+                        ((unsigned int *)(__src + __ptrDelta))[1] = ((unsigned int *)__src)[1];
+                        __src += 8;
+                    }
+                    while (__src <= __srcLast) {
+                        /* copy over bytes */
+                        __src[__ptrDelta] = __src[0];
+                        __src ++;
+                    }
+                    goto doneSource;
+                }
+            }
+
+            __srcLastX = __srcLastX + 4;
+            if (__src <= __srcLastX) {
+                unsigned int __sum, __digit;
+
+                __digit = ((unsigned *)__src)[0];
+
+                asm ("addl %%eax,%%edx  \n\
+                      movl $0,%%eax     \n\
+                      adcl $0,%%eax"
+                        : "=a"  ((unsigned long)(__carry)),
+                          "=d"  ((unsigned long)(__sum))
+                        : "0"   ((unsigned long)(__carry)),
+                          "1"   (__digit) );
+
+                ((unsigned int *)(__src + __ptrDelta))[0] = __sum;
+                __src += 4;
+
+                if (__carry == 0) {
+                    while (__src <= __srcLast) {
+                        /* copy over bytes */
+                        __src[__ptrDelta] = __src[0];
+                        __src ++;
+                    }
+                    goto doneSource;
+                }
+            }
+        }
 #  endif
 # else /* not i386-GNUC */
 #  if defined(WIN32) && defined(__BORLANDC__) && defined(__i386__) && (__POINTER_SIZE__ == 4)
-	{
-	    unsigned char *__srcLast4;
-
-	    /*
-	     * add long-wise
-	     */
-	    __srcLast4 = __srcLast - 3;
-	    while (__src <= __srcLast4) {
-		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 int *)(__src + __ptrDelta))[0] = __sum;
-		__src += 4;
-		if (__carry == 0) {
-		    while (__src <= __srcLast4) {
-			/* copy over words */
-			((unsigned int *)(__src + __ptrDelta))[0] = ((unsigned int *)__src)[0];
-			__src += 4;
-		    }
-		    while (__src <= __srcLast) {
-			/* copy over bytes */
-			__src[__ptrDelta] = __src[0];
-			__src ++;
-		    }
-		    goto doneSource;
-		}
-	    }
-	}
+        {
+            unsigned char *__srcLast4;
+
+            /*
+             * add long-wise
+             */
+            __srcLast4 = __srcLast - 3;
+            while (__src <= __srcLast4) {
+                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 int *)(__src + __ptrDelta))[0] = __sum;
+                __src += 4;
+                if (__carry == 0) {
+                    while (__src <= __srcLast4) {
+                        /* copy over words */
+                        ((unsigned int *)(__src + __ptrDelta))[0] = ((unsigned int *)__src)[0];
+                        __src += 4;
+                    }
+                    while (__src <= __srcLast) {
+                        /* copy over bytes */
+                        __src[__ptrDelta] = __src[0];
+                        __src ++;
+                    }
+                    goto doneSource;
+                }
+            }
+        }
 #  else /* not i386-WIN32 */
 #   if defined(__LSBFIRST__) && (__POINTER_SIZE__ == 8)
-	{
-	    unsigned char *__srcLast4;
-
-	    /*
-	     * add long-wise
-	     */
-	    __srcLast4 = __srcLast - 3;
-	    while (__src <= __srcLast4) {
-		unsigned INT __sum;
-
-		__sum = ((unsigned int *)__src)[0] + __carry;
-		((unsigned int *)(__src + __ptrDelta))[0] = __sum /* & 0xFFFF */;
-		__src += 4;
-		__carry = __sum >> 32;
-		if (__carry == 0) {
-		    while (__src <= __srcLast4) {
-			/* copy over words */
-			((unsigned int *)(__src + __ptrDelta))[0] = ((unsigned int *)__src)[0];
-			__src += 4;
-		    }
-		    while (__src <= __srcLast) {
-			/* copy over bytes */
-			__src[__ptrDelta] = __src[0];
-			__src ++;
-		    }
-		    goto doneSource;
-		}
-	    }
-	}
+        {
+            unsigned char *__srcLast4;
+
+            /*
+             * add long-wise
+             */
+            __srcLast4 = __srcLast - 3;
+            while (__src <= __srcLast4) {
+                unsigned INT __sum;
+
+                __sum = (INT)(((unsigned int *)__src)[0]);
+                __sum += __carry;
+                ((unsigned int *)(__src + __ptrDelta))[0] = __sum /* & 0xFFFF */;
+                __src += 4;
+                __carry = __sum >> 32;
+                if (__carry == 0) {
+                    while (__src <= __srcLast4) {
+                        /* copy over words */
+                        ((unsigned int *)(__src + __ptrDelta))[0] = ((unsigned int *)__src)[0];
+                        __src += 4;
+                    }
+                    while (__src <= __srcLast) {
+                        /* copy over bytes */
+                        __src[__ptrDelta] = __src[0];
+                        __src ++;
+                    }
+                    goto doneSource;
+                }
+            }
+        }
 #   endif /* LSB+64bit */
 #  endif /* __i386__ & WIN32 */
 # endif /* __i386__ & GNUC */
 
-	/*
-	 * add short-wise
-	 */
-	while (__src < __srcLast) {
-	    __carry += ((unsigned short *)__src)[0];
-	    ((unsigned short *)(__src + __ptrDelta))[0] = __carry /* & 0xFFFF */;
-	    __carry >>= 16;
-	    __src += 2;
-	}
-	/*
-	 * last (odd) byte
-	 */
-	if (__src <= __srcLast) {
-	    __carry += __src[0];
-	    __src[__ptrDelta] = __carry /* & 0xFF */;
-	    __carry >>= 8;
-	    __src++;
-	}
+        /*
+         * add short-wise
+         */
+        while (__src < __srcLast) {
+            __carry += ((unsigned short *)__src)[0];
+            ((unsigned short *)(__src + __ptrDelta))[0] = __carry /* & 0xFFFF */;
+            __carry >>= 16;
+            __src += 2;
+        }
+        /*
+         * last (odd) byte
+         */
+        if (__src <= __srcLast) {
+            __carry += __src[0];
+            __src[__ptrDelta] = __carry /* & 0xFF */;
+            __carry >>= 8;
+            __src++;
+        }
 #else /* not __LSBFIRST__ */
 
-	/*
-	 * add byte-wise
-	 */
-	while (__src <= __srcLast) {
-	    __carry += __src[0];
-	    __src[__ptrDelta] = __carry /* & 0xFF */;
-	    __src++;
-	    __carry >>= 8;
-
-	    if (__carry == 0) {
-		while (__src <= __srcLast) {
-		    /* copy over rest */
-		    __src[__ptrDelta] = __src[0];
-		    __src++;
-		}
-		goto doneSource;
-	    }
-	}
+        /*
+         * add byte-wise
+         */
+        while (__src <= __srcLast) {
+            __carry += __src[0];
+            __src[__ptrDelta] = __carry /* & 0xFF */;
+            __src++;
+            __carry >>= 8;
+
+            if (__carry == 0) {
+                while (__src <= __srcLast) {
+                    /* copy over rest */
+                    __src[__ptrDelta] = __src[0];
+                    __src++;
+                }
+                goto doneSource;
+            }
+        }
 #endif /* __LSBFIRST__ */
 
     doneSource: ;
-	/*
-	 * now, at most one other byte is to be stored ...
-	 */
-	if (__len < __rsltLen) {
-	    __src[__ptrDelta] = __carry /* & 0xFF */;
-	    __src++;
-	}
-
-	if (__src[__ptrDelta-1]) {      /* lastDigit */
-	    RETURN (result);
-	}
-	ok = true;
+        /*
+         * now, at most one other byte is to be stored ...
+         */
+        if (__len < __rsltLen) {
+            __src[__ptrDelta] = __carry /* & 0xFF */;
+            __src++;
+        }
+
+        if (__src[__ptrDelta-1] != 0) {      /* lastDigit */
+            RETURN (result);
+        }
+        // must compress
+        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 and:[rsltLen > SmallInteger maxBytes]) 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 and:[rsltLen > SmallInteger maxBytes]) ifTrue:[
+            ^ result
+        ].
     ].
 
     ^ result compressed