【发布时间】:2020-09-18 13:22:12
【问题描述】:
orpd 指令是“压缩双精度浮点值的按位逻辑或”。这与por(“按位逻辑或”)不完全相同吗?如果是这样,拥有它有什么意义?
【问题讨论】:
标签: assembly x86 sse instruction-set sse2
orpd 指令是“压缩双精度浮点值的按位逻辑或”。这与por(“按位逻辑或”)不完全相同吗?如果是这样,拥有它有什么意义?
【问题讨论】:
标签: assembly x86 sse instruction-set sse2
请记住,SSE1 orps 先出现。 (实际上MMX por mm, mm/mem 甚至在 SSE1 之前就出现了。)
我猜,具有新前缀的相同操作码是SSE2 orpd 指令对于硬件解码器逻辑是有意义的,就像movapd 与movaps 一样。在ps 和pd 版本之间,类似这样的一些指令是多余的,但有些不是,例如addps 与addpd 或unpcklps 与unpcklpd 是不同的洗牌。
SSE2 也引入 66 0F EB /r por xmm,xmm/mem 的原因至少部分是为了与 MMX 0F EB /r por mm, mm/mem 保持一致,同样的操作码具有新的强制性前缀。就像paddb mm, mm 与paddb xmm, xmm。
但也考虑到 vec-integer 与 FP 的不同绕过转发域的可能性。不同的微架构对于它们如何实际解码和运行这些不同的指令有不同的行为。有些人以相同的方式运行所有 XMM or 指令,从而为 FP 和 simd-integer 域之间的转发产生额外的延迟。
对于 FP-float 和 FP-double,没有任何 CPU 实际上具有不同的转发域,所以是的,movapd 和 orpd 实际上是你不应该使用的无用空间浪费。请改用较小的orps 编码。
(或者使用 VEX 编码也没关系;vorps 和 vorpd 大小相同:2 字节前缀 + 操作码 + modrm ...)
por 与 orps
有关在addps 等 FP 数学指令之间使用por 或在paddb 等 SIMD 整数 insn 之间使用orps 时绕过延迟的更多信息,请参阅
如果有人想知道,对标题的另一种解释的答案是:FP 值上的按位布尔值主要用于设置、清除或切换符号位。或者用 cmpps/pd 掩码做一些事情,比如混合。
【讨论】:
addps -> addpd。这仅适用于实际数学,而不是布尔值或洗牌。 addps 可以毫无延迟地转发到 unpcklpd,因此这不是 3 个单独的旁路网络的证据,也不是存在 orpd 的任何理由。有证据表明,BD 保留了要重用的向量元素的额外内容,并且在转发 FMA->FMA 时比 orps -> FMA 具有更低的延迟。
orpd / orps。只有实际的数学。假设 Agner Fog 的总结是完全准确的。对于 K8/K10 确实考虑了重新格式化延迟作为假设,但基于仅看到 i-vec 和 FP 之间的额外延迟而不是该 uarch 系列的单精度和双精度指令之间的额外延迟而拒绝了它。