38 #ifndef headerfilettmathuint_x86 39 #define headerfilettmathuint_x86 51 #ifdef TTMATH_PLATFORM32 74 template<u
int value_size>
78 static const char info[] =
"asm_vc_32";
82 static const char info[] =
"asm_gcc_32";
92 template<u
int value_size>
122 template<u
int value_size>
127 uint * p2 =
const_cast<uint*
>(ss2.table);
180 __asm__ __volatile__(
182 "xorl %%edx, %%edx \n" 186 "movl (%%esi,%%edx,4), %%eax \n" 187 "adcl %%eax, (%%ebx,%%edx,4) \n" 193 "adc %%ecx, %%ecx \n" 195 :
"=c" (c),
"=a" (dummy),
"=d" (dummy2)
196 :
"0" (b),
"1" (c),
"b" (p1),
"S" (p2)
200 TTMATH_LOGC(
"UInt::Add", c)
231 template<
uint value_size>
238 TTMATH_ASSERT( index < value_size )
283 __asm__ __volatile__(
285 "subl %%edx, %%ecx \n" 288 "addl %%eax, (%%ebx,%%edx,4) \n" 298 "movzx %%al, %%edx \n" 300 :
"=d" (c),
"=a" (dummy),
"=c" (dummy2)
301 :
"0" (index),
"1" (value),
"2" (b),
"b" (p1)
306 TTMATH_LOGC(
"UInt::AddInt", c)
350 template<
uint value_size>
357 TTMATH_ASSERT( index < value_size - 1 )
406 __asm__ __volatile__(
408 "subl %%edx, %%ecx \n" 410 "addl %%esi, (%%ebx,%%edx,4) \n" 415 "adcl %%eax, (%%ebx,%%edx,4) \n" 425 "movzx %%al, %%eax \n" 427 :
"=a" (c),
"=c" (dummy),
"=d" (dummy2)
428 :
"0" (x2),
"1" (b),
"2" (index),
"b" (p1),
"S" (x1)
433 TTMATH_LOGC(
"UInt::AddTwoInts", c)
460 template<
uint value_size>
463 TTMATH_ASSERT( ss1_size >= ss2_size )
465 uint rest = ss1_size - ss2_size;
524 uint dummy1, dummy2, dummy3;
526 __asm__ __volatile__(
528 "xor %%edx, %%edx \n" 530 "mov (%%esi,%%edx,4), %%eax \n" 531 "adc (%%ebx,%%edx,4), %%eax \n" 532 "mov %%eax, (%%edi,%%edx,4) \n" 538 "adc %%ecx, %%ecx \n" 544 "xor %%ebx, %%ebx \n" 546 "mov %%eax, %%ecx \n" 548 "mov (%%esi, %%edx, 4), %%eax \n" 549 "adc %%ebx, %%eax \n" 550 "mov %%eax, (%%edi, %%edx, 4) \n" 556 "adc %%ecx, %%ecx \n" 559 :
"=a" (dummy1),
"=b" (dummy2),
"=c" (c),
"=d" (dummy3)
560 :
"1" (ss2),
"2" (ss2_size),
"3" (rest),
"S" (ss1),
"D" (result)
565 TTMATH_VECTOR_LOGC(
"UInt::AddVector", c, result, ss1_size)
579 template<
uint value_size>
580 uint UInt<value_size>::Sub(const UInt<value_size> & ss2,
uint c)
584 uint * p2 =
const_cast<uint*
>(ss2.table);
632 __asm__ __volatile__(
634 "xorl %%edx, %%edx \n" 638 "movl (%%esi,%%edx,4), %%eax \n" 639 "sbbl %%eax, (%%ebx,%%edx,4) \n" 645 "adc %%ecx, %%ecx \n" 647 :
"=c" (c),
"=a" (dummy),
"=d" (dummy2)
648 :
"0" (b),
"1" (c),
"b" (p1),
"S" (p2)
653 TTMATH_LOGC(
"UInt::Sub", c)
685 template<
uint value_size>
692 TTMATH_ASSERT( index < value_size )
737 __asm__ __volatile__(
739 "subl %%edx, %%ecx \n" 742 "subl %%eax, (%%ebx,%%edx,4) \n" 752 "movzx %%al, %%edx \n" 754 :
"=d" (c),
"=a" (dummy),
"=c" (dummy2)
755 :
"0" (index),
"1" (value),
"2" (b),
"b" (p1)
760 TTMATH_LOGC(
"UInt::SubInt", c)
788 template<
uint value_size>
791 TTMATH_ASSERT( ss1_size >= ss2_size )
793 uint rest = ss1_size - ss2_size;
857 uint dummy1, dummy2, dummy3;
859 __asm__ __volatile__(
861 "xor %%edx, %%edx \n" 863 "mov (%%esi,%%edx,4), %%eax \n" 864 "sbb (%%ebx,%%edx,4), %%eax \n" 865 "mov %%eax, (%%edi,%%edx,4) \n" 871 "adc %%ecx, %%ecx \n" 877 "xor %%ebx, %%ebx \n" 879 "mov %%eax, %%ecx \n" 881 "mov (%%esi, %%edx, 4), %%eax \n" 882 "sbb %%ebx, %%eax \n" 883 "mov %%eax, (%%edi, %%edx, 4) \n" 889 "adc %%ecx, %%ecx \n" 892 :
"=a" (dummy1),
"=b" (dummy2),
"=c" (c),
"=d" (dummy3)
893 :
"1" (ss2),
"2" (ss2_size),
"3" (rest),
"S" (ss1),
"D" (result)
898 TTMATH_VECTOR_LOGC(
"UInt::SubVector", c, result, ss1_size)
917 template<
uint value_size>
918 uint UInt<value_size>::Rcl2_one(
uint c)
937 rcl dword ptr [ebx+edx*4], 1
956 __asm__ __volatile__(
958 "xorl %%edx, %%edx \n" 962 "rcll $1, (%%ebx, %%edx, 4) \n" 968 "adcl %%ecx, %%ecx \n" 970 :
"=c" (c),
"=a" (dummy),
"=d" (dummy2)
971 :
"0" (b),
"1" (c),
"b" (p1)
976 TTMATH_LOGC(
"UInt::Rcl2_one", c)
995 template<
uint value_size>
996 uint UInt<value_size>::Rcr2_one(
uint c)
1013 rcr dword ptr [ebx+ecx*4-4], 1
1030 __asm__ __volatile__(
1035 "rcrl $1, -4(%%ebx, %%ecx, 4) \n" 1040 "adcl %%ecx, %%ecx \n" 1042 :
"=c" (c),
"=a" (dummy)
1043 :
"0" (b),
"1" (c),
"b" (p1)
1048 TTMATH_LOGC(
"UInt::Rcr2_one", c)
1056 #pragma warning (disable : 4731) 1074 template<u
int value_size>
1079 uint b = value_size;
1112 rol dword ptr [ebx+edx*4], cl
1114 mov eax, [ebx+edx*4]
1116 xor [ebx+edx*4], eax
1140 uint dummy, dummy2, dummy3;
1142 __asm__ __volatile__(
1146 "movl %%ecx, %%esi \n" 1147 "movl $32, %%ecx \n" 1148 "subl %%esi, %%ecx \n" 1149 "movl $-1, %%edx \n" 1150 "shrl %%cl, %%edx \n" 1151 "movl %%edx, %%ebp \n" 1152 "movl %%esi, %%ecx \n" 1154 "xorl %%edx, %%edx \n" 1155 "movl %%edx, %%esi \n" 1156 "orl %%eax, %%eax \n" 1157 "cmovnz %%ebp, %%esi \n" 1160 "roll %%cl, (%%ebx,%%edx,4) \n" 1162 "movl (%%ebx,%%edx,4), %%eax \n" 1163 "andl %%ebp, %%eax \n" 1164 "xorl %%eax, (%%ebx,%%edx,4) \n" 1165 "orl %%esi, (%%ebx,%%edx,4) \n" 1166 "movl %%eax, %%esi \n" 1176 :
"=a" (c),
"=D" (dummy),
"=S" (dummy2),
"=d" (dummy3)
1177 :
"0" (c),
"1" (b),
"b" (p1),
"c" (bits)
1182 TTMATH_LOGC(
"UInt::Rcl2", c)
1202 template<
uint value_size>
1207 uint b = value_size;
1242 ror dword ptr [ebx+edx*4], cl
1244 mov eax, [ebx+edx*4]
1246 xor [ebx+edx*4], eax
1271 uint dummy, dummy2, dummy3;
1273 __asm__ __volatile__(
1277 "movl %%ecx, %%esi \n" 1278 "movl $32, %%ecx \n" 1279 "subl %%esi, %%ecx \n" 1280 "movl $-1, %%edx \n" 1281 "shll %%cl, %%edx \n" 1282 "movl %%edx, %%ebp \n" 1283 "movl %%esi, %%ecx \n" 1285 "xorl %%edx, %%edx \n" 1286 "movl %%edx, %%esi \n" 1287 "addl %%edi, %%edx \n" 1289 "orl %%eax, %%eax \n" 1290 "cmovnz %%ebp, %%esi \n" 1293 "rorl %%cl, (%%ebx,%%edx,4) \n" 1295 "movl (%%ebx,%%edx,4), %%eax \n" 1296 "andl %%ebp, %%eax \n" 1297 "xorl %%eax, (%%ebx,%%edx,4) \n" 1298 "orl %%esi, (%%ebx,%%edx,4) \n" 1299 "movl %%eax, %%esi \n" 1310 :
"=a" (c),
"=D" (dummy),
"=S" (dummy2),
"=d" (dummy3)
1311 :
"0" (c),
"1" (b),
"b" (p1),
"c" (bits)
1316 TTMATH_LOGC(
"UInt::Rcr2", c)
1323 #pragma warning (default : 4731) 1331 template<u
int value_size>
1332 sint UInt<value_size>::FindLeadingBitInWord(
uint x)
1362 :
"=r" (result),
"=&r" (dummy)
1377 template<u
int value_size>
1378 sint UInt<value_size>::FindLowestBitInWord(
uint x)
1408 :
"=r" (result),
"=&r" (dummy)
1430 template<u
int value_size>
1462 "btsl %%ebx, %%eax \n" 1464 "movzx %%bl, %%ebx \n" 1466 :
"=a" (v),
"=b" (old_bit)
1467 :
"0" (v),
"1" (bit)
1488 template<u
int value_size>
1527 :
"=a" (result1_),
"=d" (result2_)
1534 *result_low = result1_;
1535 *result_high = result2_;
1563 template<u
int value_size>
1573 TTMATH_ASSERT( c != 0 )
1600 :
"=a" (r_),
"=d" (rest_)
1601 :
"0" (b),
"1" (a),
"c" (c)
1618 #endif //ifdef TTMATH_PLATFORM32 1619 #endif //ifndef TTMATH_NOASM
static const char * LibTypeStr()
uint Add(const UInt< value_size > &ss2, uint c=0)
static LibTypeCode LibType()
static void MulTwoWords(uint a, uint b, uint *result_high, uint *result_low)
a namespace for the TTMath library
#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)