| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // Copyright 2009 The Go Authors. All rights reserved. | 5 // Copyright 2009 The Go Authors. All rights reserved. |
| 6 // Use of this source code is governed by a BSD-style | 6 // Use of this source code is governed by a BSD-style |
| 7 // license that can be found in the LICENSE file. | 7 // license that can be found in the LICENSE file. |
| 8 | 8 |
| 9 /* | 9 /* |
| 10 * Copyright (c) 2003-2005 Tom Wu | 10 * Copyright (c) 2003-2005 Tom Wu |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 final cbs = _DIGIT_BITS - bs; | 264 final cbs = _DIGIT_BITS - bs; |
| 265 final bm = (1 << cbs) - 1; | 265 final bm = (1 << cbs) - 1; |
| 266 var c = 0; | 266 var c = 0; |
| 267 var i = x_used; | 267 var i = x_used; |
| 268 while (--i >= 0) { | 268 while (--i >= 0) { |
| 269 final d = x_digits[i]; | 269 final d = x_digits[i]; |
| 270 r_digits[i + ds + 1] = (d >> cbs) | c; | 270 r_digits[i + ds + 1] = (d >> cbs) | c; |
| 271 c = (d & bm) << bs; | 271 c = (d & bm) << bs; |
| 272 } | 272 } |
| 273 r_digits[ds] = c; | 273 r_digits[ds] = c; |
| 274 i = ds; | |
| 275 while (--i >= 0) { | |
| 276 r_digits[i] = 0; | |
| 277 } | |
| 278 } | 274 } |
| 279 | 275 |
| 280 // Return this << n. | 276 // Return this << n. |
| 281 _Bigint _lShift(int n) { | 277 _Bigint _lShift(int n) { |
| 282 final ds = n ~/ _DIGIT_BITS; | 278 final ds = n ~/ _DIGIT_BITS; |
| 283 final bs = n % _DIGIT_BITS; | 279 final bs = n % _DIGIT_BITS; |
| 284 if (bs == 0) { | 280 if (bs == 0) { |
| 285 return _dlShift(ds); | 281 return _dlShift(ds); |
| 286 } | 282 } |
| 287 var r_used = _used + ds + 1; | 283 var r_used = _used + ds + 1; |
| 288 var r_digits = new Uint32List(r_used + 2 + (r_used & 1)); // +2 for 64-bit. | 284 var r_digits = new Uint32List(r_used + 2 + (r_used & 1)); // +2 for 64-bit. |
| 289 _lsh(_digits, _used, n, r_digits); | 285 _lsh(_digits, _used, n, r_digits); |
| 290 return new _Bigint(_neg, r_used, r_digits); | 286 return new _Bigint(_neg, r_used, r_digits); |
| 291 } | 287 } |
| 292 | 288 |
| 293 // r_digits[0..r_used-1] = x_digits[0..x_used-1] << n. | 289 // r_digits[0..r_used-1] = x_digits[0..x_used-1] << n. |
| 294 // Return r_used. | 290 // Return r_used. |
| 295 static int _lShiftDigits(Uint32List x_digits, int x_used, int n, | 291 static int _lShiftDigits(Uint32List x_digits, int x_used, int n, |
| 296 Uint32List r_digits) { | 292 Uint32List r_digits) { |
| 297 final ds = n ~/ _DIGIT_BITS; | 293 final ds = n ~/ _DIGIT_BITS; |
| 298 final bs = n % _DIGIT_BITS; | 294 final bs = n % _DIGIT_BITS; |
| 299 if (bs == 0) { | 295 if (bs == 0) { |
| 300 return _dlShiftDigits(x_digits, x_used, ds, r_digits); | 296 return _dlShiftDigits(x_digits, x_used, ds, r_digits); |
| 301 } | 297 } |
| 302 var r_used = x_used + ds + 1; | 298 var r_used = x_used + ds + 1; |
| 303 assert(r_digits.length >= r_used + 2 + (r_used & 1)); // +2 for 64-bit. | 299 assert(r_digits.length >= r_used + 2 + (r_used & 1)); // +2 for 64-bit. |
| 304 _lsh(x_digits, x_used, n, r_digits); | 300 _lsh(x_digits, x_used, n, r_digits); |
| 301 var i = ds; |
| 302 while (--i >= 0) { |
| 303 r_digits[i] = 0; |
| 304 } |
| 305 if (r_digits[r_used - 1] == 0) { | 305 if (r_digits[r_used - 1] == 0) { |
| 306 r_used--; // Clamp result. | 306 r_used--; // Clamp result. |
| 307 } else if (r_used.isOdd) { | 307 } else if (r_used.isOdd) { |
| 308 r_digits[r_used] = 0; | 308 r_digits[r_used] = 0; |
| 309 } | 309 } |
| 310 return r_used; | 310 return r_used; |
| 311 } | 311 } |
| 312 | 312 |
| 313 // r_digits[0..r_used-1] = x_digits[0..x_used-1] >> n. | 313 // r_digits[0..r_used-1] = x_digits[0..x_used-1] >> n. |
| 314 static void _rsh(Uint32List x_digits, int x_used, int n, | 314 static void _rsh(Uint32List x_digits, int x_used, int n, |
| (...skipping 1447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1762 | 1762 |
| 1763 int _mul(Uint32List x_digits, int x_used, | 1763 int _mul(Uint32List x_digits, int x_used, |
| 1764 Uint32List y_digits, int y_used, | 1764 Uint32List y_digits, int y_used, |
| 1765 Uint32List r_digits) { | 1765 Uint32List r_digits) { |
| 1766 var r_used = _Bigint._mulDigits(x_digits, x_used, | 1766 var r_used = _Bigint._mulDigits(x_digits, x_used, |
| 1767 y_digits, y_used, | 1767 y_digits, y_used, |
| 1768 r_digits); | 1768 r_digits); |
| 1769 return _reduce(r_digits, r_used); | 1769 return _reduce(r_digits, r_used); |
| 1770 } | 1770 } |
| 1771 } | 1771 } |
| OLD | NEW |