5. FMA4/XOP 指令 operands 寻址
AMD 的 XOP/FMA4 指令 operands 最多可以 4 个 operands,因此要分开下以几种情况描述
XOP/FMA4 指令的 operands 寻址很大程度上依赖于 XOP.W 和 VEX.W 的取值。
像以下这个 FMA4 指令的 2 种寻址模式
VEX RXB.mmmmmm W.vvvv.L.pp Opcode
VEX RXB.mmmmmm W.vvvv.L.pp Opcode |
AMD 定义的 operands 寻址模式表:
VEX.W/XOP.W |
ModRM.reg |
VEX.vvvv/XOP.vvvv |
ModRM.r/m |
imm8[7:4] |
0 |
dest |
src1 |
src2 |
src3 |
1 |
dest |
src1 |
src3 |
src2 |
当 VEX.W/XOP.W = 0 时:ModRM.r/m 提供 src2 operand(即:third operand)寻址,而 imm8[7:4] 则提供 src3(即:fourth operand)寻址。
当 VEX.W/XOP.W = 1 时:ModRM.r/m 提供 src3 operand(即:fourth operand)寻址,而 imm8[7:4] 则提供 src2(即:third operand)寻址。
而 dest operand(即:first operand)固定由 ModRm.reg 提供寻址。
src1 operand(即:second operand)固定由 VEX.vvvv/XOP.vvvv 提供寻址。
那么,指令 vfmaddpd 的 2 种寻址模式如下:
vfmaddpd xmm1, xmm2, xmm3/mem128, xmm4
|
实际上,很容易看出 xmm3/mem128 这个 operands 到底是由谁提供寻址。
因为,指令中 xmm3/mem128 既可 register 也可以 memory,那么它只能由 ModRM.r/m 提供寻址,这是肯定的。
下面是某条 XOP 指令的 opcode 描述:
XOP RXB.mmmmmm W.vvvv.L.pp Opcode
XOP RXB.mmmmmm W.vvvv.L.pp Opcode
XOP RXB.mmmmmm W.vvvv.L.pp Opcode |
对于 3 个 operands 都是 register 的情况下:
XOP.W |
ModRM.reg |
XOP.vvvv |
ModRM.r/m |
0 |
dest |
src2 |
src1 |
1 |
dest |
src1 |
src2 |
对于,第 3 个 operand 是 imm8 的情况下:
XOP.W |
ModRM.reg |
XOP.vvvv |
ModRM.r/m |
imm8 |
0 |
dest |
1111 |
src1 |
src2 |
这种情况下,XOP.vvvv 必须为 1111,指示指令不需要 XOP.vvvv 寻址,而 src2 则由 imm8 提供立即数。
那么,这条指令的 3 种寻址模式是:
vprotb xmm1, xmm2/mem128, xmm3
vprotb xmm1, xmm2, xmm3/mem128
vprotb xmm1, xmm2/mem128, imm8 |
像下面这条 XOP 指令:
XOP RXB.mmmmmm W.vvvv.L.pp Opcode |
它的 operands 寻址情况是:
XOP.W |
ModRM.reg |
XOP.vvvv |
ModRM.r/m |
0 |
dest |
1111 |
src |
那么这条指令的 operand 是:
vfrczpd xmm1, xmm2/mem128 |
(1)destination operand(first operand)由 ModRM.reg 提供寻址。
(2)而指令的 src1 和 src2 以及 src3 根据 VEX.W/XOP.W 的取值不同,以及指令的 operands 个数而不同。
mik 写于 2009-05-17 00:38