【问题标题】:What are the benefits of using smaller registers, e.g. al vs eax / rax使用较小的寄存器有什么好处,例如al vs eax / rax
【发布时间】:2014-01-13 20:06:36
【问题描述】:

我注意到 GHC 的代码生成器当前不输出使用任何低位机器寄存器(如 al)的程序集。甚至字节大小的操作都是在 64 位机器上使用 rax 和在 32 位机器上使用 eax 实现的。然而,GCC 经常使用这些较小的寄存器。

使用像al这样的小型寄存器有什么真正的性能优势


到目前为止我听到的一个建议是inc al 的操作码小于inc rax(但不小于inc eax)。为什么要使用小型寄存器,是否还有其他非性能方面的考虑?

【问题讨论】:

  • 一些移位指令只需要cl。在这种情况下,您需要使用一个小寄存器。
  • 除了更小的编码之外,一些指令使用 8 位比 32 位更快。
  • 我认为每个人都在暗示的答案在于编码。我不一定会使用 GCC 输出作为参考。英特尔文档可以/将显示各种指令的编码,例如,如果要添加两个小数字,则不一定需要 64 位的立即数,而可能需要 16 位。同样,每条指令可以使用一个字节的操作码,而不是两个或更多。除了二进制获取不动产带宽、指令数量和每个指令的大小之外,它还变成了对我们隐藏的微码问题。

标签: assembly compiler-construction


【解决方案1】:

在 x86-64 上使用 64 位寄存器 (rxx) 需要操作码前缀。因此指令更长,在内存和指令缓存中占用更多空间。我不知道它是否也会减慢解码速度。 如果在不适合 L1 指令缓存的循环中使用较大的代码,则代码大小可能会损害性能。

【讨论】:

    【解决方案2】:

    如果您只将 al 用于 8 位值,则会将 ah 留给第二个。

    加载 ax 与 rax可能提供内存带宽优势。但是,它也可能导致问题。那里要小心。

    【讨论】:

    • 子寄存器不能重命名,这会限制处理器并行操作的能力。大多数现代编译器将零扩展字节以填充目标寄存器以避免错误的依赖。
    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多