6. FMA4/XOP 指令解析


上一页 返回目录

以上一节的几条指令为例,说一说 FMA4/XOP 指令的解析

 

1、 FMA4 指令的解析

(1)有以下指令:

vfmaddpd xmm1, xmm9, [rax], xmm10

接上节,它的 opcode 描述是:

                                               VEX    RXB.mmmmmm    W.vvvv.L.pp    Opcode
vfmaddpd xmm1, xmm2, xmm3/mem128, xmm4         c4     RXB.03        0.xsrc1.0.01   69 /r /is4

将指令分解为:

c4
101
00011
0
0110
0
01
69
00
001
000
1010
0000
VEX.C4
VEX.RXB
VEX.mmmmm
VEX.W
VEX.vvvv
VEX.L
VEX.pp
opcode
mod
reg
r/m
VEX.[RXBmmmmm] = a3
VEX.[WvvvvLpp] = 31
ModRM = 08
imm8 = a0

那么,它的编码是:c4 a3 31 69 08 a0

 

 

(2)将它的 operands 改变一下为:

vfmaddpd xmm1, xmm9, xmm10, [rax]

将指令为解为:

c4
101
00011
1
0110
0
01
69
00
001
000
1010
0000
VEX.C4
VEX.RXB
VEX.mmmmm
VEX.W
VEX.vvvv
VEX.L
VEX.pp
opcode
mod
reg
r/m
VEX.[RXBmmmmm] = a3
VEX.[WvvvvLpp] = b1
ModRM = 08
imm8 = a0

那么,它的编码是:c4 a3 b1 69 08 a0

 

可以看出:上面两个例子中,仅仅只有 VEX.W 不同而已,其它是完全相同的。

对于 memory 寻址,所有的通用指令中的 memory 寻址修饰都可以使用在这里,即:可以作 address-size override 以及 segment override

 

 

 

2、 XOP 指令解析

(1)3 个 operands 的指令

举上节中的例子:

(1) vprotb xmm8, [rax], xmm0
(2) vprotb xmm0, xmm10, [rax]
(3) vprotb xmm0, [rax], 1

指令1 的分解部分为:

8f
001
01001
0
1111
0
00
90
00
000
000
XOP.8F
XOP.RXB
XOP.mmmmm
XOP.W
XOP.vvvv
XOP.L
XOP.pp
opcode
mod
reg
r/m
XOP.[RXBmmmmm] = 29
XOP.[WvvvvLpp] = 78
ModRM = 00

它的最终编码是: 8f 29 78 90 00

 

指令2 的分解部分为:

8f
101
01001
1
0101
0
00
90
00
000
000
XOP.8F
XOP.RXB
XOP.mmmmm
XOP.W
XOP.vvvv
XOP.L
XOP.pp
opcode
mod
reg
r/m
XOP.[RXBmmmmm] = a9
XOP.[WvvvvLpp] = a8
ModRM = 00

它的最终编码是: 8f a9 a8 90 00

 

指令3 的分解部分为:

8f
101
01000
0
1111
0
00
c0
00
000
000
01
XOP.8F
XOP.RXB
XOP.mmmmm
XOP.W
XOP.vvvv
XOP.L
XOP.pp
opcode
mod
reg
r/m
XOP.[RXBmmmmm] = a8
XOP.[WvvvvLpp] = 78
ModRM = 00
imm8 = 01

它的最终编码是: 8f a8 78 c0 00 01

 

 

(2)2 个 operands 的指令

(1)vfrczpd xmm1, xmm2
(2)vfpczpd xmm1, [rax]

指令1 的分解部分为:

8f
101
01001
0
1111
0
00
81
11
001
010
XOP.8F
XOP.RXB
XOP.mmmmm
XOP.W
XOP.vvvv
XOP.L
XOP.pp
opcode
mod
reg
r/m
XOP.[RXBmmmmm] = a9
XOP.[WvvvvLpp] = 78
ModRM = ca

它的编码是:8f a9 78 81 ca

 

指令2 的分解部分为:

8f
101
01001
0
1111
0
00
81
00
001
000
XOP.8F
XOP.RXB
XOP.mmmmm
XOP.W
XOP.vvvv
XOP.L
XOP.pp
opcode
mod
reg
r/m
XOP.[RXBmmmmm] = a9
XOP.[WvvvvLpp] = 78
ModRM = 08

它的编码是:8f a9 78 81 08

 

 

上一页 返回目录


mik 写于 2009-05-17 00:38