如何使用SSE2指令集将两个带符号的32位整数相乘?
答案 0 :(得分:0)
pmuldq
是一条SSE4.1指令,但是SSE2有pmuludq
并使用“将无符号高阶产品转换成签名”算法(在Hacker's Delight 8.3节中找到)高dword可以修复。低dword当然已经是正确的了。
这是我在asm的尝试,我根本没有测试过。
movdqa xmm2, xmm0
psrad xmm0, 31
movdqa xmm3, xmm1
psrad xmm1, 31
pand xmm2, xmm0
pand xmm3, xmm1
paddd xmm2, xmm3
pmuludq xmm0, xmm1
pshufd xmm2, xmm2, 0xB1
psubd xmm0, xmm2
除了它的倍数之外的dword在开头必须为零。它看起来与Hacker's Delight略有不同,因为我将算法的最后一位重新排列为p = p - (t1 + t2)
(保存了一个shuffle)。