armv8 中的 MOV 指令使用哪个处理器部分

Which processor part does a MOV instruction in armv8 use

假设我有以下指令 - MOV X5, XZR
这条 MOV 伪指令将使用处理器硬件的哪一部分?我的意思是 - MOV 指令是否需要使用 ALU 或内存?这显然需要访问寄存器。

我很好奇,因为我正在阅读教科书 "Computer Organization and Design",作者在其中讨论了 2-issue 处理器。 2 条指令在同一个数据包中的要求是,如果一条指令是内存指令,则另一条指令必须是 ALU/Logic 或分支。我上面说的指令后面跟着一个Branch指令,我不确定这2条指令是否可以在同一个数据包中。

如果您能分享一些有关此伪指令实际如何实现的信息,那也会非常有帮助。感谢您的帮助。

XZR 是寄存器的别名,它总是 returns 0 并且只能更改为 0。它在 AArch64 中是新的,但其他 RISC 喜欢MIPS 一直有一个零寄存器。 (32 位 ARM / Thumb ARMv8 模式是一种不同的架构,某些 AArch64 CPUs 也可以执行。)

寄存器不存在于内存中并且不涉及内存,除非指令将数据从内存移动到寄存器,反之亦然。

这条指令基本上是通过将一个寄存器复制到另一个寄存器来将寄存器 X5 设置为零。

ARM 是整个 "RISC" 范例的一部分,具有一些实际的效率妥协。 AArch64 让它变得更加 RISCy,删除了一些使现代超标量管道复杂化的 ARM 东西,并将寄存器扩展到 64 位。该 RISC 范式的一些设计原则是:

  • 提供了大量寄存器。 AArch64 有 32 个整数寄存器,高于 ARM 中的 15 个(不包括程序计数器)。 (与当天 x86 的 8 相比,这仍然很大)。
  • 有加载和存储数据的指令 to/from 寄存器(因此 RISC 也被称为 "load-store architecture")
  • 其他指令(例如 ADD、SUB 等)只对寄存器起作用 - 寄存器与内存操作有限。所以像 "Add what's at memory location 1000 to register X" 这样的东西不被使用——你必须 "Load X2 with what's at memory location 1000" 然后 "X = X + X2"。 (add reg, mem 甚至 add mem,reg 是 RISC 避免的经典 CISC 功能。)

所以考虑到遗留问题,您可能会将这条指令放在 "ALU" 类别中,因为它根本不与内存对话, 并且它只在整数寄存器(不是 FP/vector)。就流水线的其余部分而言,它只读写整数寄存器值,不读写内存,也不会分支。

但是 ALU 在 CPU 上所做的是:ALU 接受输入,执行操作,然后将其传递到输出。在 RISC 中,输入总是寄存器。

使用 MOV,没有任何操作,输入只是传递到输出。它可以绕过 ALU,或者为了简单起见,数据路径仍然通过带有控制信号的 ALU,使其执行类似 OR 和 0 的操作,因此值不变。

如你所见,现实世界并不像你的教科书那么整洁。我不知道任何给定 ARM CPU 中的管道实际上是如何工作的。

问题实际上与任何特定的 ISA 无关,尽管他的示例使用的是 AArch64 指令助记符,但它是关于 CPU 微架构的。特别是关于 2 路超标量、有序微体系结构。答案将针对任何特定的微架构 "it depends" 是否可以同时安排 2 条指令。因此,根据您查看的设计,您会得到不同的答案。构建 CPU 涉及许多权衡,以实现所需的功率、性能和面积目标,这就是答案会有所不同的原因。

由于您正在阅读 "Computer Organization and Design" 入门级 CPU 微架构教科书,让我们将微架构简化为一些理想主义的东西,而不是让自己关注工业设计这一点可能只会让您更加困惑。假设您的微架构有 2 个相同的 3 级管道,可以在没有旁路网络的情况下在一个周期内处理所有操作。您的管道现在看起来像:

| Fetch0 | -> | Decode0 | -> | Execute+Writeback |
| Fetch1 | -> | Decode1 | -> | Execute+Writeback |

在这种简化的情况下,答案是在解码期间,您的两个解码器必须对两条指令进行寄存器依赖性分析。如果 mov 产生一个寄存器 branch 消耗,它们不能一起执行,你必须延迟分支直到 mov 执行,否则它们可以一起流下管道。

当然,在具有不对称执行资源、更多流水线阶段、多周期指令、旁路网络、去耦合的实际设计中,决定什么可以配对或不配对会变得更加复杂 fetch/execute和投机执行,仅举几个交易的微架构技巧。

如果您有兴趣了解商业设计是否可以将两种特定类型的指令配对在一起,您可以随时查看设计的软件优化指南(如果有)以了解每条指令使用的资源。例如,这里是 Arm Cortex A-55 Optimization Guide.