免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6766 | 回复: 4
打印 上一主题 下一主题

【x64 指令系统】之 XOP 指令集(完) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-17 00:38 |只看该作者 |倒序浏览
声明:
  由于 XOP 是 AMD 全新推出新一代基于 SSE5 的 SIMD 指令集,目前尚无应用成品,无应用环境测试,难免会有错漏。

  敬请留意,不妥之处不吝指出

同时:
  最好先读过【x64 指令系统】之 AVX 指令集 这个贴子。




目录
------------------------------------------------------------
1、XOP 指令集简介
2、XOP 指令格式
3、opcode
4、operands 寻址
5、XOP/FMA4 指令实例解析(完)
------------------------------------------------------------










:wink:

[ 本帖最后由 mik 于 2009-5-18 01:08 编辑 ]

评分

参与人数 1可用积分 +15 收起 理由
prolj + 15 原创内容

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2009-05-17 01:30 |只看该作者
1、XOP 指令集简介


1、XOP 指令集产生的背景:
  AMD 抢出推出 SSE5 指令集,但 Intel 打着如意算盘,却不跟进,推出了全新的 AVX 指令集。AVX 借鉴了一些 SSE5 的思想,但进行了扩充改良。客观地说,AVX 比 SSE5 更优,但 SSE5 既然有 Intel 值得学习的地方。AMD 是知道的。
  AMD 最终决定跟进 Intel,除了兼容 AVX 指令外,另外推出一套 XOP 指令集(或者说是 XOP 指令扩展)、FMA4 和 CVT16 指令。XOP 指令集的产生是 AMD 也不愿 SSE5 被全盘推翻,保留了一些 SSE5 指令的优秀的地方。

  目前,AMD 指令集方面的策略的是:全面兼容 Intel 的 AVX 指令,还保留自已一些独到的地方,产生了 XOP / FMA 指令。XOP 指令集是 AVX 以外的另一个指令集扩展。




2、XOP 指令集的特点

(1)XOP prefix 代替 VEX prefix
  XOP prefix 是 3 bytes 的,固定以 8F。

(2)XOP prefix 格式实际上与几乎一样
  除了以 8F 开头,固定为 3 bytes 外,其它基本没什么区别

(3)XOP prefix 同样起了集成 prefix 的作用

(4)XOP 指令的格式比 VAX 指令更灵活,体现在 operands 的寻址上。








:wink:

论坛徽章:
0
3 [报告]
发表于 2009-05-17 23:08 |只看该作者
3、 opcode



  AMD 对 opcode 进行较详的叙述,opcode 里包含了指令的后缀,这个后缀定义了指令操作数据元素的大小。





上面是 opcode 的格式,其中 opcode[1:0] 定义了指令后缀


看看下面几条指令:

(1) vfmaddpd xmm1, xmm2, xmm3/m128, xmm4
(2) vfmaddps xmm1, xmm2, xmm3/m128, xmm4
(3) vfmaddsd xmm1, xmm2, xmm3/m64, xmm4
(4) vfmaddss xmm1, xmm2, xmm3/m32, xmm4
----------------------------------------------------------------------------
它们都是执行同一操作: dest = src1 * src2 + src3
所不同的是,它们操作的对象元素大小之间的区别:pd、ps、sd和 ss

pd 是 packed double-precision(压缩的双精度)
ps 是 packed single-precision(压缩的单精度)
sd 是 double-precision (非压缩的双精度)
ss 是 single-precision(非压缩的单精度)


它们对应的 opcode 是:

69:        011010    01          ==>  pd
68:                     00           ==>  ps
6B:                     11           ==>  sd      
6A:                     10           ==>  ss

-------------------------------------------------
不同后缀的指令使用不同 OES 码


注:
  Intel 的指令在汇编代码级上有不同的指令后缀,但表现出来的 opcode 码却是相同的,也就是说:在 opcode 没体现出 OES 这个概念。




:wink:

论坛徽章:
0
4 [报告]
发表于 2009-05-18 00:24 |只看该作者
4、operands 寻址


  
  XOP 指令支持 2 ~ 4 个 operands,扩展出来的 XOP 指令集大多数是 4 个 operands 的。
  AMD 的 FMA4 指令都是 4 operands,而 Intel 的 FMA 大多数是 3 operands。


