好像,嵌入汇编只需要写出变量,编译器会自动翻译为对应的地址偏移形式吧 :lol
可以得到几个结论
1、位运算能不用就不用
2、跳转不一定不好
3、太追求精简也不行
=======================
不过综合来说, 59#是最好的 呵呵, 59#原理和我36#是一样的
我被宝宝说的不敢用ebx, esi, edi了
看来用内存数据使用位指令并不好
另外,push/pop完全可以用
movd xmm0, ebx/movd ebx, xmm0代替
应该还快点, 呵呵 AMD 36#表现好,是否表示其内置内存控制器有比较优秀的内存Cache控制能力??
回复 63# 无心人 的帖子
我不是说了吗:59# 改编自你的36#,主要是将访问内存改成访问寄存器。
除了edx,eax,ecx,其它寄存器函数调用后是需要恢复原值的。 对了,SSE4 出了个新指令:POPCNT,可以直接得到一个整数的bit=1的数目。
按照《Software Optimization Guide for AMD Family 10h Processors》上的说法:
典型延迟:POPCNT reg,reg 2POPCNT reg,mem 5
最慢情况都是6
看来效率要好于BSF/BSR
老兄可否调试出一版?(我是没有那个条件了:( ) :)
Intel支持么?
你家俩电脑,比俺强多了
你测试下,用 xmm保存ebx 的情况
应该能节约掉一部分内存读写
至少xmm 读写速度是一级缓存的2-3倍吧 http://en.wikipedia.org/wiki/SSE4
:L
好像i7才支持popcnt
AMD的U俺学校是么有的
回复 67# 无心人 的帖子
考虑到兼容性,在效率保证的前提下,尽量用较老的指令集。这样吧,考虑到要移植到64bit平台,
大家可以接着来写个:UINT64 GreaterEqualBit2( UINT64 n /* 1 <= n <= 2^63+2^62 */ )顺便对64位平台下的汇编练练手:) (应该更游刃有余,因为可用寄存器更多了)。 :b:
那简单了,去掉push ebx/pop ebx
使用r8替换ebx
rax替换eax, rcx替换ecx,rdx替换edx
...
OK