首页 > 解决方案 > 无论如何,是否有比 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 上看到两者。

旁注:有人有不同的任务,但与这个问题有相似的目标 - Unsigned Multiplication using Signed Multiplier

标签: c++assemblysimdwebassembly

解决方案


推荐阅读