Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(540)

Unified Diff: runtime/lib/bigint.dart

Issue 741613002: Revert bigint changes of r41817 until dart2js failures are understood and fixed. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | runtime/vm/intrinsifier_x64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/lib/bigint.dart
===================================================================
--- runtime/lib/bigint.dart (revision 41819)
+++ runtime/lib/bigint.dart (working copy)
@@ -203,52 +203,36 @@
_Bigint _toBigint() => this;
// Make sure at least 'length' _digits are allocated.
- // Copy existing and used _digits if reallocation is necessary.
- // Avoid preserving _digits unnecessarily by calling this function with a
- // meaningful _used field.
+ // Copy existing _digits if reallocation is necessary.
+ // TODO(regis): Check that we are not preserving _digits unnecessarily.
void _ensureLength(int length) {
var digits = _digits;
- if (length > digits.length) {
+ if (length > 0 && (length > digits.length)) {
var new_digits = new Uint32List(length + EXTRA_DIGITS);
+ for (var i = _used; --i >= 0; ) {
+ new_digits[i] = digits[i];
+ }
_digits = new_digits;
- if (_used > 0) {
- var i = _used + 1; // Copy leading zero for 64-bit processing.
- while (--i >= 0) {
- new_digits[i] = digits[i];
- }
- }
}
}
// Clamp off excess high _digits.
void _clamp() {
- var used = _used;
- if (used > 0) {
- var digits = _digits;
- if (digits[used - 1] == 0) {
- do {
- --used;
- } while (used > 0 && digits[used - 1] == 0);
- _used = used;
- }
- digits[used] = 0; // Set leading zero for 64-bit processing.
+ var digits = _digits;
+ while (_used > 0 && digits[_used - 1] == 0) {
+ --_used;
}
}
// Copy this to r.
void _copyTo(_Bigint r) {
- var used = _used;
- if (used > 0) {
- r._used = 0; // No digits to preserve.
- r._ensureLength(used);
- var digits = _digits;
- var r_digits = r._digits;
- var i = used + 1; // Copy leading zero for 64-bit processing.
- while (--i >= 0) {
- r_digits[i] = digits[i];
- }
+ r._ensureLength(_used);
+ var digits = _digits;
+ var r_digits = r._digits;
+ for (var i = _used - 1; i >= 0; --i) {
+ r_digits[i] = digits[i];
}
- r._used = used;
+ r._used = _used;
r._neg = _neg;
}
@@ -265,22 +249,14 @@
// r = this << n*DIGIT_BITS.
void _dlShiftTo(int n, _Bigint r) {
- var used = _used;
- if (used == 0) {
- r._used = 0;
- r._neg = false;
- return;
- }
- var r_used = used + n;
+ var r_used = _used + n;
r._ensureLength(r_used);
var digits = _digits;
var r_digits = r._digits;
- var i = used + 1; // Copy leading zero for 64-bit processing.
- while (--i >= 0) {
+ for (var i = _used - 1; i >= 0; --i) {
r_digits[i + n] = digits[i];
}
- i = n;
- while (--i >= 0) {
+ for (var i = n - 1; i >= 0; --i) {
r_digits[i] = 0;
}
r._used = r_used;
@@ -289,22 +265,14 @@
// r = this >> n*DIGIT_BITS.
void _drShiftTo(int n, _Bigint r) {
- var used = _used;
- if (used == 0) {
- r._used = 0;
- r._neg = false;
- return;
- }
- var r_used = used - n;
- if (r_used <= 0) {
+ var r_used = _used - n;
+ if (r_used < 0) {
if (_neg) {
// Set r to -1.
- r._used = 0; // No digits to preserve.
+ r._neg = true;
r._ensureLength(1);
- r._neg = true;
r._used = 1;
r._digits[0] = 1;
- r._digits[1] = 0; // Set leading zero for 64-bit processing.
} else {
// Set r to 0.
r._neg = false;
@@ -315,7 +283,8 @@
r._ensureLength(r_used);
var digits = _digits;
var r_digits = r._digits;
- for (var i = n; i < used + 1; i++) { // Copy leading zero for 64-bit proc.
+ var used = _used;
+ for (var i = n; i < used; ++i) {
r_digits[i - n] = digits[i];
}
r._used = r_used;
@@ -346,13 +315,11 @@
var digits = _digits;
var r_digits = r._digits;
var c = 0;
- var i = _used;
- while (--i >= 0) {
+ for (var i = _used - 1; i >= 0; --i) {
r_digits[i + ds + 1] = (digits[i] >> cbs) | c;
c = (digits[i] & bm) << bs;
}
- i = ds;
- while (--i >= 0) {
+ for (var i = ds - 1; i >= 0; --i) {
r_digits[i] = 0;
}
r_digits[ds] = c;
@@ -374,11 +341,9 @@
if (_neg) {
// Set r to -1.
r._neg = true;
- r._used = 0; // No digits to preserve.
r._ensureLength(1);
r._used = 1;
r._digits[0] = 1;
- r._digits[1] = 0; // Set leading zero for 64-bit processing.
} else {
// Set r to 0.
r._neg = false;
@@ -393,7 +358,7 @@
var r_digits = r._digits;
r_digits[0] = digits[ds] >> bs;
var used = _used;
- for (var i = ds + 1; i < used; i++) {
+ for (var i = ds + 1; i < used; ++i) {
r_digits[i - ds - 1] |= (digits[i] & bm) << cbs;
r_digits[i - ds] = digits[i] >> bs;
}
@@ -902,11 +867,6 @@
// TODO(regis): Use karatsuba multiplication when appropriate.
var used = _used;
var a_used = a._used;
- if (used == 0 || a_used == 0) {
- r._used = 0;
- r._neg = false;
- return;
- }
var r_used = used + a_used;
r._ensureLength(r_used);
var digits = _digits;
@@ -913,7 +873,7 @@
var a_digits = a._digits;
var r_digits = r._digits;
r._used = r_used;
- var i = r_used + 1; // Set leading zero for 64-bit processing.
+ var i = r_used;
while (--i >= 0) {
r_digits[i] = 0;
}
@@ -927,16 +887,11 @@
// r = this^2, r != this.
void _sqrTo(_Bigint r) {
var used = _used;
- if (used == 0) {
- r._used = 0;
- r._neg = false;
- return;
- }
var r_used = 2 * used;
r._ensureLength(r_used);
var digits = _digits;
var r_digits = r._digits;
- var i = r_used + 1; // Set leading zero for 64-bit processing.
+ var i = r_used;
while (--i >= 0) {
r_digits[i] = 0;
}
@@ -1015,7 +970,6 @@
var r_digits = r._digits;
if (r._compareTo(t) >= 0) {
r_digits[r._used++] = 1;
- r_digits[r._used] = 0; // Set leading zero for 64-bit processing.
r._subTo(t, r);
}
ONE._dlShiftTo(y_used, t);
@@ -1023,7 +977,6 @@
while (y._used < y_used) {
y_digits[y._used++] = 0;
}
- y_digits[y._used] = 0; // Set leading zero for 64-bit processing.
Uint32List args = new Uint32List(2);
args[_YT] = yt;
while (--j >= 0) {
@@ -1466,10 +1419,9 @@
while (x._used <= _mused2) { // Pad x so _mulAdd has enough room later.
x_digits[x._used++] = 0;
}
- x_digits[x._used] = 0; // Set leading zero for 64-bit processing.
var m_used = _m._used;
var m_digits = _m._digits;
- for (var i = 0; i < m_used; i++) {
+ for (var i = 0; i < m_used; ++i) {
_mulMod(_rho_mu, x_digits, i);
_Bigint._mulAdd(_rho_mu, _MU, m_digits, 0, x_digits, i, m_used);
}
« no previous file with comments | « no previous file | runtime/vm/intrinsifier_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698