github.com/gopherjs/gopherjs@v1.19.0-beta1.0.20240506212314-27071a8796e4/compiler/prelude/numeric.js (about) 1 var $min = Math.min; 2 var $mod = (x, y) => { return x % y; }; 3 var $parseInt = parseInt; 4 var $parseFloat = f => { 5 if (f !== undefined && f !== null && f.constructor === Number) { 6 return f; 7 } 8 return parseFloat(f); 9 }; 10 11 var $froundBuf = new Float32Array(1); 12 var $fround = Math.fround || (f => { 13 $froundBuf[0] = f; 14 return $froundBuf[0]; 15 }); 16 17 var $imul = Math.imul || ((a, b) => { 18 var ah = (a >>> 16) & 0xffff; 19 var al = a & 0xffff; 20 var bh = (b >>> 16) & 0xffff; 21 var bl = b & 0xffff; 22 return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) >> 0); 23 }); 24 25 var $floatKey = f => { 26 if (f !== f) { 27 $idCounter++; 28 return "NaN$" + $idCounter; 29 } 30 return String(f); 31 }; 32 33 var $flatten64 = x => { 34 return x.$high * 4294967296 + x.$low; 35 }; 36 37 var $shiftLeft64 = (x, y) => { 38 if (y === 0) { 39 return x; 40 } 41 if (y < 32) { 42 return new x.constructor(x.$high << y | x.$low >>> (32 - y), (x.$low << y) >>> 0); 43 } 44 if (y < 64) { 45 return new x.constructor(x.$low << (y - 32), 0); 46 } 47 return new x.constructor(0, 0); 48 }; 49 50 var $shiftRightInt64 = (x, y) => { 51 if (y === 0) { 52 return x; 53 } 54 if (y < 32) { 55 return new x.constructor(x.$high >> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); 56 } 57 if (y < 64) { 58 return new x.constructor(x.$high >> 31, (x.$high >> (y - 32)) >>> 0); 59 } 60 if (x.$high < 0) { 61 return new x.constructor(-1, 4294967295); 62 } 63 return new x.constructor(0, 0); 64 }; 65 66 var $shiftRightUint64 = (x, y) => { 67 if (y === 0) { 68 return x; 69 } 70 if (y < 32) { 71 return new x.constructor(x.$high >>> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); 72 } 73 if (y < 64) { 74 return new x.constructor(0, x.$high >>> (y - 32)); 75 } 76 return new x.constructor(0, 0); 77 }; 78 79 var $mul64 = (x, y) => { 80 var x48 = x.$high >>> 16; 81 var x32 = x.$high & 0xFFFF; 82 var x16 = x.$low >>> 16; 83 var x00 = x.$low & 0xFFFF; 84 85 var y48 = y.$high >>> 16; 86 var y32 = y.$high & 0xFFFF; 87 var y16 = y.$low >>> 16; 88 var y00 = y.$low & 0xFFFF; 89 90 var z48 = 0, z32 = 0, z16 = 0, z00 = 0; 91 z00 += x00 * y00; 92 z16 += z00 >>> 16; 93 z00 &= 0xFFFF; 94 z16 += x16 * y00; 95 z32 += z16 >>> 16; 96 z16 &= 0xFFFF; 97 z16 += x00 * y16; 98 z32 += z16 >>> 16; 99 z16 &= 0xFFFF; 100 z32 += x32 * y00; 101 z48 += z32 >>> 16; 102 z32 &= 0xFFFF; 103 z32 += x16 * y16; 104 z48 += z32 >>> 16; 105 z32 &= 0xFFFF; 106 z32 += x00 * y32; 107 z48 += z32 >>> 16; 108 z32 &= 0xFFFF; 109 z48 += x48 * y00 + x32 * y16 + x16 * y32 + x00 * y48; 110 z48 &= 0xFFFF; 111 112 var hi = ((z48 << 16) | z32) >>> 0; 113 var lo = ((z16 << 16) | z00) >>> 0; 114 115 var r = new x.constructor(hi, lo); 116 return r; 117 }; 118 119 var $div64 = (x, y, returnRemainder) => { 120 if (y.$high === 0 && y.$low === 0) { 121 $throwRuntimeError("integer divide by zero"); 122 } 123 124 var s = 1; 125 var rs = 1; 126 127 var xHigh = x.$high; 128 var xLow = x.$low; 129 if (xHigh < 0) { 130 s = -1; 131 rs = -1; 132 xHigh = -xHigh; 133 if (xLow !== 0) { 134 xHigh--; 135 xLow = 4294967296 - xLow; 136 } 137 } 138 139 var yHigh = y.$high; 140 var yLow = y.$low; 141 if (y.$high < 0) { 142 s *= -1; 143 yHigh = -yHigh; 144 if (yLow !== 0) { 145 yHigh--; 146 yLow = 4294967296 - yLow; 147 } 148 } 149 150 var high = 0, low = 0, n = 0; 151 while (yHigh < 2147483648 && ((xHigh > yHigh) || (xHigh === yHigh && xLow > yLow))) { 152 yHigh = (yHigh << 1 | yLow >>> 31) >>> 0; 153 yLow = (yLow << 1) >>> 0; 154 n++; 155 } 156 for (var i = 0; i <= n; i++) { 157 high = high << 1 | low >>> 31; 158 low = (low << 1) >>> 0; 159 if ((xHigh > yHigh) || (xHigh === yHigh && xLow >= yLow)) { 160 xHigh = xHigh - yHigh; 161 xLow = xLow - yLow; 162 if (xLow < 0) { 163 xHigh--; 164 xLow += 4294967296; 165 } 166 low++; 167 if (low === 4294967296) { 168 high++; 169 low = 0; 170 } 171 } 172 yLow = (yLow >>> 1 | yHigh << (32 - 1)) >>> 0; 173 yHigh = yHigh >>> 1; 174 } 175 176 if (returnRemainder) { 177 return new x.constructor(xHigh * rs, xLow * rs); 178 } 179 return new x.constructor(high * s, low * s); 180 }; 181 182 var $divComplex = (n, d) => { 183 var ninf = n.$real === Infinity || n.$real === -Infinity || n.$imag === Infinity || n.$imag === -Infinity; 184 var dinf = d.$real === Infinity || d.$real === -Infinity || d.$imag === Infinity || d.$imag === -Infinity; 185 var nnan = !ninf && (n.$real !== n.$real || n.$imag !== n.$imag); 186 var dnan = !dinf && (d.$real !== d.$real || d.$imag !== d.$imag); 187 if (nnan || dnan) { 188 return new n.constructor(NaN, NaN); 189 } 190 if (ninf && !dinf) { 191 return new n.constructor(Infinity, Infinity); 192 } 193 if (!ninf && dinf) { 194 return new n.constructor(0, 0); 195 } 196 if (d.$real === 0 && d.$imag === 0) { 197 if (n.$real === 0 && n.$imag === 0) { 198 return new n.constructor(NaN, NaN); 199 } 200 return new n.constructor(Infinity, Infinity); 201 } 202 var a = Math.abs(d.$real); 203 var b = Math.abs(d.$imag); 204 if (a <= b) { 205 var ratio = d.$real / d.$imag; 206 var denom = d.$real * ratio + d.$imag; 207 return new n.constructor((n.$real * ratio + n.$imag) / denom, (n.$imag * ratio - n.$real) / denom); 208 } 209 var ratio = d.$imag / d.$real; 210 var denom = d.$imag * ratio + d.$real; 211 return new n.constructor((n.$imag * ratio + n.$real) / denom, (n.$imag - n.$real * ratio) / denom); 212 };