C 汇编中的纯高位乘法?

C 汇编中的纯高位乘法?,c,assembly,x86,C,Assembly,X86,要实现介于0和1之间的实数,通常使用ANSI浮点或双精度浮点。但是,0到1之间的固定精度数字(小数模1)可以有效地实现为32位整数或16位字,它们与普通整数/字一样相加,但以“错误的方式”相乘,这意味着当你将X乘以Y时,你保留了乘积的高阶位。这相当于乘以0.X和0.Y,其中X的所有位都在小数点之后。类似地,-1和1之间的有符号数也可以通过这种方式实现,只需一个额外的位和一个移位 如何在C中实现固定精度mod 1或mod 2(特别是使用MMX或SSE)? 我认为这种表示法对于酉矩阵的有效表示,对于

要实现介于0和1之间的实数,通常使用ANSI浮点或双精度浮点。但是,0到1之间的固定精度数字(小数模1)可以有效地实现为32位整数或16位字,它们与普通整数/字一样相加,但以“错误的方式”相乘,这意味着当你将X乘以Y时,你保留了乘积的高阶位。这相当于乘以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);
}
允许您以任何方式使用它;-)