MMX 寄存器和 XMM 寄存器有什么区别?

37

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

请问有没有人能够解释一下,MMX寄存器和XMM寄存器之间的区别?我非常困惑它们各自的功能以及它们之间的异同。


3
{btsdaf} - Peter Cordes
1个回答

44

MM寄存器是指MMX指令集使用的寄存器,它是向x86添加(仅整数)SIMD的第一次尝试之一。它们的宽度为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扩展为eax,扩展为ax,可以访问为ah:al)。

在支持AVX的处理器中,XMM寄存器文件中的每个寄存器都扩展到256位。整个256位寄存器称为YMMx(x从0到15),可以被新的AVX指令使用,其中下半部分为XMMx,仍可用于旧的SSE指令。
同样地,AVX-512将寄存器扩展到512位;整个寄存器为ZMMx(可与AVX-512指令一起使用),下半部分为YMMx(也可与AVX指令一起使用),最低128位仍可使用XMMx(也可与SSE一起使用)。此外,寄存器数量增加到32个,因此这些寄存器既更大又数量翻了两倍。

2
嗯,我学习汇编语言的大部分都是意外的... 我所了解的x86汇编语言主要来自于对C/C++应用程序进行性能分析、死亡调试和反向工程,以及一些有趣的代码高尔夫挑战,我通常会用16位x86汇编来解决这些问题。很长一段时间,我并没有真正地“学习”它,只是因为它经常出现在我的面前,我最终会知道一些关于它的东西。然后,通过阅读相当多的Intel IA32/EMT64手册,我加深了对它的了解。 - Matteo Italia
2
另一个没有人再使用MMX的原因是因为x86-64根本不支持它。 - Cody Gray
5
x264和ffmpeg仍然有很多MMX代码,其中一些即使在具有SSE2和AVX2的CPU上也会被使用。将一些功能重写为使用XMM的低半部分进行8B处理可能会略微提高速度。 @CodyGray:那是完全的无稽之谈。x86-64(指令集架构)绝对包括x87/MMX寄存器。所有现代的x86-64操作系统都会保存/恢复x87状态(因此也会保存/恢复MMX状态)。微软已经说过,他们不鼓励在x86-64中使用MMX,但即使他们的编译器内置函数不起作用,它确实在汇编级别上可以正常工作。 - Peter Cordes
2
据我所知,这些都是无稽之谈。https://chessprogramming.wikispaces.com/MMX?responseToken=e9501a67e04a4f7c3efc2f4cde3d715e#MMX%20and%2064-bit%20Windows。微软的工具链可能会拒绝汇编MMX或x87指令,但操作系统级别的上下文切换支持仍然存在。据我所知,GNU工具链(和NASM/YASM)在Win64上的MMX可以正常工作。然而,内核代码不能使用MMX,只能使用SSE/AVX:https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/floating-point-support-for-64-bit-drivers。 - Peter Cordes
1
1)通常是SSE。2)不知道,从未使用过MASM32;但是在32位代码中,x87是“传统”的选择。3)“很复杂”。这些“胖”寄存器实际上持有具有常规大小的值数组 ;唯一比常规寄存器大的类型就是128位整数。支持SSE的编译器通常提供相应的额外类型来表示SSE寄存器。4)XMMWORD / YMMWORD。5和6)我看不出问题…由高级语言公开的类型不受硬件限制。 - Matteo Italia
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接