assembly中纯粹的高位乘法?

要实现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访问权限。

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

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

因此,一次处理乘法和添加八个带符号的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); } 

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