指令解码器如何在32位模式下区分EVEX前缀和绑定的OpCode?

问题描述 投票:0回答:1
IN32位模式Intel通过反转寄存器扩展名的高位来解决VEX前缀与LDS/LES冲突,因为MODRM BYTE的MOD字段不能为11B

VEX前缀的初始字节值C4H和C5H与LDS和LES指令的Opcodes相同。这些说明在64位模式下不支持。为了在32位模式下解决歧义,Vex的规范利用了一个法律LDS或LES的MODRM字节不可能为11xxxxxx的事实(它可以指定寄存器操作数)。 VEX前缀的第二个字节中的各种位点被倒置,以确保字节始终以32位模式为该形式。

https://en.wikipedia.org/wiki/vex_prefix#technical_description

在Evex中,R和X位没有倒置,这导致MOD = 00B,这也指示了BOUND

指令中的内存操作数

雷克斯前缀的四个位r,x,b和w。 W将操作数尺寸扩展到64位或用作附加的操作码,R扩展REG,B扩展R/M或REG,X和B在SIB字节中扩展了索引和基础。 
与vex前缀相结合,rxb以非连接形式提供,就像在rex前缀中一样。

https://en.wikipedia.org/wiki/evex_prefix

那么他们如何解码该指令重叠?

我检查了英特尔手册,他们似乎仅在vex而非evex中提到了零件的反转。 sandpile
中的桌子说,Evex中的RXB位也应倒置。

他们中的哪一个是正确的?


由于两个事实,倒置的技巧起作用:

在32位模式中,只有32个ZMM寄存器中的8个,因此Evex.r'位永远不会翻转,因此永远不要使用允许的绑定编码。 在64位模式中,没有绑定的指令,因此Evex位可以采用任何值。

the摘自AVX上的Patent

示出了以下内容:

assembly x86 instructions opcode
1个回答
4
投票
[0111] REX'磁场 - 这是Rex'场的第一部分,是Evex.r'位字段(Evex字节1,位[4] -r'),用于编码上部16或更低16扩展32寄存器集。在本发明的一个实施方案中,该位以及下面所示的其他列表以位倒置格式存储,以将(以众所周知的x86 32位模式)与界限的实际操作指令区分开来,其真实的OpCode Byte为62,但不接受mod r/m字段(如下所述)在mod字段中的11值;本发明的替代实施例不会以倒置格式以下面的其他指示位存储。一个值1用于编码下部16个寄存器。换句话说,r'RRRR是通过将evex.r',evex.r和其他其他字段的其他RRR组合形成的。

nove,在这一事实上尚不清楚SDM

。 我已经浏览了SDM,实际上,在Evex部分中,没有提及EVEX编码的补充含义的痕迹。必须以某种方式从evex是vex的扩展中推断出来,而对于后者,有一个反向含义的陈述(第2a卷,第2.3.5节,第一个子弹):
  1. 该字段使用1的补体形式(倒式形式)编码,即XMM0/YMM0/R0编码为1111b,XMM15/YMM15/R15编码为0000B.

在Intel®64和IA-32架构软件开发人员手册2的表A2中;绑定为0x62 GV,马萨诸塞州。 G表示操作数1将被解释为通用登记册。 m表示操作数2必须是内存操作数。表示mod字段不得为0b11。然后,我假设其他MOD字段值将被解释为EVEX前缀的第二个字节。和0x62将被解释为EVEX前缀标头。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.