Implementation of the cairo_x functions which implement high precision arithmetic. More...
Go to the source code of this file.
Macros | |
#define | _cairo_msbset64(q) (q.hi & ((uint32_t) 1 << 31)) |
#define | _cairo_uint32_rsa(a, n) ((uint32_t) (((int32_t) (a)) >> (n))) |
#define | uint32_carry16 ((1) << 16) |
#define | uint32_hi(i) ((i) >> 16) |
#define | uint32_lo(i) ((i) & 0xffff) |
#define | uint64_hi32(i) ((i).hi) |
#define | uint64_lo32(i) ((i).lo) |
Functions | |
cairo_quorem128_t | _cairo_int128_divrem (cairo_int128_t num, cairo_int128_t den) |
int | _cairo_int128_lt (cairo_int128_t a, cairo_int128_t b) |
cairo_int128_t | _cairo_int32_to_int128 (int32_t i) |
cairo_int64_t | _cairo_int32_to_int64 (int32_t i) |
cairo_int64_t | _cairo_int32x32_64_mul (int32_t a, int32_t b) |
cairo_quorem64_t | _cairo_int64_divrem (cairo_int64_t num, cairo_int64_t den) |
int | _cairo_int64_lt (cairo_int64_t a, cairo_int64_t b) |
cairo_int128_t | _cairo_int64_to_int128 (cairo_int64_t i) |
cairo_int128_t | _cairo_int64x64_128_mul (cairo_int64_t a, cairo_int64_t b) |
cairo_quorem64_t | _cairo_int_96by64_32x64_divrem (cairo_int128_t num, cairo_int64_t den) |
cairo_uint128_t | _cairo_uint128_add (cairo_uint128_t a, cairo_uint128_t b) |
cairo_uquorem128_t | _cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den) |
int | _cairo_uint128_eq (cairo_uint128_t a, cairo_uint128_t b) |
cairo_uint128_t | _cairo_uint128_lsl (cairo_uint128_t a, int shift) |
int | _cairo_uint128_lt (cairo_uint128_t a, cairo_uint128_t b) |
cairo_uint128_t | _cairo_uint128_mul (cairo_uint128_t a, cairo_uint128_t b) |
cairo_uint128_t | _cairo_uint128_negate (cairo_uint128_t a) |
cairo_uint128_t | _cairo_uint128_not (cairo_uint128_t a) |
cairo_uint128_t | _cairo_uint128_rsa (cairo_int128_t a, int shift) |
cairo_uint128_t | _cairo_uint128_rsl (cairo_uint128_t a, int shift) |
cairo_uint128_t | _cairo_uint128_sub (cairo_uint128_t a, cairo_uint128_t b) |
cairo_uint128_t | _cairo_uint32_to_uint128 (uint32_t i) |
cairo_uint64_t | _cairo_uint32_to_uint64 (uint32_t i) |
static cairo_uint64_t | _cairo_uint32s_to_uint64 (uint32_t h, uint32_t l) |
cairo_uint64_t | _cairo_uint32x32_64_mul (uint32_t a, uint32_t b) |
cairo_uint64_t | _cairo_uint64_add (cairo_uint64_t a, cairo_uint64_t b) |
cairo_uquorem64_t | _cairo_uint64_divrem (cairo_uint64_t num, cairo_uint64_t den) |
int | _cairo_uint64_eq (cairo_uint64_t a, cairo_uint64_t b) |
cairo_uint64_t | _cairo_uint64_lsl (cairo_uint64_t a, int shift) |
int | _cairo_uint64_lt (cairo_uint64_t a, cairo_uint64_t b) |
cairo_uint64_t | _cairo_uint64_mul (cairo_uint64_t a, cairo_uint64_t b) |
cairo_uint64_t | _cairo_uint64_negate (cairo_uint64_t a) |
cairo_uint64_t | _cairo_uint64_not (cairo_uint64_t a) |
cairo_int64_t | _cairo_uint64_rsa (cairo_int64_t a, int shift) |
cairo_uint64_t | _cairo_uint64_rsl (cairo_uint64_t a, int shift) |
cairo_uint64_t | _cairo_uint64_sub (cairo_uint64_t a, cairo_uint64_t b) |
cairo_uint128_t | _cairo_uint64_to_uint128 (cairo_uint64_t i) |
cairo_uint128_t | _cairo_uint64x64_128_mul (cairo_uint64_t a, cairo_uint64_t b) |
cairo_uquorem64_t | _cairo_uint_96by64_32x64_divrem (cairo_uint128_t num, cairo_uint64_t den) |
_cairo_uint_96by64_32x64_divrem: | |
static cairo_uint64_t | uint64_hi (cairo_uint64_t i) |
static cairo_uint64_t | uint64_lo (cairo_uint64_t i) |
static cairo_uint64_t | uint64_shift32 (cairo_uint64_t i) |
Variables | |
const char * | cairo_impl128 = "cairo_uint64_t" |
const char * | cairo_impl64 = "uint32_t" |
static const cairo_uint64_t | uint64_carry32 = { 0, 1 } |
Implementation of the cairo_x functions which implement high precision arithmetic.
Definition in file cairo-wideint.c.
#define _cairo_msbset64 | ( | q | ) | (q.hi & ((uint32_t) 1 << 31)) |
Definition at line 598 of file cairo-wideint.c.
Definition at line 208 of file cairo-wideint.c.
#define uint32_carry16 ((1) << 16) |
Definition at line 122 of file cairo-wideint.c.
#define uint32_hi | ( | i | ) | ((i) >> 16) |
Definition at line 121 of file cairo-wideint.c.
#define uint32_lo | ( | i | ) | ((i) & 0xffff) |
Definition at line 120 of file cairo-wideint.c.
#define uint64_hi32 | ( | i | ) | ((i).hi) |
Definition at line 424 of file cairo-wideint.c.
#define uint64_lo32 | ( | i | ) | ((i).lo) |
Definition at line 423 of file cairo-wideint.c.
cairo_quorem128_t _cairo_int128_divrem | ( | cairo_int128_t | num, |
cairo_int128_t | den | ||
) |
Definition at line 653 of file cairo-wideint.c.
References _cairo_int128_negate, _cairo_int128_negative, _cairo_uint128_divrem(), cairo_uquorem128_t::quo, cairo_quorem128_t::quo, cairo_uquorem128_t::rem, and cairo_quorem128_t::rem.
int _cairo_int128_lt | ( | cairo_int128_t | a, |
cairo_int128_t | b | ||
) |
Definition at line 579 of file cairo-wideint.c.
References _cairo_int128_negative, and _cairo_uint128_lt().
cairo_int128_t _cairo_int32_to_int128 | ( | int32_t | i | ) |
Definition at line 359 of file cairo-wideint.c.
References _cairo_int32_to_int64(), cairo_int128_t::hi, and cairo_int128_t::lo.
cairo_int64_t _cairo_int32_to_int64 | ( | int32_t | i | ) |
Definition at line 77 of file cairo-wideint.c.
References cairo_int64_t::lo.
Referenced by _cairo_int32_to_int128(), and _cairo_int64_to_int128().
cairo_int64_t _cairo_int32x32_64_mul | ( | int32_t | a, |
int32_t | b | ||
) |
Definition at line 153 of file cairo-wideint.c.
References _cairo_uint32x32_64_mul(), and cairo_int64_t::hi.
cairo_quorem64_t _cairo_int64_divrem | ( | cairo_int64_t | num, |
cairo_int64_t | den | ||
) |
Definition at line 307 of file cairo-wideint.c.
References _cairo_int64_negate, _cairo_int64_negative, _cairo_uint64_divrem(), cairo_uquorem64_t::quo, cairo_quorem64_t::quo, cairo_uquorem64_t::rem, and cairo_quorem64_t::rem.
int _cairo_int64_lt | ( | cairo_int64_t | a, |
cairo_int64_t | b | ||
) |
Definition at line 241 of file cairo-wideint.c.
References _cairo_int64_negative, and _cairo_uint64_lt().
cairo_int128_t _cairo_int64_to_int128 | ( | cairo_int64_t | i | ) |
Definition at line 379 of file cairo-wideint.c.
References _cairo_int32_to_int64(), _cairo_int64_negative, cairo_int128_t::hi, and cairo_int128_t::lo.
cairo_int128_t _cairo_int64x64_128_mul | ( | cairo_int64_t | a, |
cairo_int64_t | b | ||
) |
Definition at line 489 of file cairo-wideint.c.
References _cairo_int64_negative, _cairo_int64_to_uint64, _cairo_uint64_sub(), _cairo_uint64x64_128_mul(), and cairo_int128_t::hi.
cairo_quorem64_t _cairo_int_96by64_32x64_divrem | ( | cairo_int128_t | num, |
cairo_int64_t | den | ||
) |
Definition at line 796 of file cairo-wideint.c.
References _cairo_int128_negate, _cairo_int128_negative, _cairo_int64_negate, _cairo_int64_negative, _cairo_int64_to_uint64, _cairo_uint32s_to_uint64(), _cairo_uint64_eq(), _cairo_uint_96by64_32x64_divrem(), cairo_uquorem64_t::quo, cairo_quorem64_t::quo, cairo_uquorem64_t::rem, and cairo_quorem64_t::rem.
cairo_uint128_t _cairo_uint128_add | ( | cairo_uint128_t | a, |
cairo_uint128_t | b | ||
) |
Definition at line 389 of file cairo-wideint.c.
References _cairo_uint32_to_uint64(), _cairo_uint64_add(), and _cairo_uint64_lt().
Referenced by _cairo_uint128_divrem(), _cairo_uint128_negate(), and ns3::int64x64_t::Round().
cairo_uquorem128_t _cairo_uint128_divrem | ( | cairo_uint128_t | num, |
cairo_uint128_t | den | ||
) |
Definition at line 602 of file cairo-wideint.c.
References _cairo_msbset64, _cairo_uint128_add(), _cairo_uint128_le, _cairo_uint128_lsl(), _cairo_uint128_lt(), _cairo_uint128_ne, _cairo_uint128_rsl(), _cairo_uint128_sub(), _cairo_uint32_to_uint128(), cairo_uquorem128_t::quo, and cairo_uquorem128_t::rem.
Referenced by _cairo_int128_divrem().
int _cairo_uint128_eq | ( | cairo_uint128_t | a, |
cairo_uint128_t | b | ||
) |
Definition at line 589 of file cairo-wideint.c.
References _cairo_uint64_eq().
cairo_uint128_t _cairo_uint128_lsl | ( | cairo_uint128_t | a, |
int | shift | ||
) |
Definition at line 517 of file cairo-wideint.c.
References _cairo_uint32_to_uint64(), _cairo_uint64_add(), _cairo_uint64_lsl(), and _cairo_uint64_rsl().
Referenced by _cairo_uint128_divrem().
int _cairo_uint128_lt | ( | cairo_uint128_t | a, |
cairo_uint128_t | b | ||
) |
Definition at line 571 of file cairo-wideint.c.
References _cairo_uint64_eq(), and _cairo_uint64_lt().
Referenced by _cairo_int128_lt(), and _cairo_uint128_divrem().
cairo_uint128_t _cairo_uint128_mul | ( | cairo_uint128_t | a, |
cairo_uint128_t | b | ||
) |
Definition at line 504 of file cairo-wideint.c.
References _cairo_uint64_add(), _cairo_uint64_mul(), and _cairo_uint64x64_128_mul().
cairo_uint128_t _cairo_uint128_negate | ( | cairo_uint128_t | a | ) |
Definition at line 635 of file cairo-wideint.c.
References _cairo_uint128_add(), _cairo_uint32_to_uint128(), and _cairo_uint64_not().
Referenced by ns3::output_sign().
cairo_uint128_t _cairo_uint128_not | ( | cairo_uint128_t | a | ) |
Definition at line 643 of file cairo-wideint.c.
References _cairo_uint64_not().
cairo_uint128_t _cairo_uint128_rsa | ( | cairo_int128_t | a, |
int | shift | ||
) |
Definition at line 553 of file cairo-wideint.c.
References _cairo_uint64_add(), _cairo_uint64_lsl(), _cairo_uint64_rsa(), _cairo_uint64_rsl(), cairo_int128_t::hi, and cairo_int128_t::lo.
cairo_uint128_t _cairo_uint128_rsl | ( | cairo_uint128_t | a, |
int | shift | ||
) |
Definition at line 535 of file cairo-wideint.c.
References _cairo_uint32_to_uint64(), _cairo_uint64_add(), _cairo_uint64_lsl(), and _cairo_uint64_rsl().
Referenced by _cairo_uint128_divrem(), and _cairo_uint_96by64_32x64_divrem().
cairo_uint128_t _cairo_uint128_sub | ( | cairo_uint128_t | a, |
cairo_uint128_t | b | ||
) |
Definition at line 401 of file cairo-wideint.c.
References _cairo_uint32_to_uint64(), _cairo_uint64_gt, and _cairo_uint64_sub().
Referenced by _cairo_uint128_divrem().
cairo_uint128_t _cairo_uint32_to_uint128 | ( | uint32_t | i | ) |
Definition at line 349 of file cairo-wideint.c.
References _cairo_uint32_to_uint64().
Referenced by _cairo_uint128_divrem(), and _cairo_uint128_negate().
cairo_uint64_t _cairo_uint32_to_uint64 | ( | uint32_t | i | ) |
Definition at line 67 of file cairo-wideint.c.
Referenced by _cairo_uint128_add(), _cairo_uint128_lsl(), _cairo_uint128_rsl(), _cairo_uint128_sub(), _cairo_uint32_to_uint128(), _cairo_uint64_divrem(), _cairo_uint64_to_uint128(), and _cairo_uint_96by64_32x64_divrem().
Definition at line 87 of file cairo-wideint.c.
Referenced by _cairo_int_96by64_32x64_divrem(), and _cairo_uint_96by64_32x64_divrem().
Definition at line 125 of file cairo-wideint.c.
References uint32_carry16, uint32_hi, and uint32_lo.
Referenced by _cairo_int32x32_64_mul(), _cairo_uint64_mul(), _cairo_uint64x64_128_mul(), and _cairo_uint_96by64_32x64_divrem().
cairo_uint64_t _cairo_uint64_add | ( | cairo_uint64_t | a, |
cairo_uint64_t | b | ||
) |
Definition at line 97 of file cairo-wideint.c.
Referenced by _cairo_uint128_add(), _cairo_uint128_lsl(), _cairo_uint128_mul(), _cairo_uint128_rsa(), _cairo_uint128_rsl(), _cairo_uint64_divrem(), _cairo_uint64x64_128_mul(), and _cairo_uint_96by64_32x64_divrem().
cairo_uquorem64_t _cairo_uint64_divrem | ( | cairo_uint64_t | num, |
cairo_uint64_t | den | ||
) |
Definition at line 272 of file cairo-wideint.c.
References _cairo_uint32_to_uint64(), _cairo_uint64_add(), _cairo_uint64_le, _cairo_uint64_lsl(), _cairo_uint64_lt(), _cairo_uint64_rsl(), _cairo_uint64_sub(), cairo_uquorem64_t::quo, and cairo_uquorem64_t::rem.
Referenced by _cairo_int64_divrem(), and _cairo_uint_96by64_32x64_divrem().
int _cairo_uint64_eq | ( | cairo_uint64_t | a, |
cairo_uint64_t | b | ||
) |
Definition at line 235 of file cairo-wideint.c.
Referenced by _cairo_int_96by64_32x64_divrem(), _cairo_uint128_eq(), and _cairo_uint128_lt().
cairo_uint64_t _cairo_uint64_lsl | ( | cairo_uint64_t | a, |
int | shift | ||
) |
Definition at line 175 of file cairo-wideint.c.
Referenced by _cairo_uint128_lsl(), _cairo_uint128_rsa(), _cairo_uint128_rsl(), and _cairo_uint64_divrem().
int _cairo_uint64_lt | ( | cairo_uint64_t | a, |
cairo_uint64_t | b | ||
) |
Definition at line 228 of file cairo-wideint.c.
Referenced by _cairo_int64_lt(), _cairo_uint128_add(), _cairo_uint128_lt(), _cairo_uint64_divrem(), _cairo_uint64x64_128_mul(), and _cairo_uint_96by64_32x64_divrem().
cairo_uint64_t _cairo_uint64_mul | ( | cairo_uint64_t | a, |
cairo_uint64_t | b | ||
) |
Definition at line 165 of file cairo-wideint.c.
References _cairo_uint32x32_64_mul().
Referenced by _cairo_uint128_mul().
cairo_uint64_t _cairo_uint64_negate | ( | cairo_uint64_t | a | ) |
Definition at line 259 of file cairo-wideint.c.
cairo_uint64_t _cairo_uint64_not | ( | cairo_uint64_t | a | ) |
Definition at line 251 of file cairo-wideint.c.
Referenced by _cairo_uint128_negate(), and _cairo_uint128_not().
cairo_int64_t _cairo_uint64_rsa | ( | cairo_int64_t | a, |
int | shift | ||
) |
Definition at line 211 of file cairo-wideint.c.
References _cairo_uint32_rsa, cairo_int64_t::hi, and cairo_int64_t::lo.
Referenced by _cairo_uint128_rsa().
cairo_uint64_t _cairo_uint64_rsl | ( | cairo_uint64_t | a, |
int | shift | ||
) |
Definition at line 192 of file cairo-wideint.c.
Referenced by _cairo_uint128_lsl(), _cairo_uint128_rsa(), _cairo_uint128_rsl(), and _cairo_uint64_divrem().
cairo_uint64_t _cairo_uint64_sub | ( | cairo_uint64_t | a, |
cairo_uint64_t | b | ||
) |
Definition at line 109 of file cairo-wideint.c.
Referenced by _cairo_int64x64_128_mul(), _cairo_uint128_sub(), _cairo_uint64_divrem(), and _cairo_uint_96by64_32x64_divrem().
cairo_uint128_t _cairo_uint64_to_uint128 | ( | cairo_uint64_t | i | ) |
Definition at line 369 of file cairo-wideint.c.
References _cairo_uint32_to_uint64().
cairo_uint128_t _cairo_uint64x64_128_mul | ( | cairo_uint64_t | a, |
cairo_uint64_t | b | ||
) |
Definition at line 461 of file cairo-wideint.c.
References _cairo_uint32x32_64_mul(), _cairo_uint64_add(), _cairo_uint64_lt(), uint64_carry32, uint64_hi(), uint64_hi32, uint64_lo(), uint64_lo32, and uint64_shift32().
Referenced by _cairo_int64x64_128_mul(), and _cairo_uint128_mul().
cairo_uquorem64_t _cairo_uint_96by64_32x64_divrem | ( | cairo_uint128_t | num, |
cairo_uint64_t | den | ||
) |
_cairo_uint_96by64_32x64_divrem:
Compute a 32 bit quotient and 64 bit remainder of a 96 bit unsigned dividend and 64 bit divisor. If the quotient doesn't fit into 32 bits then the returned remainder is equal to the divisor, and the quotient is the largest representable 64 bit integer. It is an error to call this function with the high 32 bits of ‘num’ being non-zero.
Definition at line 686 of file cairo-wideint.c.
References _cairo_uint128_rsl(), _cairo_uint128_to_uint32, _cairo_uint128_to_uint64, _cairo_uint32_to_uint64(), _cairo_uint32s_to_uint64(), _cairo_uint32x32_64_mul(), _cairo_uint64_add(), _cairo_uint64_divrem(), _cairo_uint64_ge, _cairo_uint64_lt(), _cairo_uint64_sub(), _cairo_uint64_to_uint32, cairo_uquorem64_t::quo, cairo_uquorem64_t::rem, and uint64_hi32.
Referenced by _cairo_int_96by64_32x64_divrem().
|
static |
Definition at line 437 of file cairo-wideint.c.
Referenced by _cairo_uint64x64_128_mul().
|
static |
Definition at line 427 of file cairo-wideint.c.
Referenced by _cairo_uint64x64_128_mul().
|
static |
Definition at line 447 of file cairo-wideint.c.
Referenced by _cairo_uint64x64_128_mul().
const char* cairo_impl128 = "cairo_uint64_t" |
Definition at line 346 of file cairo-wideint.c.
Referenced by ns3::int64x64::test::Int64x64ImplTestCase::DoRun().
const char* cairo_impl64 = "uint32_t" |
Definition at line 64 of file cairo-wideint.c.
Referenced by ns3::int64x64::test::Int64x64ImplTestCase::DoRun().
|
static |
Definition at line 456 of file cairo-wideint.c.
Referenced by _cairo_uint64x64_128_mul().