x86 - VEX 前缀编码和 SSE/AVX MOVUP(D/S) 指令
问题描述
我正在尝试了解 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]
如这两个:
db 066h, 0fh, 10h, 00000000b ; movupd xmm0,xmmword ptr [rax]
db 0c5h, 11111001b, 10h, 00000000b ; vmovupd xmm0,xmmword ptr [rax]
因此我的问题:
v
这些说明中的第一个代表什么?仅仅是为了表示VEX
前缀的使用吗?如果我在上面的示例中使用或不使用
VEX
前缀,它是否有任何区别(除了说明的长度)?我试图在他们的文档中理解英特尔的语法。说,这个截图:
我VEX.128.0F.WIG
可以看到这.128
是第 2 个字节的第 2 位(L
)VEX
。然后.0F
是一个 3 字节的VEX
前缀,m-mmmm
形式是00001
,对吗?但是这个WIG
部分代表什么?
前缀是否
VEX
仅由 Intel CPU 识别?AMD怎么样?movups
最后,和有什么区别movupd
?似乎它们都只是从源内存中移动了 16 个字节:
进入xmm
注册表:
并且“双”或“单”精度包装确实没有任何区别。
谢谢你对我的耐心。
解决方案
- 这些说明中的第一个 v 代表什么?是否只是表示使用 VEX 前缀?
v 代表指令的 AVX 版本。
- 如果我在上面的示例中使用或不使用 VEX 前缀,是否有任何区别(除了说明的长度)?
是的,它确实。如果使用 VEX 前缀,寄存器的高位将被清除。(例如,如果您使用 vmovups xmm0,则清除上半部分 ymm0。
- 我试图在他们的文档中理解英特尔的语法。[剪辑]。但是 WIG 部分代表什么?
“W” = 宽度标志。“IG” = 忽略。
从手册中的“3.1.1.2指令摘要表中的操作码列(带有VEX前缀的指令)”部分,
“— WIG:可以使用 C5H 形式(如果不需要 VEX.mmmmm)或在 VEX 前缀的 C4H 形式中忽略 VEX.W 值。”
"— 如果存在 WIG,则可以使用 VEX 的两字节形式或三字节形式对指令进行编码。使用 VEX 的三字节形式对指令进行编码时,忽略 VEX.W 的值。 "
- VEX 前缀是否仅被 Intel CPU 识别?AMD怎么样?
它被任何支持 AVX 的 CPU 识别。自 2011 年以来,英特尔和 AMD 都支持它(英特尔的 Sandy Bridge 及更高版本,以及 AMD 的 Bulldozer 及更高版本)
- 最后,movups和movupd有什么区别?似乎它们都只是从源内存中移动了 16 个字节:
我相信某些处理器可能会在浮点 SIMD 寄存器的内容上保留标志;在某些情况下,使用错误的宽度/类型可能会导致停顿。
推荐阅读
- ajax - 使用 ajax 选择的 Octobercms 无法按预期工作
- ruby - 在没有 Rails 或安装 gems 的情况下在 Ruby 中获取太平洋时间
- java - requests.exceptions.ConnectionError: HTTPSConnectionPool(host='', port=2376): Max retries exceeded with url: /v1.24/version - Windows 上的 Docker
- android - 尝试响应 android 数字软键盘上的刻度时,onEditor 操作不起作用
- spring-boot - 无法在 QueryBuilders.termQuery 的帮助下获取数据
- python - 计算样本的标准偏差
- java - Tesseract OCR 不适用于 Java Web 应用程序
- c# - 如何在c#中从一行删除到文本文件的末尾?
- python - 使用 Pool.map() 类型错误的多线程 PhantomJS
- c# - 使用来自多个文件的任何 CPU (x64/x86)