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 寄存器,与通用寄存器的 e
和 r
扩展不同(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 个,因此这些寄存器的数量都增加了两倍。
我目前正在学习在 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 寄存器,与通用寄存器的 e
和 r
扩展不同(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 个,因此这些寄存器的数量都增加了两倍。