5. FMA4/XOP 指令 operands 寻址


上一页 返回目录 下一页

 

AMD 的 XOP/FMA4 指令 operands 最多可以 4 个 operands,因此要分开下以几种情况描述

XOP/FMA4 指令的 operands 寻址很大程度上依赖于 XOP.W 和 VEX.W 的取值。

 

1、 4 个 operands 的寻址情况

像以下这个 FMA4 指令的 2 种寻址模式

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

 

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

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
         ----  ----  -----------  ----
          |     |         |         |
          +-----|---------|---------|---------------->  ModRM.reg
                |         |         |
                +---------|---------|---------------->  VEX.vvvv
                          |         |
                          +---------|---------------->  ModRM.r/m
                                    |
                                    +---------------->  imm8[7:4]


vfmaddpd xmm1, xmm2, xmm3, xmm4/mem128
         ----  ----  ----  -----------
          |     |     |         |
          +-----|-----|---------|------------------->  ModRM.reg
                |     |         |
                +-----|---------|------------------->  VEX.vvvv
                      |         |
                      +---------|------------------->  imm8[7:4]
                                |
                                +------------------->  ModRM.r/m

实际上,很容易看出 xmm3/mem128 这个 operands 到底是由谁提供寻址。

因为,指令中 xmm3/mem128 既可 register 也可以 memory,那么它只能由 ModRM.r/m 提供寻址,这是肯定的。

 

 

 

2、 3 个 operands 的寻址情况

下面是某条 XOP 指令的 opcode 描述:

                                       XOP    RXB.mmmmmm    W.vvvv.L.pp    Opcode
vprotb xmm1, xmm2/mem128, xmm3         8f     RXB.09        0.xcnt.0.00    90 /r

 

                                       XOP    RXB.mmmmmm    W.vvvv.L.pp    Opcode
vprotb xmm1, xmm2, xmm3/mem128         8f     RXB.09        1.xcnt.0.00    90 /r

 

                                       XOP    RXB.mmmmmm    W.vvvv.L.pp    Opcode
vprotb xmm1, xmm2/mem128, imm8         8f     RXB.08        0.1111.0.00    c0 /r /ib

对于 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
       ----  -----------  ----
        |        |         |
        +--------|---------|----------------------->  ModRM.reg
                 |         |
                 +---------|----------------------->  ModRM.r/m
                           |
                           +----------------------->  XOP.vvvv

 

vprotb xmm1, xmm2, xmm3/mem128
       ----  ----  -----------
        |     |         |
        +-----|---------|-------------------------->  ModRM.reg
              |         |
              +---------|-------------------------->  XOP.vvvv
                        |
                        +-------------------------->  ModRM.r/m

 

vprotb xmm1, xmm2/mem128, imm8
       ----  -----------  ----
        |        |         |
        +--------|---------|----------------------->  ModRM.reg
                 |         |
                 +---------|----------------------->  ModRM.r/m
                           |
                           +----------------------->  imm8 (XOP.vvvv = 1111)

 

 

 

3、2 个 operands 的寻址情况

像下面这条 XOP 指令:

                                  XOP    RXB.mmmmmm    W.vvvv.L.pp    Opcode
vfrczpd xmm1, xmm2/mem128         8f     RXB.09        0.1111.0.00    81 /r

它的 operands 寻址情况是:

XOP.W
ModRM.reg
XOP.vvvv
ModRM.r/m
0
dest
1111
src

 

那么这条指令的 operand 是:

vfrczpd xmm1, xmm2/mem128
        ----  -----------
         |        |     
         +--------|--------------------------->  ModRM.reg
                  |       
                  +--------------------------->  ModRM.r/m  (XOP.vvvv = 1111)

 

 

4、FMA4/XOP 指令的 operands 寻址总结

(1)destination operand(first operand)由 ModRM.reg 提供寻址。

(2)而指令的 src1 和 src2 以及 src3 根据 VEX.W/XOP.W 的取值不同,以及指令的 operands 个数而不同。

 

上一页 返回目录 下一页


mik 写于 2009-05-17 00:38