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