无心人 发表于 2009-2-3 21:29:25

:)

   好像,嵌入汇编只需要写出变量,编译器会自动翻译为对应的地址偏移形式吧

无心人 发表于 2009-2-3 21:34:22

:lol

可以得到几个结论
    1、位运算能不用就不用
    2、跳转不一定不好
    3、太追求精简也不行
=======================
不过综合来说, 59#是最好的

无心人 发表于 2009-2-3 21:40:14

呵呵, 59#原理和我36#是一样的
    我被宝宝说的不敢用ebx, esi, edi了
    看来用内存数据使用位指令并不好
    另外,push/pop完全可以用
    movd xmm0, ebx/movd ebx, xmm0代替
    应该还快点, 呵呵

无心人 发表于 2009-2-3 21:42:49

AMD 36#表现好,是否表示其内置内存控制器有比较优秀的内存Cache控制能力??

gxqcn 发表于 2009-2-3 21:44:04

回复 63# 无心人 的帖子

我不是说了吗:59# 改编自你的36#,
主要是将访问内存改成访问寄存器。

除了edx,eax,ecx,其它寄存器函数调用后是需要恢复原值的。

gxqcn 发表于 2009-2-3 21:49:45

对了,SSE4 出了个新指令:POPCNT,可以直接得到一个整数的bit=1的数目。

按照《Software Optimization Guide for AMD Family 10h Processors》上的说法:
典型延迟:POPCNT reg,reg 2POPCNT reg,mem 5
最慢情况都是6

看来效率要好于BSF/BSR

老兄可否调试出一版?(我是没有那个条件了:( )

无心人 发表于 2009-2-3 21:52:06

:)

Intel支持么?
你家俩电脑,比俺强多了

   你测试下,用 xmm保存ebx 的情况
   应该能节约掉一部分内存读写
   至少xmm 读写速度是一级缓存的2-3倍吧

无心人 发表于 2009-2-3 21:57:21

http://en.wikipedia.org/wiki/SSE4
   
    :L
       好像i7才支持popcnt
       AMD的U俺学校是么有的

gxqcn 发表于 2009-2-3 21:58:30

回复 67# 无心人 的帖子

考虑到兼容性,在效率保证的前提下,尽量用较老的指令集。

这样吧,考虑到要移植到64bit平台,
大家可以接着来写个:UINT64 GreaterEqualBit2( UINT64 n /* 1 <= n <= 2^63+2^62 */ )顺便对64位平台下的汇编练练手:) (应该更游刃有余,因为可用寄存器更多了)。

无心人 发表于 2009-2-3 22:18:17

:b:
   那简单了,去掉push ebx/pop ebx
   使用r8替换ebx
   rax替换eax, rcx替换ecx,rdx替换edx
    ...
   OK
页: 1 2 3 4 5 6 [7] 8 9 10 11
查看完整版本: 求bit位为1数目不超出2的正整数