无心人
发表于 2009-2-4 21:25:36
:)
SSE2做这个题目可能能超过宝宝的代码
emms在浮点前用就可以了
gxqcn
发表于 2009-2-4 21:25:45
我还计划 64位 的 HugeCalc,
将主动放弃对部分老型号的 CPU 的支持(即无相关指令集的),
追求的就是效率。
无心人
发表于 2009-2-4 21:28:16
:L
支持64位的系统,目前似乎都支持SSE2
当然Cell和MIPS等不是你考虑的吧,哈哈
liangbch
发表于 2009-2-4 21:28:31
回19#,这样虽然没有跳转指令,但对于任意一个输入,都要执行好多条指令,而我的那个汇编版本,对于任意一个数,最多仅需要执行8条指令。
另外,无心人如有时间的话,可测试一下各个版本,看看那个更快。
无心人
发表于 2009-2-4 21:30:27
就是说,要找到个少于8条指令的SIMD版本
无心人
发表于 2009-2-4 21:36:42
刚尝试SSE2,大概在20条指令左右, 不理想
无心人
发表于 2009-2-5 08:23:40
利用宝宝的思路能得到一个简单的汇编算法
假设初始化一个表,有32项,每项两个值,
对i = 0..31
第一个是2^i, 如果2^i < 10^k < 2^(i+1), 则是10^k
第二个是第一个的题目意义的位数
假设表名t
t [] = {1, 1, 2, 1, 4, 1, 10, 2, 16, 2, 32, 2, 100, 3, 128, 3, 256, 3, 1000, 4, 1024, 4, 2048, 4, 4096, 4, 10000, 5, 16384, 5, 32468, 5
100000, 6, 131072, 6,262144, 6, 1000000, 7, 1048576, 7,2097152, 7,4194304, 7, 10000000, 8,16777216, 8
33554432, 8, 100000000, 9,134217728, 9,268435456, 9, 1000000000, 10, 1073741824, 10,2147483648, 10}
无心人
发表于 2009-2-5 08:26:08
movedx, n
bsrecx, edx
push ebx
mov eax,
movebx, eax
sub ebx, 1
cmpedx,
cmovbeax, ebx
pop ebx
=====================
9条指令
无心人
发表于 2009-2-5 08:29:19
或者利用setcc
mov edx, n
bsrecx, edx
mov eax,
push ebx
xor ebx, ebx
cmp edx,
setb bl
sub eax, ebx
pop ebx
=====================
还是9条, 如果能想办法只用3个寄存器,则就更完美了
无心人
发表于 2009-2-5 08:34:57
===========================
mov eax, n
bsrecx, eax
xor edx, edx
cmpeax,
setb dl
mov eax,
sub eax, edx
============================
7条指令!!!!