1、XOP/FMA4 指令的 operands 寻址模式

与 Intel 的一样,4 operands 有以下几个域提供:

(1) XOP.vvvv
  提供 sources 操作数的寻址,与 Intel 的 AVX 指令方案所不同的是:AVX 的 VEX.vvvv 可用作 destination 和 source 操作数寻址。而 XOP 指令中,XOP.vvvv 不能用来寻址 destination 操作数,只能用来寻址 source 操作数。

(2) ModRM.reg
  提供 destination 操作数寻址,情况和上述一样,XOP 指令中,ModRM.reg 只能用来寻址 destination,不能作为 source 操作数寻。而 AVX 指令中可作为 source 操作数寻址。

(3) ModRM.r/m
  提供 source 操作数的寻址。

(4) imme[7:4]
  和 Intel 方案一样,使用 imme[7:4] 用来寻址其中一个 source 操作数,与 Intel 所不同的是:在 AVX 中 imme[7:4] 只能寻址 src3(即最后一个操作数)



2、XOP/FMA4 指令的 operands 寻址方案

* ModRM.reg 固定寻址 dest 操作数。
* 当不使用 XOP.vvvv 域时,AMD 遵循 Intel 的方案,必须 XOP.vvvv = 1111。这种情况下是只有 2 个 operands 的情况。
* XOP.W 提供 operands 寻址的补充规定。

(1) 4 个 operands 时的寻址
dest: ModRM.reg 提供
src1: XOP.vvvv 提供
src2:当 XOP.W = 0 时,由 ModRM.r/m 提供
   当 XOP.W = 1 时,由 imm[7:4] 提供
src3:当 XOP.W = 0 时,由 imm[7:4] 提供
   当 XOP.W = 1 时,由 ModRM.r/m 提供

(2) 3 个 operands 的寻址
dest:ModRM.reg 提供
src1:当 XOP.W = 0 时,由 ModRM.r/m 提供
   当 XOP.W = 1 时,由 XOP.vvvv 提供
src2:当 XOP.W = 0 时,由 XOP.vvvv 提供
   当 XOP.W = 1 时,由 ModRM.r/m 提供

无需 imme[7:4]


(3) 2 个 operands 的寻址
dest:ModRM.reg 提供
src1:ModRM.r/m 提供

XOP.vvvv = 1111

---------------------------------------------------------------------
  对于 operands 寻址,AMD 都有明文规定,文档上都写得清清楚楚。而 Intel 文档表现得含糊,在 AVX 指令的描述上,Intel 只明文规定 VEX.vvvv 提供哪个操作数的寻址。其余的 operands 要靠理解。
  这是 AMD 比 Intel 做得好的一点。



:wink:

论坛徽章:
0
5 [报告]
发表于 2009-05-18 01:05 |只看该作者
5、XOP/FMA4 指令实例解析



  为什么要扯上 FMA4 指令?FMA4 指令又是什么一回事?

----- FMA 是 AVX 指令集中的一部分。
     Intel 的 FMA 指令是 3 operands 的,被称为 FMA3,而 AMD 的 FMA 是 4 operands 的,被称为 FMA4,AMD 认为 4 operands 更能提供效率。



1、 XOP 指令解析
  
指令:vpmacsdd   xmm0, xmm8, [r9], xmm1
                        -----  -----   ---  -----
                          |        |        |      |
                          +-----+------+----+--------------> dest: ModRM.reg
                                   |         |      |
                                   +------+----+--------------> src1: XOP.vvvv
                                             |      |
                                             +----+--------------> src2: ModRM.r/m
                                                    |
                                                    +--------------> src3:  imme[7:4]


8F     110     01000        0    0111  0  00          9E        00-111-110       1110 0000
        ---      ------       -     ----   -  --          --         -----------       ----------
        RXB    mmmmm      W   vvvv   L  pp       opcode     mod-reg-r/m        imme


整条指令的 encode 是: 8F C8 38 9E 3E E0


(1) 8F 是 XOP.8F

(2) XOP.RXB = 110(反码形式)
  XOP.R 扩展 ModRM.reg = [XOP.R+ModRM.reg] = 1111,也就是 xmm0
  XOP.X 无用
  XOP.B 扩展 ModRM.r/m = [XOP.B+ModRM.r/m] = 0110,它是寄存器 r9

