AVX 指令集编码的粗略介绍

发布于 2022-09-18 17:55:05 字数 3607 浏览 15 评论 0

简单说一说 AVX 指令的编码,主要是 VEX prefix 的编码

AVX 指令集增加了一个 VEX prefix,VEX prefix 是 2 个字节或 3 个字节。

128 位的 XMM 寄存器扩展成为了 256 位的 YMM 寄存器

下面以 VEX2 表示 2 个字节的 VEX prefix ,以 VEX3 表示 3 个字节的 VEX prefix(前缀)

VEX 的一个特点是,压缩了 REX、66、F3、F2、0F prefix(前缀)从另一角度来讲,是集成了以前的 prefix,从而不需要 REX,SIMD 以及 0F prefix

一、VEX2 的组成:

VEX2 由以下部分组成:

VEX2.C5 + VEX2.[RvvvvLpp]

1、VEX2.C5 部分

  2 个字节的 VEX prefix 由 C5 开头,即:第 1 个字节是 0xC5

2、VEX2.[RvvvvLpp] 部分
  第 2 个字节由 R + vvvv + L + pp 这 4 个域组成。

(1)VEX2.R 域
  用来扩展 ModRM.reg 域,也就是 VEX2.R + MOdRM.reg 扩展访问高 8 个寄存器 R8/XMM8/YMM8 ~ R15/XMM15/YMM15

(2)VEX2.vvvv 域
  vvvv 域用来表示 source / dest 寄存器编码。

注意:
  这里的编码与原有的寄存器 ID 是相反的,0000 表示 XMM15/YMM15 寄存器,1111 表示 XMM0/YMM0 寄存器,而原有的寄存器是 0000 表示 XMM0 寄存器, 1111 表示 YMM15 寄存器。
-------------------------------------------------------------------------------------------------------------------

  之所以相反编码是因为(在 32 位模式下,为了区分 LES/LDS 指令和 AVX 指令集):

* 当在 x86 的 32 位或 compatibility 模式下,C5 是 LDS 指令的 Opcode 码,也就是说:在 32 位下 VEX2.C5 是 LDS 指令,那么这种情况下,LDS 指令需要一个 GRPs 寄存器操作数和 memory 操作数。

* 所以,如果在 32 位下,VEX2.C5 后面接着是 00、01、10 的话,它会被认为是 LDS 指令而不是 AVX 指令集。

故:
  在 32 位下 VEX2.R + VEX2.v 必须是 11,也就是 C5 后面必须是 11。

  在 64 位模式下,LES / LDS 是无效的指令,所以无需区分 LES / LDS 与 AVX 指令集。

就因为上面这个原因,AVX 指令集中的寄存器 ID 与 通用指令集中的寄存器 ID 是相反的。

(3)VEX2.L 部分

  VEX2.L = 0 指示是 128 位(XMM),VEX2.L = 1 时,指示为 256 位(YMM)。

  因此,VEX2.L = 0 时,可表示为 VEX2.128 域,
     VEX2.L = 1 时,可表示为 VEX2.256 域。

(4)VEX2.pp 部分

  VEX2.pp 用来指示 SIMD prefix,所谓的 SIMD prefix 就是 SSE ~ SSE4.2 所使用的 66、F3 以及 F2 prefix。这些 prefix 用来修饰 SIMD opcode,产生多个 opcode 码。

VEX2.pp = 01 时,表示用 66 来修饰 opcode 码
VEX2.pp = 10 时,表示用 F3 来修饰 opcode 码
VEX2.pp = 11 时,表示用 F2 来修饰 opcode 码

VEX2.pp = 00时,表示无效。

二、VEX3 的组成

VEX3 由以下部分组成: VEX3.C4 + VEX3.[RXBmmmmm] + VEX3.[WvvvvLpp]

1、 VEX3.C4

  第1个字节是 C4,在 32 位模式下,它是 LES 指令的 opcode 码,在 64 位模式下是无效的。

2、VEX3.[RXBmmmmm]

  这个字节由 VEX3.RXB + VEX3.mmmmm 组成

(1)VEX3.RXB
  相当于 REX.RXB 用来扩展寄存器 ID

(2)VEX3.mmmmm
  这部分是 Opcode 的一部分,即:0F、0F 38 以及 0F3A

VEX3.mmmmm = 00001 时:代表 0F
VEX3.mmmmm = 00010 时:代表 0F 38
VEX3.mmmmm = 00011 时:代表 0F 3A
----------------------------------------------
其它的都是 #UD (无效的)

(3)VEX3.[WvvvvLpp] 部分

VEX3.W = 0 时,使用 defaule opeands size
VEX2.W = 1 时,使用 64 bit operands size

VEX3.vvvv :意义与 VEX2.vvvv 一致
VEX3.L :  意义与 VEX2.L 一致
VEX3.pp :  意义与 VEX2.pp 一致

AVX 指令集先粗略讲一讲 VEX prefix,过几天再写一份详细的 AVX 指令集学习文档。:wink:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

十秒萌定你 2022-09-25 17:55:05

版主真热心啊,支持

π浅易 2022-09-25 17:55:05

原帖由 prolj 于 2009-5-8 16:40 发表
http://www.china-pub.com/209258&ref=ps

《天书夜读》这书我在书店里大致翻过,感觉一般,写虎头蛇尾,定位不准确,书名确实很吸引人。

但是这书到底是教人汇编的?还是教人windows 内核编码?

结果是两方面都说得不到位。整书篇幅这不长,怎么可能象书名一样涵盖两个方面。

当然我是粗略看,很细看。或许说得有不对之处。据说两个作者都是牛人。

追星践月 2022-09-25 17:55:05

完整的文档见置顶的贴子:[x64指令系统]之 AVX 指令集

葬花如无物 2022-09-25 17:55:05

以后还期待mik更多的大作啊

原谅过去的我 2022-09-25 17:55:05

关注!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文