【问题标题】:In x64, using "pop [RAX]", where is the value temporarily stored?在 x64 中,使用“pop [RAX]”,值临时存储在哪里?
【发布时间】:2020-01-19 21:47:42
【问题描述】:

我找到的答案解释了在 x86 平台上,如果没有将值存储在两者之间的某处,则无法直接进行内存到内存复制。

mov rax,[RSI]
mov [RDI],rax

我使用 pop 大量使用 64 位写入内存,这似乎直接将值从内存复制到内存,没有任何明显的“中间人”。

在写入之前,读取之后的值在哪里?

【问题讨论】:

    标签: assembly x86 x86-64 cpu-architecture


    【解决方案1】:

    临时位置是 CPU 内部某个不属于架构状态的缓冲区。

    在像 Skylake 这样的现代 x86 上,pop [mem] 解码为 2 个 uop,所以大概第一个 uop 是一个内部寄存器的 pop,第二个是一个存储。

    我们知道现代 x86 CPU 确实有一些额外的逻辑寄存器保留供微码和多微指令指令使用,如此类。它们以与体系结构寄存器相同的方式重命名到物理寄存器文件中。例如http://blog.stuffedcow.net/2013/05/measuring-rob-capacity/ 提到“一些额外的架构寄存器供内部使用”。亨利称它们为“建筑”寄存器,但这可能会引起混淆。他只是指逻辑而不是物理,架构寄存器。这些临时寄存器不(AFAIK)跨指令边界使用,仅在一条 x86 指令中使用。

    原始 8086 是非流水线的(指令预取除外),因此实现 pop [mem] 的内部微代码或逻辑可能只是从某个特殊用途的缓冲区加载然后存储。与 add [mem], reg 类似,但加载与存储的地址不同,并且没有通过 ALU 提供。

    在 x86 上无法进行内存到内存的直接复制。

    您可能指的是Why IA32 does not allow memory to memory mov? 上已接受的答案之类的东西,不幸的是,对原因的解释完全是错误的并且非常具有误导性。

    这是使mov [mem], [mem] 不可能的指令编码 限制,而不是CPU 内部的限制。请参阅What x86 instructions take two (or more) memory operands?
    pop [mem] 是其中之一,因为其中一个内存操作数是隐式。即使是原始的 8086 也可以做到这一点。


    我使用 pop 大量使用 64 位写入内存

    如果前端 uop 吞吐量或端口 2/3 压力是瓶颈,请考虑使用堆栈中的 128 位 SSE 负载,然后使用 movlpsmovhps 存储 64 位一半。在当前的 Intel CPU(如 Skylake)上,movhps [mem], xmm0 是一条单指令。 (实际上是微融合的;所有存储都是存储地址 + 存储数据。但无论如何,不​​需要像 pextrq 的无用内存目标形式那样的端口 5 shuffle uop。

    或者,如果您的目的地是连续的,请执行 128 位或 256 位副本。

    pop [mem] 有一些用例,但它并不出色,而且在主流 Intel 上通常不会比 pop reg / mov [mem], reg 快,因为它仍然是 2 微秒。它确实有安全的代码大小,但不需要 tmp reg。

    https://agner.org/optimize/

    【讨论】:

      【解决方案2】:

      pop [rax] 是执行内存到内存操作的方法之一。弹出的值可能存储在两者之间的某个位置,但这是一个实现细节。这些答案的意思是,使用 modr/m 字节作为其操作数的指令最多可以有一个内存操作数。这些是大多数指令,但不是像 movsb [rdi], [rsi] 这样的指令,它们的操作数内置在指令中。

      【讨论】:

      • 哇,我忘了 movsb/etc。我会说,如果您删除“可能”,那么我可以接受它作为答案。这个“可能”让我很困扰,因为它必须存储在公众一无所知的一些实现细节后面的某个地方,对吗?对于可能会出现吹毛求疵或“语义”的问题,我深表歉意。
      • @z0rberg's 可能有人以这样一种方式实现了 x86,即数据直接从一个内存位置传输到另一个内存位置(例如,通过连接两个内存的数据总线),但这不太可能.由于没有强制要求中间寄存器的规范,我只能说“可能”。我也可以说“一般;”这会让你满意吗?
      • 你的回答让我笑了。 “连接两个存储器的数据总线。”没关系。感谢您花时间写回复。我会接受它作为答案。太糟糕了,显然没有更多关于这方面的知识。
      • @z0rberg's 恰恰相反,有!让我看看是否可以找到一些进一步的阅读材料,可以帮助您更深入地了解这一点。
      • @z0rberg's 抱歉,我没有找到真正的 x86 处理器中发生的任何事情。如果我发现任何具体的事情,我会回复你。
      猜你喜欢
      • 1970-01-01
      • 2012-02-24
      • 2011-03-02
      • 2012-11-14
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多