code: function bnpSquareTo(r) {
    var x = this.abs();
    var x_array = x.array;
    var r_array = r.array;
  
    var i = r.t = 2*x.t;
    while(--i >= 0) r_array[i] = 0;
    for(i = 0; i < x.t-1; ++i) {
      var c = x.am(i,x_array[i],r,2*i,0,1);
      if((r_array[i+x.t]+=x.am(i+1,2*x_array[i],r,2*i+1,c,x.t-i-1)) >= BI_DV) {
        r_array[i+x.t] -= BI_DV;
        r_array[i+x.t+1] = 1;
      }
    }
    if(r.t > 0) r_array[r.t-1] += x.am(i,x_array[i],r,2*i,0,1);
    r.s = 0;
    r.clamp();
  }
docs: (protected) r = this^2, r != this (HAC 14.16)