/runtime/stdlib/caml_int64.js

https://github.com/phated/reasonable · JavaScript · 626 lines · 569 code · 56 blank · 1 comment · 125 complexity · 80f9dfd78b1feba3e686d8af0dc6709a MD5 · raw file

  1. import * as Caml_int32 from "stdlib/caml_int32.js";
  2. import * as Caml_utils from "stdlib/caml_utils.js";
  3. import * as Caml_primitive from "stdlib/caml_primitive.js";
  4. import * as Caml_builtin_exceptions from "stdlib/caml_builtin_exceptions.js";
  5. var min_int = /* record */[
  6. /* hi */-2147483648,
  7. /* lo */0
  8. ];
  9. var max_int = /* record */[
  10. /* hi */2147483647,
  11. /* lo */1
  12. ];
  13. var one = /* record */[
  14. /* hi */0,
  15. /* lo */1
  16. ];
  17. var zero = /* record */[
  18. /* hi */0,
  19. /* lo */0
  20. ];
  21. var neg_one = /* record */[
  22. /* hi */-1,
  23. /* lo */4294967295
  24. ];
  25. function neg_signed(x) {
  26. return (x & 2147483648) !== 0;
  27. }
  28. function add(param, param$1) {
  29. var other_low_ = param$1[/* lo */1];
  30. var this_low_ = param[/* lo */1];
  31. var lo = this_low_ + other_low_ & 4294967295;
  32. var overflow = neg_signed(this_low_) && (neg_signed(other_low_) || !neg_signed(lo)) || neg_signed(other_low_) && !neg_signed(lo) ? 1 : 0;
  33. var hi = param[/* hi */0] + param$1[/* hi */0] + overflow & 4294967295;
  34. return /* record */[
  35. /* hi */hi,
  36. /* lo */(lo >>> 0)
  37. ];
  38. }
  39. function not(param) {
  40. var hi = param[/* hi */0] ^ -1;
  41. var lo = param[/* lo */1] ^ -1;
  42. return /* record */[
  43. /* hi */hi,
  44. /* lo */(lo >>> 0)
  45. ];
  46. }
  47. function eq(x, y) {
  48. if (x[/* hi */0] === y[/* hi */0]) {
  49. return x[/* lo */1] === y[/* lo */1];
  50. } else {
  51. return false;
  52. }
  53. }
  54. function equal_null(x, y) {
  55. if (y !== null) {
  56. return eq(x, y);
  57. } else {
  58. return false;
  59. }
  60. }
  61. function equal_undefined(x, y) {
  62. if (y !== undefined) {
  63. return eq(x, y);
  64. } else {
  65. return false;
  66. }
  67. }
  68. function equal_nullable(x, y) {
  69. if (y == null) {
  70. return false;
  71. } else {
  72. return eq(x, y);
  73. }
  74. }
  75. function neg(x) {
  76. if (eq(x, min_int)) {
  77. return min_int;
  78. } else {
  79. return add(not(x), one);
  80. }
  81. }
  82. function sub(x, y) {
  83. return add(x, neg(y));
  84. }
  85. function lsl_(x, numBits) {
  86. if (numBits === 0) {
  87. return x;
  88. } else {
  89. var lo = x[/* lo */1];
  90. if (numBits >= 32) {
  91. return /* record */[
  92. /* hi */(lo << (numBits - 32 | 0)),
  93. /* lo */0
  94. ];
  95. } else {
  96. var hi = (lo >>> (32 - numBits | 0)) | (x[/* hi */0] << numBits);
  97. return /* record */[
  98. /* hi */hi,
  99. /* lo */((lo << numBits) >>> 0)
  100. ];
  101. }
  102. }
  103. }
  104. function lsr_(x, numBits) {
  105. if (numBits === 0) {
  106. return x;
  107. } else {
  108. var hi = x[/* hi */0];
  109. var offset = numBits - 32 | 0;
  110. if (offset === 0) {
  111. return /* record */[
  112. /* hi */0,
  113. /* lo */(hi >>> 0)
  114. ];
  115. } else if (offset > 0) {
  116. var lo = (hi >>> offset);
  117. return /* record */[
  118. /* hi */0,
  119. /* lo */(lo >>> 0)
  120. ];
  121. } else {
  122. var hi$1 = (hi >>> numBits);
  123. var lo$1 = (hi << (-offset | 0)) | (x[/* lo */1] >>> numBits);
  124. return /* record */[
  125. /* hi */hi$1,
  126. /* lo */(lo$1 >>> 0)
  127. ];
  128. }
  129. }
  130. }
  131. function asr_(x, numBits) {
  132. if (numBits === 0) {
  133. return x;
  134. } else {
  135. var hi = x[/* hi */0];
  136. if (numBits < 32) {
  137. var hi$1 = (hi >> numBits);
  138. var lo = (hi << (32 - numBits | 0)) | (x[/* lo */1] >>> numBits);
  139. return /* record */[
  140. /* hi */hi$1,
  141. /* lo */(lo >>> 0)
  142. ];
  143. } else {
  144. var lo$1 = (hi >> (numBits - 32 | 0));
  145. return /* record */[
  146. /* hi */hi >= 0 ? 0 : -1,
  147. /* lo */(lo$1 >>> 0)
  148. ];
  149. }
  150. }
  151. }
  152. function is_zero(param) {
  153. if (param[/* hi */0] !== 0 || param[/* lo */1] !== 0) {
  154. return false;
  155. } else {
  156. return true;
  157. }
  158. }
  159. function mul(_this, _other) {
  160. while(true) {
  161. var other = _other;
  162. var $$this = _this;
  163. var exit = 0;
  164. var lo;
  165. var this_hi = $$this[/* hi */0];
  166. var exit$1 = 0;
  167. var exit$2 = 0;
  168. var exit$3 = 0;
  169. if (this_hi !== 0 || $$this[/* lo */1] !== 0) {
  170. exit$3 = 4;
  171. } else {
  172. return zero;
  173. }
  174. if (exit$3 === 4) {
  175. if (other[/* hi */0] !== 0 || other[/* lo */1] !== 0) {
  176. exit$2 = 3;
  177. } else {
  178. return zero;
  179. }
  180. }
  181. if (exit$2 === 3) {
  182. if (this_hi !== -2147483648 || $$this[/* lo */1] !== 0) {
  183. exit$1 = 2;
  184. } else {
  185. lo = other[/* lo */1];
  186. exit = 1;
  187. }
  188. }
  189. if (exit$1 === 2) {
  190. var other_hi = other[/* hi */0];
  191. var lo$1 = $$this[/* lo */1];
  192. var exit$4 = 0;
  193. if (other_hi !== -2147483648 || other[/* lo */1] !== 0) {
  194. exit$4 = 3;
  195. } else {
  196. lo = lo$1;
  197. exit = 1;
  198. }
  199. if (exit$4 === 3) {
  200. var other_lo = other[/* lo */1];
  201. if (this_hi < 0) {
  202. if (other_hi < 0) {
  203. _other = neg(other);
  204. _this = neg($$this);
  205. continue ;
  206. } else {
  207. return neg(mul(neg($$this), other));
  208. }
  209. } else if (other_hi < 0) {
  210. return neg(mul($$this, neg(other)));
  211. } else {
  212. var a48 = (this_hi >>> 16);
  213. var a32 = this_hi & 65535;
  214. var a16 = (lo$1 >>> 16);
  215. var a00 = lo$1 & 65535;
  216. var b48 = (other_hi >>> 16);
  217. var b32 = other_hi & 65535;
  218. var b16 = (other_lo >>> 16);
  219. var b00 = other_lo & 65535;
  220. var c48 = 0;
  221. var c32 = 0;
  222. var c16 = 0;
  223. var c00 = a00 * b00;
  224. c16 = (c00 >>> 16) + a16 * b00;
  225. c32 = (c16 >>> 16);
  226. c16 = (c16 & 65535) + a00 * b16;
  227. c32 = c32 + (c16 >>> 16) + a32 * b00;
  228. c48 = (c32 >>> 16);
  229. c32 = (c32 & 65535) + a16 * b16;
  230. c48 += (c32 >>> 16);
  231. c32 = (c32 & 65535) + a00 * b32;
  232. c48 += (c32 >>> 16);
  233. c32 = c32 & 65535;
  234. c48 = c48 + (a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48) & 65535;
  235. var hi = c32 | (c48 << 16);
  236. var lo$2 = c00 & 65535 | ((c16 & 65535) << 16);
  237. return /* record */[
  238. /* hi */hi,
  239. /* lo */(lo$2 >>> 0)
  240. ];
  241. }
  242. }
  243. }
  244. if (exit === 1) {
  245. if ((lo & 1) === 0) {
  246. return zero;
  247. } else {
  248. return min_int;
  249. }
  250. }
  251. };
  252. }
  253. function swap(param) {
  254. var hi = Caml_int32.caml_int32_bswap(param[/* lo */1]);
  255. var lo = Caml_int32.caml_int32_bswap(param[/* hi */0]);
  256. return /* record */[
  257. /* hi */hi,
  258. /* lo */(lo >>> 0)
  259. ];
  260. }
  261. function xor(param, param$1) {
  262. return /* record */[
  263. /* hi */param[/* hi */0] ^ param$1[/* hi */0],
  264. /* lo */((param[/* lo */1] ^ param$1[/* lo */1]) >>> 0)
  265. ];
  266. }
  267. function or_(param, param$1) {
  268. return /* record */[
  269. /* hi */param[/* hi */0] | param$1[/* hi */0],
  270. /* lo */((param[/* lo */1] | param$1[/* lo */1]) >>> 0)
  271. ];
  272. }
  273. function and_(param, param$1) {
  274. return /* record */[
  275. /* hi */param[/* hi */0] & param$1[/* hi */0],
  276. /* lo */((param[/* lo */1] & param$1[/* lo */1]) >>> 0)
  277. ];
  278. }
  279. function ge(param, param$1) {
  280. var other_hi = param$1[/* hi */0];
  281. var hi = param[/* hi */0];
  282. if (hi > other_hi) {
  283. return true;
  284. } else if (hi < other_hi) {
  285. return false;
  286. } else {
  287. return param[/* lo */1] >= param$1[/* lo */1];
  288. }
  289. }
  290. function neq(x, y) {
  291. return !eq(x, y);
  292. }
  293. function lt(x, y) {
  294. return !ge(x, y);
  295. }
  296. function gt(x, y) {
  297. if (x[/* hi */0] > y[/* hi */0]) {
  298. return true;
  299. } else if (x[/* hi */0] < y[/* hi */0]) {
  300. return false;
  301. } else {
  302. return x[/* lo */1] > y[/* lo */1];
  303. }
  304. }
  305. function le(x, y) {
  306. return !gt(x, y);
  307. }
  308. function min(x, y) {
  309. if (ge(x, y)) {
  310. return y;
  311. } else {
  312. return x;
  313. }
  314. }
  315. function max(x, y) {
  316. if (gt(x, y)) {
  317. return x;
  318. } else {
  319. return y;
  320. }
  321. }
  322. function to_float(param) {
  323. return param[/* hi */0] * (0x100000000) + param[/* lo */1];
  324. }
  325. var two_ptr_32_dbl = Math.pow(2, 32);
  326. var two_ptr_63_dbl = Math.pow(2, 63);
  327. var neg_two_ptr_63 = -Math.pow(2, 63);
  328. function of_float(x) {
  329. if (isNaN(x) || !isFinite(x)) {
  330. return zero;
  331. } else if (x <= neg_two_ptr_63) {
  332. return min_int;
  333. } else if (x + 1 >= two_ptr_63_dbl) {
  334. return max_int;
  335. } else if (x < 0) {
  336. return neg(of_float(-x));
  337. } else {
  338. var hi = x / two_ptr_32_dbl | 0;
  339. var lo = x % two_ptr_32_dbl | 0;
  340. return /* record */[
  341. /* hi */hi,
  342. /* lo */(lo >>> 0)
  343. ];
  344. }
  345. }
  346. function div(_self, _other) {
  347. while(true) {
  348. var other = _other;
  349. var self = _self;
  350. var self_hi = self[/* hi */0];
  351. var exit = 0;
  352. var exit$1 = 0;
  353. if (other[/* hi */0] !== 0 || other[/* lo */1] !== 0) {
  354. exit$1 = 2;
  355. } else {
  356. throw Caml_builtin_exceptions.division_by_zero;
  357. }
  358. if (exit$1 === 2) {
  359. if (self_hi !== -2147483648) {
  360. if (self_hi !== 0 || self[/* lo */1] !== 0) {
  361. exit = 1;
  362. } else {
  363. return zero;
  364. }
  365. } else if (self[/* lo */1] !== 0) {
  366. exit = 1;
  367. } else if (eq(other, one) || eq(other, neg_one)) {
  368. return self;
  369. } else if (eq(other, min_int)) {
  370. return one;
  371. } else {
  372. var other_hi = other[/* hi */0];
  373. var half_this = asr_(self, 1);
  374. var approx = lsl_(div(half_this, other), 1);
  375. var exit$2 = 0;
  376. if (approx[/* hi */0] !== 0 || approx[/* lo */1] !== 0) {
  377. exit$2 = 3;
  378. } else if (other_hi < 0) {
  379. return one;
  380. } else {
  381. return neg(one);
  382. }
  383. if (exit$2 === 3) {
  384. var y = mul(other, approx);
  385. var rem = add(self, neg(y));
  386. return add(approx, div(rem, other));
  387. }
  388. }
  389. }
  390. if (exit === 1) {
  391. var other_hi$1 = other[/* hi */0];
  392. var exit$3 = 0;
  393. if (other_hi$1 !== -2147483648 || other[/* lo */1] !== 0) {
  394. exit$3 = 2;
  395. } else {
  396. return zero;
  397. }
  398. if (exit$3 === 2) {
  399. if (self_hi < 0) {
  400. if (other_hi$1 < 0) {
  401. _other = neg(other);
  402. _self = neg(self);
  403. continue ;
  404. } else {
  405. return neg(div(neg(self), other));
  406. }
  407. } else if (other_hi$1 < 0) {
  408. return neg(div(self, neg(other)));
  409. } else {
  410. var res = zero;
  411. var rem$1 = self;
  412. while(ge(rem$1, other)) {
  413. var approx$1 = Caml_primitive.caml_float_max(1, Math.floor(to_float(rem$1) / to_float(other)));
  414. var log2 = Math.ceil(Math.log(approx$1) / Math.LN2);
  415. var delta = log2 <= 48 ? 1 : Math.pow(2, log2 - 48);
  416. var approxRes = of_float(approx$1);
  417. var approxRem = mul(approxRes, other);
  418. while(approxRem[/* hi */0] < 0 || gt(approxRem, rem$1)) {
  419. approx$1 -= delta;
  420. approxRes = of_float(approx$1);
  421. approxRem = mul(approxRes, other);
  422. };
  423. if (is_zero(approxRes)) {
  424. approxRes = one;
  425. }
  426. res = add(res, approxRes);
  427. rem$1 = add(rem$1, neg(approxRem));
  428. };
  429. return res;
  430. }
  431. }
  432. }
  433. };
  434. }
  435. function mod_(self, other) {
  436. var y = mul(div(self, other), other);
  437. return add(self, neg(y));
  438. }
  439. function div_mod(self, other) {
  440. var quotient = div(self, other);
  441. var y = mul(quotient, other);
  442. return /* tuple */[
  443. quotient,
  444. add(self, neg(y))
  445. ];
  446. }
  447. function compare(self, other) {
  448. var v = Caml_primitive.caml_nativeint_compare(self[/* hi */0], other[/* hi */0]);
  449. if (v === 0) {
  450. return Caml_primitive.caml_nativeint_compare(self[/* lo */1], other[/* lo */1]);
  451. } else {
  452. return v;
  453. }
  454. }
  455. function of_int32(lo) {
  456. return /* record */[
  457. /* hi */lo < 0 ? -1 : 0,
  458. /* lo */(lo >>> 0)
  459. ];
  460. }
  461. function to_int32(x) {
  462. return x[/* lo */1] | 0;
  463. }
  464. function to_hex(x) {
  465. var aux = function (v) {
  466. return (v >>> 0).toString(16);
  467. };
  468. var match = x[/* hi */0];
  469. var match$1 = x[/* lo */1];
  470. var exit = 0;
  471. if (match !== 0 || match$1 !== 0) {
  472. exit = 1;
  473. } else {
  474. return "0";
  475. }
  476. if (exit === 1) {
  477. if (match$1 !== 0) {
  478. if (match !== 0) {
  479. var lo = aux(x[/* lo */1]);
  480. var pad = 8 - lo.length | 0;
  481. if (pad <= 0) {
  482. return aux(x[/* hi */0]) + lo;
  483. } else {
  484. return aux(x[/* hi */0]) + (Caml_utils.repeat(pad, "0") + lo);
  485. }
  486. } else {
  487. return aux(x[/* lo */1]);
  488. }
  489. } else {
  490. return aux(x[/* hi */0]) + "00000000";
  491. }
  492. }
  493. }
  494. function discard_sign(x) {
  495. return /* record */[
  496. /* hi */2147483647 & x[/* hi */0],
  497. /* lo */x[/* lo */1]
  498. ];
  499. }
  500. function float_of_bits(x) {
  501. var int32 = new Int32Array(/* array */[
  502. x[/* lo */1],
  503. x[/* hi */0]
  504. ]);
  505. return new Float64Array(int32.buffer)[0];
  506. }
  507. function bits_of_float(x) {
  508. var u = new Float64Array(/* array */[x]);
  509. var int32 = new Int32Array(u.buffer);
  510. var x$1 = int32[1];
  511. var hi = x$1;
  512. var x$2 = int32[0];
  513. var lo = x$2;
  514. return /* record */[
  515. /* hi */hi,
  516. /* lo */(lo >>> 0)
  517. ];
  518. }
  519. function get64(s, i) {
  520. var hi = (s.charCodeAt(i + 4 | 0) << 32) | (s.charCodeAt(i + 5 | 0) << 40) | (s.charCodeAt(i + 6 | 0) << 48) | (s.charCodeAt(i + 7 | 0) << 56);
  521. var lo = s.charCodeAt(i) | (s.charCodeAt(i + 1 | 0) << 8) | (s.charCodeAt(i + 2 | 0) << 16) | (s.charCodeAt(i + 3 | 0) << 24);
  522. return /* record */[
  523. /* hi */hi,
  524. /* lo */(lo >>> 0)
  525. ];
  526. }
  527. export {
  528. min_int ,
  529. max_int ,
  530. one ,
  531. zero ,
  532. not ,
  533. of_int32 ,
  534. to_int32 ,
  535. add ,
  536. neg ,
  537. sub ,
  538. lsl_ ,
  539. lsr_ ,
  540. asr_ ,
  541. is_zero ,
  542. mul ,
  543. xor ,
  544. or_ ,
  545. and_ ,
  546. swap ,
  547. ge ,
  548. eq ,
  549. neq ,
  550. lt ,
  551. gt ,
  552. le ,
  553. equal_null ,
  554. equal_undefined ,
  555. equal_nullable ,
  556. min ,
  557. max ,
  558. to_float ,
  559. of_float ,
  560. div ,
  561. mod_ ,
  562. div_mod ,
  563. compare ,
  564. to_hex ,
  565. discard_sign ,
  566. float_of_bits ,
  567. bits_of_float ,
  568. get64 ,
  569. }
  570. /* two_ptr_32_dbl Not a pure module */