If you have a full 32-bit number and you need to divide, you can simply do a multiply and take the top 32-bit half as the result. This is faster because multiplication is faster than division. ( thanks to pdixon for the tip). 如果你有一个满32-bit(full 32-bit)的数要做除法,你可以简单地做乘法,然后取高32-bit部分作为结果。这样会快些,因为乘法比除法快!(感谢pdixon提供了这个tip)(译者注:由于水平有限,此tip翻译尚待商讨,而且不能给出一个例子。还仰仗各位帮忙。)
<12>被常数除
这儿有一些很好的信息----怎样被常数除(在Agner Fog的pentopt.pdf中)。我(Mark Larson)写了一个小程序:可以根据你输入的除数自动产生汇编代码序列。我会继续探究探究,然后贴出来。这是Agner的文档的链接。Agner's Pentopt PDF (http://www.agner.org/assem/)
在P4上,MMS/SSE/SSE2指令的延迟那么长以至于我总是每个循环处理2个事件或者提前读取一个循环。如果你有足够的寄存器,可以多于2个事件。所有的各种各样的MOVE(包括MOVD)指令在P4上的速度都慢。所以2个32-bit的数字数组相加运算在P4上比P3上还慢。一个快点儿的方法可能就是每个循环(这个循环在FRED标号之前预读循环初始值MM0和MM1)处理两个事件。你必须做的只是在数组元素个数为奇时进行特殊的处理;在最后检查一下,如果为奇数,加一个额外的dword。这儿有个并没有提前读取值的代码段。我想,把它改为提前读取值是很容易的,所以我没有两个都贴出。下面的代码可以:在P4机上避免ADC这个速度慢的指令来把两个数组相加。 pxor mm7,mm7 ; the previous loops carry stays in here fred: movd mm0,[esi] ; esi points to src1 movd mm1,[edi] ; edi points to src2, also to be used as the destination paddq mm0,mm1 ; add both values together paddq mm0,mm7 ; add in remainder from last add movd [edi],mm0 ; save value to memory movq mm7,mm0 psrlq mm7,32 ; shift the carry over to bit 0 add esi,8 add edi,8 sub ecx,1 jnz fred movd [edi],mm7 ; save carry