3 #include <mmintrin.h>
\r
6 #pragma intrinsic(_umul128)
\r
9 bool addOvf(uint_fast64_t &a,const uint_fast64_t &b) {
\r
10 bool ret = (a > ~b);
\r
14 bool addOvf(const uint_fast64_t &a,const uint_fast64_t &b,uint_fast64_t &sum) {
\r
15 bool ret = (a > ~b);
\r
19 bool subUnf(uint_fast64_t &a,const uint_fast64_t &b) {
\r
24 bool subUnf(const uint_fast64_t &a,const uint_fast64_t &b,uint_fast64_t &dif) {
\r
29 uint_fast64_t mul128(const uint_fast64_t &Multiplicand, const uint_fast64_t &Multiplier,uint_fast64_t &HighProduct) {
\r
30 return _umul128(Multiplier, Multiplicand, &HighProduct);
\r
32 uint_fast64_t div_rq(const uint_fast64_t &Dividend, const uint_fast64_t &Divisor,uint_fast64_t &Quotient) {
\r
33 Quotient = Dividend/Divisor;
\r
34 return Dividend%Divisor;
\r
36 uint_fast64_t div_qr(const uint_fast64_t &Dividend, const uint_fast64_t &Divisor,uint_fast64_t &Remainder) {
\r
37 Remainder = Dividend%Divisor;
\r
38 return Dividend/Divisor;
\r
40 template <class Type>
\r
41 Type mul_bits(const Type &Multiplicand, const Type &Multiplier,Type &HighProduct) {
\r
42 return _umul128(Multiplier, Multiplicand, &HighProduct);
\r