changed: small optimization in ttmath_subindexed_x64()

(asm for x86_64 on MS VC)
changed: removed some MS VC warnings
changed: if TTMATH_DEBUG_LOG is defined then UInt::UInt()
         constructor fills the table with special values
added:   macro: TTMATH_BITS(min_bits)
         which returns the number of machine words
         capable to hold min_bits bits


git-svn-id: svn://ttmath.org/publicrep/ttmath/trunk@201 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
Tomasz Sowa 2009-09-20 20:10:29 +00:00
parent 01a86e40d9
commit 4c0d8c26ff
6 changed files with 46 additions and 11 deletions

View File

@ -1,4 +1,4 @@
Version 0.9.0 prerelease (2009.09.13): Version 0.9.0 prerelease (2009.09.20):
* fixed: Big::operator>>(std::istream&, Big<> &) didn't recognize values * fixed: Big::operator>>(std::istream&, Big<> &) didn't recognize values
in scientific mode (with 'e' character) in scientific mode (with 'e' character)
* added: support for wide characters (wchar_t, std::wstring) * added: support for wide characters (wchar_t, std::wstring)
@ -25,6 +25,9 @@ Version 0.9.0 prerelease (2009.09.13):
Big::SetInfoBit(unsigned char) Big::SetInfoBit(unsigned char)
Big::IsInfoBit(unsigned char) Big::IsInfoBit(unsigned char)
some methods for manipulating the info flags some methods for manipulating the info flags
* added: macro: TTMATH_BITS(min_bits)
which returns the number of machine words
capable to hold min_bits bits
* changed: Factorial() is using the Gamma() function now * changed: Factorial() is using the Gamma() function now
* changed: Big::Div(ss2) * changed: Big::Div(ss2)
Big::Mod(ss2) Big::Mod(ss2)

View File

@ -46,10 +46,13 @@
*/ */
#ifdef _MSC_VER #ifdef _MSC_VER
//warning C4127: conditional expression is constant
#pragma warning( disable: 4127 ) #pragma warning( disable: 4127 )
//warning C4127: conditional expression is constant
#pragma warning( disable: 4702 )
//warning C4702: unreachable code
#endif #endif
#include "ttmathbig.h" #include "ttmathbig.h"
#include "ttmathobjects.h" #include "ttmathobjects.h"
@ -2788,6 +2791,8 @@ namespace ttmath
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning( default: 4127 ) #pragma warning( default: 4127 )
//warning C4127: conditional expression is constant //warning C4127: conditional expression is constant
#pragma warning( disable: 4702 )
//warning C4702: unreachable code
#endif #endif
#endif #endif

View File

@ -157,6 +157,13 @@ namespace ttmath
*/ */
#define TTMATH_BUILTIN_VARIABLES_SIZE 256u #define TTMATH_BUILTIN_VARIABLES_SIZE 256u
/*!
this macro returns the number of machine words
capable to hold min_bits bits
e.g. TTMATH_BITS(128) returns 4
*/
#define TTMATH_BITS(min_bits) ((min_bits-1)/32 + 1)
#else #else
/*! /*!
@ -203,6 +210,13 @@ namespace ttmath
*/ */
#define TTMATH_BUILTIN_VARIABLES_SIZE 128ul #define TTMATH_BUILTIN_VARIABLES_SIZE 128ul
/*!
this macro returns the number of machine words
capable to hold min_bits bits
e.g. TTMATH_BITS(128) returns 2
*/
#define TTMATH_BITS(min_bits) ((min_bits-1)/64 + 1)
#endif #endif
} }
@ -279,6 +293,7 @@ namespace ttmath
namespace ttmath namespace ttmath
{ {

View File

@ -2594,6 +2594,18 @@ public:
*/ */
UInt() UInt()
{ {
// when macro TTMATH_DEBUG_LOG is defined
// we set special values to the table
// in order to be everywhere the same value of the UInt object
#ifdef TTMATH_DEBUG_LOG
#ifdef TTMATH_PLATFORM32
for(uint i=0 ; i<value_size ; ++i)
table[i] = 0xc1c1c1c1;
#else
for(uint i=0 ; i<value_size ; ++i)
table[i] = 0xc1c1c1c1c1c1c1c1;
#endif
#endif
} }

View File

@ -390,7 +390,7 @@ namespace ttmath
#endif #endif
TTMATH_LOG("UInt::AddVector") // TTMATH_LOG("UInt::AddVector")
return c; return c;
} }
@ -613,7 +613,7 @@ namespace ttmath
#endif #endif
TTMATH_LOG("UInt::SubVector") // TTMATH_LOG("UInt::SubVector")
return c; return c;
} }

View File

@ -44,11 +44,11 @@
PUBLIC ttmath_adc_x64 PUBLIC ttmath_adc_x64
PUBLIC ttmath_addindexed_x64 PUBLIC ttmath_addindexed_x64
PUBLIC ttmath_addindexed2_x64 PUBLIC ttmath_addindexed2_x64
PUBLIC ttmath_addvector_x64 PUBLIC ttmath_addvector_x64
PUBLIC ttmath_sbb_x64 PUBLIC ttmath_sbb_x64
PUBLIC ttmath_subindexed_x64 PUBLIC ttmath_subindexed_x64
PUBLIC ttmath_subvector_x64 PUBLIC ttmath_subvector_x64
PUBLIC ttmath_rcl_x64 PUBLIC ttmath_rcl_x64
PUBLIC ttmath_rcr_x64 PUBLIC ttmath_rcr_x64
@ -58,6 +58,8 @@ PUBLIC ttmath_rcr2_x64
PUBLIC ttmath_div_x64 PUBLIC ttmath_div_x64
;
; Microsoft x86_64 convention: http://msdn.microsoft.com/en-us/library/9b372w95.aspx
; ;
; "rax, rcx, rdx, r8-r11 are volatile." ; "rax, rcx, rdx, r8-r11 are volatile."
; "rbx, rbp, rdi, rsi, r12-r15 are nonvolatile." ; "rbx, rbp, rdi, rsi, r12-r15 are nonvolatile."
@ -289,16 +291,14 @@ loop1:
mov r9, 1 mov r9, 1
dec rdx dec rdx
jnz loop1 jnz loop1
jc return_1 ; most of the times, there will be NO carry (I hope)
mov rax, 1
ret
done: done:
xor rax, rax xor rax, rax
ret ret
return_1:
mov rax, 1
ret
ttmath_subindexed_x64 ENDP ttmath_subindexed_x64 ENDP