通过FLIX指令结构提高可配置处理器计算性能
解决长指令字体系结构代码膨胀的一种有效方法是采用更加灵活的指令长度。如果处理器允许多种不同的指令长度,包括各种对单一操作进行编码的短指令,那么与传统长指令字VLIW处理器相比,编译器就可以获得更加有效的指令代码大小和更加有效的指令存储效率。对长指令字处理器而言,减少代码大小还意味着减少所要求的总线带宽,并且减少了与取指令相关的功耗。例如,Tensilica的 Xtensa LX处理器采用了灵活的指令扩展技术(FLIX)。该体系结构的指令代码寻址可以提供16位、24位和选择一种32位或者64位的指令长度。设计人员定义的指令可以使用24位、32位和64位的指令格式。
长指令允许用户更加自由地进行编码。在这种情况下,用户可以根据每个指令槽指令操作的多少来定义(虽然在通常情况下有3到6个独立的指令操作槽)大量的子指令和操作。各个指令槽的大小不需要相等。大的指令槽(20到30位)可以放置各种不同的操作码、寄存器个数相对多的寄存器文件(16 到32个寄存器)以及3个或者4个寄存器操作数标志符。系统开发人员应当考虑到建立具有大指令槽的处理器,这种大指令槽针对应用,具有适度的并行性,但是在应用领域内应当具有较强的灵活性和一般性。
小的指令槽(8~16位)让用户可以直接说明小寄存器集之间数据的移动,并且允许用户将大量的独立指令槽打包成一个长指令字。每一个指令槽提供更有限的操作范围、更少的操作标志符(或更多隐含的操作数)及使用更少寄存器的文件。开发人员应当考虑根据不同应用建立许多小的指令槽,这些应用在许多专用功能部件之间具有高度的并行性。
长指令字和自动处理器生成
长指令字非常适合处理器硬件和软件的自动生成。高级指令描述可以说明适合每个指令槽的子指令集。从这些指令描述中,处理器产生器确定每个指令槽中每个编码域的编码要求、分配操作码并建立针对所有必需的指令格式的指令译码硬件。而且处理器产生器还建立与长指令字处理器相应的编译器和汇编器。对于长指令字体系结构而言,将子指令打包成长指令是一项非常复杂的任务。汇编器可以处理这种指令包,因此程序员写的汇编语言源代码程序只需要指定不同操作或者子指令,不必过分关注打包的约束。编译器在满足系统具有最大性能和最小代码容量的前提下产生适合指令槽的程序代码,因此通常需要自己将各类操作打包成长指令。
图4表示用FLIX技术中的TIE语言描述的一个简短且完整的长指令字处理器。该处理器完全建立在32位的整数操作的基础上,并没有定义新的操作。此描述建立了一个具有高度潜在指令级并行性的处理器,其应用完全用标准C整数操作和数据类型写成。三个指令槽中的第一个指令槽支持全部常用的整数操作,包括ALU操作、加载、存储、跳转和分支指令操作。第二个指令槽提供加载和存储操作,另外还包括大多数常用的ALU操作。第三个指令槽补充全部 ALU操作,但是不包括加载和存储操作。
图3中的第一行说明了一个新的64位指令长度,并指定了确定指令长度的前4位编码。第二行说明了指令长度格式为format1,它包括 3个指令槽,分别为base_slot、ldst_slot和alu_slot,并且在新指令格式中对这三个指令槽进行了命名。第四行列出了第一个指令槽 base_slot所有可能包含的TIE指令。在这种情况下,所有在Xtensa LX处理器中的指令(除了新指令)都可能包含在这个指令槽中。处理器产生器还为每个指令槽产生一个空操作NOP,因此软件工具总是可以产生完整的指令,即使找不到可以封装到长指令字中的合适操作。第四行和第五行指定可以包含在其它两个指令槽中的指令子集.
评论