(3) XOP.W = 0
  XOP.W 设为 0 则为 ModRM.r/m 寻址 src2,在这里必须由 ModRM.r/m 来寻址 src2,所以 XOP.W 必须为 0

(4) XOP.vvvv = 0111(反码形式)
  XOP.vvvv = 0111 也就是 xmm8,它用来寻址 src1

(5) XOP.L = 0
  这里是 128 位数据

(6) XOP.pp = 00
  对于 XOP 指令来说,并不需要 SIMD prefix

(7) opcode
  9E 是它的 opcode

(8 ) ModRM 字节
mod-reg-r/m = 00-111-110

mod = 00 时,提供 [base] 寻址,这里它提供了 [r9] 寻址
reg = 111(反码)时:与 XOP.R 组合起来是 1111,就是 xmm0,它是 dest 操作数
r/m = 110(反码)时:与 XOP.B 组合起来是 0110,就是 [r9] 内存操作数,它是 src2 操作数。


(9) imme = 1110 0000 (反码形式)

imme[7:4] = 1110 也就是 xmm1,它是 src3 操作数。






2、FMA4 指令解析

指令:
  vfmaddpd ymm0, ymm8, ymm1, [r9]
                   -----   -----  -----   ----
                      |         |       |        |
                      +------+-----+-----+-----------> ModRM.reg
                                |       |        |
                                +-----+-----+-----------> VEX.vvvv
                                         |        |
                                         +-----+-----------> imme[7:4](VEX.W = 1)
                                                  |
                                                  +-----------> ModRM.r/m

-----------------------------------------------------------------------
  这是一条 FMA4 指令,实际上就是一条 AVX 指令。因此,它要遵循 AVX 指令编码的规范。但 AMD 将它更细化,使用 EX.W 来决定 src2 与 src3 的寻址。



C4    110   00011     1  0111  1  01      69       00 111  110      1110 0000
        ---   ------    -   -----  -  --      ---      -----------       ---------
       RXB  mmmmm   W  vvvv  L  pp   opcode   mod-reg-r/m      imme[7:4] = 1110


这条指令最终的 encode 是: C4 C3 BD 69 3E E0



(1) VEX.C4

  byte0 是 C4,它的 AVX 指令。


(2)  VEX.RXB = 110(反码)

VEX.R = 1:和 ModRM.reg 组合起来是 1111,也就是 ymm0
VEX.X = 1: 无使用
VEX.B = 0:和 ModRM.r/m 组合起来是 0110,也就是 r9 寄存器


(3) VEX.mmmmm = 00011
  
VEX.mmmmm = 00011 它提供 escape prefix 是 0F3A


(4)  VEX.W = 1

VEX.W 是对 opcode 的补充说明,对于 AMD 来说是 operands 补充说明,对于 Intel 来说是 OES(operands elment size)的补充说。

VEX.W = 1,表明 src3(最后1个操作数) 由 ModRM.r/m 提供,而不是 imme[7:4] 提供


(5)  VEX.vvvv = 0111 (反码)

VEX.vvvv 这里提供 src1 寻址。
VEX.vvvv 是反码形式,它值为 0111,实际上是 1000 (ID),因此它是 ymm8 寄存器


(6) VEX.L = 1
  操作数是 256 位



(7) VEX.pp = 01

VEX.pp =  01,表示指令的 SIMD prefix 是 66



(8 ) 69

这是指令的 opcode 码



(9) ModRM = 00-111-110(反码)

ModRM.mod = 00,为 ModRM.r/m 提供 [base] 的寻址模式
ModRM.reg = 111,与 VEX.R 组合起来是 1111,也就是 ymm0
ModRM.r/m = 110,与 VEX.B 组合起来是 0110,反码形式是 1001,即表示 r9 寄存器
-----------------------------------------------------------------------------
因此,ModRM 提供的寻址是 reg = ymm0
                                   r/m =   [r9]



(10) imme = 11100000(反码)

imme[7:4] = 1110,表示为 ymm1 寄存器






由此可见:

  AMD 的指令集里包含了兼容的 AVX 和 FMA(FMA4)指令,也就属于自己扩展的 XOP 指令。







------(完)-------
:wink:

[ 本帖最后由 mik 于 2009-5-18 23:41 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP