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) { |
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 */ |