6. FMA4/XOP 指令解析
以上一节的几条指令为例,说一说 FMA4/XOP 指令的解析
vfmaddpd xmm1, xmm9, [rax], xmm10 |
接上节,它的 opcode 描述是:
VEX RXB.mmmmmm W.vvvv.L.pp Opcode |
将指令分解为:
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
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
举上节中的例子:
(1) vprotb xmm8, [rax], xmm0 |
指令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
(1)vfrczpd xmm1, xmm2 |
指令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