/source/libs/cairo/cairo-1.12.16/src/cairo-wideint.c

https://bitbucket.org/minux/luatex · C · 852 lines · 643 code · 115 blank · 94 comment · 81 complexity · 8254b9065805711c10b53963b07ae424 MD5 · raw file

  1. /* cairo - a vector graphics library with display and print output
  2. *
  3. * Copyright © 2004 Keith Packard
  4. *
  5. * This library is free software; you can redistribute it and/or
  6. * modify it either under the terms of the GNU Lesser General Public
  7. * License version 2.1 as published by the Free Software Foundation
  8. * (the "LGPL") or, at your option, under the terms of the Mozilla
  9. * Public License Version 1.1 (the "MPL"). If you do not alter this
  10. * notice, a recipient may use your version of this file under either
  11. * the MPL or the LGPL.
  12. *
  13. * You should have received a copy of the LGPL along with this library
  14. * in the file COPYING-LGPL-2.1; if not, write to the Free Software
  15. * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
  16. * You should have received a copy of the MPL along with this library
  17. * in the file COPYING-MPL-1.1
  18. *
  19. * The contents of this file are subject to the Mozilla Public License
  20. * Version 1.1 (the "License"); you may not use this file except in
  21. * compliance with the License. You may obtain a copy of the License at
  22. * http://www.mozilla.org/MPL/
  23. *
  24. * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
  25. * OF ANY KIND, either express or implied. See the LGPL or the MPL for
  26. * the specific language governing rights and limitations.
  27. *
  28. * The Original Code is the cairo graphics library.
  29. *
  30. * The Initial Developer of the Original Code is Keith Packard
  31. *
  32. * Contributor(s):
  33. * Keith R. Packard <keithp@keithp.com>
  34. */
  35. #include "cairoint.h"
  36. #if HAVE_UINT64_T
  37. #define uint64_lo32(i) ((i) & 0xffffffff)
  38. #define uint64_hi32(i) ((i) >> 32)
  39. #define uint64_lo(i) ((i) & 0xffffffff)
  40. #define uint64_hi(i) ((i) >> 32)
  41. #define uint64_shift32(i) ((i) << 32)
  42. #define uint64_carry32 (((uint64_t) 1) << 32)
  43. #define _cairo_uint32s_to_uint64(h,l) ((uint64_t) (h) << 32 | (l))
  44. #else
  45. #define uint64_lo32(i) ((i).lo)
  46. #define uint64_hi32(i) ((i).hi)
  47. static cairo_uint64_t
  48. uint64_lo (cairo_uint64_t i)
  49. {
  50. cairo_uint64_t s;
  51. s.lo = i.lo;
  52. s.hi = 0;
  53. return s;
  54. }
  55. static cairo_uint64_t
  56. uint64_hi (cairo_uint64_t i)
  57. {
  58. cairo_uint64_t s;
  59. s.lo = i.hi;
  60. s.hi = 0;
  61. return s;
  62. }
  63. static cairo_uint64_t
  64. uint64_shift32 (cairo_uint64_t i)
  65. {
  66. cairo_uint64_t s;
  67. s.lo = 0;
  68. s.hi = i.lo;
  69. return s;
  70. }
  71. static const cairo_uint64_t uint64_carry32 = { 0, 1 };
  72. cairo_uint64_t
  73. _cairo_double_to_uint64 (double i)
  74. {
  75. cairo_uint64_t q;
  76. q.hi = i * (1. / 4294967296.);
  77. q.lo = i - q.hi * 4294967296.;
  78. return q;
  79. }
  80. double
  81. _cairo_uint64_to_double (cairo_uint64_t i)
  82. {
  83. return i.hi * 4294967296. + i.lo;
  84. }
  85. cairo_int64_t
  86. _cairo_double_to_int64 (double i)
  87. {
  88. cairo_uint64_t q;
  89. q.hi = i * (1. / INT32_MAX);
  90. q.lo = i - q.hi * (double)INT32_MAX;
  91. return q;
  92. }
  93. double
  94. _cairo_int64_to_double (cairo_int64_t i)
  95. {
  96. return i.hi * INT32_MAX + i.lo;
  97. }
  98. cairo_uint64_t
  99. _cairo_uint32_to_uint64 (uint32_t i)
  100. {
  101. cairo_uint64_t q;
  102. q.lo = i;
  103. q.hi = 0;
  104. return q;
  105. }
  106. cairo_int64_t
  107. _cairo_int32_to_int64 (int32_t i)
  108. {
  109. cairo_uint64_t q;
  110. q.lo = i;
  111. q.hi = i < 0 ? -1 : 0;
  112. return q;
  113. }
  114. static cairo_uint64_t
  115. _cairo_uint32s_to_uint64 (uint32_t h, uint32_t l)
  116. {
  117. cairo_uint64_t q;
  118. q.lo = l;
  119. q.hi = h;
  120. return q;
  121. }
  122. cairo_uint64_t
  123. _cairo_uint64_add (cairo_uint64_t a, cairo_uint64_t b)
  124. {
  125. cairo_uint64_t s;
  126. s.hi = a.hi + b.hi;
  127. s.lo = a.lo + b.lo;
  128. if (s.lo < a.lo)
  129. s.hi++;
  130. return s;
  131. }
  132. cairo_uint64_t
  133. _cairo_uint64_sub (cairo_uint64_t a, cairo_uint64_t b)
  134. {
  135. cairo_uint64_t s;
  136. s.hi = a.hi - b.hi;
  137. s.lo = a.lo - b.lo;
  138. if (s.lo > a.lo)
  139. s.hi--;
  140. return s;
  141. }
  142. #define uint32_lo(i) ((i) & 0xffff)
  143. #define uint32_hi(i) ((i) >> 16)
  144. #define uint32_carry16 ((1) << 16)
  145. cairo_uint64_t
  146. _cairo_uint32x32_64_mul (uint32_t a, uint32_t b)
  147. {
  148. cairo_uint64_t s;
  149. uint16_t ah, al, bh, bl;
  150. uint32_t r0, r1, r2, r3;
  151. al = uint32_lo (a);
  152. ah = uint32_hi (a);
  153. bl = uint32_lo (b);
  154. bh = uint32_hi (b);
  155. r0 = (uint32_t) al * bl;
  156. r1 = (uint32_t) al * bh;
  157. r2 = (uint32_t) ah * bl;
  158. r3 = (uint32_t) ah * bh;
  159. r1 += uint32_hi(r0); /* no carry possible */
  160. r1 += r2; /* but this can carry */
  161. if (r1 < r2) /* check */
  162. r3 += uint32_carry16;
  163. s.hi = r3 + uint32_hi(r1);
  164. s.lo = (uint32_lo (r1) << 16) + uint32_lo (r0);
  165. return s;
  166. }
  167. cairo_int64_t
  168. _cairo_int32x32_64_mul (int32_t a, int32_t b)
  169. {
  170. cairo_int64_t s;
  171. s = _cairo_uint32x32_64_mul ((uint32_t) a, (uint32_t) b);
  172. if (a < 0)
  173. s.hi -= b;
  174. if (b < 0)
  175. s.hi -= a;
  176. return s;
  177. }
  178. cairo_uint64_t
  179. _cairo_uint64_mul (cairo_uint64_t a, cairo_uint64_t b)
  180. {
  181. cairo_uint64_t s;
  182. s = _cairo_uint32x32_64_mul (a.lo, b.lo);
  183. s.hi += a.lo * b.hi + a.hi * b.lo;
  184. return s;
  185. }
  186. cairo_uint64_t
  187. _cairo_uint64_lsl (cairo_uint64_t a, int shift)
  188. {
  189. if (shift >= 32)
  190. {
  191. a.hi = a.lo;
  192. a.lo = 0;
  193. shift -= 32;
  194. }
  195. if (shift)
  196. {
  197. a.hi = a.hi << shift | a.lo >> (32 - shift);
  198. a.lo = a.lo << shift;
  199. }
  200. return a;
  201. }
  202. cairo_uint64_t
  203. _cairo_uint64_rsl (cairo_uint64_t a, int shift)
  204. {
  205. if (shift >= 32)
  206. {
  207. a.lo = a.hi;
  208. a.hi = 0;
  209. shift -= 32;
  210. }
  211. if (shift)
  212. {
  213. a.lo = a.lo >> shift | a.hi << (32 - shift);
  214. a.hi = a.hi >> shift;
  215. }
  216. return a;
  217. }
  218. #define _cairo_uint32_rsa(a,n) ((uint32_t) (((int32_t) (a)) >> (n)))
  219. cairo_int64_t
  220. _cairo_uint64_rsa (cairo_int64_t a, int shift)
  221. {
  222. if (shift >= 32)
  223. {
  224. a.lo = a.hi;
  225. a.hi = _cairo_uint32_rsa (a.hi, 31);
  226. shift -= 32;
  227. }
  228. if (shift)
  229. {
  230. a.lo = a.lo >> shift | a.hi << (32 - shift);
  231. a.hi = _cairo_uint32_rsa (a.hi, shift);
  232. }
  233. return a;
  234. }
  235. int
  236. _cairo_uint64_lt (cairo_uint64_t a, cairo_uint64_t b)
  237. {
  238. return (a.hi < b.hi ||
  239. (a.hi == b.hi && a.lo < b.lo));
  240. }
  241. int
  242. _cairo_uint64_eq (cairo_uint64_t a, cairo_uint64_t b)
  243. {
  244. return a.hi == b.hi && a.lo == b.lo;
  245. }
  246. int
  247. _cairo_int64_lt (cairo_int64_t a, cairo_int64_t b)
  248. {
  249. if (_cairo_int64_negative (a) && !_cairo_int64_negative (b))
  250. return 1;
  251. if (!_cairo_int64_negative (a) && _cairo_int64_negative (b))
  252. return 0;
  253. return _cairo_uint64_lt (a, b);
  254. }
  255. int
  256. _cairo_uint64_cmp (cairo_uint64_t a, cairo_uint64_t b)
  257. {
  258. if (a.hi < b.hi)
  259. return -1;
  260. else if (a.hi > b.hi)
  261. return 1;
  262. else if (a.lo < b.lo)
  263. return -1;
  264. else if (a.lo > b.lo)
  265. return 1;
  266. else
  267. return 0;
  268. }
  269. int
  270. _cairo_int64_cmp (cairo_int64_t a, cairo_int64_t b)
  271. {
  272. if (_cairo_int64_negative (a) && !_cairo_int64_negative (b))
  273. return -1;
  274. if (!_cairo_int64_negative (a) && _cairo_int64_negative (b))
  275. return 1;
  276. return _cairo_uint64_cmp (a, b);
  277. }
  278. cairo_uint64_t
  279. _cairo_uint64_not (cairo_uint64_t a)
  280. {
  281. a.lo = ~a.lo;
  282. a.hi = ~a.hi;
  283. return a;
  284. }
  285. cairo_uint64_t
  286. _cairo_uint64_negate (cairo_uint64_t a)
  287. {
  288. a.lo = ~a.lo;
  289. a.hi = ~a.hi;
  290. if (++a.lo == 0)
  291. ++a.hi;
  292. return a;
  293. }
  294. /*
  295. * Simple bit-at-a-time divide.
  296. */
  297. cairo_uquorem64_t
  298. _cairo_uint64_divrem (cairo_uint64_t num, cairo_uint64_t den)
  299. {
  300. cairo_uquorem64_t qr;
  301. cairo_uint64_t bit;
  302. cairo_uint64_t quo;
  303. bit = _cairo_uint32_to_uint64 (1);
  304. /* normalize to make den >= num, but not overflow */
  305. while (_cairo_uint64_lt (den, num) && (den.hi & 0x80000000) == 0)
  306. {
  307. bit = _cairo_uint64_lsl (bit, 1);
  308. den = _cairo_uint64_lsl (den, 1);
  309. }
  310. quo = _cairo_uint32_to_uint64 (0);
  311. /* generate quotient, one bit at a time */
  312. while (bit.hi | bit.lo)
  313. {
  314. if (_cairo_uint64_le (den, num))
  315. {
  316. num = _cairo_uint64_sub (num, den);
  317. quo = _cairo_uint64_add (quo, bit);
  318. }
  319. bit = _cairo_uint64_rsl (bit, 1);
  320. den = _cairo_uint64_rsl (den, 1);
  321. }
  322. qr.quo = quo;
  323. qr.rem = num;
  324. return qr;
  325. }
  326. #endif /* !HAVE_UINT64_T */
  327. #if HAVE_UINT128_T
  328. cairo_uquorem128_t
  329. _cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den)
  330. {
  331. cairo_uquorem128_t qr;
  332. qr.quo = num / den;
  333. qr.rem = num % den;
  334. return qr;
  335. }
  336. #else
  337. cairo_uint128_t
  338. _cairo_uint32_to_uint128 (uint32_t i)
  339. {
  340. cairo_uint128_t q;
  341. q.lo = _cairo_uint32_to_uint64 (i);
  342. q.hi = _cairo_uint32_to_uint64 (0);
  343. return q;
  344. }
  345. cairo_int128_t
  346. _cairo_int32_to_int128 (int32_t i)
  347. {
  348. cairo_int128_t q;
  349. q.lo = _cairo_int32_to_int64 (i);
  350. q.hi = _cairo_int32_to_int64 (i < 0 ? -1 : 0);
  351. return q;
  352. }
  353. cairo_uint128_t
  354. _cairo_uint64_to_uint128 (cairo_uint64_t i)
  355. {
  356. cairo_uint128_t q;
  357. q.lo = i;
  358. q.hi = _cairo_uint32_to_uint64 (0);
  359. return q;
  360. }
  361. cairo_int128_t
  362. _cairo_int64_to_int128 (cairo_int64_t i)
  363. {
  364. cairo_int128_t q;
  365. q.lo = i;
  366. q.hi = _cairo_int32_to_int64 (_cairo_int64_negative(i) ? -1 : 0);
  367. return q;
  368. }
  369. cairo_uint128_t
  370. _cairo_uint128_add (cairo_uint128_t a, cairo_uint128_t b)
  371. {
  372. cairo_uint128_t s;
  373. s.hi = _cairo_uint64_add (a.hi, b.hi);
  374. s.lo = _cairo_uint64_add (a.lo, b.lo);
  375. if (_cairo_uint64_lt (s.lo, a.lo))
  376. s.hi = _cairo_uint64_add (s.hi, _cairo_uint32_to_uint64 (1));
  377. return s;
  378. }
  379. cairo_uint128_t
  380. _cairo_uint128_sub (cairo_uint128_t a, cairo_uint128_t b)
  381. {
  382. cairo_uint128_t s;
  383. s.hi = _cairo_uint64_sub (a.hi, b.hi);
  384. s.lo = _cairo_uint64_sub (a.lo, b.lo);
  385. if (_cairo_uint64_gt (s.lo, a.lo))
  386. s.hi = _cairo_uint64_sub (s.hi, _cairo_uint32_to_uint64(1));
  387. return s;
  388. }
  389. cairo_uint128_t
  390. _cairo_uint64x64_128_mul (cairo_uint64_t a, cairo_uint64_t b)
  391. {
  392. cairo_uint128_t s;
  393. uint32_t ah, al, bh, bl;
  394. cairo_uint64_t r0, r1, r2, r3;
  395. al = uint64_lo32 (a);
  396. ah = uint64_hi32 (a);
  397. bl = uint64_lo32 (b);
  398. bh = uint64_hi32 (b);
  399. r0 = _cairo_uint32x32_64_mul (al, bl);
  400. r1 = _cairo_uint32x32_64_mul (al, bh);
  401. r2 = _cairo_uint32x32_64_mul (ah, bl);
  402. r3 = _cairo_uint32x32_64_mul (ah, bh);
  403. r1 = _cairo_uint64_add (r1, uint64_hi (r0)); /* no carry possible */
  404. r1 = _cairo_uint64_add (r1, r2); /* but this can carry */
  405. if (_cairo_uint64_lt (r1, r2)) /* check */
  406. r3 = _cairo_uint64_add (r3, uint64_carry32);
  407. s.hi = _cairo_uint64_add (r3, uint64_hi(r1));
  408. s.lo = _cairo_uint64_add (uint64_shift32 (r1),
  409. uint64_lo (r0));
  410. return s;
  411. }
  412. cairo_int128_t
  413. _cairo_int64x64_128_mul (cairo_int64_t a, cairo_int64_t b)
  414. {
  415. cairo_int128_t s;
  416. s = _cairo_uint64x64_128_mul (_cairo_int64_to_uint64(a),
  417. _cairo_int64_to_uint64(b));
  418. if (_cairo_int64_negative (a))
  419. s.hi = _cairo_uint64_sub (s.hi,
  420. _cairo_int64_to_uint64 (b));
  421. if (_cairo_int64_negative (b))
  422. s.hi = _cairo_uint64_sub (s.hi,
  423. _cairo_int64_to_uint64 (a));
  424. return s;
  425. }
  426. cairo_uint128_t
  427. _cairo_uint128_mul (cairo_uint128_t a, cairo_uint128_t b)
  428. {
  429. cairo_uint128_t s;
  430. s = _cairo_uint64x64_128_mul (a.lo, b.lo);
  431. s.hi = _cairo_uint64_add (s.hi,
  432. _cairo_uint64_mul (a.lo, b.hi));
  433. s.hi = _cairo_uint64_add (s.hi,
  434. _cairo_uint64_mul (a.hi, b.lo));
  435. return s;
  436. }
  437. cairo_uint128_t
  438. _cairo_uint128_lsl (cairo_uint128_t a, int shift)
  439. {
  440. if (shift >= 64)
  441. {
  442. a.hi = a.lo;
  443. a.lo = _cairo_uint32_to_uint64 (0);
  444. shift -= 64;
  445. }
  446. if (shift)
  447. {
  448. a.hi = _cairo_uint64_add (_cairo_uint64_lsl (a.hi, shift),
  449. _cairo_uint64_rsl (a.lo, (64 - shift)));
  450. a.lo = _cairo_uint64_lsl (a.lo, shift);
  451. }
  452. return a;
  453. }
  454. cairo_uint128_t
  455. _cairo_uint128_rsl (cairo_uint128_t a, int shift)
  456. {
  457. if (shift >= 64)
  458. {
  459. a.lo = a.hi;
  460. a.hi = _cairo_uint32_to_uint64 (0);
  461. shift -= 64;
  462. }
  463. if (shift)
  464. {
  465. a.lo = _cairo_uint64_add (_cairo_uint64_rsl (a.lo, shift),
  466. _cairo_uint64_lsl (a.hi, (64 - shift)));
  467. a.hi = _cairo_uint64_rsl (a.hi, shift);
  468. }
  469. return a;
  470. }
  471. cairo_uint128_t
  472. _cairo_uint128_rsa (cairo_int128_t a, int shift)
  473. {
  474. if (shift >= 64)
  475. {
  476. a.lo = a.hi;
  477. a.hi = _cairo_uint64_rsa (a.hi, 64-1);
  478. shift -= 64;
  479. }
  480. if (shift)
  481. {
  482. a.lo = _cairo_uint64_add (_cairo_uint64_rsl (a.lo, shift),
  483. _cairo_uint64_lsl (a.hi, (64 - shift)));
  484. a.hi = _cairo_uint64_rsa (a.hi, shift);
  485. }
  486. return a;
  487. }
  488. int
  489. _cairo_uint128_lt (cairo_uint128_t a, cairo_uint128_t b)
  490. {
  491. return (_cairo_uint64_lt (a.hi, b.hi) ||
  492. (_cairo_uint64_eq (a.hi, b.hi) &&
  493. _cairo_uint64_lt (a.lo, b.lo)));
  494. }
  495. int
  496. _cairo_int128_lt (cairo_int128_t a, cairo_int128_t b)
  497. {
  498. if (_cairo_int128_negative (a) && !_cairo_int128_negative (b))
  499. return 1;
  500. if (!_cairo_int128_negative (a) && _cairo_int128_negative (b))
  501. return 0;
  502. return _cairo_uint128_lt (a, b);
  503. }
  504. int
  505. _cairo_uint128_cmp (cairo_uint128_t a, cairo_uint128_t b)
  506. {
  507. int cmp;
  508. cmp = _cairo_uint64_cmp (a.hi, b.hi);
  509. if (cmp)
  510. return cmp;
  511. return _cairo_uint64_cmp (a.lo, b.lo);
  512. }
  513. int
  514. _cairo_int128_cmp (cairo_int128_t a, cairo_int128_t b)
  515. {
  516. if (_cairo_int128_negative (a) && !_cairo_int128_negative (b))
  517. return -1;
  518. if (!_cairo_int128_negative (a) && _cairo_int128_negative (b))
  519. return 1;
  520. return _cairo_uint128_cmp (a, b);
  521. }
  522. int
  523. _cairo_uint128_eq (cairo_uint128_t a, cairo_uint128_t b)
  524. {
  525. return (_cairo_uint64_eq (a.hi, b.hi) &&
  526. _cairo_uint64_eq (a.lo, b.lo));
  527. }
  528. #if HAVE_UINT64_T
  529. #define _cairo_msbset64(q) (q & ((uint64_t) 1 << 63))
  530. #else
  531. #define _cairo_msbset64(q) (q.hi & ((uint32_t) 1 << 31))
  532. #endif
  533. cairo_uquorem128_t
  534. _cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den)
  535. {
  536. cairo_uquorem128_t qr;
  537. cairo_uint128_t bit;
  538. cairo_uint128_t quo;
  539. bit = _cairo_uint32_to_uint128 (1);
  540. /* normalize to make den >= num, but not overflow */
  541. while (_cairo_uint128_lt (den, num) && !_cairo_msbset64(den.hi))
  542. {
  543. bit = _cairo_uint128_lsl (bit, 1);
  544. den = _cairo_uint128_lsl (den, 1);
  545. }
  546. quo = _cairo_uint32_to_uint128 (0);
  547. /* generate quotient, one bit at a time */
  548. while (_cairo_uint128_ne (bit, _cairo_uint32_to_uint128(0)))
  549. {
  550. if (_cairo_uint128_le (den, num))
  551. {
  552. num = _cairo_uint128_sub (num, den);
  553. quo = _cairo_uint128_add (quo, bit);
  554. }
  555. bit = _cairo_uint128_rsl (bit, 1);
  556. den = _cairo_uint128_rsl (den, 1);
  557. }
  558. qr.quo = quo;
  559. qr.rem = num;
  560. return qr;
  561. }
  562. cairo_int128_t
  563. _cairo_int128_negate (cairo_int128_t a)
  564. {
  565. a.lo = _cairo_uint64_not (a.lo);
  566. a.hi = _cairo_uint64_not (a.hi);
  567. return _cairo_uint128_add (a, _cairo_uint32_to_uint128 (1));
  568. }
  569. cairo_int128_t
  570. _cairo_int128_not (cairo_int128_t a)
  571. {
  572. a.lo = _cairo_uint64_not (a.lo);
  573. a.hi = _cairo_uint64_not (a.hi);
  574. return a;
  575. }
  576. #endif /* !HAVE_UINT128_T */
  577. cairo_quorem128_t
  578. _cairo_int128_divrem (cairo_int128_t num, cairo_int128_t den)
  579. {
  580. int num_neg = _cairo_int128_negative (num);
  581. int den_neg = _cairo_int128_negative (den);
  582. cairo_uquorem128_t uqr;
  583. cairo_quorem128_t qr;
  584. if (num_neg)
  585. num = _cairo_int128_negate (num);
  586. if (den_neg)
  587. den = _cairo_int128_negate (den);
  588. uqr = _cairo_uint128_divrem (num, den);
  589. if (num_neg)
  590. qr.rem = _cairo_int128_negate (uqr.rem);
  591. else
  592. qr.rem = uqr.rem;
  593. if (num_neg != den_neg)
  594. qr.quo = _cairo_int128_negate (uqr.quo);
  595. else
  596. qr.quo = uqr.quo;
  597. return qr;
  598. }
  599. /**
  600. * _cairo_uint_96by64_32x64_divrem:
  601. *
  602. * Compute a 32 bit quotient and 64 bit remainder of a 96 bit unsigned
  603. * dividend and 64 bit divisor. If the quotient doesn't fit into 32
  604. * bits then the returned remainder is equal to the divisor, and the
  605. * quotient is the largest representable 64 bit integer. It is an
  606. * error to call this function with the high 32 bits of @num being
  607. * non-zero.
  608. **/
  609. cairo_uquorem64_t
  610. _cairo_uint_96by64_32x64_divrem (cairo_uint128_t num,
  611. cairo_uint64_t den)
  612. {
  613. cairo_uquorem64_t result;
  614. cairo_uint64_t B = _cairo_uint32s_to_uint64 (1, 0);
  615. /* These are the high 64 bits of the *96* bit numerator. We're
  616. * going to represent the numerator as xB + y, where x is a 64,
  617. * and y is a 32 bit number. */
  618. cairo_uint64_t x = _cairo_uint128_to_uint64 (_cairo_uint128_rsl(num, 32));
  619. /* Initialise the result to indicate overflow. */
  620. result.quo = _cairo_uint32s_to_uint64 (-1U, -1U);
  621. result.rem = den;
  622. /* Don't bother if the quotient is going to overflow. */
  623. if (_cairo_uint64_ge (x, den)) {
  624. return /* overflow */ result;
  625. }
  626. if (_cairo_uint64_lt (x, B)) {
  627. /* When the final quotient is known to fit in 32 bits, then
  628. * num < 2^64 if and only if den < 2^32. */
  629. return _cairo_uint64_divrem (_cairo_uint128_to_uint64 (num), den);
  630. }
  631. else {
  632. /* Denominator is >= 2^32. the numerator is >= 2^64, and the
  633. * division won't overflow: need two divrems. Write the
  634. * numerator and denominator as
  635. *
  636. * num = xB + y x : 64 bits, y : 32 bits
  637. * den = uB + v u, v : 32 bits
  638. */
  639. uint32_t y = _cairo_uint128_to_uint32 (num);
  640. uint32_t u = uint64_hi32 (den);
  641. uint32_t v = _cairo_uint64_to_uint32 (den);
  642. /* Compute a lower bound approximate quotient of num/den
  643. * from x/(u+1). Then we have
  644. *
  645. * x = q(u+1) + r ; q : 32 bits, r <= u : 32 bits.
  646. *
  647. * xB + y = q(u+1)B + (rB+y)
  648. * = q(uB + B + v - v) + (rB+y)
  649. * = q(uB + v) + qB - qv + (rB+y)
  650. * = q(uB + v) + q(B-v) + (rB+y)
  651. *
  652. * The true quotient of num/den then is q plus the
  653. * contribution of q(B-v) + (rB+y). The main contribution
  654. * comes from the term q(B-v), with the term (rB+y) only
  655. * contributing at most one part.
  656. *
  657. * The term q(B-v) must fit into 64 bits, since q fits into 32
  658. * bits on account of being a lower bound to the true
  659. * quotient, and as B-v <= 2^32, we may safely use a single
  660. * 64/64 bit division to find its contribution. */
  661. cairo_uquorem64_t quorem;
  662. cairo_uint64_t remainder; /* will contain final remainder */
  663. uint32_t quotient; /* will contain final quotient. */
  664. uint32_t q;
  665. uint32_t r;
  666. /* Approximate quotient by dividing the high 64 bits of num by
  667. * u+1. Watch out for overflow of u+1. */
  668. if (u+1) {
  669. quorem = _cairo_uint64_divrem (x, _cairo_uint32_to_uint64 (u+1));
  670. q = _cairo_uint64_to_uint32 (quorem.quo);
  671. r = _cairo_uint64_to_uint32 (quorem.rem);
  672. }
  673. else {
  674. q = uint64_hi32 (x);
  675. r = _cairo_uint64_to_uint32 (x);
  676. }
  677. quotient = q;
  678. /* Add the main term's contribution to quotient. Note B-v =
  679. * -v as an uint32 (unless v = 0) */
  680. if (v)
  681. quorem = _cairo_uint64_divrem (_cairo_uint32x32_64_mul (q, -v), den);
  682. else
  683. quorem = _cairo_uint64_divrem (_cairo_uint32s_to_uint64 (q, 0), den);
  684. quotient += _cairo_uint64_to_uint32 (quorem.quo);
  685. /* Add the contribution of the subterm and start computing the
  686. * true remainder. */
  687. remainder = _cairo_uint32s_to_uint64 (r, y);
  688. if (_cairo_uint64_ge (remainder, den)) {
  689. remainder = _cairo_uint64_sub (remainder, den);
  690. quotient++;
  691. }
  692. /* Add the contribution of the main term's remainder. The
  693. * funky test here checks that remainder + main_rem >= den,
  694. * taking into account overflow of the addition. */
  695. remainder = _cairo_uint64_add (remainder, quorem.rem);
  696. if (_cairo_uint64_ge (remainder, den) ||
  697. _cairo_uint64_lt (remainder, quorem.rem))
  698. {
  699. remainder = _cairo_uint64_sub (remainder, den);
  700. quotient++;
  701. }
  702. result.quo = _cairo_uint32_to_uint64 (quotient);
  703. result.rem = remainder;
  704. }
  705. return result;
  706. }
  707. cairo_quorem64_t
  708. _cairo_int_96by64_32x64_divrem (cairo_int128_t num, cairo_int64_t den)
  709. {
  710. int num_neg = _cairo_int128_negative (num);
  711. int den_neg = _cairo_int64_negative (den);
  712. cairo_uint64_t nonneg_den;
  713. cairo_uquorem64_t uqr;
  714. cairo_quorem64_t qr;
  715. if (num_neg)
  716. num = _cairo_int128_negate (num);
  717. if (den_neg)
  718. nonneg_den = _cairo_int64_negate (den);
  719. else
  720. nonneg_den = den;
  721. uqr = _cairo_uint_96by64_32x64_divrem (num, nonneg_den);
  722. if (_cairo_uint64_eq (uqr.rem, nonneg_den)) {
  723. /* bail on overflow. */
  724. qr.quo = _cairo_uint32s_to_uint64 (0x7FFFFFFF, -1U);
  725. qr.rem = den;
  726. return qr;
  727. }
  728. if (num_neg)
  729. qr.rem = _cairo_int64_negate (uqr.rem);
  730. else
  731. qr.rem = uqr.rem;
  732. if (num_neg != den_neg)
  733. qr.quo = _cairo_int64_negate (uqr.quo);
  734. else
  735. qr.quo = uqr.quo;
  736. return qr;
  737. }