Fixed 36-bit multiplication results in cases of overflow

This commit is contained in:
Jeff 2017-04-01 15:14:27 -07:00 committed by Jeff Parsons
commit 1a8c1306d4
4 changed files with 19 additions and 6 deletions

View file

@ -103,7 +103,7 @@ function Dc(a,b){var c=this.b(this.a)&C,d=this.b(b);this.c(b,Ec(a,d,c)+c)}functi
function Kc(a,b){b=this.b(b)/E|0;var c=this.b(this.a);this.c(this.a,Ec(a,c,b)+b)}function Lc(a,b){var c=this.b(this.a),d=c/E|0,c=Ec(a,c,d)+d;this.c(this.a,c);b&&this.c(b,c)}function Q(a){Mc[a&7].call(this,a,a>>3&127)}function Nc(){}function Oc(){}function O(a){this.M("undefined opcode: "+ka(a));this.f=(this.f+-1)%$a;N(this)}function Pc(a){a>F&&(a!=G?a=db-a:this.g|=163840);return a}function R(a,b){var c=(a+b)%J;Qc.call(this,a,b,c);return c}
function S(a,b,c){var d=!1,e=!1,f=b-b%G;a=a%G+b*G%J;b=this.o=f+Math.trunc(b/2);c>F&&(c=J-c,d=!d);b>F&&(a?(b=I-b,a=J-a):b&&(b=J-b),e=!0,d=!d);if(b>=c)return this.g|=131104,-1;f=this.Na;f[0]=0;f[1]=0;f=this.da;f[0]=1;f[1]=0;f=this.X;f[0]=c;f[1]=0;c=this.ea;c[0]=a;for(c[1]=b;0<Rc(this.ea,this.X);)Sc(this.X,this.X),Sc(this.da,this.da);do{if(0<=Rc(this.ea,this.X)&&(b=this.ea,a=this.X,b[0]-=a[0],b[1]-=a[1],0>b[0]&&(b[0]+=J,b[1]--),Sc(this.Na,this.da),Tc(this.ea)))break;Uc(this.X);Uc(this.da)}while(!Tc(this.da));
a=this.Na[0];this.o=this.ea[0];d&&a&&(a=J-a);e&&this.o&&(this.o=J-this.o);return a}
function Vc(a,b,c,d){var e=a,f=b;b=!1;var g;e>F&&(d||1001!=this.Wa||e!=G)&&(e=J-e,b=!b);f>F&&(f=J-f,b=!b);if(e<E&&f<E)a=e*f,g=0;else{a=e&C;e=Math.trunc(e/E);g=f&C;var f=Math.trunc(f/E),h=a*g,m=e*g+Math.trunc(h/E);g=Math.trunc(m/E);m=(m&C)+a*f;a=(m*E+(h&C))%J;g+=Math.trunc(m/E)+e*f}b&&(a?(g=I-g,a=J-a):g&&(g=J-g));if(c)return!d&&(g||a>F)&&(g!=I||a<=F)&&(this.g|=131072),a;c=a;b=g;a=b-b%G;b=2*b%J+Math.trunc(c/G);c=a+c%G;d?d=c:(d=b-b%G,a!=d&&(b=a+(b-d),this.g|=131072),this.o=c,d=b);return d}
function Vc(a,b,c,d){var e=a,f=b;b=!1;var g;e>F&&(d||1001!=this.Wa||e!=G)&&(e=J-e,b=!b);f>F&&(f=J-f,b=!b);if(e<E&&f<E)a=e*f,g=0;else{a=e&C;e=Math.trunc(e/E);g=f&C;var f=Math.trunc(f/E),h=a*g,m=e*g+Math.trunc(h/E);g=Math.trunc(m/E);m=(m&C)+a*f;a=(m*E+(h&C))%J;g+=Math.trunc(m/E)+e*f}b&&(a?(g=I-g,a=J-a):g&&(g=J-g));if(c)return!d&&(g||a>F)&&(g!=I||a<=F)&&(this.g|=131072),a;c=a;b=g;a=b-b%G;b=2*b%J+Math.trunc(c/G);c=a+c%G;a!=b-b%G&&(c=b,d||(this.g|=131072));d?d=c:(this.o=c,d=b);return d}
function Wc(a){a?a==G?this.g|=163840:a=db-a:this.g|=98304;return a}function Xc(a,b){var c=a-b;0>c&&(c+=J);Qc.call(this,c,b,a);return c}function Qc(a,b,c){a=Math.trunc(a/cb);b=Math.trunc(b/cb);c=Math.trunc(c/cb);var d=a^(a^b)&(b^c);this.g=this.g|(d&2?65536:0)|(d&1?32768:0)|((a^c)&(b^c)&2?131072:0)}function T(a,b){return((a/K|0)&(b/K|0))*K+((a&b)>>>0)}function U(a,b){return T(a,(~(b/K|0)&15)*K+(~b>>>0))}function V(a,b){return(a<G?a:a-J)-(b<G?b:b-J)}
function Yc(a,b){return(~((a/K|0)^(b/K|0))&15)*K+(~(a^b)>>>0)}function W(a,b){return(a/K|0|b/K|0)*K+((a|b)>>>0)}function X(a){return a<G?a:a-J}function Y(a,b){return((a/K|0)^(b/K|0))*K+((a^b)>>>0)}function Z(a){return(a/E|0)+(a&C)*E}function Ec(a,b,c){switch(a&384){case 0:b-=b&C;break;case 128:b=0;break;case 256:b=C*E;break;case 384:b=c>ab?C*E:0}return b}function vc(a,b,c){switch(a&384){case 0:b&=C;break;case 128:b=0;break;case 256:b=C;break;case 384:b=c>F?C:0}return b}
function Sc(a,b){a[0]+=b[0];a[1]+=b[1];a[0]>=J&&(a[0]%=J,a[1]++)}function Rc(a,b){var c=a[1]-b[1];c||(c=a[0]-b[0]);return c}function Uc(a){a[1]%2&&(a[0]+=J);a[0]=Math.trunc(a[0]/2);a[1]=Math.trunc(a[1]/2)}function Tc(a){return!a[0]&&!a[1]}