A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
cairo-wideint.c
Go to the documentation of this file.
1 /* cairo - a vector graphics library with display and print output
2  *
3  * Copyright © 2004 Keith Packard
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * The original code as contributed to the cairo library under
19  * the dual license MPL+LGPL. We used the LGPL relicensing clause to
20  * get a GPL version of this code which now lives here. This header is
21  * unmodified other than the licensing clause.
22  *
23  * The Original Code is the cairo graphics library.
24  *
25  * The Initial Developer of the Original Code is Keith Packard
26  *
27  * Contributor(s):
28  * Keith R. Packard <keithp@keithp.com>
29  */
30 
31 #include "cairo-wideint-private.h"
32 
33 #if HAVE_UINT64_T
34 
35 const char * cairo_impl64 = "uint64_t";
36 
37 #define _cairo_uint32s_to_uint64(h,l) ((uint64_t) (h) << 32 | (l))
38 
41 {
43 
44  qr.quo = num / den;
45  qr.rem = num % den;
46  return qr;
47 }
48 
49 #else
50 
51 const char * cairo_impl64 = "uint32_t";
52 
54 _cairo_uint32_to_uint64 (uint32_t i)
55 {
57 
58  q.lo = i;
59  q.hi = 0;
60  return q;
61 }
62 
64 _cairo_int32_to_int64 (int32_t i)
65 {
67 
68  q.lo = i;
69  q.hi = i < 0 ? -1 : 0;
70  return q;
71 }
72 
73 static cairo_uint64_t
74 _cairo_uint32s_to_uint64 (uint32_t h, uint32_t l)
75 {
77 
78  q.lo = l;
79  q.hi = h;
80  return q;
81 }
82 
85 {
87 
88  s.hi = a.hi + b.hi;
89  s.lo = a.lo + b.lo;
90  if (s.lo < a.lo)
91  s.hi++;
92  return s;
93 }
94 
97 {
99 
100  s.hi = a.hi - b.hi;
101  s.lo = a.lo - b.lo;
102  if (s.lo > a.lo)
103  s.hi--;
104  return s;
105 }
106 
107 #define uint32_lo(i) ((i) & 0xffff)
108 #define uint32_hi(i) ((i) >> 16)
109 #define uint32_carry16 ((1) << 16)
110 
112 _cairo_uint32x32_64_mul (uint32_t a, uint32_t b)
113 {
115 
116  uint16_t ah, al, bh, bl;
117  uint32_t r0, r1, r2, r3;
118 
119  al = uint32_lo (a);
120  ah = uint32_hi (a);
121  bl = uint32_lo (b);
122  bh = uint32_hi (b);
123 
124  r0 = (uint32_t) al * bl;
125  r1 = (uint32_t) al * bh;
126  r2 = (uint32_t) ah * bl;
127  r3 = (uint32_t) ah * bh;
128 
129  r1 += uint32_hi(r0); /* no carry possible */
130  r1 += r2; /* but this can carry */
131  if (r1 < r2) /* check */
132  r3 += uint32_carry16;
133 
134  s.hi = r3 + uint32_hi(r1);
135  s.lo = (uint32_lo (r1) << 16) + uint32_lo (r0);
136  return s;
137 }
138 
140 _cairo_int32x32_64_mul (int32_t a, int32_t b)
141 {
143  s = _cairo_uint32x32_64_mul ((uint32_t) a, (uint32_t) b);
144  if (a < 0)
145  s.hi -= b;
146  if (b < 0)
147  s.hi -= a;
148  return s;
149 }
150 
153 {
155 
156  s = _cairo_uint32x32_64_mul (a.lo, b.lo);
157  s.hi += a.lo * b.hi + a.hi * b.lo;
158  return s;
159 }
160 
162 _cairo_uint64_lsl (cairo_uint64_t a, int shift)
163 {
164  if (shift >= 32)
165  {
166  a.hi = a.lo;
167  a.lo = 0;
168  shift -= 32;
169  }
170  if (shift)
171  {
172  a.hi = a.hi << shift | a.lo >> (32 - shift);
173  a.lo = a.lo << shift;
174  }
175  return a;
176 }
177 
179 _cairo_uint64_rsl (cairo_uint64_t a, int shift)
180 {
181  if (shift >= 32)
182  {
183  a.lo = a.hi;
184  a.hi = 0;
185  shift -= 32;
186  }
187  if (shift)
188  {
189  a.lo = a.lo >> shift | a.hi << (32 - shift);
190  a.hi = a.hi >> shift;
191  }
192  return a;
193 }
194 
195 #define _cairo_uint32_rsa(a,n) ((uint32_t) (((int32_t) (a)) >> (n)))
196 
198 _cairo_uint64_rsa (cairo_int64_t a, int shift)
199 {
200  if (shift >= 32)
201  {
202  a.lo = a.hi;
203  a.hi = _cairo_uint32_rsa (a.hi, 31);
204  shift -= 32;
205  }
206  if (shift)
207  {
208  a.lo = a.lo >> shift | a.hi << (32 - shift);
209  a.hi = _cairo_uint32_rsa (a.hi, shift);
210  }
211  return a;
212 }
213 
214 int
216 {
217  return (a.hi < b.hi ||
218  (a.hi == b.hi && a.lo < b.lo));
219 }
220 
221 int
223 {
224  return a.hi == b.hi && a.lo == b.lo;
225 }
226 
227 int
229 {
231  return 1;
233  return 0;
234  return _cairo_uint64_lt (a, b);
235 }
236 
239 {
240  a.lo = ~a.lo;
241  a.hi = ~a.hi;
242  return a;
243 }
244 
247 {
248  a.lo = ~a.lo;
249  a.hi = ~a.hi;
250  if (++a.lo == 0)
251  ++a.hi;
252  return a;
253 }
254 
255 /*
256  * Simple bit-at-a-time divide.
257  */
260 {
262  cairo_uint64_t bit;
263  cairo_uint64_t quo;
264 
265  bit = _cairo_uint32_to_uint64 (1);
266 
267  /* normalize to make den >= num, but not overflow */
268  while (_cairo_uint64_lt (den, num) && (den.hi & 0x80000000) == 0)
269  {
270  bit = _cairo_uint64_lsl (bit, 1);
271  den = _cairo_uint64_lsl (den, 1);
272  }
273  quo = _cairo_uint32_to_uint64 (0);
274 
275  /* generate quotient, one bit at a time */
276  while (bit.hi | bit.lo)
277  {
278  if (_cairo_uint64_le (den, num))
279  {
280  num = _cairo_uint64_sub (num, den);
281  quo = _cairo_uint64_add (quo, bit);
282  }
283  bit = _cairo_uint64_rsl (bit, 1);
284  den = _cairo_uint64_rsl (den, 1);
285  }
286  qr.quo = quo;
287  qr.rem = num;
288  return qr;
289 }
290 
291 #endif /* !HAVE_UINT64_T */
292 
295 {
296  int num_neg = _cairo_int64_negative (num);
297  int den_neg = _cairo_int64_negative (den);
298  cairo_uquorem64_t uqr;
299  cairo_quorem64_t qr;
300 
301  if (num_neg)
302  num = _cairo_int64_negate (num);
303  if (den_neg)
304  den = _cairo_int64_negate (den);
305  uqr = _cairo_uint64_divrem (num, den);
306  if (num_neg)
307  qr.rem = _cairo_int64_negate (uqr.rem);
308  else
309  qr.rem = uqr.rem;
310  if (num_neg != den_neg)
312  else
313  qr.quo = (cairo_int64_t) uqr.quo;
314  return qr;
315 }
316 
317 #if HAVE_UINT128_T
318 
319 const char * cairo_impl128 = "uint128_t";
320 
322 _cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den)
323 {
325 
326  qr.quo = num / den;
327  qr.rem = num % den;
328  return qr;
329 }
330 
331 #else
332 
333 const char * cairo_impl128 = "cairo_uint64_t";
334 
335 cairo_uint128_t
337 {
338  cairo_uint128_t q;
339 
340  q.lo = _cairo_uint32_to_uint64 (i);
341  q.hi = _cairo_uint32_to_uint64 (0);
342  return q;
343 }
344 
347 {
348  cairo_int128_t q;
349 
350  q.lo = _cairo_int32_to_int64 (i);
351  q.hi = _cairo_int32_to_int64 (i < 0 ? -1 : 0);
352  return q;
353 }
354 
355 cairo_uint128_t
357 {
358  cairo_uint128_t q;
359 
360  q.lo = i;
361  q.hi = _cairo_uint32_to_uint64 (0);
362  return q;
363 }
364 
367 {
368  cairo_int128_t q;
369 
370  q.lo = i;
372  return q;
373 }
374 
375 cairo_uint128_t
376 _cairo_uint128_add (cairo_uint128_t a, cairo_uint128_t b)
377 {
378  cairo_uint128_t s;
379 
380  s.hi = _cairo_uint64_add (a.hi, b.hi);
381  s.lo = _cairo_uint64_add (a.lo, b.lo);
382  if (_cairo_uint64_lt (s.lo, a.lo))
383  s.hi = _cairo_uint64_add (s.hi, _cairo_uint32_to_uint64 (1));
384  return s;
385 }
386 
387 cairo_uint128_t
388 _cairo_uint128_sub (cairo_uint128_t a, cairo_uint128_t b)
389 {
390  cairo_uint128_t s;
391 
392  s.hi = _cairo_uint64_sub (a.hi, b.hi);
393  s.lo = _cairo_uint64_sub (a.lo, b.lo);
394  if (_cairo_uint64_gt (s.lo, a.lo))
395  s.hi = _cairo_uint64_sub (s.hi, _cairo_uint32_to_uint64(1));
396  return s;
397 }
398 
399 #if HAVE_UINT64_T
400 
401 #define uint64_lo32(i) ((i) & 0xffffffff)
402 #define uint64_hi32(i) ((i) >> 32)
403 #define uint64_lo(i) ((i) & 0xffffffff)
404 #define uint64_hi(i) ((i) >> 32)
405 #define uint64_shift32(i) ((i) << 32)
406 #define uint64_carry32 (((uint64_t) 1) << 32)
407 
408 #else
409 
410 #define uint64_lo32(i) ((i).lo)
411 #define uint64_hi32(i) ((i).hi)
412 
413 static cairo_uint64_t
415 {
417 
418  s.lo = i.lo;
419  s.hi = 0;
420  return s;
421 }
422 
423 static cairo_uint64_t
425 {
427 
428  s.lo = i.hi;
429  s.hi = 0;
430  return s;
431 }
432 
433 static cairo_uint64_t
435 {
437 
438  s.lo = 0;
439  s.hi = i.lo;
440  return s;
441 }
442 
443 static const cairo_uint64_t uint64_carry32 = { 0, 1 };
444 
445 #endif
446 
447 cairo_uint128_t
449 {
450  cairo_uint128_t s;
451  uint32_t ah, al, bh, bl;
452  cairo_uint64_t r0, r1, r2, r3;
453 
454  al = uint64_lo32 (a);
455  ah = uint64_hi32 (a);
456  bl = uint64_lo32 (b);
457  bh = uint64_hi32 (b);
458 
459  r0 = _cairo_uint32x32_64_mul (al, bl);
460  r1 = _cairo_uint32x32_64_mul (al, bh);
461  r2 = _cairo_uint32x32_64_mul (ah, bl);
462  r3 = _cairo_uint32x32_64_mul (ah, bh);
463 
464  r1 = _cairo_uint64_add (r1, uint64_hi (r0)); /* no carry possible */
465  r1 = _cairo_uint64_add (r1, r2); /* but this can carry */
466  if (_cairo_uint64_lt (r1, r2)) /* check */
467  r3 = _cairo_uint64_add (r3, uint64_carry32);
468 
469  s.hi = _cairo_uint64_add (r3, uint64_hi(r1));
470  s.lo = _cairo_uint64_add (uint64_shift32 (r1),
471  uint64_lo (r0));
472  return s;
473 }
474 
477 {
481  if (_cairo_int64_negative (a))
482  s.hi = _cairo_uint64_sub (s.hi,
484  if (_cairo_int64_negative (b))
485  s.hi = _cairo_uint64_sub (s.hi,
487  return s;
488 }
489 
490 cairo_uint128_t
491 _cairo_uint128_mul (cairo_uint128_t a, cairo_uint128_t b)
492 {
493  cairo_uint128_t s;
494 
495  s = _cairo_uint64x64_128_mul (a.lo, b.lo);
496  s.hi = _cairo_uint64_add (s.hi,
497  _cairo_uint64_mul (a.lo, b.hi));
498  s.hi = _cairo_uint64_add (s.hi,
499  _cairo_uint64_mul (a.hi, b.lo));
500  return s;
501 }
502 
503 cairo_uint128_t
504 _cairo_uint128_lsl (cairo_uint128_t a, int shift)
505 {
506  if (shift >= 64)
507  {
508  a.hi = a.lo;
509  a.lo = _cairo_uint32_to_uint64 (0);
510  shift -= 64;
511  }
512  if (shift)
513  {
514  a.hi = _cairo_uint64_add (_cairo_uint64_lsl (a.hi, shift),
515  _cairo_uint64_rsl (a.lo, (64 - shift)));
516  a.lo = _cairo_uint64_lsl (a.lo, shift);
517  }
518  return a;
519 }
520 
521 cairo_uint128_t
522 _cairo_uint128_rsl (cairo_uint128_t a, int shift)
523 {
524  if (shift >= 64)
525  {
526  a.lo = a.hi;
527  a.hi = _cairo_uint32_to_uint64 (0);
528  shift -= 64;
529  }
530  if (shift)
531  {
532  a.lo = _cairo_uint64_add (_cairo_uint64_rsl (a.lo, shift),
533  _cairo_uint64_lsl (a.hi, (64 - shift)));
534  a.hi = _cairo_uint64_rsl (a.hi, shift);
535  }
536  return a;
537 }
538 
539 cairo_uint128_t
541 {
542  if (shift >= 64)
543  {
544  a.lo = a.hi;
545  a.hi = _cairo_uint64_rsa (a.hi, 64-1);
546  shift -= 64;
547  }
548  if (shift)
549  {
550  a.lo = _cairo_uint64_add (_cairo_uint64_rsl (a.lo, shift),
551  _cairo_uint64_lsl (a.hi, (64 - shift)));
552  a.hi = _cairo_uint64_rsa (a.hi, shift);
553  }
554  return a;
555 }
556 
557 int
558 _cairo_uint128_lt (cairo_uint128_t a, cairo_uint128_t b)
559 {
560  return (_cairo_uint64_lt (a.hi, b.hi) ||
561  (_cairo_uint64_eq (a.hi, b.hi) &&
562  _cairo_uint64_lt (a.lo, b.lo)));
563 }
564 
565 int
567 {
569  return 1;
571  return 0;
572  return _cairo_uint128_lt (a, b);
573 }
574 
575 int
576 _cairo_uint128_eq (cairo_uint128_t a, cairo_uint128_t b)
577 {
578  return (_cairo_uint64_eq (a.hi, b.hi) &&
579  _cairo_uint64_eq (a.lo, b.lo));
580 }
581 
582 #if HAVE_UINT64_T
583 #define _cairo_msbset64(q) (q & ((uint64_t) 1 << 63))
584 #else
585 #define _cairo_msbset64(q) (q.hi & ((uint32_t) 1 << 31))
586 #endif
587 
589 _cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den)
590 {
592  cairo_uint128_t bit;
593  cairo_uint128_t quo;
594 
595  bit = _cairo_uint32_to_uint128 (1);
596 
597  /* normalize to make den >= num, but not overflow */
598  while (_cairo_uint128_lt (den, num) && !_cairo_msbset64(den.hi))
599  {
600  bit = _cairo_uint128_lsl (bit, 1);
601  den = _cairo_uint128_lsl (den, 1);
602  }
603  quo = _cairo_uint32_to_uint128 (0);
604 
605  /* generate quotient, one bit at a time */
607  {
608  if (_cairo_uint128_le (den, num))
609  {
610  num = _cairo_uint128_sub (num, den);
611  quo = _cairo_uint128_add (quo, bit);
612  }
613  bit = _cairo_uint128_rsl (bit, 1);
614  den = _cairo_uint128_rsl (den, 1);
615  }
616  qr.quo = quo;
617  qr.rem = num;
618  return qr;
619 }
620 
621 cairo_uint128_t
622 _cairo_uint128_negate (cairo_uint128_t a)
623 {
624  a.lo = _cairo_uint64_not (a.lo);
625  a.hi = _cairo_uint64_not (a.hi);
627 }
628 
629 cairo_uint128_t
630 _cairo_uint128_not (cairo_uint128_t a)
631 {
632  a.lo = _cairo_uint64_not (a.lo);
633  a.hi = _cairo_uint64_not (a.hi);
634  return a;
635 }
636 
637 #endif /* !HAVE_UINT128_T */
638 
641 {
642  int num_neg = _cairo_int128_negative (num);
643  int den_neg = _cairo_int128_negative (den);
644  cairo_uquorem128_t uqr;
646 
647  if (num_neg)
648  num = _cairo_int128_negate (num);
649  if (den_neg)
650  den = _cairo_int128_negate (den);
651  uqr = _cairo_uint128_divrem (num, den);
652  if (num_neg)
653  qr.rem = _cairo_int128_negate (uqr.rem);
654  else
655  qr.rem = uqr.rem;
656  if (num_neg != den_neg)
657  qr.quo = _cairo_int128_negate (uqr.quo);
658  else
659  qr.quo = uqr.quo;
660  return qr;
661 }
662 
673 _cairo_uint_96by64_32x64_divrem (cairo_uint128_t num,
674  cairo_uint64_t den)
675 {
676  cairo_uquorem64_t result;
678 
679  /* These are the high 64 bits of the *96* bit numerator. We're
680  * going to represent the numerator as xB + y, where x is a 64,
681  * and y is a 32 bit number. */
683 
684  /* Initialise the result to indicate overflow. */
685  result.quo = _cairo_uint32s_to_uint64 (-1U, -1U);
686  result.rem = den;
687 
688  /* Don't bother if the quotient is going to overflow. */
689  if (_cairo_uint64_ge (x, den)) {
690  return /* overflow */ result;
691  }
692 
693  if (_cairo_uint64_lt (x, B)) {
694  /* When the final quotient is known to fit in 32 bits, then
695  * num < 2^64 if and only if den < 2^32. */
697  }
698  else {
699  /* Denominator is >= 2^32. the numerator is >= 2^64, and the
700  * division won't overflow: need two divrems. Write the
701  * numerator and denominator as
702  *
703  * num = xB + y x : 64 bits, y : 32 bits
704  * den = uB + v u, v : 32 bits
705  */
706  uint32_t y = _cairo_uint128_to_uint32 (num);
707  uint32_t u = uint64_hi32 (den);
708  uint32_t v = _cairo_uint64_to_uint32 (den);
709 
710  /* Compute a lower bound approximate quotient of num/den
711  * from x/(u+1). Then we have
712  *
713  * x = q(u+1) + r ; q : 32 bits, r <= u : 32 bits.
714  *
715  * xB + y = q(u+1)B + (rB+y)
716  * = q(uB + B + v - v) + (rB+y)
717  * = q(uB + v) + qB - qv + (rB+y)
718  * = q(uB + v) + q(B-v) + (rB+y)
719  *
720  * The true quotient of num/den then is q plus the
721  * contribution of q(B-v) + (rB+y). The main contribution
722  * comes from the term q(B-v), with the term (rB+y) only
723  * contributing at most one part.
724  *
725  * The term q(B-v) must fit into 64 bits, since q fits into 32
726  * bits on account of being a lower bound to the true
727  * quotient, and as B-v <= 2^32, we may safely use a single
728  * 64/64 bit division to find its contribution. */
729 
730  cairo_uquorem64_t quorem;
731  cairo_uint64_t remainder; /* will contain final remainder */
732  uint32_t quotient; /* will contain final quotient. */
733  uint32_t q;
734  uint32_t r;
735 
736  /* Approximate quotient by dividing the high 64 bits of num by
737  * u+1. Watch out for overflow of u+1. */
738  if (u+1) {
739  quorem = _cairo_uint64_divrem (x, _cairo_uint32_to_uint64 (u+1));
740  q = _cairo_uint64_to_uint32 (quorem.quo);
741  r = _cairo_uint64_to_uint32 (quorem.rem);
742  }
743  else {
744  q = uint64_hi32 (x);
745  r = _cairo_uint64_to_uint32 (x);
746  }
747  quotient = q;
748 
749  /* Add the main term's contribution to quotient. Note B-v =
750  * -v as an uint32 (unless v = 0) */
751  if (v)
752  quorem = _cairo_uint64_divrem (_cairo_uint32x32_64_mul (q, -v), den);
753  else
754  quorem = _cairo_uint64_divrem (_cairo_uint32s_to_uint64 (q, 0), den);
755  quotient += _cairo_uint64_to_uint32 (quorem.quo);
756 
757  /* Add the contribution of the subterm and start computing the
758  * true remainder. */
759  remainder = _cairo_uint32s_to_uint64 (r, y);
760  if (_cairo_uint64_ge (remainder, den)) {
761  remainder = _cairo_uint64_sub (remainder, den);
762  quotient++;
763  }
764 
765  /* Add the contribution of the main term's remainder. The
766  * funky test here checks that remainder + main_rem >= den,
767  * taking into account overflow of the addition. */
768  remainder = _cairo_uint64_add (remainder, quorem.rem);
769  if (_cairo_uint64_ge (remainder, den) ||
770  _cairo_uint64_lt (remainder, quorem.rem))
771  {
772  remainder = _cairo_uint64_sub (remainder, den);
773  quotient++;
774  }
775 
776  result.quo = _cairo_uint32_to_uint64 (quotient);
777  result.rem = remainder;
778  }
779  return result;
780 }
781 
784 {
785  int num_neg = _cairo_int128_negative (num);
786  int den_neg = _cairo_int64_negative (den);
787  cairo_uint64_t nonneg_den;
788  cairo_uquorem64_t uqr;
789  cairo_quorem64_t qr;
790 
791  if (num_neg)
792  num = _cairo_int128_negate (num);
793  if (den_neg)
794  nonneg_den = _cairo_int64_negate (den);
795  else
796  nonneg_den = den;
797 
798  uqr = _cairo_uint_96by64_32x64_divrem (num, nonneg_den);
799  if (_cairo_uint64_eq (uqr.rem, _cairo_int64_to_uint64 (nonneg_den))) {
800  /* bail on overflow. */
801  qr.quo = _cairo_uint32s_to_uint64 (0x7FFFFFFF, -1U);;
802  qr.rem = den;
803  return qr;
804  }
805 
806  if (num_neg)
807  qr.rem = _cairo_int64_negate (uqr.rem);
808  else
809  qr.rem = uqr.rem;
810  if (num_neg != den_neg)
811  qr.quo = _cairo_int64_negate (uqr.quo);
812  else
813  qr.quo = uqr.quo;
814  return qr;
815 }
const char * cairo_impl64
Definition: cairo-wideint.c:35
#define _cairo_int64_to_uint64(i)
#define _cairo_uint64_le(a, b)
int _cairo_uint128_lt(cairo_uint128_t a, cairo_uint128_t b)
cairo_uint128_t _cairo_uint32_to_uint128(uint32_t i)
cairo_uint128_t _cairo_uint128_not(cairo_uint128_t a)
#define _cairo_uint64_rsa(a, b)
cairo_uint128_t _cairo_uint128_negate(cairo_uint128_t a)
#define _cairo_uint32x32_64_mul(a, b)
#define _cairo_uint64_not(a)
int64_t cairo_int64_t
#define _cairo_uint128_to_uint64(a)
#define _cairo_msbset64(q)
int _cairo_uint128_eq(cairo_uint128_t a, cairo_uint128_t b)
cairo_int128_t _cairo_int64x64_128_mul(cairo_int64_t a, cairo_int64_t b)
#define _cairo_uint64_lsl(a, b)
#define uint64_lo(i)
#define uint64_hi32(i)
cairo_uint128_t _cairo_uint128_mul(cairo_uint128_t a, cairo_uint128_t b)
cairo_uquorem64_t _cairo_uint_96by64_32x64_divrem(cairo_uint128_t num, cairo_uint64_t den)
_cairo_uint_96by64_32x64_divrem:
cairo_uint128_t _cairo_uint64_to_uint128(cairo_uint64_t i)
#define _cairo_uint64_gt(a, b)
#define _cairo_uint32s_to_uint64(h, l)
Definition: cairo-wideint.c:37
#define _cairo_uint128_to_uint32(a)
Ptr< SampleEmitter > s
#define _cairo_uint64_to_uint32(i)
#define _cairo_uint64_mul(a, b)
#define _cairo_uint64_rsl(a, b)
cairo_uquorem128_t _cairo_uint128_divrem(cairo_uint128_t num, cairo_uint128_t den)
cairo_uint128_t _cairo_uint128_sub(cairo_uint128_t a, cairo_uint128_t b)
#define _cairo_int64_negative(a)
#define _cairo_uint32_to_uint64(i)
#define _cairo_int32x32_64_mul(a, b)
cairo_uquorem64_t _cairo_uint64_divrem(cairo_uint64_t num, cairo_uint64_t den)
Definition: cairo-wideint.c:40
#define uint64_hi(i)
#define uint64_shift32(i)
#define _cairo_int64_negate(a)
cairo_uint128_t _cairo_uint128_lsl(cairo_uint128_t a, int shift)
#define _cairo_int128_negative(a)
cairo_uint128_t _cairo_uint128_rsa(cairo_int128_t a, int shift)
cairo_quorem64_t _cairo_int64_divrem(cairo_int64_t num, cairo_int64_t den)
uint64_t cairo_uint64_t
const char * cairo_impl128
cairo_quorem64_t _cairo_int_96by64_32x64_divrem(cairo_int128_t num, cairo_int64_t den)
#define _cairo_uint64_add(a, b)
#define _cairo_uint128_le(a, b)
#define uint64_lo32(i)
cairo_uint128_t _cairo_uint64x64_128_mul(cairo_uint64_t a, cairo_uint64_t b)
#define _cairo_uint64_negate(a)
cairo_int128_t _cairo_int32_to_int128(int32_t i)
#define _cairo_int128_negate(a)
#define _cairo_uint64_lt(a, b)
int _cairo_int128_lt(cairo_int128_t a, cairo_int128_t b)
#define _cairo_uint64_ge(a, b)
#define _cairo_uint128_ne(a, b)
#define _cairo_int32_to_int64(i)
cairo_uint128_t _cairo_uint128_rsl(cairo_uint128_t a, int shift)
cairo_uint128_t _cairo_uint128_add(cairo_uint128_t a, cairo_uint128_t b)
#define _cairo_uint64_sub(a, b)
#define uint64_carry32
#define _cairo_int64_lt(a, b)
#define _cairo_uint64_eq(a, b)
cairo_int128_t _cairo_int64_to_int128(cairo_int64_t i)
cairo_quorem128_t _cairo_int128_divrem(cairo_int128_t num, cairo_int128_t den)