orpd 等 SSE2 指令有什么意义?

What is the point of SSE2 instructions such as orpd?

orpd 指令是 "bitwise logical OR of packed double precision floating point values"。这不是和 por ("bitwise logical OR") 做的完全一样吗?如果是这样,拥有它有什么意义?

请记住,SSE1 orps came first. (Well actually MMX por mm, mm/mem 甚至在 SSE1 之前就出现了。)

具有新前缀的相同操作码是 SSE2 orpd 指令对于硬件解码器逻辑来说是有意义的,我想,就像 movapdmovaps 一样。 pspd 版本之间的一些指令是多余的,但有些不是,比如 addpsaddpdunpcklpsunpcklpd 是不同的洗牌。

SSE2 还引入 66 0F EB /r por xmm,xmm/mem 的原因至少部分是为了与 MMX 0F EB /r por mm, mm/mem 保持一致,同样的操作码具有新的强制性前缀。就像 paddb mm, mmpaddb xmm, xmm.

但也考虑到 vec-integer 与 FP 的不同 bypass-forwarding 域的可能性。不同的微体系结构在实际解码方式和 运行 那些不同的指令方面有不同的行为。一些 运行 所有 XMM or 指令都以相同的方式进行,为 FP 和 simd-integer 域之间的转发创建额外的延迟。

没有任何 CPU 在 FP-float 和 FP-double 上有不同的转发域,所以是的,movapdorpd 在实践中space 的无用浪费,你永远不应该使用。请改用较小的 orps 编码。

(或者使用 VEX 编码没关系;vorpsvorpd 大小相同:2 字节前缀 + 操作码 + modrm ...)


por 对比 orps

有关在 addps 等 FP 数学指令之间使用 por 或在 paddb 等 SIMD-integer 指令之间使用 orps 时的旁路延迟的更多信息,请参阅


如果有人想知道,请回答标题的其他解释:FP 值上的按位布尔值主要用于设置、清除或切换符号位。或者用 cmpps/pd 蒙版做一些事情,比如混合。