3. XOP prefix


上一页 返回目录 下一页

xop format

上面的 XOP prefix 的结构图。

XOP prefix 共有 3 bytes,其中 first byte 是 8F,记作: XOP.8F

 

1、XOP.8F

XOP prefix 的第 1 个字节了是 8F,在通用指令里 opcode 8F 是一组 Group opcode,仅当 ModRM.reg = 000 时,这个 opcode 才是有效的,它是 POP 指令。

ModRM.reg ≠ 000 时,这个 opcode 8F 是无效的 opcode,即:当 ModRM 值大于等于 00-001-000(08H)时, 这个 8F 是无效的 opcode

AMD 选择使用 8F 作为 XOP prefix,正是基于这个原因。

 

(1)XOP prefix 与 VEX prefix 的对比

VEX prefix 是 C4 或 C5,在 16 位 或 32 位下它必须保证下一个字节是以 11-XXXXXX 开头的

XOP prefix 是 8F,则需保证下一个字节是大于等于 08H 则可

关于 VEX prefix 详见:VEX prefix

由于,这个 prefix 的取值不同,就决定了它们之间的编码差异。

 

 

2、 XOP prefix 的 byte 1 结构

描述
R
[7]
[XOP.R + ModRM.reg]
X
[6]
[XOP.X + SIB.index]
B
[5]
[XOP.B + SIB.base],[XOP.B + ModRM.r/m] 以及 [XOP.B + opcode.reg]
mmmmm
[4:0]
= 08
表示指令需要 imm8 字节
= 09
表示指令不需要 imm8 字节

XOP.RXB 与 VEX.RXB 作用一致,这一位也是反相作用。 分别用于扩展 ModRM.reg、SIB.index 以及 ModRM.r/m、SIB.base、opcode.reg

例如:当 XOP.R = 1、ModRM.reg = 000 时,register ID 值为 1000 表示 xmm0 寄存器。

XOP.mmmmm 指示 imm8 部分是否存在,另一个作用是表明 opcode 是 XOP 指令:ModRM >= 08H

有关 registers 编码反相,详见:AVX 和 XOP 指令中的 registers 编码反相

 

3、XOP prefix 的 byte 2 结构

描述
W
[7]
在 XOP/FMA4 指令中主要作用是:对 operands 寻址进行配置
vvvv
[6:3]
提供 retisters 寻址,具体是哪个 operand 依赖于 opcode
L
[2]
operands 长度(xmm or ymm?)
pp
[1:0]
00
none
01
66
10
F3
11
F2

XOP.vvvv 提供的 registers 寻址依赖于 XOP.W 配置。

有关 XOP.vvvv 寻址,详见:operands 寻址

 

 

4、XOP.RXB 与 VEX.RXB 的差异

在 AVX 指令的 VEX prefix 中,VEX.RXB 在 legacy 模式与 long 的 compaitibility 模式下必须: VEX.RXB = 11X(以 11 开头)

而 XOP 指令的 XOP prefix 中,XOP.RXB 则在 legacy 模式与 long 的 compaitibility 模式下不必为 11 开头

前面已经说过,这是因为:opcode 8F 仅当 ModRM.reg = 000 时才有效。因此,只要大于等于 08H,就能区分通用指令与 XOP 指令。

 

XOP 指令以下这条指令为例:

vpmacsdd xmm0, xmm7, [eax], xmm1

它的 opcode 是 9e,在 32 位模式下,它的编码结构如下:

8f
101
01000
0
1000
0
00
9e
00
000
000
0001
0000
XOP.8F
RXB
mmmmm
W
vvvv
L
pp
opcode
mod
reg
r/m
[7:4]
[3:0]
XOP.[RXBmmmmm] = a8
XOP.[WvvvvLpp] = 40
ModRM = 00
imm8 = 10

它最终的编码为:8f a8 40 9e 00 10

 

 

5、Intel 的 FMA 指令中 VEX.W 与 AMD 的 FMA4 指令中 VEX.W 的差异

对于 W 标志位, AMD 与 Intel 存在设计理念的差异。

 

(1)Intel 的 FMA 指令中 VEX.W 主要作用是选择指令处理数据的不同,从而根据不同的数据产生不同的指令,例如:

vfmadd132ps xmm0, xmm1, xmm2

vfmadd132pd xmm0, xmm1, xmm2

上面是 2 个版本的指令,它们的 opcode 码是相同

  1. 第 1 条的 VEX.W = 0

  2. 第 2 条的 VEX.W = 1

它们处理的数据分别是 packed single-precision float-point 数据和 packed double-precision float-point 数据

当 VEX.W = 0 是处理 packed single-precision float point 数据

当 VEX.W = 1 是处理 packed double-precision float point 数据。

 

 

(2)AMD 的 FMA4 指令中 XOP.W 主要作用对 operands 寻址进行配置,例如:

vfmaddpd xmm1, xmm2, [rax], xmm4

vfmaddpd xmm1, xmm2, xmm3, [rax]

上面是 2 个版本的 vfmaddpd 指令,它们处理的是 packed double-precision float point 数据。

  1. 第 1 条的 VEX.W = 0

  2. 第 2 条的 VEX.W = 1

当 XOP.W = 0 时, ModRM.r/m 提供 third operand(即:src2)寻址。

当 XOP.W = 1 时, ModRM.r/m 提供 fourth operand(即:src3)寻址。

 

再来看一看,下面两条 FMA4 指令:

vfmaddps xmm1, xmm2, [rax], xmm4

vfmaddps xmm1, xmm2, xmm3, [rax]

上面是 2 个版本的 vfmaddps 指令,它们处理的是 packed singled-precision float point 数据。

这两条指令和上面两条指令的 opcode 是不同的。

Intel 的设计理念是:采用相同的 opcode 码,而根据 VEX.W 的取值不同,从而达到指令处理多种数据。

AMD 的设计理念是:采用不同的 opcode 码,达到指令处理多种数据。又而根据 VEX.W 的取值不同,而达到 operand 寻址的多样性。

AMD 的设计上允许 operand 的多样性,达到真正的 4 个 operands 

而 Intel 的指令不支持 4 个 operands。

这就是为什么 Intel 的是 FMA 指令,而 AMD 的是 FMA4 指令的原因。

 

 

 

 

上一页 返回目录 下一页


mik 写于 2009-05-17 00:38