fixed: UInt::AddInt() in no-asm code has incorrect assertion
changed: UInt::SubInt() in no-asm code is a little faster now changed: small cosmetic changes in commentaries deleted: some debug #ifdef's from UInt::Div() (in no-asm code) git-svn-id: svn://ttmath.org/publicrep/ttmath/trunk@136 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
parent
a7a7eb7808
commit
277dd72fb6
|
@ -1,4 +1,4 @@
|
||||||
Version 0.8.4 prerelease (2009.05.05):
|
Version 0.8.4 prerelease (2009.05.08):
|
||||||
* fixed: UInt::DivInt() didn't check whether the divisor is zero
|
* fixed: UInt::DivInt() didn't check whether the divisor is zero
|
||||||
there was a hardware interruption when the divisor was zero
|
there was a hardware interruption when the divisor was zero
|
||||||
(now the method returns one)
|
(now the method returns one)
|
||||||
|
@ -25,7 +25,6 @@ Version 0.8.4 prerelease (2009.05.05):
|
||||||
(it's used when macro TTMATH_NOASM is defined)
|
(it's used when macro TTMATH_NOASM is defined)
|
||||||
The third form can be used on x86 and x86_64 as well and
|
The third form can be used on x86 and x86_64 as well and
|
||||||
on other platforms with a little effort.
|
on other platforms with a little effort.
|
||||||
(Temporarily I left there some '#ifdef's for debugging.)
|
|
||||||
|
|
||||||
|
|
||||||
Version 0.8.3 (2009.04.06):
|
Version 0.8.3 (2009.04.06):
|
||||||
|
|
4
README
4
README
|
@ -21,6 +21,6 @@ This means only C++ developers can use this library and one thing they have
|
||||||
to do is to use 'include' directive of the preprocessor. How big the
|
to do is to use 'include' directive of the preprocessor. How big the
|
||||||
values can be is set directly in the source code by the programmer.
|
values can be is set directly in the source code by the programmer.
|
||||||
|
|
||||||
Author: Tomasz Sowa <t.sowa@slimaczek.pl>
|
Author: Tomasz Sowa <t.sowa@ttmath.org>
|
||||||
Project pages: http://ttmath.slimaczek.pl
|
Project pages: http://www.ttmath.org
|
||||||
http://sourceforge.net/projects/ttmath
|
http://sourceforge.net/projects/ttmath
|
||||||
|
|
|
@ -423,7 +423,7 @@ namespace ttmath
|
||||||
if( c )
|
if( c )
|
||||||
// Sin is from <-1,1> and cannot make an overflow
|
// Sin is from <-1,1> and cannot make an overflow
|
||||||
// but the carry can be from the Taylor series
|
// but the carry can be from the Taylor series
|
||||||
// (then we only breaks our calculations)
|
// (then we only break our calculations)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if( addition )
|
if( addition )
|
||||||
|
|
|
@ -1874,7 +1874,7 @@ public:
|
||||||
// error but I leave it at the moment as is
|
// error but I leave it at the moment as is
|
||||||
TTMATH_ASSERT( sizeof(double) == 8 )
|
TTMATH_ASSERT( sizeof(double) == 8 )
|
||||||
|
|
||||||
// I am not sure what will be on a plaltform which has
|
// I am not sure what will be on a platform which has
|
||||||
// a different endianness... but we use this library only
|
// a different endianness... but we use this library only
|
||||||
// on x86 and amd (intel) 64 bits (as there's a lot of assembler code)
|
// on x86 and amd (intel) 64 bits (as there's a lot of assembler code)
|
||||||
union
|
union
|
||||||
|
|
|
@ -2903,7 +2903,6 @@ public:
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
public: // !!! chwilowo public
|
|
||||||
uint Rcl2_one(uint c);
|
uint Rcl2_one(uint c);
|
||||||
uint Rcr2_one(uint c);
|
uint Rcr2_one(uint c);
|
||||||
uint Rcl2(uint bits, uint c);
|
uint Rcl2(uint bits, uint c);
|
||||||
|
|
|
@ -116,7 +116,7 @@ namespace ttmath
|
||||||
table[1] = 30 + 2;
|
table[1] = 30 + 2;
|
||||||
table[2] = 5;
|
table[2] = 5;
|
||||||
|
|
||||||
of course if there was a carry from table[3] it would be returned
|
of course if there was a carry from table[2] it would be returned
|
||||||
*/
|
*/
|
||||||
template<uint value_size>
|
template<uint value_size>
|
||||||
uint UInt<value_size>::AddInt(uint value, uint index)
|
uint UInt<value_size>::AddInt(uint value, uint index)
|
||||||
|
@ -175,7 +175,7 @@ namespace ttmath
|
||||||
{
|
{
|
||||||
uint i, c;
|
uint i, c;
|
||||||
|
|
||||||
TTMATH_ASSERT( index < value_size )
|
TTMATH_ASSERT( index < value_size - 1 )
|
||||||
|
|
||||||
|
|
||||||
c = AddTwoWords(table[index], x1, 0, &table[index]);
|
c = AddTwoWords(table[index], x1, 0, &table[index]);
|
||||||
|
@ -255,7 +255,7 @@ namespace ttmath
|
||||||
table[1] = 30 - 2;
|
table[1] = 30 - 2;
|
||||||
table[2] = 5;
|
table[2] = 5;
|
||||||
|
|
||||||
of course if there was a carry from table[3] it would be returned
|
of course if there was a carry from table[2] it would be returned
|
||||||
*/
|
*/
|
||||||
template<uint value_size>
|
template<uint value_size>
|
||||||
uint UInt<value_size>::SubInt(uint value, uint index)
|
uint UInt<value_size>::SubInt(uint value, uint index)
|
||||||
|
@ -473,8 +473,8 @@ namespace ttmath
|
||||||
|
|
||||||
uint mask = 1;
|
uint mask = 1;
|
||||||
|
|
||||||
while( bit-- > 0 )
|
if( bit > 1 )
|
||||||
mask = mask << 1;
|
mask = mask << bit;
|
||||||
|
|
||||||
uint last = value & mask;
|
uint last = value & mask;
|
||||||
value = value | mask;
|
value = value | mask;
|
||||||
|
@ -601,7 +601,6 @@ namespace ttmath
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
// !! maybe returns something? a carry? or when c is zero?
|
|
||||||
/*!
|
/*!
|
||||||
this method calculates 64bits word a:b / 32bits c (a higher, b lower word)
|
this method calculates 64bits word a:b / 32bits c (a higher, b lower word)
|
||||||
r = a:b / c and rest - remainder
|
r = a:b / c and rest - remainder
|
||||||
|
@ -648,10 +647,6 @@ namespace ttmath
|
||||||
{
|
{
|
||||||
*r = b / c;
|
*r = b / c;
|
||||||
*rest = b % c;
|
*rest = b % c;
|
||||||
|
|
||||||
#ifdef TTMATH_WARTOWNIK
|
|
||||||
++tester_wartownik1; // !!!!! skasowac
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if( c_.u_.high == 0 )
|
if( c_.u_.high == 0 )
|
||||||
|
@ -674,10 +669,6 @@ namespace ttmath
|
||||||
*rest = temp2.u % c;
|
*rest = temp2.u % c;
|
||||||
|
|
||||||
*r = res_.u;
|
*r = res_.u;
|
||||||
#ifdef TTMATH_WARTOWNIK
|
|
||||||
++tester_wartownik2; // !!!!! skasowac
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -690,6 +681,13 @@ namespace ttmath
|
||||||
|
|
||||||
#ifdef TTMATH_PLATFORM64
|
#ifdef TTMATH_PLATFORM64
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method is available only on 64bit platforms
|
||||||
|
|
||||||
|
the same algorithm like the third division algorithm in ttmathuint.h
|
||||||
|
but now with the radix=2^32
|
||||||
|
*/
|
||||||
template<uint value_size>
|
template<uint value_size>
|
||||||
void UInt<value_size>::DivTwoWords2(uint a, uint b, uint c, uint * r, uint * rest)
|
void UInt<value_size>::DivTwoWords2(uint a, uint b, uint c, uint * r, uint * rest)
|
||||||
{
|
{
|
||||||
|
@ -704,7 +702,6 @@ namespace ttmath
|
||||||
c_.u = c;
|
c_.u = c;
|
||||||
|
|
||||||
// normalizing
|
// normalizing
|
||||||
// a0 will actually not be used
|
|
||||||
uint d = DivTwoWordsNormalize(a_, b_, c_);
|
uint d = DivTwoWordsNormalize(a_, b_, c_);
|
||||||
|
|
||||||
// loop from j=1 to j=0
|
// loop from j=1 to j=0
|
||||||
|
@ -748,12 +745,7 @@ namespace ttmath
|
||||||
a_.u = a_.u << 1; // carry bits from 'a' are simply skipped
|
a_.u = a_.u << 1; // carry bits from 'a' are simply skipped
|
||||||
|
|
||||||
if( bc )
|
if( bc )
|
||||||
{
|
|
||||||
a_.u = a_.u | 1;
|
a_.u = a_.u | 1;
|
||||||
#ifdef TTMATH_WARTOWNIK
|
|
||||||
++tester_wartownik3; // !!!!! skasowac
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return d;
|
return d;
|
||||||
|
@ -802,23 +794,11 @@ namespace ttmath
|
||||||
|
|
||||||
if( decrease )
|
if( decrease )
|
||||||
{
|
{
|
||||||
#ifdef TTMATH_WARTOWNIK
|
|
||||||
++tester_wartownik4; // !!!!! skasowac
|
|
||||||
#endif
|
|
||||||
|
|
||||||
--qp_.u;
|
--qp_.u;
|
||||||
rp_.u += v_.u_.high;
|
rp_.u += v_.u_.high;
|
||||||
|
|
||||||
if( rp_.u_.high == 0 )
|
if( rp_.u_.high == 0 )
|
||||||
{
|
|
||||||
next_test = true;
|
next_test = true;
|
||||||
|
|
||||||
#ifdef TTMATH_WARTOWNIK
|
|
||||||
++tester_wartownik5; // !!!!! skasowac
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while( next_test );
|
while( next_test );
|
||||||
|
@ -849,20 +829,12 @@ namespace ttmath
|
||||||
temp_.u_.low = u_.u_.high;
|
temp_.u_.low = u_.u_.high;
|
||||||
c = SubTwoWords(temp_.u, res_high, c, &sub_res_high_.u);
|
c = SubTwoWords(temp_.u, res_high, c, &sub_res_high_.u);
|
||||||
|
|
||||||
#ifdef TTMATH_WARTOWNIK
|
|
||||||
++tester_wartownik6; // !!!!! skasowac
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if( c )
|
if( c )
|
||||||
{
|
{
|
||||||
--q;
|
--q;
|
||||||
|
|
||||||
c = AddTwoWords(sub_res_low_.u, v_.u, 0, &sub_res_low_.u);
|
c = AddTwoWords(sub_res_low_.u, v_.u, 0, &sub_res_low_.u);
|
||||||
AddTwoWords(sub_res_high_.u, 0, c, &sub_res_high_.u);
|
AddTwoWords(sub_res_high_.u, 0, c, &sub_res_high_.u);
|
||||||
|
|
||||||
#ifdef TTMATH_WARTOWNIK
|
|
||||||
++tester_wartownik7; // !!!!! skasowac
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u_.u_.high = sub_res_high_.u_.low;
|
u_.u_.high = sub_res_high_.u_.low;
|
||||||
|
|
|
@ -463,7 +463,6 @@ namespace ttmath
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
|
|
||||||
"push %%ecx \n"
|
"push %%ecx \n"
|
||||||
|
|
||||||
"xorl %%eax, %%eax \n"
|
"xorl %%eax, %%eax \n"
|
||||||
|
@ -515,7 +514,7 @@ namespace ttmath
|
||||||
table[1] = 30 - 2;
|
table[1] = 30 - 2;
|
||||||
table[2] = 5;
|
table[2] = 5;
|
||||||
|
|
||||||
of course if there was a carry from table[3] it would be returned
|
of course if there was a carry from table[2] it would be returned
|
||||||
*/
|
*/
|
||||||
template<uint value_size>
|
template<uint value_size>
|
||||||
uint UInt<value_size>::SubInt(uint value, uint index)
|
uint UInt<value_size>::SubInt(uint value, uint index)
|
||||||
|
@ -1138,16 +1137,15 @@ namespace ttmath
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
multiplication: result2:result1 = a * b
|
multiplication: result_high:result_low = a * b
|
||||||
result2 - higher word
|
result_high - higher word of the result
|
||||||
result1 - lower word of the result
|
result_low - lower word of the result
|
||||||
|
|
||||||
this method never returns a carry
|
this methos never returns a carry
|
||||||
|
this method is used in the second version of the multiplication algorithms
|
||||||
it is an auxiliary method for second version of the multiplication algorithm
|
|
||||||
*/
|
*/
|
||||||
template<uint value_size>
|
template<uint value_size>
|
||||||
void UInt<value_size>::MulTwoWords(uint a, uint b, uint * result2, uint * result1)
|
void UInt<value_size>::MulTwoWords(uint a, uint b, uint * result_high, uint * result_low)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
we must use these temporary variables in order to inform the compilator
|
we must use these temporary variables in order to inform the compilator
|
||||||
|
@ -1192,8 +1190,8 @@ namespace ttmath
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
*result1 = result1_;
|
*result_low = result1_;
|
||||||
*result2 = result2_;
|
*result_high = result2_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -137,7 +137,7 @@ namespace ttmath
|
||||||
table[1] = 30 + 2;
|
table[1] = 30 + 2;
|
||||||
table[2] = 5;
|
table[2] = 5;
|
||||||
|
|
||||||
of course if there was a carry from table[3] it would be returned
|
of course if there was a carry from table[2] it would be returned
|
||||||
*/
|
*/
|
||||||
template<uint value_size>
|
template<uint value_size>
|
||||||
uint UInt<value_size>::AddInt(uint value, uint index)
|
uint UInt<value_size>::AddInt(uint value, uint index)
|
||||||
|
@ -339,7 +339,7 @@ namespace ttmath
|
||||||
table[1] = 30 - 2;
|
table[1] = 30 - 2;
|
||||||
table[2] = 5;
|
table[2] = 5;
|
||||||
|
|
||||||
of course if there was a carry from table[3] it would be returned
|
of course if there was a carry from table[2] it would be returned
|
||||||
*/
|
*/
|
||||||
template<uint value_size>
|
template<uint value_size>
|
||||||
uint UInt<value_size>::SubInt(uint value, uint index)
|
uint UInt<value_size>::SubInt(uint value, uint index)
|
||||||
|
@ -635,7 +635,7 @@ namespace ttmath
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
this method returns the number of the highest set bit in one 32-bit word
|
this method returns the number of the highest set bit in one 64-bit word
|
||||||
if the 'x' is zero this method returns '-1'
|
if the 'x' is zero this method returns '-1'
|
||||||
|
|
||||||
***this method is created only on a 64bit platform***
|
***this method is created only on a 64bit platform***
|
||||||
|
@ -723,18 +723,17 @@ namespace ttmath
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
multiplication: result2:result1 = a * b
|
multiplication: result_high:result_low = a * b
|
||||||
result2 - higher word
|
result_high - higher word of the result
|
||||||
result1 - lower word of the result
|
result_low - lower word of the result
|
||||||
|
|
||||||
this methos never returns a carry
|
this methos never returns a carry
|
||||||
|
this method is used in the second version of the multiplication algorithms
|
||||||
|
|
||||||
***this method is created only on a 64bit platform***
|
***this method is created only on a 64bit platform***
|
||||||
|
|
||||||
it is an auxiliary method for version two of the multiplication algorithm
|
|
||||||
*/
|
*/
|
||||||
template<uint value_size>
|
template<uint value_size>
|
||||||
void UInt<value_size>::MulTwoWords(uint a, uint b, uint * result2, uint * result1)
|
void UInt<value_size>::MulTwoWords(uint a, uint b, uint * result_high, uint * result_low)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
we must use these temporary variables in order to inform the compilator
|
we must use these temporary variables in order to inform the compilator
|
||||||
|
@ -763,8 +762,8 @@ namespace ttmath
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
*result1 = result1_;
|
*result_low = result1_;
|
||||||
*result2 = result2_;
|
*result_high = result2_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue