AVX 指令集编码的粗略介绍
简单说一说 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
版主真热心啊,支持
http://www.china-pub.com/209258&ref=ps
《天书夜读》这书我在书店里大致翻过,感觉一般,写虎头蛇尾,定位不准确,书名确实很吸引人。
但是这书到底是教人汇编的?还是教人windows 内核编码?
结果是两方面都说得不到位。整书篇幅这不长,怎么可能象书名一样涵盖两个方面。
当然我是粗略看,很细看。或许说得有不对之处。据说两个作者都是牛人。
完整的文档见置顶的贴子:[x64指令系统]之 AVX 指令集
以后还期待mik更多的大作啊
关注!