LEFT | RIGHT |
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
2 /* cairo - a vector graphics library with display and print output | 2 /* cairo - a vector graphics library with display and print output |
3 * | 3 * |
4 * Copyright © 2004 Keith Packard | 4 * Copyright © 2004 Keith Packard |
5 * | 5 * |
6 * This program is free software; you can redistribute it and/or modify | 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 | 7 * it under the terms of the GNU General Public License version 2 as |
8 * published by the Free Software Foundation; | 8 * published by the Free Software Foundation; |
9 * | 9 * |
10 * This program is distributed in the hope that it will be useful, | 10 * This program is distributed in the hope that it will be useful, |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 int den_neg = _cairo_int64_negative (den); | 306 int den_neg = _cairo_int64_negative (den); |
307 cairo_uquorem64_t uqr; | 307 cairo_uquorem64_t uqr; |
308 cairo_quorem64_t qr; | 308 cairo_quorem64_t qr; |
309 | 309 |
310 if (num_neg) | 310 if (num_neg) |
311 num = _cairo_int64_negate (num); | 311 num = _cairo_int64_negate (num); |
312 if (den_neg) | 312 if (den_neg) |
313 den = _cairo_int64_negate (den); | 313 den = _cairo_int64_negate (den); |
314 uqr = _cairo_uint64_divrem (num, den); | 314 uqr = _cairo_uint64_divrem (num, den); |
315 if (num_neg) | 315 if (num_neg) |
316 » qr.rem = _cairo_int64_negate ((cairo_int64_t)uqr.rem); //PDB | 316 » qr.rem = _cairo_int64_negate ((cairo_int64_t)uqr.rem); //PDB cast |
317 else | 317 else |
318 qr.rem = uqr.rem; | 318 qr.rem = uqr.rem; |
319 if (num_neg != den_neg) | 319 if (num_neg != den_neg) |
320 » qr.quo = (cairo_int64_t) _cairo_int64_negate ((cairo_int64_t)uqr.quo);
//PDB | 320 » qr.quo = (cairo_int64_t) _cairo_int64_negate ((cairo_int64_t)uqr.quo);
//PDB cast |
321 else | 321 else |
322 qr.quo = (cairo_int64_t) uqr.quo; | 322 qr.quo = (cairo_int64_t) uqr.quo; |
323 return qr; | 323 return qr; |
324 } | 324 } |
325 | 325 |
326 #if HAVE_UINT128_T | 326 #if HAVE_UINT128_T |
327 | 327 |
328 const char * cairo_impl128 = "uint128_t"; | 328 const char * cairo_impl128 = "uint128_t"; |
329 | 329 |
330 cairo_uquorem128_t | 330 cairo_uquorem128_t |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 { | 684 { |
685 cairo_uquorem64_t result; | 685 cairo_uquorem64_t result; |
686 cairo_uint64_t B = _cairo_uint32s_to_uint64 (1, 0); | 686 cairo_uint64_t B = _cairo_uint32s_to_uint64 (1, 0); |
687 | 687 |
688 /* These are the high 64 bits of the *96* bit numerator. We're | 688 /* These are the high 64 bits of the *96* bit numerator. We're |
689 * going to represent the numerator as xB + y, where x is a 64, | 689 * going to represent the numerator as xB + y, where x is a 64, |
690 * and y is a 32 bit number. */ | 690 * and y is a 32 bit number. */ |
691 cairo_uint64_t x = _cairo_uint128_to_uint64 (_cairo_uint128_rsl(num, 32)); | 691 cairo_uint64_t x = _cairo_uint128_to_uint64 (_cairo_uint128_rsl(num, 32)); |
692 | 692 |
693 /* Initialise the result to indicate overflow. */ | 693 /* Initialise the result to indicate overflow. */ |
694 result.quo = _cairo_uint32s_to_uint64 (UINT_MAX, UINT_MAX); //PDB | 694 result.quo = _cairo_uint32s_to_uint64 (UINT_MAX, UINT_MAX); //PDB cast |
695 result.rem = den; | 695 result.rem = den; |
696 | 696 |
697 /* Don't bother if the quotient is going to overflow. */ | 697 /* Don't bother if the quotient is going to overflow. */ |
698 if (_cairo_uint64_ge (x, den)) { | 698 if (_cairo_uint64_ge (x, den)) { |
699 return /* overflow */ result; | 699 return /* overflow */ result; |
700 } | 700 } |
701 | 701 |
702 if (_cairo_uint64_lt (x, B)) { | 702 if (_cairo_uint64_lt (x, B)) { |
703 /* When the final quotient is known to fit in 32 bits, then | 703 /* When the final quotient is known to fit in 32 bits, then |
704 * num < 2^64 if and only if den < 2^32. */ | 704 * num < 2^64 if and only if den < 2^32. */ |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 } | 751 } |
752 else { | 752 else { |
753 q = uint64_hi32 (x); | 753 q = uint64_hi32 (x); |
754 r = _cairo_uint64_to_uint32 (x); | 754 r = _cairo_uint64_to_uint32 (x); |
755 } | 755 } |
756 quotient = q; | 756 quotient = q; |
757 | 757 |
758 /* Add the main term's contribution to quotient. Note B-v = | 758 /* Add the main term's contribution to quotient. Note B-v = |
759 * -v as an uint32 (unless v = 0) */ | 759 * -v as an uint32 (unless v = 0) */ |
760 if (v) | 760 if (v) |
761 » quorem = _cairo_uint64_divrem (_cairo_uint32x32_64_mul (q, -(int32_t
)v), den); //PDB | 761 » quorem = _cairo_uint64_divrem (_cairo_uint32x32_64_mul (q, -(int32_t
)v), den); //PDB cast |
762 else | 762 else |
763 quorem = _cairo_uint64_divrem (_cairo_uint32s_to_uint64 (q, 0), den)
; | 763 quorem = _cairo_uint64_divrem (_cairo_uint32s_to_uint64 (q, 0), den)
; |
764 quotient += _cairo_uint64_to_uint32 (quorem.quo); | 764 quotient += _cairo_uint64_to_uint32 (quorem.quo); |
765 | 765 |
766 /* Add the contribution of the subterm and start computing the | 766 /* Add the contribution of the subterm and start computing the |
767 * true remainder. */ | 767 * true remainder. */ |
768 remainder = _cairo_uint32s_to_uint64 (r, y); | 768 remainder = _cairo_uint32s_to_uint64 (r, y); |
769 if (_cairo_uint64_ge (remainder, den)) { | 769 if (_cairo_uint64_ge (remainder, den)) { |
770 remainder = _cairo_uint64_sub (remainder, den); | 770 remainder = _cairo_uint64_sub (remainder, den); |
771 quotient++; | 771 quotient++; |
(...skipping 28 matching lines...) Expand all Loading... |
800 if (num_neg) | 800 if (num_neg) |
801 num = _cairo_int128_negate (num); | 801 num = _cairo_int128_negate (num); |
802 if (den_neg) | 802 if (den_neg) |
803 nonneg_den = _cairo_int64_negate (den); | 803 nonneg_den = _cairo_int64_negate (den); |
804 else | 804 else |
805 nonneg_den = den; | 805 nonneg_den = den; |
806 | 806 |
807 uqr = _cairo_uint_96by64_32x64_divrem (num, nonneg_den); | 807 uqr = _cairo_uint_96by64_32x64_divrem (num, nonneg_den); |
808 if (_cairo_uint64_eq (uqr.rem, _cairo_int64_to_uint64 (nonneg_den))) { | 808 if (_cairo_uint64_eq (uqr.rem, _cairo_int64_to_uint64 (nonneg_den))) { |
809 /* bail on overflow. */ | 809 /* bail on overflow. */ |
810 » qr.quo = _cairo_uint32s_to_uint64 (0x7FFFFFFF, UINT_MAX); //PDB | 810 » qr.quo = _cairo_uint32s_to_uint64 (0x7FFFFFFF, UINT_MAX); //PDB cast |
811 qr.rem = den; | 811 qr.rem = den; |
812 return qr; | 812 return qr; |
813 } | 813 } |
814 | 814 |
815 if (num_neg) | 815 if (num_neg) |
816 » qr.rem = _cairo_int64_negate ((cairo_int64_t)uqr.rem); //PDB | 816 » qr.rem = _cairo_int64_negate ((cairo_int64_t)uqr.rem); //PDB cast |
817 else | 817 else |
818 qr.rem = uqr.rem; | 818 qr.rem = uqr.rem; |
819 if (num_neg != den_neg) | 819 if (num_neg != den_neg) |
820 » qr.quo = _cairo_int64_negate ((cairo_int64_t)uqr.quo); //PDB | 820 » qr.quo = _cairo_int64_negate ((cairo_int64_t)uqr.quo); //PDB cast |
821 else | 821 else |
822 qr.quo = uqr.quo; | 822 qr.quo = uqr.quo; |
823 return qr; | 823 return qr; |
824 } | 824 } |
LEFT | RIGHT |