MMX 和 XMM 寄存器之间的区别?

difference between MMX and XMM register?

我目前正在学习在 Intel x86 处理器上进行汇编编程。

谁能给我解释一下,MMX和XMM寄存器有什么区别?我对它们的作用以及它们之间的异同很困惑?

MM 寄存器是 MMX 指令集使用的寄存器,这是将(仅整数)SIMD 添加到 x86 的首次尝试之一。它们是 64 位宽,它们实际上是 x87 寄存器尾数部分的别名(但它们不受 FPU 栈顶位置的影响);这样做是为了保持与现有操作系统的兼容性(它已经在上下文切换时保存了 FPU 堆栈),但是将 MMX 与浮点一起使用是一项非常重要的工作。

现在它们只是历史上的怪事,我认为没有人真正使用 MMX,因为它已经完全被各种 SSE 扩展所取代。 编辑:正如 Peter Cordes 在评论中指出的那样,仍然有相当多的 MMX 代码。


XMM 寄存器是一个完全独立的寄存器集,由 SSE 引入,至今仍在广泛使用。它们有 128 位宽,指令可以将它们视为 64 位、32 位(整数和浮点数)、16 位或 8 位(仅整数)值的数组。在 32 位模式下有 8 个,在 64 位模式下有 16 个。实际上,所有浮点数学都是在 64 位模式下在 SSE(以及 XMM 寄存器)中完成的,因此,与 MMX 寄存器不同,它们仍然非常相关。

现在你可能还会遇到YMM和ZMM寄存器;它们分别与 AVX (2011) 和 AVX-512 (2015) 指令集一起引入,并且它们扩展了 XMM 寄存器,与通用寄存器的 er 扩展不同(rax extended eax which extended ax which can be accessed as ah:al).

在支持 AVX 的处理器中,XMM 寄存器文件中的每个寄存器都扩展到 256 位。整个 256 位寄存器被称为 YMMx(x 从 0 到 15),可以被新的 AVX 指令使用,下半部分是 XMMx,并且仍然可以被旧的 SSE 指令使用。

同理,AVX-512将上述寄存器扩展为512位;整个寄存器是 ZMMx(可用于 AVX-512 指令),低 256 位是 YMMx(也可用于 AVX 指令),低 128 位仍然是 XMMx(也可用于 SSE)。此外,寄存器数量增加到 32 个,因此这些寄存器的数量都增加了两倍。