装配中纯粹的高位乘法?

时间:2012-05-07 07:25:10

标签: c assembly x86

要实现0到1之间的实数,通常使用ANSI浮点数或双精度数。但是0到1之间的固定精度数(模数为1的小数)可以有效地实现为32位整数或16位字,它们像正常的整数/字一样添加,但是乘以“错误的方式”,这意味着当你乘以X倍时是的,你保留了产品的高位。这相当于乘以0.X和0.Y,其中X的所有位都在小数点后面。同样,-1和1之间的带符号数也可以通过一个额外的位和一个移位来实现。

如何在C中实现固定精度mod 1或mod 2(特别是使用MMX或SSE)? 我认为这种表示对于单位矩阵的有效表示非常有用,对于数值密集的物理模拟。它使更多MMX / SSE具有整数量,但您需要更高级别的PMULHW访问权限。

1 个答案:

答案 0 :(得分:10)

如果16位定点运算已足够且您使用的是x86或类似的架构,则可以直接使用SSE。

SSE3指令pmulhrsw直接在硬件中实现带符号的0.15定点算术乘法(你称之为mod 2,从-1 .. + 1)。添加与标准16位向量操作没有什么不同,只是使用paddw

因此,一次处理乘法和添加8个有符号16位定点变量的库可能如下所示:

typedef __v8hi fixed16_t;

fixed16_t mul(fixed16_t a, fixed16_t b) {
    return _mm_mulhrs_epi16(a,b);
}

fixed16_t add(fixed16_t a, fixed16_t b) {
    return _mm_add_epi16(a,b);
}

允许以您​​喜欢的任何方式使用它; - )