comcat
一介草民
级别: 论坛版主
精华:
3
发帖: 165
威望: 144 点
镭: 219 L
贡献值: 0 点
在线时间:114(小时)
注册时间:2006-04-14
最后登录:2010-01-12
|
发布龙芯2E多媒体指令分析、测试文档
因为没有公开的多媒体指令文档,这个让要做多媒体优化的弟兄们比较郁闷
手头刚好有打了龙芯补丁的汇编器as, 于是将龙芯补丁提取出来,稍作整理,得到了龙芯扩展的指令列表:
/* godson2 extensions */
faddu, D,V,T, 0x45800000, 0xffe0003f for, D,V,T, 0x45a00000, 0xffe0003f fadd, D,V,T, 0x45c00000, 0xffe0003f fdadd, D,V,T, 0x45e00000, 0xffe0003f pavgh, D,V,T, 0x46400000, 0xffe0003f pavgb, D,V,T, 0x46600000, 0xffe0003f pmaxsh, D,V,T, 0x46800000, 0xffe0003f pminsh, D,V,T, 0x46a00000, 0xffe0003f pmaxub, D,V,T, 0x46c00000, 0xffe0003f pminub, D,V,T, 0x46e00000, 0xffe0003f paddsh, D,V,T, 0x47000000, 0xffe0003f paddush, D,V,T, 0x47200000, 0xffe0003f paddh, D,V,T, 0x47400000, 0xffe0003f paddw, D,V,T, 0x47600000, 0xffe0003f paddsb, D,V,T, 0x47800000, 0xffe0003f paddusb, D,V,T, 0x47a00000, 0xffe0003f paddb, D,V,T, 0x47c00000, 0xffe0003f paddd, D,V,T, 0x47e00000, 0xffe0003f fsubu, D,V,T, 0x45800001, 0xffe0003f pasubub, D,V,T, 0x45a00001, 0xffe0003f fsub, D,V,T, 0x45c00001, 0xffe0003f fdsub, D,V,T, 0x45e00001, 0xffe0003f pcmpeqw, D,V,T, 0x46400001, 0xffe0003f pcmpgtw, D,V,T, 0x46600001, 0xffe0003f pcmpeqh, D,V,T, 0x46800001, 0xffe0003f pcmpgth, D,V,T, 0x46a00001, 0xffe0003f pcmpeqb, D,V,T, 0x46c00001, 0xffe0003f pcmpgtb, D,V,T, 0x46e00001, 0xffe0003f psubsh, D,V,T, 0x47000001, 0xffe0003f psubush, D,V,T, 0x47200001, 0xffe0003f psubh, D,V,T, 0x47400001, 0xffe0003f psubw, D,V,T, 0x47600001, 0xffe0003f psubsb, D,V,T, 0x47800001, 0xffe0003f psubusb, D,V,T, 0x47a00001, 0xffe0003f psubb, D,V,T, 0x47c00001, 0xffe0003f psubd, D,V,T, 0x47e00001, 0xffe0003f fsll, D,V,T, 0x45800002, 0xffe0003f fdsll, D,V,T, 0x45a00002, 0xffe0003f pextrh, D,V,T, 0x45c00002, 0xffe0003f pmaddhw, D,V,T, 0x45e00002, 0xffe0003f psllw, D,V,T, 0x46400002, 0xffe0003f psllh, D,V,T, 0x46600002, 0xffe0003f pmullh, D,V,T, 0x46800002, 0xffe0003f pmulhh, D,V,T, 0x46a00002, 0xffe0003f pmuluw, D,V,T, 0x46c00002, 0xffe0003f pmulhuh, D,V,T, 0x46e00002, 0xffe0003f pshufh, D,V,T, 0x47000002, 0xffe0003f packsswh, D,V,T, 0x47200002, 0xffe0003f packsshb, D,V,T, 0x47400002, 0xffe0003f packushb, D,V,T, 0x47600002, 0xffe0003f fxor, D,V,T, 0x47800002, 0xffe0003f fnor, D,V,T, 0x47a00002, 0xffe0003f fand, D,V,T, 0x47c00002, 0xffe0003f pandn, D,V,T, 0x47e00002, 0xffe0003f fsrl, D,V,T, 0x45800003, 0xffe0003f fdsrl, D,V,T, 0x45a00003, 0xffe0003f fsra, D,V,T, 0x45c00003, 0xffe0003f fdsra, D,V,T, 0x45e00003, 0xffe0003f psrlw, D,V,T, 0x46400003, 0xffe0003f psrlh, D,V,T, 0x46600003, 0xffe0003f psraw, D,V,T, 0x46800003, 0xffe0003f psrah, D,V,T, 0x46a00003, 0xffe0003f punpcklwd, D,V,T, 0x46c00003, 0xffe0003f punpckhwd, D,V,T, 0x46e00003, 0xffe0003f punpcklhw, D,V,T, 0x47000003, 0xffe0003f punpckhhw, D,V,T, 0x47200003, 0xffe0003f punpcklbh, D,V,T, 0x47400003, 0xffe0003f punpckhbh, D,V,T, 0x47600003, 0xffe0003f pinsrh_0, D,V,T, 0x47800003, 0xffe0003f pinsrh_1, D,V,T, 0x47a00003, 0xffe0003f pinsrh_2, D,V,T, 0x47c00003, 0xffe0003f pinsrh_3, D,V,T, 0x47e00003, 0xffe0003f fseq, S,T, 0x46800032, 0xffe007ff fseq1, S,T, 0x46a00032, 0xffe007ff fsltu, S,T, 0x4680003c, 0xffe007ff fslt, S,T, 0x46a0003c, 0xffe007ff fsleu, S,T, 0x4680003e, 0xffe007ff fsle, S,T, 0x46a0003e, 0xffe007ff biadd, D,V, 0x46800005, 0xffff003f pmovmskb, D,V, 0x46a00005, 0xffff003f
/* godson2 paired single */
add.gps, D,V,T, 0x45600000, 0xffe0003f sub.gps, D,V,T, 0x45600001, 0xffe0003f mul.gps, D,V,T, 0x45600002, 0xffe0003f abs.gps, D,V, 0x45600005, 0xffff003f mov.gps, D,S, 0x45600006, 0xffff003f neg.gps, D,V, 0x45600007, 0xffff003f c.f.gps, S,T, 0x45600030, 0xffe007ff c.un.gps, S,T, 0x45600031, 0xffe007ff c.eq.gps, S,T, 0x45600032, 0xffe007ff c.ueq.gps, S,T, 0x45600033, 0xffe007ff c.olt.gps, S,T, 0x45600034, 0xffe007ff c.ult.gps, S,T, 0x45600035, 0xffe007ff c.ole.gps, S,T, 0x45600036, 0xffe007ff c.ule.gps, S,T, 0x45600037, 0xffe007ff c.sf.gps, S,T, 0x45600038, 0xffe007ff c.ngle.gps, S,T, 0x45600039, 0xffe007ff c.seq.gps, S,T, 0x4560003a, 0xffe007ff c.ngl.gps, S,T, 0x4560003b, 0xffe007ff c.lt.gps, S,T, 0x4560003c, 0xffe007ff c.nge.gps, S,T, 0x4560003d, 0xffe007ff c.le.gps, S,T, 0x4560003e, 0xffe007ff c.ngt.gps, S,T, 0x4560003f 0xffe007ff
于是边假设,边测试就有了这个文档。 看过MMX, SSE的兄弟应该对前面80条指令的大部分很眼熟的。
文档涵盖80条整型多媒体指令,尚有22条双单精度指令(Paired-Singl, 同时操作2个单精度浮点数)没有一一测试,因为 这些在一般的多媒体优化中用的较少,以后再熟悉吧。
文档附带了一些多媒体指令编程的小技巧,以Tips的条目形式列出。对多媒体中指令中的一些重要概念做了概要的说明。
文档从程序员的角度出发写的,不太喜欢一堆罗嗦的文字, 一些指令的操作一部分用图形示意,复杂点的就用伪代码表示了:)
因为很多指令实现的MMX的思想,对类MMX一看就知道的就没有去测试,绝大部分指令经测试,所有用到的测试程序在这里找: http://people.openrays.org/~comcat/ 有疑问的可以自己再测测。
可以供在龙芯平台做多媒体优化的兄弟参考.
文档共63页.
下载链接: http://people.openrays.org/~comcat/mydoc/godson2e.mmi.pdf
另: fadd 的问题(详见文档描述)已经得到龙梦方面的回帖:
http://www.lemote.com/bbs/viewthread.php?tid=3057&extra=page%3D1
CODE: 确实有问题,我已经去问做ALU的人了;这里可能是个bug。龙芯2E在64位、32位的问题处理上和MIPS R4000并不完全一样,没有一个模式位,因此64位的指令也可以在32位下自由使用,但这样做可能引起一些意想不到的问题。
add的问题,有可能是因为0x0000 0000 ffff fffe高位为0,导致溢出判断逻辑出问题。正常情况-2应该是0xffff ffff ffff fffe,纯32位的操作不会出现前面那种数据。
建议用addu指令,彻底避免溢出例外;记得一般mips编译器也不产生add指令。
要使用该指令的兄弟要注意, 尽量避免使用 fadd。
龙梦方面的最新回复:
CODE: MIPS指令集定义中关于add指令的描述有一段是这样的: Restrictions: On 64-bit processors, if either GPR rt or GPR rs do not contain sign-extended 32-bit values (bits 63..31 equal), then the result of the operation is undefined.
因此这个不是一个bug,已经和相关人员确认过了。
这样看来,因为fadd的操作对象是64位多媒体(浮点)寄存器(MMR/FPR),而fadd只对低32位执行加运算,如果要使用fadd的话,则程序员将负数从GPR移入MMR时,要对其进行符号扩展。否则程序会异常退出。这个只对运行于32位模式下的龙芯2E而言, 64位模式下的龙芯2E就不会有该问题.
如上面的测试程序中操作数 0x0000 0000 ffff fffe(-2)要扩展为0xffff ffff ffff fffe 方可无事。
[ 此贴被comcat在2006-12-21 17:00重新编辑 ]
|
行到水穷处,坐看云起时
|
[楼 主]
|
Posted: 2006-12-20 18:17 |
| |