c++ - 无论如何,是否有比 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 两次,这会产生相同数量的指令,但不一定是更优化的解决方案。
旁注:有人有不同的任务,但与这个问题有相似的目标 - Unsigned Multiplication using Signed Multiplier
解决方案
推荐阅读
- angular - How to access a Set after asynchronous calls are complete
- vue.js - 将图像位置动态传递给 Bootstrap-Vue 的 b-card 似乎不起作用?
- java - 使用 Selenium 在 whatsapp 上分享图像 - Java
- pyspark - Pyspark dataproc 作业失败
- javascript - 如何用您自己的文本更改选择框文本
- javascript - 脚本不显示新记录,它只是继续显示相同的记录
- ssis - SSIS 阻止从已存在于 SQL Server 表中的平面文件中插入数据行
- dart - Flutter 如何播放 youtube 播放列表视频?
- android - 在包含 RecyclerView 的 Activity 中加载片段
- mysql - 返回日期时间列介于用户输入的日期、小时和小步舞曲之间的数据