anchor.diff:      while (--i >= 0) {
         r_digits[i] = 0;
       }
  +  }
  +
  +  // Return this << n.
  +  _Bigint _lShift(int n) {
  +    final ds = n ~/ _DIGIT_BITS;
  +    final bs = n % _DIGIT_BITS;
  +    if (bs == 0) {
  +      return _dlShift(ds);
  +    }
  +    var r_used = _used + ds + 1;
  +    var r_digits = new Uint32List(r_used + (r_used & 1));
  +    _lsh(_digits, _used, n, r_digits);
  +    return new _Bigint(_neg, r_used, r_digits);
  +  }
  +
  +  // r_digits[0..r_used-1] = x_digits[0..x_used-1] << n.
  +  // Return r_used.
  +  static int _lShiftDigits(Uint32List x_digits, int x_used, int n,
  +                           Uint32List r_digits) {
  +    final ds = n ~/ _DIGIT_BITS;
  +    final bs = n % _DIGIT_BITS;
  +    if (bs == 0) {
  +      return _dlShiftDigits(x_digits, x_used, ds, r_digits);
  +    }
  +    var r_used = x_used + ds + 1;
  +    assert(r_digits.length >= r_used + (r_used & 1));
  +    _lsh(x_digits, x_used, n, r_digits);
       if (r_digits[r_used - 1] == 0) {
         r_used--;  // Clamp result.
       } else if (r_used.isOdd) {
  
positive.code: 
    // Return this >> n*_DIGIT_BITS.
    _Bigint _drShift(int n) {
      var used = _used;
      if (used == 0) {
        return _ZERO;
      }
      var r_used = used - n;
      if (r_used <= 0) {
        return _neg ? _MINUS_ONE : _ZERO;
      }
      var digits = _digits;
      var r_digits = new Uint32List(r_used + (r_used & 1));
      for (var i = n; i < used; i++) {
        r_digits[i - n] = digits[i];
      }
      var r = new _Bigint(_neg, r_used, r_digits);
      if (_neg) {
        // Round down if any bit was shifted out.
        for (var i = 0; i < n; i++) {
  
negative.code:   // Return r_used.
    static int _rShiftDigits(Uint32List x_digits, int x_used, int n,
                             Uint32List r_digits) {
      final ds = n ~/ _DIGIT_BITS;
      final bs = n % _DIGIT_BITS;
      if (bs == 0) {
        return _drShiftDigits(x_digits, x_used, ds, r_digits);
      }
  