无论如何,是否有比pmullw更有效地将pmaddubsw用于无符号乘法的无符号运算?

问题描述

Pmaddubsw一个引人入胜的指令,因为它执行无符号乘无符号运算。实际上,这意味着操作数的顺序很重要,如果您尝试将一个无符号值乘以一个具有大于127的值的有符号值,那么在最终的位表示形式中将得到相当意外的结果。>

这对我很有趣,因为我正在为WebAssembly SIMD指令集提议扩展(从8位到16位)的水平乘加指令。

然后我要确定哪种方法是针对以AVX为目标的x86_64上的所述指令的理想实现。如果我可以在1-op中使用pmaddubsw,那将比pmullw,pand,psrlw所需的7 op解决方案更为理想。但是由于无符号乘法的局限性,我不确定是否有可能以1-op结束无符号结果,或者至少得到的解决方案比pmullw,pand,psrlw解决方案好

我想出的与行为相符的唯一方法屏蔽,移位并两次调用pmaddubsw,这将产生相同数量的指令,不一定是最佳的解决方案。

您可以在Godbolt here.上看到这两者

旁注:某人的任务不同,但目标与此类似-Unsigned Multiplication using Signed Multiplier

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)