无心人 发表于 2008-3-31 17:10:56

高难度汇编问题: 64位乘

有64位整数保存在xmm0, xmm1低64位
不借助任何其他寄存器,只使用xmm0-xmm7
在20条SSE2指令内计算xmm0 = xmm0 * xmm1
如果达不到20条,24条内也可以

无心人 发表于 2008-4-1 07:58:06

pshufd xmm0, xmm0, 11011100b
movdqu xmm2, xmm0
pshufd xmm1, xmm1, 11011100b
pmuludq xmm0, xmm1
movdq2q mm0, xmm0
psrldq xmm0, 8
movdq2q mm1, xmm0
pshufd xmm1, xmm1, 11001110b
pmuludq xmm1, xmm2
movdq2q mm2, xmm1
psrldq xmm1, 8
movdq2q mm3, xmm1
movd eax, mm0
psrlq mm0, 32
paddq mm0, mm2
movd ebx,mm3
movd mm2, ebx
psrld mm3, 32
paddq mm0, mm2
paddq mm1, mm3
movd ebx, mm0
psrldq mm0, 32
paddq mm1, mm0
movd mm2,ebx
movd mm0, eax
psrlq mm2, 32
paddq mm0, mm2
movq2dq xmm1, mm1
movq2dq xmm0, mm0
psrldq xmm1, 8
paddq xmm0, xmm1

:( 31条

liangbch 发表于 2008-4-1 11:19:12

原帖由 无心人 于 2008-3-31 17:10 发表 http://images.5d6d.net/dz60/common/back.gif
有64位整数保存在xmm0, xmm1低64位
不借助任何其他寄存器,只使用xmm0-xmm7
在20条SSE2指令内计算xmm0 = xmm0 * xmm1
如果达不到20条,24条内也可以
楼主出此题 可能是想 找出一个解决长乘 算法的完美算法。这基本是徒劳的。
最根本的解决之道是:大数的表示法不能采用2^32进制,而转为采用 2^31 或者 2^30 进制,即采用每个DWORD存储31位或者30位2进制数,虽然浪费了一点存储空间,也带来乘法次数的增多(增加了大约1/15多一点),但其优点可完全抵消此缺点。并对算法的设计带来实质性的帮助。
对于使用ALU指令来说,可大大降低ADC指令的运行次数。
对于使用SSE2指令来说,可在ALU指令的基础上真正提速2倍,充分发挥SSE2指令 1次可计算2个32bit×32bit和 64bbit + 64bit的能力。平均而言,每次30 bit × 30bit的运算仅需要使用3条指令。
   
   举例来说,以那个128bit*128bit 的 函数为例,需要 4×4次 32bit × 32bit 的乘法,平均每次 32bit × 32bit 的乘 需要使用 6条以上的指令,以此推算,一个15DWORD( 15×32bit) × 15DWORD 的乘法 需要 15×15×6= 1350次 指令。而依照本方法,采用2^30进制,一个15×32bit的数需要 16个DWORD 存储,故采用此方式存储,需要16×16次 30bit* 30bit的乘法,所以需要 16*16*3=768条指令,相比前者的1350条指令,单指令数而言,减少至先前的57%,若以指令数和运行时间成反比(即假定每条指令的时间均相同),则此法可提速75%。

无心人 发表于 2008-4-1 13:45:43

别在这里讨论了
这个题目我自己也失败了
页: [1]
查看完整版本: 高难度汇编问题: 64位乘