A Discrete-Event Network Simulator
API
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 
39 #if HAVE_UINT64_T
40 
41 const char * cairo_impl64 = "uint64_t";
42 
43 #define _cairo_uint32s_to_uint64(h,l) ((uint64_t) (h) << 32 | (l))
44 
47 {
49 
50  qr.quo = num / den;
51  qr.rem = num % den;
52  return qr;
53 }
54 
55 #else
56 
57 const char * cairo_impl64 = "uint32_t";
58 
60 _cairo_uint32_to_uint64 (uint32_t i)
61 {
63 
64  q.lo = i;
65  q.hi = 0;
66  return q;
67 }
68 
70 _cairo_int32_to_int64 (int32_t i)
71 {
73 
74  q.lo = i;
75  q.hi = i < 0 ? -1 : 0;
76  return q;
77 }
78 
79 static cairo_uint64_t
80 _cairo_uint32s_to_uint64 (uint32_t h, uint32_t l)
81 {
83 
84  q.lo = l;
85  q.hi = h;
86  return q;
87 }
88 
91 {
93 
94  s.hi = a.hi + b.hi;
95  s.lo = a.lo + b.lo;
96  if (s.lo < a.lo)
97  s.hi++;
98  return s;
99 }
100 
103 {
104  cairo_uint64_t s;
105 
106  s.hi = a.hi - b.hi;
107  s.lo = a.lo - b.lo;
108  if (s.lo > a.lo)
109  s.hi--;
110  return s;
111 }
112 
113 #define uint32_lo(i) ((i) & 0xffff)
114 #define uint32_hi(i) ((i) >> 16)
115 #define uint32_carry16 ((1) << 16)
116 
118 _cairo_uint32x32_64_mul (uint32_t a, uint32_t b)
119 {
120  cairo_uint64_t s;
121 
122  uint16_t ah, al, bh, bl;
123  uint32_t r0, r1, r2, r3;
124 
125  al = uint32_lo (a);
126  ah = uint32_hi (a);
127  bl = uint32_lo (b);
128  bh = uint32_hi (b);
129 
130  r0 = (uint32_t) al * bl;
131  r1 = (uint32_t) al * bh;
132  r2 = (uint32_t) ah * bl;
133  r3 = (uint32_t) ah * bh;
134 
135  r1 += uint32_hi(r0); /* no carry possible */
136  r1 += r2; /* but this can carry */
137  if (r1 < r2) /* check */
138  r3 += uint32_carry16;
139 
140  s.hi = r3 + uint32_hi(r1);
141  s.lo = (uint32_lo (r1) << 16) + uint32_lo (r0);
142  return s;
143 }
144 
146 _cairo_int32x32_64_mul (int32_t a, int32_t b)
147 {
148  cairo_int64_t s;
149  s = _cairo_uint32x32_64_mul ((uint32_t) a, (uint32_t) b);
150  if (a < 0)
151  s.hi -= b;
152  if (b < 0)
153  s.hi -= a;
154  return s;
155 }
156 
159 {
160  cairo_uint64_t s;
161 
162  s = _cairo_uint32x32_64_mul (a.lo, b.lo);
163  s.hi += a.lo * b.hi + a.hi * b.lo;
164  return s;
165 }
166 
168 _cairo_uint64_lsl (cairo_uint64_t a, int shift)
169 {
170  if (shift >= 32)
171  {
172  a.hi = a.lo;
173  a.lo = 0;
174  shift -= 32;
175  }
176  if (shift)
177  {
178  a.hi = a.hi << shift | a.lo >> (32 - shift);
179  a.lo = a.lo << shift;
180  }
181  return a;
182 }
183 
185 _cairo_uint64_rsl (cairo_uint64_t a, int shift)
186 {
187  if (shift >= 32)
188  {
189  a.lo = a.hi;
190  a.hi = 0;
191  shift -= 32;
192  }
193  if (shift)
194  {
195  a.lo = a.lo >> shift | a.hi << (32 - shift);
196  a.hi = a.hi >> shift;
197  }
198  return a;
199 }
200 
201 #define _cairo_uint32_rsa(a,n) ((uint32_t) (((int32_t) (a)) >> (n)))
202 
204 _cairo_uint64_rsa (cairo_int64_t a, int shift)
205 {
206  if (shift >= 32)
207  {
208  a.lo = a.hi;
209  a.hi = _cairo_uint32_rsa (a.hi, 31);
210  shift -= 32;
211  }
212  if (shift)
213  {
214  a.lo = a.lo >> shift | a.hi << (32 - shift);
215  a.hi = _cairo_uint32_rsa (a.hi, shift);
216  }
217  return a;
218 }
219 
220 int
222 {
223  return (a.hi < b.hi ||
224  (a.hi == b.hi && a.lo < b.lo));
225 }
226 
227 int
229 {
230  return a.hi == b.hi && a.lo == b.lo;
231 }
232 
233 int
235 {
237  return 1;
239  return 0;
240  return _cairo_uint64_lt (a, b);
241 }
242 
245 {
246  a.lo = ~a.lo;
247  a.hi = ~a.hi;
248  return a;
249 }
250 
253 {
254  a.lo = ~a.lo;
255  a.hi = ~a.hi;
256  if (++a.lo == 0)
257  ++a.hi;
258  return a;
259 }
260 
261 /*
262  * Simple bit-at-a-time divide.
263  */
266 {
268  cairo_uint64_t bit;
269  cairo_uint64_t quo;
270 
271  bit = _cairo_uint32_to_uint64 (1);
272 
273  /* normalize to make den >= num, but not overflow */
274  while (_cairo_uint64_lt (den, num) && (den.hi & 0x80000000) == 0)
275  {
276  bit = _cairo_uint64_lsl (bit, 1);
277  den = _cairo_uint64_lsl (den, 1);
278  }
279  quo = _cairo_uint32_to_uint64 (0);
280 
281  /* generate quotient, one bit at a time */
282  while (bit.hi | bit.lo)
283  {
284  if (_cairo_uint64_le (den, num))
285  {
286  num = _cairo_uint64_sub (num, den);
287  quo = _cairo_uint64_add (quo, bit);
288  }
289  bit = _cairo_uint64_rsl (bit, 1);
290  den = _cairo_uint64_rsl (den, 1);
291  }
292  qr.quo = quo;
293  qr.rem = num;
294  return qr;
295 }
296 
297 #endif /* !HAVE_UINT64_T */
298 
301 {
302  int num_neg = _cairo_int64_negative (num);
303  int den_neg = _cairo_int64_negative (den);
304  cairo_uquorem64_t uqr;
305  cairo_quorem64_t qr;
306 
307  if (num_neg)
308  num = _cairo_int64_negate (num);
309  if (den_neg)
310  den = _cairo_int64_negate (den);
311  uqr = _cairo_uint64_divrem (num, den);
312  if (num_neg)
313  qr.rem = _cairo_int64_negate (uqr.rem);
314  else
315  qr.rem = uqr.rem;
316  if (num_neg != den_neg)
318  else
319  qr.quo = (cairo_int64_t) uqr.quo;
320  return qr;
321 }
322 
323 #if HAVE_UINT128_T
324 
325 const char * cairo_impl128 = "uint128_t";
326 
328 _cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den)
329 {
331 
332  qr.quo = num / den;
333  qr.rem = num % den;
334  return qr;
335 }
336 
337 #else
338 
339 const char * cairo_impl128 = "cairo_uint64_t";
340 
341 cairo_uint128_t
343 {
344  cairo_uint128_t q;
345 
346  q.lo = _cairo_uint32_to_uint64 (i);
347  q.hi = _cairo_uint32_to_uint64 (0);
348  return q;
349 }
350 
353 {
354  cairo_int128_t q;
355 
356  q.lo = _cairo_int32_to_int64 (i);
357  q.hi = _cairo_int32_to_int64 (i < 0 ? -1 : 0);
358  return q;
359 }
360 
361 cairo_uint128_t
363 {
364  cairo_uint128_t q;
365 
366  q.lo = i;
367  q.hi = _cairo_uint32_to_uint64 (0);
368  return q;
369 }
370 
373 {
374  cairo_int128_t q;
375 
376  q.lo = i;
378  return q;
379 }
380 
381 cairo_uint128_t
382 _cairo_uint128_add (cairo_uint128_t a, cairo_uint128_t b)
383 {
384  cairo_uint128_t s;
385 
386  s.hi = _cairo_uint64_add (a.hi, b.hi);
387  s.lo = _cairo_uint64_add (a.lo, b.lo);
388  if (_cairo_uint64_lt (s.lo, a.lo))
389  s.hi = _cairo_uint64_add (s.hi, _cairo_uint32_to_uint64 (1));
390  return s;
391 }
392 
393 cairo_uint128_t
394 _cairo_uint128_sub (cairo_uint128_t a, cairo_uint128_t b)
395 {
396  cairo_uint128_t s;
397 
398  s.hi = _cairo_uint64_sub (a.hi, b.hi);
399  s.lo = _cairo_uint64_sub (a.lo, b.lo);
400  if (_cairo_uint64_gt (s.lo, a.lo))
401  s.hi = _cairo_uint64_sub (s.hi, _cairo_uint32_to_uint64(1));
402  return s;
403 }
404 
405 #if HAVE_UINT64_T
406 
407 #define uint64_lo32(i) ((i) & 0xffffffff)
408 #define uint64_hi32(i) ((i) >> 32)
409 #define uint64_lo(i) ((i) & 0xffffffff)
410 #define uint64_hi(i) ((i) >> 32)
411 #define uint64_shift32(i) ((i) << 32)
412 #define uint64_carry32 (((uint64_t) 1) << 32)
413 
414 #else
415 
416 #define uint64_lo32(i) ((i).lo)
417 #define uint64_hi32(i) ((i).hi)
418 
419 static cairo_uint64_t
421 {
422  cairo_uint64_t s;
423 
424  s.lo = i.lo;
425  s.hi = 0;
426  return s;
427 }
428 
429 static cairo_uint64_t
431 {
432  cairo_uint64_t s;
433 
434  s.lo = i.hi;
435  s.hi = 0;
436  return s;
437 }
438 
439 static cairo_uint64_t
441 {
442  cairo_uint64_t s;
443 
444  s.lo = 0;
445  s.hi = i.lo;
446  return s;
447 }
448 
449 static const cairo_uint64_t uint64_carry32 = { 0, 1 };
450 
451 #endif
452 
453 cairo_uint128_t
455 {
456  cairo_uint128_t s;
457  uint32_t ah, al, bh, bl;
458  cairo_uint64_t r0, r1, r2, r3;
459 
460  al = uint64_lo32 (a);
461  ah = uint64_hi32 (a);
462  bl = uint64_lo32 (b);
463  bh = uint64_hi32 (b);
464 
465  r0 = _cairo_uint32x32_64_mul (al, bl);
466  r1 = _cairo_uint32x32_64_mul (al, bh);
467  r2 = _cairo_uint32x32_64_mul (ah, bl);
468  r3 = _cairo_uint32x32_64_mul (ah, bh);
469 
470  r1 = _cairo_uint64_add (r1, uint64_hi (r0)); /* no carry possible */
471  r1 = _cairo_uint64_add (r1, r2); /* but this can carry */
472  if (_cairo_uint64_lt (r1, r2)) /* check */
473  r3 = _cairo_uint64_add (r3, uint64_carry32);
474 
475  s.hi = _cairo_uint64_add (r3, uint64_hi(r1));
476  s.lo = _cairo_uint64_add (uint64_shift32 (r1),
477  uint64_lo (r0));
478  return s;
479 }
480 
483 {
484  cairo_int128_t s;
487  if (_cairo_int64_negative (a))
488  s.hi = _cairo_uint64_sub (s.hi,
490  if (_cairo_int64_negative (b))
491  s.hi = _cairo_uint64_sub (s.hi,
493  return s;
494 }
495 
496 cairo_uint128_t
497 _cairo_uint128_mul (cairo_uint128_t a, cairo_uint128_t b)
498 {
499  cairo_uint128_t s;
500 
501  s = _cairo_uint64x64_128_mul (a.lo, b.lo);
502  s.hi = _cairo_uint64_add (s.hi,
503  _cairo_uint64_mul (a.lo, b.hi));
504  s.hi = _cairo_uint64_add (s.hi,
505  _cairo_uint64_mul (a.hi, b.lo));
506  return s;
507 }
508 
509 cairo_uint128_t
510 _cairo_uint128_lsl (cairo_uint128_t a, int shift)
511 {
512  if (shift >= 64)
513  {
514  a.hi = a.lo;
515  a.lo = _cairo_uint32_to_uint64 (0);
516  shift -= 64;
517  }
518  if (shift)
519  {
520  a.hi = _cairo_uint64_add (_cairo_uint64_lsl (a.hi, shift),
521  _cairo_uint64_rsl (a.lo, (64 - shift)));
522  a.lo = _cairo_uint64_lsl (a.lo, shift);
523  }
524  return a;
525 }
526 
527 cairo_uint128_t
528 _cairo_uint128_rsl (cairo_uint128_t a, int shift)
529 {
530  if (shift >= 64)
531  {
532  a.lo = a.hi;
533  a.hi = _cairo_uint32_to_uint64 (0);
534  shift -= 64;
535  }
536  if (shift)
537  {
538  a.lo = _cairo_uint64_add (_cairo_uint64_rsl (a.lo, shift),
539  _cairo_uint64_lsl (a.hi, (64 - shift)));
540  a.hi = _cairo_uint64_rsl (a.hi, shift);
541  }
542  return a;
543 }
544 
545 cairo_uint128_t
547 {
548  if (shift >= 64)
549  {
550  a.lo = a.hi;
551  a.hi = _cairo_uint64_rsa (a.hi, 64-1);
552  shift -= 64;
553  }
554  if (shift)
555  {
556  a.lo = _cairo_uint64_add (_cairo_uint64_rsl (a.lo, shift),
557  _cairo_uint64_lsl (a.hi, (64 - shift)));
558  a.hi = _cairo_uint64_rsa (a.hi, shift);
559  }
560  return a;
561 }
562 
563 int
564 _cairo_uint128_lt (cairo_uint128_t a, cairo_uint128_t b)
565 {
566  return (_cairo_uint64_lt (a.hi, b.hi) ||
567  (_cairo_uint64_eq (a.hi, b.hi) &&
568  _cairo_uint64_lt (a.lo, b.lo)));
569 }
570 
571 int
573 {
575  return 1;
577  return 0;
578  return _cairo_uint128_lt (a, b);
579 }
580 
581 int
582 _cairo_uint128_eq (cairo_uint128_t a, cairo_uint128_t b)
583 {
584  return (_cairo_uint64_eq (a.hi, b.hi) &&
585  _cairo_uint64_eq (a.lo, b.lo));
586 }
587 
588 #if HAVE_UINT64_T
589 #define _cairo_msbset64(q) (q & ((uint64_t) 1 << 63))
590 #else
591 #define _cairo_msbset64(q) (q.hi & ((uint32_t) 1 << 31))
592 #endif
593 
595 _cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den)
596 {
598  cairo_uint128_t bit;
599  cairo_uint128_t quo;
600 
601  bit = _cairo_uint32_to_uint128 (1);
602 
603  /* normalize to make den >= num, but not overflow */
604  while (_cairo_uint128_lt (den, num) && !_cairo_msbset64(den.hi))
605  {
606  bit = _cairo_uint128_lsl (bit, 1);
607  den = _cairo_uint128_lsl (den, 1);
608  }
609  quo = _cairo_uint32_to_uint128 (0);
610 
611  /* generate quotient, one bit at a time */
613  {
614  if (_cairo_uint128_le (den, num))
615  {
616  num = _cairo_uint128_sub (num, den);
617  quo = _cairo_uint128_add (quo, bit);
618  }
619  bit = _cairo_uint128_rsl (bit, 1);
620  den = _cairo_uint128_rsl (den, 1);
621  }
622  qr.quo = quo;
623  qr.rem = num;
624  return qr;
625 }
626 
627 cairo_uint128_t
628 _cairo_uint128_negate (cairo_uint128_t a)
629 {
630  a.lo = _cairo_uint64_not (a.lo);
631  a.hi = _cairo_uint64_not (a.hi);
633 }
634 
635 cairo_uint128_t
636 _cairo_uint128_not (cairo_uint128_t a)
637 {
638  a.lo = _cairo_uint64_not (a.lo);
639  a.hi = _cairo_uint64_not (a.hi);
640  return a;
641 }
642 
643 #endif /* !HAVE_UINT128_T */
644 
647 {
648  int num_neg = _cairo_int128_negative (num);
649  int den_neg = _cairo_int128_negative (den);
650  cairo_uquorem128_t uqr;
652 
653  if (num_neg)
654  num = _cairo_int128_negate (num);
655  if (den_neg)
656  den = _cairo_int128_negate (den);
657  uqr = _cairo_uint128_divrem (num, den);
658  if (num_neg)
659  qr.rem = _cairo_int128_negate (uqr.rem);
660  else
661  qr.rem = uqr.rem;
662  if (num_neg != den_neg)
663  qr.quo = _cairo_int128_negate (uqr.quo);
664  else
665  qr.quo = uqr.quo;
666  return qr;
667 }
668 
679 _cairo_uint_96by64_32x64_divrem (cairo_uint128_t num,
680  cairo_uint64_t den)
681 {
682  cairo_uquorem64_t result;
684 
685  /* These are the high 64 bits of the *96* bit numerator. We're
686  * going to represent the numerator as xB + y, where x is a 64,
687  * and y is a 32 bit number. */
689 
690  /* Initialise the result to indicate overflow. */
691  result.quo = _cairo_uint32s_to_uint64 (-1U, -1U);
692  result.rem = den;
693 
694  /* Don't bother if the quotient is going to overflow. */
695  if (_cairo_uint64_ge (x, den)) {
696  return /* overflow */ result;
697  }
698 
699  if (_cairo_uint64_lt (x, B)) {
700  /* When the final quotient is known to fit in 32 bits, then
701  * num < 2^64 if and only if den < 2^32. */
703  }
704  else {
705  /* Denominator is >= 2^32. the numerator is >= 2^64, and the
706  * division won't overflow: need two divrems. Write the
707  * numerator and denominator as
708  *
709  * num = xB + y x : 64 bits, y : 32 bits
710  * den = uB + v u, v : 32 bits
711  */
712  uint32_t y = _cairo_uint128_to_uint32 (num);
713  uint32_t u = uint64_hi32 (den);
714  uint32_t v = _cairo_uint64_to_uint32 (den);
715 
716  /* Compute a lower bound approximate quotient of num/den
717  * from x/(u+1). Then we have
718  *
719  * x = q(u+1) + r ; q : 32 bits, r <= u : 32 bits.
720  *
721  * xB + y = q(u+1)B + (rB+y)
722  * = q(uB + B + v - v) + (rB+y)
723  * = q(uB + v) + qB - qv + (rB+y)
724  * = q(uB + v) + q(B-v) + (rB+y)
725  *
726  * The true quotient of num/den then is q plus the
727  * contribution of q(B-v) + (rB+y). The main contribution
728  * comes from the term q(B-v), with the term (rB+y) only
729  * contributing at most one part.
730  *
731  * The term q(B-v) must fit into 64 bits, since q fits into 32
732  * bits on account of being a lower bound to the true
733  * quotient, and as B-v <= 2^32, we may safely use a single
734  * 64/64 bit division to find its contribution. */
735 
736  cairo_uquorem64_t quorem;
737  cairo_uint64_t remainder; /* will contain final remainder */
738  uint32_t quotient; /* will contain final quotient. */
739  uint32_t q;
740  uint32_t r;
741 
742  /* Approximate quotient by dividing the high 64 bits of num by
743  * u+1. Watch out for overflow of u+1. */
744  if (u+1) {
745  quorem = _cairo_uint64_divrem (x, _cairo_uint32_to_uint64 (u+1));
746  q = _cairo_uint64_to_uint32 (quorem.quo);
747  r = _cairo_uint64_to_uint32 (quorem.rem);
748  }
749  else {
750  q = uint64_hi32 (x);
751  r = _cairo_uint64_to_uint32 (x);
752  }
753  quotient = q;
754 
755  /* Add the main term's contribution to quotient. Note B-v =
756  * -v as an uint32 (unless v = 0) */
757  if (v)
758  quorem = _cairo_uint64_divrem (_cairo_uint32x32_64_mul (q, -v), den);
759  else
760  quorem = _cairo_uint64_divrem (_cairo_uint32s_to_uint64 (q, 0), den);
761  quotient += _cairo_uint64_to_uint32 (quorem.quo);
762 
763  /* Add the contribution of the subterm and start computing the
764  * true remainder. */
765  remainder = _cairo_uint32s_to_uint64 (r, y);
766  if (_cairo_uint64_ge (remainder, den)) {
767  remainder = _cairo_uint64_sub (remainder, den);
768  quotient++;
769  }
770 
771  /* Add the contribution of the main term's remainder. The
772  * funky test here checks that remainder + main_rem >= den,
773  * taking into account overflow of the addition. */
774  remainder = _cairo_uint64_add (remainder, quorem.rem);
775  if (_cairo_uint64_ge (remainder, den) ||
776  _cairo_uint64_lt (remainder, quorem.rem))
777  {
778  remainder = _cairo_uint64_sub (remainder, den);
779  quotient++;
780  }
781 
782  result.quo = _cairo_uint32_to_uint64 (quotient);
783  result.rem = remainder;
784  }
785  return result;
786 }
787 
790 {
791  int num_neg = _cairo_int128_negative (num);
792  int den_neg = _cairo_int64_negative (den);
793  cairo_uint64_t nonneg_den;
794  cairo_uquorem64_t uqr;
795  cairo_quorem64_t qr;
796 
797  if (num_neg)
798  num = _cairo_int128_negate (num);
799  if (den_neg)
800  nonneg_den = _cairo_int64_negate (den);
801  else
802  nonneg_den = den;
803 
804  uqr = _cairo_uint_96by64_32x64_divrem (num, nonneg_den);
805  if (_cairo_uint64_eq (uqr.rem, _cairo_int64_to_uint64 (nonneg_den))) {
806  /* bail on overflow. */
807  qr.quo = _cairo_uint32s_to_uint64 (0x7FFFFFFF, -1U);;
808  qr.rem = den;
809  return qr;
810  }
811 
812  if (num_neg)
813  qr.rem = _cairo_int64_negate (uqr.rem);
814  else
815  qr.rem = uqr.rem;
816  if (num_neg != den_neg)
817  qr.quo = _cairo_int64_negate (uqr.quo);
818  else
819  qr.quo = uqr.quo;
820  return qr;
821 }
const char * cairo_impl64
Definition: cairo-wideint.c:41
#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:43
#define _cairo_uint128_to_uint32(a)
#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:46
#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)
Declaration of the cairo_x functions which implement high precision arithmetic.
#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)