38 #ifndef headerfilettmathuint_noasm 39 #define headerfilettmathuint_noasm 66 template<u
int value_size>
69 #ifdef TTMATH_PLATFORM32 70 static const char info[] =
"no_asm_32";
73 #ifdef TTMATH_PLATFORM64 74 static const char info[] =
"no_asm_64";
84 template<u
int value_size>
87 #ifdef TTMATH_PLATFORM32 91 #ifdef TTMATH_PLATFORM64 105 template<u
int value_size>
120 temp = a + b + carry;
141 template<u
int value_size>
146 for(i=0 ; i<value_size ; ++i)
147 c = AddTwoWords(table[i], ss2.table[i], c, &table[i]);
149 TTMATH_LOGC(
"UInt::Add", c)
177 template<
uint value_size>
182 TTMATH_ASSERT( index < value_size )
185 c = AddTwoWords(table[index], value, 0, &table[index]);
187 for(i=index+1 ; i<value_size && c ; ++i)
188 c = AddTwoWords(table[i], 0, c, &table[i]);
190 TTMATH_LOGC("UInt::AddInt", c)
235 template<
uint value_size>
240 TTMATH_ASSERT( index < value_size - 1 )
243 c = AddTwoWords(table[index], x1, 0, &table[index]);
244 c = AddTwoWords(table[index+1], x2, c, &table[index+1]);
246 for(i=index+2 ; i<value_size && c ; ++i)
247 c = AddTwoWords(table[i], 0, c, &table[i]);
249 TTMATH_LOGC("UInt::AddTwoInts", c)
277 template<
uint value_size>
282 TTMATH_ASSERT( ss1_size >= ss2_size )
284 for(i=0 ; i<ss2_size ; ++i)
285 c = AddTwoWords(ss1[i], ss2[i], c, &result[i]);
287 for( ; i<ss1_size ; ++i)
288 c = AddTwoWords(ss1[i], 0, c, &result[i]);
290 TTMATH_VECTOR_LOGC("UInt::AddVector", c, result, ss1_size)
304 template<
uint value_size>
317 *result = a - b - carry;
337 template<u
int value_size>
342 for(i=0 ; i<value_size ; ++i)
343 c = SubTwoWords(table[i], ss2.table[i], c, &table[i]);
345 TTMATH_LOGC(
"UInt::Sub", c)
375 template<
uint value_size>
380 TTMATH_ASSERT( index < value_size )
383 c = SubTwoWords(table[index], value, 0, &table[index]);
385 for(i=index+1 ; i<value_size && c ; ++i)
386 c = SubTwoWords(table[i], 0, c, &table[i]);
388 TTMATH_LOGC("UInt::SubInt", c)
415 template<
uint value_size>
420 TTMATH_ASSERT( ss1_size >= ss2_size )
422 for(i=0 ; i<ss2_size ; ++i)
423 c = SubTwoWords(ss1[i], ss2[i], c, &result[i]);
425 for( ; i<ss1_size ; ++i)
426 c = SubTwoWords(ss1[i], 0, c, &result[i]);
428 TTMATH_VECTOR_LOGC("UInt::SubVector", c, result, ss1_size)
447 template<
uint value_size>
448 uint UInt<value_size>::Rcl2_one(
uint c)
455 for(i=0 ; i<value_size ; ++i)
458 table[i] = (table[i] << 1) | c;
462 TTMATH_LOGC(
"UInt::Rcl2_one", c)
485 template<
uint value_size>
486 uint UInt<value_size>::Rcr2_one(
uint c)
494 for(i=
sint(value_size)-1 ; i>=0 ; --i)
497 table[i] = (table[i] >> 1) | c;
503 TTMATH_LOGC(
"UInt::Rcr2_one", c)
523 template<
uint value_size>
534 for(i=0 ; i<value_size ; ++i)
536 new_c = table[i] >> move;
537 table[i] = (table[i] << bits) | c;
541 TTMATH_LOGC(
"UInt::Rcl2", (c & 1))
561 template<
uint value_size>
573 for(i=value_size-1 ; i>=0 ; --i)
575 new_c = table[i] << move;
576 table[i] = (table[i] >> bits) | c;
582 TTMATH_LOGC(
"UInt::Rcr2", c)
594 template<
uint value_size>
595 sint UInt<value_size>::FindLeadingBitInWord(
uint x)
617 template<u
int value_size>
618 sint UInt<value_size>::FindLowestBitInWord(
uint x)
625 while( (x & 1) == 0 )
649 template<u
int value_size>
659 uint last = value & mask;
660 value = value | mask;
662 return (last != 0) ? 1 : 0;
687 template<
uint value_size>
688 void UInt<value_size>::MulTwoWords(
uint a,
uint b,
uint * result_high,
uint * result_low)
690 #ifdef TTMATH_PLATFORM32 708 res.u = ulint(a) * ulint(b);
710 *result_high = res.u_.high;
711 *result_low = res.u_.low;
725 uint_ res_high1, res_high2;
726 uint_ res_low1, res_low2;
752 res_low1.u =
uint(b_.u_.low) *
uint(a_.u_.low);
754 temp.u =
uint(res_low1.u_.high) +
uint(b_.u_.low) *
uint(a_.u_.high);
755 res_low1.u_.high = temp.u_.low;
756 res_high1.u_.low = temp.u_.high;
757 res_high1.u_.high = 0;
760 temp.u =
uint(b_.u_.high) *
uint(a_.u_.low);
761 res_low2.u_.high = temp.u_.low;
763 res_high2.u =
uint(b_.u_.high) *
uint(a_.u_.high) +
uint(temp.u_.high);
765 uint c = AddTwoWords(res_low1.u, res_low2.u, 0, &res_low2.u);
766 AddTwoWords(res_high1.u, res_high2.u, c, &res_high2.u);
768 *result_high = res_high2.u;
769 *result_low = res_low2.u;
796 template<u
int value_size>
800 TTMATH_ASSERT( c != 0 && a < c )
802 #ifdef TTMATH_PLATFORM32 819 *rest =
uint(ab.u % c);
833 if( c_.u_.high == 0 )
837 uint_ a_, b_, res_, temp1, temp2;
842 temp1.u_.high = a_.u_.low;
843 temp1.u_.low = b_.u_.high;
845 res_.u_.high = (
unsigned int)(temp1.u / c);
846 temp2.u_.high = (
unsigned int)(temp1.u % c);
847 temp2.u_.low = b_.u_.low;
849 res_.u_.low = (
unsigned int)(temp2.u / c);
856 return DivTwoWords2(a, b, c, r, rest);
863 #ifdef TTMATH_PLATFORM64 872 template<u
int value_size>
878 uint_ a_, b_, c_, u_, q_;
886 uint d = DivTwoWordsNormalize(a_, b_, c_);
891 u_.u_.high = a_.u_.high;
892 u_.u_.low = a_.u_.low;
894 q_.u_.high = DivTwoWordsCalculate(u_, u3, c_);
895 MultiplySubtract(u_, u3, q_.u_.high, c_);
897 u_.u_.high = u_.u_.low;
900 q_.u_.low = DivTwoWordsCalculate(u_, u3, c_);
901 MultiplySubtract(u_, u3, q_.u_.low, c_);
906 u_.u_.high = u_.u_.low;
908 *rest = DivTwoWordsUnnormalize(u_.u, d);
914 template<u
int value_size>
915 uint UInt<value_size>::DivTwoWordsNormalize(uint_ & a_, uint_ & b_, uint_ & c_)
936 template<u
int value_size>
937 uint UInt<value_size>::DivTwoWordsUnnormalize(
uint u,
uint d)
948 template<u
int value_size>
949 unsigned int UInt<value_size>::DivTwoWordsCalculate(uint_ u_,
unsigned int u3, uint_ v_)
952 uint_ qp_, rp_, temp_;
954 qp_.u = u_.u /
uint(v_.u_.high);
955 rp_.u = u_.u %
uint(v_.u_.high);
957 TTMATH_ASSERT( qp_.u_.high==0 || qp_.u_.high==1 )
961 bool decrease =
false;
963 if( qp_.u_.high == 1 )
967 temp_.u_.high = rp_.u_.low;
970 if( qp_.u *
uint(v_.u_.low) > temp_.u )
981 if( rp_.u_.high == 0 )
991 template<u
int value_size>
992 void UInt<value_size>::MultiplySubtract(uint_ & u_,
unsigned int & u3,
unsigned int & q, uint_ v_)
999 MulTwoWords(v_.u, q, &res_high, &res_low);
1001 uint_ sub_res_high_;
1004 temp_.u_.high = u_.u_.low;
1007 uint c = SubTwoWords(temp_.u, res_low, 0, &sub_res_low_.u);
1010 temp_.u_.low = u_.u_.high;
1011 c = SubTwoWords(temp_.u, res_high, c, &sub_res_high_.u);
1017 c = AddTwoWords(sub_res_low_.u, v_.u, 0, &sub_res_low_.u);
1018 AddTwoWords(sub_res_high_.u, 0, c, &sub_res_high_.u);
1021 u_.u_.high = sub_res_high_.u_.low;
1022 u_.u_.low = sub_res_low_.u_.high;
1023 u3 = sub_res_low_.u_.low;
1026 #endif // #ifdef TTMATH_PLATFORM64 1033 #endif //ifdef TTMATH_NOASM
static const char * LibTypeStr()
uint Sub(const UInt< value_size > &ss2, uint c=0)
uint Add(const UInt< value_size > &ss2, uint c=0)
static LibTypeCode LibType()
#define TTMATH_UINT_HIGHEST_BIT
a namespace for the TTMath library
#define TTMATH_UINT_MAX_VALUE
#define TTMATH_BITS_PER_UINT
static uint SetBitInWord(uint &value, uint bit)
static void DivTwoWords(uint a, uint b, uint c, uint *r, uint *rest)