Mik*_*keF 5 x86 x86-64 intel cpu-architecture avx
我试图了解SSE / AVX指令的VEX前缀编码。因此,请问我是否提出简单的要求。我有以下相关问题。
让我们来看一下MOVUP(D / S)指令(0F 10)。如果我正确遵循2字节VEX前缀编码:
以下两种指令编码产生相同的结果:
db 0fh, 10h, 00000000b ; movups xmm0,xmmword ptr [rax]
db 0c5h, 11111000b, 10h, 00000000b ; vmovups xmm0,xmmword ptr [rax]
Run Code Online (Sandbox Code Playgroud)
由于这两个:
db 066h, 0fh, 10h, 00000000b ; movupd xmm0,xmmword ptr [rax]
db 0c5h, 11111001b, 10h, 00000000b ; vmovupd xmm0,xmmword ptr [rax]
Run Code Online (Sandbox Code Playgroud)
因此,我的问题是:
v这些说明中的第一个代表什么?仅仅是表示VEX前缀的使用吗?
如果我VEX在上面的示例中使用或不使用前缀,是否有任何区别(指令长度除外)?
我试图在他们的文档中了解Intel的语法。说,此屏幕截图:
在VEX.128.0F.WIG我可以看到的.128是L第二个VEX字节的位2()。然后.0F是一个3字节的VEX前缀,m-mmmm格式为00001,对吗?但是WIG零件代表什么呢?
是VEX前缀仅由Intel CPU的认可?AMD呢?
最后,movups和之间有什么区别movupd?似乎他们两个都只是从源内存中移出了16个字节:
进入xmm寄存器:
而“双”或“单”精密包装的确没有任何区别。
多谢您对我的耐心配合。
\n\n\n\n
\n- 这些说明中的第一个 v 代表什么?难道只是为了表示使用VEX前缀吗?
\n
v 代表指令的 AVX 版本。
\n\n\n\n\n\n
\n- 如果我在上面的示例中使用或不使用 VEX 前缀,会有什么区别吗(指令的长度除外)?
\n
是的,它确实。如果使用 VEX 前缀,寄存器的高位将被清除。(例如,如果您使用 vmovups xmm0,则 ymm0 的上半部分将被清除。
\n\n\n\n\n\n
\n- 我试图理解英特尔文档中的语法。[剪]。但 WIG 部分代表什么?
\n
“W” = 宽度标志。“IG”=忽略。
\n\n从手册中的“3.1.1.2指令汇总表中的操作码列(带有VEX前缀的指令)”部分,
\n\n“\xe2\x80\x94 WIG:可以使用 C5H 形式(如果不需要 VEX.mmmmm)或在 VEX 前缀的 C4H 形式中忽略 VEX.W 值。”
\n\n"\xe2\x80\x94 如果存在 WIG,则可以使用 VEX 的两字节形式或三字节形式对指令进行编码。使用 VEX 的三字节形式对指令进行编码时,VEX 的值.W 被忽略。”
\n\n\n\n\n\n
\n- VEX前缀只能被Intel CPU识别吗?AMD 怎么样?
\n
任何支持 AVX 的 CPU 都可以识别它。Intel 和 AMD 从 2011 年开始就支持它(Intel 的 Sandy Bridge 及更高版本,AMD 的 Bulldozer 及更高版本)
\n\n\n\n\n\n
\n- 最后,movups 和 movupd 之间有什么区别?看起来它们都只是从源内存中移动 16 个字节:
\n
我相信某些处理器可能会在浮点 SIMD 寄存器的内容上保留标志;在某些情况下,使用错误的宽度/类型可能会导致停顿。
\n