LargeInteger.st
changeset 4254 3846b94301b8
parent 4252 860133fce64f
child 4255 73212f63b6a6
equal deleted inserted replaced
4253:768802bc61a4 4254:3846b94301b8
  2010         __len3 = __len - 3;
  2010         __len3 = __len - 3;
  2011         while (__index < __len3) {
  2011         while (__index < __len3) {
  2012             __diff = ((unsigned int *)(__digitP+__index-1))[0] - (__borrow & 0xFFFFFFFFL);
  2012             __diff = ((unsigned int *)(__digitP+__index-1))[0] - (__borrow & 0xFFFFFFFFL);
  2013             __borrow >>= 32;
  2013             __borrow >>= 32;
  2014             if (__diff < 0) {
  2014             if (__diff < 0) {
  2015                 __diff += 0x100000000;
  2015                 /* __diff += 0x100000000; */
  2016                 __borrow++;
  2016                 __borrow++;
  2017             }
  2017             }
  2018             ((unsigned int *)(__resultP+__index-1))[0] = __diff;
  2018             ((unsigned int *)(__resultP+__index-1))[0] = __diff;
  2019             __index += 4;
  2019             __index += 4;
  2020         }
  2020         }
  2025          */
  2025          */
  2026         while (__index < __len) {
  2026         while (__index < __len) {
  2027             __diff = ((unsigned short *)(__digitP+__index-1))[0] - (__borrow & 0xFFFF);
  2027             __diff = ((unsigned short *)(__digitP+__index-1))[0] - (__borrow & 0xFFFF);
  2028             __borrow >>= 16;
  2028             __borrow >>= 16;
  2029             if (__diff < 0) {
  2029             if (__diff < 0) {
  2030                 __diff += 0x10000;
  2030                 /* __diff += 0x10000; */
  2031                 __borrow++;
  2031                 __borrow++;
       
  2032             } else {
       
  2033                 if (__borrow == 0) {
       
  2034                     ((unsigned short *)(__resultP+__index-1))[0] = __diff;
       
  2035                     __index += 2;
       
  2036 
       
  2037                     /* nothing more to subtract .. */
       
  2038                     while (__index < __len) {
       
  2039                         ((unsigned short *)(__resultP+__index-1))[0] = ((unsigned short *)(__digitP+__index-1))[0];
       
  2040                         __index += 2;
       
  2041                     }
       
  2042                     if (__index <= __len) {
       
  2043                         __resultP[__index-1] = __digitP[__index-1];
       
  2044                     }
       
  2045                     break;
       
  2046                 }
  2032             }
  2047             }
  2033             ((unsigned short *)(__resultP+__index-1))[0] = __diff;
  2048             ((unsigned short *)(__resultP+__index-1))[0] = __diff;
  2034             __index += 2;
  2049             __index += 2;
  2035         }
  2050         }
  2036 #endif
  2051 #endif
  2037         while (__index <= __len) {
  2052         while (__index <= __len) {
  2038             __diff = __digitP[__index-1] - (__borrow & 0xFF);
  2053             __diff = __digitP[__index-1] - (__borrow & 0xFF);
  2039             __borrow >>= 8;
  2054             __borrow >>= 8;
  2040             if (__diff < 0) {
  2055             if (__diff < 0) {
  2041                 __diff += 0x100;
  2056                 /* __diff += 0x100; */
  2042                 __borrow++;
  2057                 __borrow++;
       
  2058             } else {
       
  2059                 if (__borrow == 0) {
       
  2060                     __resultP[__index-1] = __diff;
       
  2061                     __index++;
       
  2062 
       
  2063                     /* nothing more to subtract .. */
       
  2064                     while (__index <= __len) {
       
  2065                         __resultP[__index-1] = __digitP[__index-1];
       
  2066                         __index++;
       
  2067                     }
       
  2068                     break;
       
  2069                 }
  2043             }
  2070             }
  2044             __resultP[__index-1] = __diff;
  2071             __resultP[__index-1] = __diff;
  2045             __index++;
  2072             __index++;
  2046         }
  2073         }
  2047         lastDigit = __MKSMALLINT( __resultP[__index-1-1] );
  2074         lastDigit = __MKSMALLINT( __resultP[__index-1-1] );
  2447                      - __borrow;
  2474                      - __borrow;
  2448             if (__diff >= 0) {
  2475             if (__diff >= 0) {
  2449                 __borrow = 0;
  2476                 __borrow = 0;
  2450             } else {
  2477             } else {
  2451                 __borrow = 1;
  2478                 __borrow = 1;
  2452                 __diff += 0x10000;
  2479                 /* __diff += 0x10000; */
  2453             }
  2480             }
  2454             ((unsigned short *)(__resultDigits+__index-1))[0] = __diff;
  2481             ((unsigned short *)(__resultDigits+__index-1))[0] = __diff;
  2455             __index += 2;
  2482             __index += 2;
  2456         }
  2483         }
  2457         if (__index <= __minLen) {
  2484 
       
  2485         if (__index == __minLen) {
  2458             /* one of the operands has odd length - cannot continue short-wise */
  2486             /* one of the operands has odd length - cannot continue short-wise */
  2459         } else {
  2487         } else {
  2460             if (__len1 > __len2) {
  2488             if (__len1 > __len2) {
  2461                 while (__index < __len1) {
  2489                 while (__index < __len1) {
  2462                     __diff = ((unsigned short *)(__myDigits+__index-1))[0] - __borrow;
  2490                     __diff = ((unsigned short *)(__myDigits+__index-1))[0] - __borrow;
  2463                     if (__diff >= 0) {
  2491                     if (__diff >= 0) {
  2464                         __borrow = 0;
  2492                         __borrow = 0;
       
  2493                         ((unsigned short *)(__resultDigits+__index-1))[0] = __diff;
       
  2494                         __index += 2;
       
  2495 
  2465                         /* copy over rest */
  2496                         /* copy over rest */
  2466                         __resultDigits[__index-1] = __diff;
       
  2467                         __index += 2;
       
  2468                         while (__index < __len1) {
  2497                         while (__index < __len1) {
  2469                             ((unsigned short *)(__resultDigits+__index-1))[0] = ((unsigned short *)(__myDigits+__index-1))[0];
  2498                             ((unsigned short *)(__resultDigits+__index-1))[0] = ((unsigned short *)(__myDigits+__index-1))[0];
  2470                             __index+=2;
  2499                             __index+=2;
  2471                         }
  2500                         }
       
  2501                         if (__index <= __len1) {
       
  2502                             __resultDigits[__index-1] = __myDigits[__index-1];
       
  2503                             __index++;
       
  2504                         }
  2472                         break;
  2505                         break;
  2473                     }
  2506                     }
  2474                     __borrow = 1;
  2507                     __borrow = 1;
  2475                     __diff += 0x10000;
  2508                     /* __diff += 0x10000; */
  2476                     ((unsigned short *)(__resultDigits+__index-1))[0] = __diff;
  2509                     ((unsigned short *)(__resultDigits+__index-1))[0] = __diff;
  2477                     __index += 2;
  2510                     __index += 2;
  2478                 }
  2511                 }
  2479             } else {
  2512             } else {
  2480                 if (__len2 > __len1) {
  2513                 if (__len2 > __len1) {
  2482                         __diff = 0 - ((unsigned short *)(__otherDigits+__index-1))[0] - __borrow;
  2515                         __diff = 0 - ((unsigned short *)(__otherDigits+__index-1))[0] - __borrow;
  2483                         if (__diff >= 0) {
  2516                         if (__diff >= 0) {
  2484                             __borrow = 0;
  2517                             __borrow = 0;
  2485                         } else {
  2518                         } else {
  2486                             __borrow = 1;
  2519                             __borrow = 1;
  2487                             __diff += 0x10000;
  2520                             /* __diff += 0x10000; */
  2488                         }
  2521                         }
  2489                         ((unsigned short *)(__resultDigits+__index-1))[0] = __diff;
  2522                         ((unsigned short *)(__resultDigits+__index-1))[0] = __diff;
  2490                         __index += 2;
  2523                         __index += 2;
  2491                     }
  2524                     }
  2492                 }
  2525                 }
  2500             __diff = __myDigits[__index-1] - __otherDigits[__index-1] - __borrow;
  2533             __diff = __myDigits[__index-1] - __otherDigits[__index-1] - __borrow;
  2501             if (__diff >= 0) {
  2534             if (__diff >= 0) {
  2502                 __borrow = 0;
  2535                 __borrow = 0;
  2503             } else {
  2536             } else {
  2504                 __borrow = 1;
  2537                 __borrow = 1;
  2505                 __diff += 0x100;
  2538                 /* __diff += 0x100; */
  2506             }
  2539             }
  2507             __resultDigits[__index-1] = __diff;
  2540             __resultDigits[__index-1] = __diff;
  2508             __index++;
  2541             __index++;
  2509         }
  2542         }
  2510 
  2543 
  2521                         __index++;
  2554                         __index++;
  2522                     }
  2555                     }
  2523                     break;
  2556                     break;
  2524                 }
  2557                 }
  2525                 __borrow = 1;
  2558                 __borrow = 1;
  2526                 __diff += 0x100;
  2559                 /* __diff += 0x100; */
  2527                 __resultDigits[__index-1] = __diff;
  2560                 __resultDigits[__index-1] = __diff;
  2528                 __index++;
  2561                 __index++;
  2529             }
  2562             }
  2530         } else {
  2563         } else {
  2531             if (__len2 > __len1) {
  2564             if (__len2 > __len1) {
  2533                     __diff = 0 - __otherDigits[__index-1] - __borrow;
  2566                     __diff = 0 - __otherDigits[__index-1] - __borrow;
  2534                     if (__diff >= 0) {
  2567                     if (__diff >= 0) {
  2535                         __borrow = 0;
  2568                         __borrow = 0;
  2536                     } else {
  2569                     } else {
  2537                         __borrow = 1;
  2570                         __borrow = 1;
  2538                         __diff += 0x100;
  2571                         /* __diff += 0x100; */
  2539                     }
  2572                     }
  2540                     __resultDigits[__index-1] = __diff;
  2573                     __resultDigits[__index-1] = __diff;
  2541                     __index++;
  2574                     __index++;
  2542                 }
  2575                 }
  2543             }
  2576             }
  3158 !
  3191 !
  3159 
  3192 
  3160 absSubtract:aLargeInteger
  3193 absSubtract:aLargeInteger
  3161     "private helper for division:
  3194     "private helper for division:
  3162         destructively subtract aLargeInteger from myself
  3195         destructively subtract aLargeInteger from myself
  3163         return true, if the result is non-zero, false otherwise.
  3196         AND return true, if the result is non-zero, false otherwise.
  3164         (i.e. this method has both a return value and a side-effect
  3197         (i.e. this method has both a return value and a side-effect
  3165          on the receiver)
  3198          on the receiver)
  3166         Only allowed for positive receiver and argument
  3199         Only allowed for positive receiver and argument
  3167         The receiver must be >= the argument.
  3200         The receiver must be >= the argument.
  3168         The receiver must be a temporary scratch-number"
  3201         The receiver must be a temporary scratch-number"
  3215                     - _borrow;
  3248                     - _borrow;
  3216             if (_diff >= 0) {
  3249             if (_diff >= 0) {
  3217                 _borrow = 0;
  3250                 _borrow = 0;
  3218             } else {
  3251             } else {
  3219                 _borrow = 1;
  3252                 _borrow = 1;
  3220                 _diff += 0x10000;
  3253                 /* _diff += 0x10000; */
  3221             }
  3254             }
  3222             ((unsigned short *)(_myDigits+_index-1))[0] = _diff;
  3255             ((unsigned short *)(_myDigits+_index-1))[0] = _diff;
  3223             anyBitNonZero |= (_diff & 0xFFFF);
  3256             anyBitNonZero |= (_diff & 0xFFFF);
  3224             _index += 2;
  3257             _index += 2;
  3225         }
  3258         }
       
  3259 
  3226         if (_index <= _len2) {
  3260         if (_index <= _len2) {
  3227             /*
  3261             /*
  3228              * cannot continue with shorts - there is an odd number of
  3262              * cannot continue with shorts - there is an odd number of
  3229              * bytes in the minuent
  3263              * bytes in the minuent
  3230              */
  3264              */
  3246                         _index++;
  3280                         _index++;
  3247                     }
  3281                     }
  3248                     RETURN (anyBitNonZero ? true : false);
  3282                     RETURN (anyBitNonZero ? true : false);
  3249                 }
  3283                 }
  3250                 _borrow = 1;
  3284                 _borrow = 1;
  3251                 _diff += 0x10000;
  3285                 /* _diff += 0x10000; */
  3252 
  3286 
  3253                 ((unsigned short *)(_myDigits+_index-1))[0] = _diff;
  3287                 ((unsigned short *)(_myDigits+_index-1))[0] = _diff;
  3254                 anyBitNonZero |= (_diff & 0xFFFF);
  3288                 anyBitNonZero |= (_diff & 0xFFFF);
  3255                 _index += 2;
  3289                 _index += 2;
  3256             }
  3290             }
  3265                     - _borrow;
  3299                     - _borrow;
  3266             if (_diff >= 0) {
  3300             if (_diff >= 0) {
  3267                 _borrow = 0;
  3301                 _borrow = 0;
  3268             } else {
  3302             } else {
  3269                 _borrow = 1;
  3303                 _borrow = 1;
  3270                 _diff += 0x100;
  3304                 /* _diff += 0x100; */
  3271             }
  3305             }
  3272             _myDigits[_index - 1] = _diff;
  3306             _myDigits[_index - 1] = _diff;
  3273             anyBitNonZero |= (_diff & 0xFF);
  3307             anyBitNonZero |= (_diff & 0xFF);
  3274             _index++;
  3308             _index++;
  3275         }
  3309         }
  3286                     _index++;
  3320                     _index++;
  3287                 }
  3321                 }
  3288                 break;
  3322                 break;
  3289             }
  3323             }
  3290             _borrow = 1;
  3324             _borrow = 1;
  3291             _diff += 0x100;
  3325             /* _diff += 0x100; */
  3292 
  3326 
  3293             _myDigits[_index - 1] = _diff;
  3327             _myDigits[_index - 1] = _diff;
  3294             anyBitNonZero |= (_diff & 0xFF);
  3328             anyBitNonZero |= (_diff & 0xFF);
  3295             _index++;
  3329             _index++;
  3296         }
  3330         }
  3563 ! !
  3597 ! !
  3564 
  3598 
  3565 !LargeInteger class methodsFor:'documentation'!
  3599 !LargeInteger class methodsFor:'documentation'!
  3566 
  3600 
  3567 version
  3601 version
  3568     ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.112 1999-06-02 10:49:21 cg Exp $'
  3602     ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.113 1999-06-02 12:56:46 cg Exp $'
  3569 ! !
  3603 ! !