逻辑/算术移位更少的位更快吗?

She*_*Cao 2 c++ performance x86 assembly cpu-architecture

x>>2不是更快x>>31?换句话说,sar x, 2sar x, 31? 我做了一些简单的测试,它们似乎具有相同的速度。我将不胜感激任何确凿的证据。

mka*_*alp 6

这将取决于硬件实现。对于涉及常量移位的常见操作(例如指针算术),可能存在更快的路径(例如,它可能与相关的加法运算融合)。对于变量移位,使用桶形移位器电路,其中任何移位量都具有相同的延迟。

  • https://uops.info/ 和 https://agner.org/optimize/ 有实际 x86 CPU 指令的编号。众所周知,Pentium 4 的转换速度很慢,但延迟/吞吐量仍然固定(不依赖于数据)。大多数 CPU 对于任何移位计数都有 1 个周期的延迟。(在现代 Intel CPU 上,编译时间常数变化很大,但是当计数是运行时变量时,`shr reg, cl` 解码为 3 uops [因为 x86 遗留包袱,如果计数为 0,则不会更新 FLAGS] (/sf/answers/2555760581/)。除非你让编译器使用 BMI2 `shlx` / `shrx`。不过,延迟只有 1 个周期。) (2认同)
  • Intel 早在 386SX 就有一个桶形移位器:https://media.digikey.com/pdf/Data%20Sheets/Intel%20PDFs/Intel386%20SX.pdf#page=84 列出寄存器移位/旋转的周期计数为3 个循环,用于按 1 移位、按 CL 移位或按立即数移位。(相比之下,像“add reg,reg”这样的指令需要 2 个周期)。最后一个具有取决于计数的移位性能的 Intel x86 似乎是 286:https://www2.math.uni-wuppertal.de/~fpf/Uebungen/GdR-SS02/opcode_i.html 有一个 8088 的表。 .奔腾。**8088 为 8 + 4n,186 和 286 为 5 + n。386 是固定的 3 个周期**。 (2认同)