相关申请本专利申请是对2014年7月15日提交的序列号为14/331,986且题为“highlyintegratedscalable,flexibledspmegamodulearchitecture”的美国专利申请的改善,其要求2013年7月15日提交的序列号为61/846,148的美国临时专利申请的优先权。本发明的
技术领域:
是数字数据处理,并且更具体是用于操作数提取的流引擎的控制。
背景技术:
:现代的数字信号处理器(dsp)面对多重挑战。工作量不断增加需要增加带宽。芯片上系统(soc)在尺寸和复杂性上不断增长。存储器系统延迟严重影响某些类型的算法。随着晶体管变小,存储器和寄存器变得更不可靠。随着软件堆栈变大,可能的交互和误差的数量变得更大。对于操作实时数据的数字信号处理器,存储器带宽和调度是一个问题。操作实时数据的数字信号处理器通常接收输入数据流、对数据流执行滤波功能(诸如编码或解码)并且输出经转换的数据流。该系统被称为实时的是因为如果经转换的数据流在被调度时对于输出不可用则应用失败。典型的视频编码需要可预测的但非时序的输入数据模式。通常相应的存储器访问难以实现可用的地址生成和存储器访问资源。典型的应用需要存储器访问加载数据寄存器文件(rf)中的数据寄存器,然后供应给执行数据处理的功能单元。技术实现要素:本发明是用在数字信号处理器中的流引擎。通过将相应的参数存储在控制寄存器中来指定固定的数据流序列。一旦开始,数据流是只读的并且不能被写入。这通常对应于实时滤波操作的需求。一旦数据流被提取出,则该数据流在供应到功能单元之前被存储于先进先出缓冲器中。数据可以仅以固定的顺序被展示给功能单元。示例性实施例供应指定的数据流的数据元素,从而相继打包一对头端寄存器,该对头端寄存器均具有功能单元的数据宽度。该对头端寄存器允许对数据流的各种访问。第一流读取指令从第一头端寄存器读取,该第一头端寄存器存储数据流的最近数据元素。第二流读取指令从第二头端寄存器读取,该第二头端寄存器存储第一头端寄存器之后的接下来的数据元素。这允许根据流数据的使用而对数据流序列内的访问进行稍微重新安排。示例性实施例使用该对头端寄存器以便将数据供应给双倍数据宽度指令。至少一个功能单元能够操作双倍正常数据宽度的数据。这可以使用相关联的功能单元来实现,每个功能单元操作正常数据宽度。第三流读取指令从第一头端寄存器和第二头端寄存器读取,从而供应双倍宽度数据。在优选实施例中,第一流读取指令、第二流读取指令和第三流读取指令中的每一个具有相关联的流读取/提前指令。流读取/提前指令像其相关联的流读取指令那样供应数据。每个流读取/提前指令还通过存储第一流头寄存器和第二流头寄存器中的所述流的下一个相继数据元素而提前数据流。附图说明本发明的这些方面和其他方面在附图中说明,其中:图1说明根据本发明的一个实施例的成双的标量/矢量数据路径处理器;图2说明图1中说明的成双的标量/矢量数据路径处理器中的寄存器和功能单元;图3说明全局标量寄存器文件;图4说明由算法功能单元共享的局部标量寄存器文件;图5说明由乘法功能单元共享的局部标量寄存器文件;图6说明由局部/存储单元共享的局部标量寄存器文件;图7说明全局矢量寄存器文件;图8说明断言寄存器文件;图9说明由算法功能单元共享的局部矢量寄存器文件;图10说明由乘法功能单元和相关功能单元共享的局部矢量寄存器文件;图11说明根据本发明的优选实施例的中央处理单元的流水线阶段;图12说明单个提取包的十六个指令;图13说明本发明使用的指令的指令编码的示例;图14说明条件码扩展间隙(slot)0的位编码;图15说明条件码扩展间隙1的位编码;图16说明常量扩展间隙的位编码0;图17是说明常量扩展的部分框图;图18说明根据本发明的用于simd操作的进位控制;图19说明本发明的流引擎的概念视图;图20说明矢量中的通道分配的第一示例;图21说明矢量中的通道分配的第二示例;图22说明基本的二维流;图23说明图21的示例流中的元素的顺序;图24说明从较大的矩形中取出较小的矩形;图25说明流引擎将如何提取该示例中具有4个字节的移项粒度的流;图26说明流引擎将如何提取该示例中具有8个字节的移项粒度的流;图27说明本发明的流引擎的细节;图28说明本发明的流模板寄存器;图29说明本发明的流模板寄存器的标记字段的子字段定义;图30说明示出本发明的流引擎供应数据的部分示意图;图31说明本发明的可替代实施例的流引擎的细节;以及图32说明示出图31的示例中的流引擎供应数据的部分示意图。具体实施方式图1说明根据本发明的优选实施例的成双的标量/矢量数据路径处理器。处理器100包括分开的一级指令缓存器(l1i)121和一级数据缓存器(l1d)123。处理器100包括二级组合式指令/数据缓存器(l2)130,其保持指令和数据两者。图1说明一级指令缓存器121和二级组合式指令/数据缓存器130之间的连接(总线142)。图1说明一级数据缓存器123和二级组合式指令/数据缓存器130之间的连接(总线145)。在处理器100的优选实施例中,二级组合式指令/数据缓存器130存储这两个指令以备份一级指令缓存器121并且存储数据以备份一级数据缓存器123。在优选实施例中,二级组合式指令/数据缓存器130进一步以本领域已知的但图1中未说明的方式连接到更高级的缓存器和/或主存储器。在优选实施例中,中央处理单元核心110、一级指令缓存器121、一级数据缓存器123以及二级组合式指令/数据缓存器130被形成在单个集成电路上。该信号集成电路可选择地包括其他电路。中央处理单元核心110在指令提取单元111控制下从一级指令缓存器121提取指令。指令提取单元111确定将被执行的下一个指令并且调用提取包大小的一组此类指令。提取包的性质和大小在下面进一步详述。如本领域已知的,在缓存命中之后(如果这些指令被存储在一级指令缓存器121中),指令被直接从一级指令缓存器121中提取。在缓存错失之后(指定的指令提取包没有被存储在一级指令缓存器121中),在二级组合式缓存器130中寻找这些指令。在优选实施例中,一级指令缓存器121中的缓存线的大小等于提取包的大小。这些指令的存储器位置在二级组合式缓存器130中或命中或错失。命中是由二级组合式缓存器130服务。错失是由另一级缓存器(未图示说明)或由主存储器(未图示说明)服务。如本领域已知的,所请求的指令可以被同时供应到一级指令缓存器121和中央处理单元核心110两者以加速使用。在本发明的优选实施例中,中央处理单元核心110包括复数个功能单元以执行指令指定的数据处理任务。指令分派单元112确定每个提取的指令的目标功能单元。在优选实施例中,中央处理单元110作为超长指令字(vliw)处理器进行操作,其能够同时处理相应的功能单元中的复数个指令。优选地,编译器组织执行包中一起被执行的指令。指令分派单元112将每个指令引导到其目标功能单元。分配给指令的功能单元完全由编译器产生的指令来指定。中央处理单元核心110的硬件不参与该功能单元分配。在优选实施例中,指令分派单元12可以并行操作复数个指令。这种并行指令的数量由执行包的大小设定。这将在下面进一步详述。指令分派单元112的分派任务的一部分是确定指令在标量数据路径侧a115中的功能单元上执行还是在矢量数据路径侧b116中的功能单元上执行。每个指令中被称为s位的指令位确定该指令控制哪个数据路径。这将在下面进一步详述。指令解码单元113对当前执行包中的每个指令解码。解码包括识别执行该指令的功能单元、从可能的寄存器文件(rf)中识别用于为相应的数据处理操作供应数据的寄存器以及识别相应的数据处理操作的结果的寄存器目的地。如下面进一步解释的,指令可以包括代替一个寄存器编号操作数字段的常量字段。该解码的结果是信号,这些信号用于控制目标功能单元以便对指定数据执行由相应的指令所指定的数据处理操作。中央处理单元核心110包括控制寄存器114。控制寄存器114存储用于以与本发明不相关的方式控制标量数据路径侧a115和矢量数据路径侧b116中的功能单元的信息。该信息可以是模式信息等。来自指令解码器113的已解码的指令和存储在控制寄存器114中的信息被供应到标量数据路径侧a115和矢量数据路径侧b116。结果,标量数据路径侧a115和矢量数据路径侧b116中的功能单元根据指令指定的数据执行指令指定的数据处理操作并且将结果存储在一个或多个指令指定的数据寄存器中。标量数据路径侧a115和矢量数据路径侧b116中的每一个包括优选并行操作的复数个功能单元。这些将结合图2进一步详述。标量数据路径侧a115和矢量数据路径侧b116之间存在允许数据交换的数据路径117。中央处理单元核心110进一步包括非基于指令的模块。仿真单元118允许响应于指令来确定中央处理单元核心110的机器状态。这种能力通常将被用于算法开发。中断/异常单元119使得中央处理单元核心110能够响应外部异步事件(中断)并且回应执行不适当操作的尝试(异常)。中央处理单元核心110包括流引擎125。流引擎125将两个数据流从通常缓存在二级组合式缓存器130中的预定地址供应到矢量数据路径侧b的寄存器文件。这提供从存储器(如缓存在二级组合式缓存器130中的)直接到功能单元操作数输入端的受控数据移动。这将在下面进一步详述。图1说明各个部分之间的总线的示例性数据宽度。一级指令缓存器121将指令经由总线141供应到指令提取单元111。优选地,总线141是512位总线。总线141从一级指令缓存器121单向通到中央处理单元10。二级组合式缓存器130将指令经由总线142供应到一级指令缓存器121。优选地,总线142是512位总线。总线142从二级组合式缓存器130单向通到一级指令缓存器121。一级数据缓存器123与标量数据路径侧a115中的寄存器文件经由总线143交换数据。优选地,总线143是64位总线。一级数据缓存器123与矢量数据路径侧b116中的寄存器文件经由总线144交换数据。优选地,总线144是512位总线。总线143和144被图示说明为双向支持中央处理单元110数据读取和数据写入两者。一级数据缓存器123与二级组合式缓存器130经由总线145交换数据。优选地,总线145是512位总线。总线145被图示说明为双向支持中央处理单元110数据读取和数据写入两者的缓存服务。如本领域已知的,在缓存命中之后(如果请求的数据存储在一级数据缓存器123中),cpu数据请求直接从一级数据缓存器123提取。在缓存错失之后(指定的数据没有存储在一级数据缓存器123中),在二级组合式缓存器130中寻找该数据。该请求数据的存储器位置在二级组合式缓存器130中或命中或错失。命中是由二级组合式缓存器130服务。错失是由另一级缓存器(未图示说明)或由主存储器(未图示说明)服务。如本领域已知的,所请求的指令可以同时供应到一级数据缓存器123和中央处理单元核心110两者以加速使用。二级组合式缓存器130将第一数据流的数据经由总线146供应到流引擎125。优选地,总线146是512位总线。流引擎125将该第一数据流的数据经由总线147供应到矢量数据路径侧b116的功能单元。优选地,总线147是512位总线。二级组合式缓存器130将第二数据流的数据经由总线148供应到流引擎125。优选地,总线148是512位总线。流引擎125将该第二数据流的数据经由总线149供应到矢量数据路径侧b116的功能单元。优选地,总线149是512位总线。根据本发明的优选实施例,总线146、147、148和149被图示说明为从二级组合式缓存器130单向通到流引擎125并且通到矢量数据路径侧b116。在缓存命中之后(如果请求的数据存储在二级组合式缓存器130中),流引擎数据请求直接从二级组合式缓存器130提取。在缓存错失之后(指定的数据没有存储在二级组合式缓存器130中),从另一级缓存器(未图示说明)或从主存储器(未图示说明)寻找该数据。在一些实施例中,一级数据缓存器123缓存未存储在二级组合式缓存器130中的数据在技术上是可行的。如果支持该操作,则根据在二级组合式缓存器130中错失的流引擎数据请求,二级组合式缓存器130应该对于流引擎请求的数据监听一级数据缓存器1233。如果一级数据缓存器123存储该数据,则其监听响应将包括随后被供应以服务流引擎请求的数据。如果一级数据缓存器123没有存储该数据,则其监听响应将指示此结果并且二级组合式缓存器130必须服务来自另一级缓存器(未图示说明)或来自主存储器(未图示说明)的这一流引擎请求。在本发明的优选实施例中,根据题为“unifiedmemorysystemarchitectureincludingcacheanddirectlyaddressablestaticrandomaccessmemory”的美国专利no.6,606,686,一级数据缓存器123和二级组合式缓存器130两者都可以被配置为选定数量的缓存器或直接可寻址的存储器。图2进一步说明标量数据路径侧a115和矢量数据路径侧b116中的功能单元和寄存器文件的细节。标量数据路径侧a115包括全局标量寄存器文件(rf)211、l1/s1局部寄存器文件212、m1/n1局部寄存器文件213和d1/d2局部寄存器文件214。标量数据路径侧a115包括l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226。矢量数据路径侧b116包括全局矢量寄存器文件231、l2/s2局部寄存器文件232、m2/n2/c局部寄存器文件233和断言寄存器文件214。矢量数据路径侧b116包括l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246。在功能单元可以从哪个寄存器文件读取或者可以写入哪个寄存器文件上存在限制。这些将在下面详述。标量数据路径侧a115包括l1单元221。l1单元221通常接受两个64位操作数并且产生一个64位结果。这两个操作数都是从全局标量寄存器文件211或l1/s1局部寄存器文件212中的指令指定的寄存器调用的。l1单元221优选执行以下指令选择的操作:64位加/减操作;32位最小/最大操作;8位单指令多数据(simd)指令(诸如绝对值求和、最小值和最大值确定);循环最小/最大操作以及寄存器文件之间的各种移动操作。结果可以被写入全局标量寄存器文件211、l1/s1局部寄存器文件212、m1/n1局部寄存器文件213或d1/d2局部寄存器文件214的指令指定的寄存器中。标量数据路径侧a115包括s1单元222。s1单元222通常接受两个64位操作数并且产生一个64位结果。这两个操作数都是从全局标量寄存器文件211或l1/s1局部寄存器文件212中的指令指定的寄存器调用的。s1单元222优选执行与l1单元211相同类型的操作。由l1单元211和s1单元222支持的数据处理操作之间可以选择性地存在轻微变化。结果可以被写入全局标量寄存器文件211、l1/s1局部寄存器文件212、m1/n1局部寄存器文件213或d1/d2局部寄存器文件214的指令指定的寄存器中。标量数据路径侧a115包括m1单元223。m1单元223通常接受两个64位操作数并且产生一个64位结果。这两个操作数都是从全局标量寄存器文件211或m1/n1局部寄存器文件213中的指令指定的寄存器调用的。m1单元223优选执行以下指令选择的操作:8位乘法操作;复杂的点积操作;32位计数操作;复杂的共轭乘法操作以及按位逻辑操作、移位、加和减。结果可以被写入全局标量寄存器文件211、l1/s1局部寄存器文件212、m1/n1局部寄存器文件213或d1/d2局部寄存器文件214的指令指定的寄存器中。标量数据路径侧a115包括n1单元224。n1单元224通常接受两个64位操作数并且产生一个64位结果。这两个操作数都是从全局标量寄存器文件211或m1/n1局部寄存器文件213中的指令指定的寄存器调用的。n1单元224优选执行与m1单元223相同类型的操作。可以存在同时采用m1单元223和n1单元224两者的某些双重操作(称为成双发布的指令)。结果可以被写入全局标量寄存器文件211、l1/s1局部寄存器文件212、m1/n1局部寄存器文件213或d1/d2局部寄存器文件214的指令指定的寄存器中。标量数据路径侧a115包括d1单元225和d2单元226。d1单元225和d2单元226通常均接受两个64位操作数并且均产生一个64位结果。d1单元225和d2单元226通常执行地址计算以及相应的加载和存储操作。d1单元225用于64位的标量加载和存储。d2单元226用于512位的矢量加载和存储。优选地,d1单元225和d2单元226也执行:对加载和存储数据进行调换、打包以及拆包;64位simd算法操作以及64位按位逻辑操作。d1/d2局部寄存器文件214将通常存储用于对相应的加载和存储进行地址计算的基础地址和偏移地址。这两个操作数都是从全局标量寄存器文件211或d1/d2局部寄存器文件214中的指令指定的寄存器调用的。计算的结果可以被写入全局标量寄存器文件211、l1/s1局部寄存器文件212、m1/n1局部寄存器文件213或d1/d2局部寄存器文件214的指令指定的寄存器中。矢量数据路径侧b116包括l2单元241。l2单元241通常接受两个512位操作数并且产生一个512位结果。这两个操作数都是从全局矢量寄存器文件231、l2/s2局部寄存器文件232或断言寄存器文件234中的指令指定的寄存器调用的。除了更宽的512位数据之外,l2单元241优选执行与l1单元221类似的指令。结果可以被写入全局矢量寄存器文件231、l2/s2局部寄存器文件232、m2/n2/c局部寄存器文件233或断言寄存器文件214的指令指定的寄存器中。矢量数据路径侧b116包括s2单元242。s2单元242通常接受两个512位操作数并且产生一个512位结果。这两个操作数都是从全局矢量寄存器文件231、l2/s2局部寄存器文件232或断言寄存器文件234中的指令指定的寄存器调用的。除了更宽的512位数据之外,s2单元242优选执行与s1单元222类似的指令。结果可以被写入全局矢量寄存器文件231、l2/s2局部寄存器文件232、m2/n2/c局部寄存器文件233或断言寄存器文件214的指令指定的寄存器中。矢量数据路径侧b116包括m2单元243。m2单元243通常接受两个512位操作数并且产生一个512位结果。这两个操作数都是从全局矢量寄存器文件231或m2/n2/c局部寄存器文件233中的指令指定的寄存器调用的。除了更宽的512位数据之外,m2单元243优选执行与m1单元222类似的指令。结果可以被写入全局矢量寄存器文件231、l2/s2局部寄存器文件232或m2/n2/c局部寄存器文件233的指令指定的寄存器中。矢量数据路径侧b116包括n2单元244。n2单元244通常接受两个512位操作数并且产生一个512位结果。这两个操作数都是从全局矢量寄存器文件231或m2/n2/c局部寄存器文件233中的指令指定的寄存器调用的。n2单元244优选执行与m2单元243相同类型的指令。可以存在同时采用m2单元243和n2单元244两者的某些双重操作(称为成双发布的指令)。结果可以被写入全局矢量寄存器文件231、l2/s2局部寄存器文件232或m2/n2/c局部寄存器文件233的指令指定的寄存器中。矢量数据路径侧b116包括c单元245。c单元245通常接受两个512位操作数并且产生一个512位结果。这两个操作数都是从全局矢量寄存器文件231或m2/n2/c局部寄存器文件233中的指令指定的寄存器调用的。c单元245优选执行:“搜查”和“搜索”指令;每个时钟周期高达512个2位pn*8位乘法的i/q复杂乘法;8位和16位的绝对差值求和(sad)计算,每个时钟周期高达512个sad;水平加法和水平最小/最大指令;以及矢量排列指令。c单元245还包括用于控制c单元245指令的某些操作的4个矢量控制寄存器(cucr0到cucr3)。控制寄存器cucr0到cucr3用作某些c单元245操作的操作数。控制寄存器cucr0到cucr3优选用于控制通用排列指令(vperm),并且用作simd多重点积操作(dotpm)和simd多重绝对差值求和(sad)操作的掩码。控制寄存器cucr0优选用于存储伽罗瓦(galios)域乘法操作(gfmpy)的多项式。控制寄存器cucr1优选用于存储伽罗瓦域多项式发生器函数。矢量数据路径侧b116包括p单元246。p单元246在局部断言寄存器文件234的寄存器上执行基础逻辑操作。p单元246具有从断言寄存器文件234读取和对断言寄存器文件234写入的直接访问权。这些操作包括and、andn、or、xor、nor、bitr、neg、set、bitcnt、rmbd、bit降采样(decimate)和扩展。p单元246的普通预期用途包括用于控制进一步simd矢量操作的simd矢量比较结果的操纵。图3说明全局标量寄存器文件211。存在16个独立的64位宽标量寄存器,其标记为a0-a15。全局标量寄存器文件211的每个寄存器可以被读取或写入作为64位的标量数据。所有的标量数据路径侧a115功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226)可以对全局标量寄存器文件211读取或写入。全局标量寄存器文件211可以被读取为32位或读取为64位并且可以仅被写入为64位。指令的执行确定读取数据的大小。矢量数据路径侧b116功能单元(l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246)可以在下面将详述的限制条件下经由交叉路径117从全局标量寄存器文件211读取。图4说明d1/d2局部寄存器文件214。存在16个独立的64位宽的标量寄存器,其标记为d0-d16。d1/d2局部寄存器文件214的每个寄存器可以被读取或写入作为64位的标量数据。所有的标量数据路径侧a115功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226)可以对全局标量寄存器文件211写入。仅d1单元225和d2单元226可以从d1/d2局部寄存器文件214读取。预计存储在d1/d2局部寄存器文件214中的数据将包括用于地址计算的基础地址和偏移地址。图5说明l1/s1局部寄存器文件212。图5中说明的实施例具有8个独立的64位宽的标量寄存器,其标记为al0-al7。优选的指令编码(见图13)允许l1/s1局部寄存器文件212包括高达16个寄存器。图5的实施例仅实施8个寄存器以降低电路尺寸和复杂性。l1/s1局部寄存器文件212的每个寄存器可以被读取或写入作为64位的标量数据。所有的标量数据路径侧a115功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226)可以对l1/s1局部寄存器文件212写入。仅l1单元221和s1单元222可以从l1/s1局部寄存器文件212读取。图6说明m1/n1局部寄存器文件213。图6中说明的实施例具有8个独立的64位宽的标量寄存器,其被标记为am0-am7。优选的指令编码(见图13)允许m1/n1局部寄存器文件213包括高达16个寄存器。图6的实施例仅实施8个寄存器以降低电路尺寸和复杂性。m1/n1局部寄存器文件213的每个寄存器可以被读取或写入作为64位的标量数据。所有的标量数据路径侧a115功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226)可以对m1/n1局部寄存器文件213写入。仅m1单元223和n1单元224可以从m1/n1局部寄存器文件213读取。图7说明全局矢量寄存器文件231。存在16个独立的512位宽的矢量寄存器。全局矢量寄存器文件231的每个寄存器可以被读取或写入作为64位的标量数据,标记为b0-b15。指令类型确定数据大小。所有的矢量数据路径侧b116功能单元(l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246)可以对全局矢量寄存器文件231读取或写入。标量数据路径侧a115功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226)可以在下面将详述的限制条件下经由交叉路径117从全局矢量寄存器文件231读取。图8说明p局部寄存器文件234。存了8个独立的64位宽的寄存器,其标记为p0-p15。p局部寄存器文件234的每个寄存器可以被读取或写入作为64位的标量数据。矢量数据路径侧b116功能单元l2单元241、s2单元242、c单元244和p单元246可以对p局部寄存器文件234写入。仅l2单元241、s2单元242和p单元246可以从p局部寄存器文件234读取。p局部寄存器文件234的普通预期用途包括:从l2单元241、s2单元242或c单元244写入一位simd矢量比较结果;由p单元246操纵simd矢量比较结果;以及使用操纵结果用于控制进一步的simd矢量操作。图9说明l2/s2局部寄存器文件232。图9中说明的实施例具有8个独立的512位宽的矢量寄存器。优选的指令编码(见图13)允许l2/s2局部寄存器文件232包括高达16个寄存器。图9的实施例仅实施8个寄存器以降低电路尺寸和复杂性。l2/s2局部矢量寄存器文件232的每个寄存器可以被读取或写入作为64位的标量数据,标记为bl0-bl7。l2/s2局部矢量寄存器文件232的每个寄存器可以被读取或写入作为512位的矢量数据,标记为vbl0-vbl7。指令类型确定数据大小。所有的矢量数据路径侧b116功能单元(l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246)可以对l2/s2局部矢量寄存器文件232写入。仅l2单元241和s2单元242可以从l2/s2局部矢量寄存器文件232读取。图10说明m2/n2/c局部寄存器文件233。图10中说明的实施例具有8个独立的512位宽的矢量寄存器。优选的指令编码(见图13)允许l1/s1局部寄存器文件212包括高达16个寄存器。图10的实施例仅实施8个寄存器以降低电路尺寸和复杂性。m2/n2/c局部矢量寄存器文件233的每个寄存器可以被读取或写入作为64位的标量数据,标记为bm0-bm7。m2/n2/c局部矢量寄存器文件233的每个寄存器可以被读取或写入作为512位的矢量数据,标记为vml0-vml7。所有的矢量数据路径侧b116功能单元(l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246)可以对m2/n2/c局部矢量寄存器文件233写入。仅m2单元233、n2单元244和c单元245可以从m2/n2/c局部矢量寄存器文件233读取。对由一侧的所有功能区可访问的全局寄存器文件和仅由一侧的一些功能单元可访问的局部寄存器文件的规定是设计选择。本发明可以通过仅采用对应于所公开的全局寄存器文件的一类寄存器文件来实践。交叉路径117允许标量数据路径侧a115和矢量数据路径侧b116之间的有限数据交换。在每个操作周期期间,一个64位数据字可以被从全局标量寄存器文件a211调用以用作矢量数据路径侧b116的一个或多个功能单元的操作数,并且一个64位数据字可以被从全局矢量寄存器文件231调用以用作标量数据路径侧a115的一个或多个功能单元的操作数。任何标量数据路径侧a115功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226)都可以从全局矢量寄存器文件231读取64位操作数。该64位操作数是全局矢量寄存器文件232的访问的寄存器中的512位数据的最低有效位。复数个标量数据路径侧a115功能单元可以采用与相同操作周期期间的操作数相同的64位交叉路径数据。然而,在任何单个操作周期中,仅一个64位操作数被从矢量数据路径侧b116转移到标量数据路径侧a115。任何矢量数据路径侧b116(l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246)都可以从全局标量寄存器文件211读取64位操作数。如果相应的指令是标量指令,则交叉路径操作数数据被视为任意其他64位操作数。如果相应的指令是矢量指令,则操作数的高448位由零填充。复数个矢量数据路径侧b116功能单元可以采用与相同操作周期期间的操作数相同的64位交叉路径数据。在任何单个操作周期中,仅一个64位操作数被从标量数据路径侧a115转移到矢量数据路径侧b116。流引擎125在某些受限的情况下传输数据。流引擎125控制两个数据流。一个流由特定类型的元素序列构成。对这些流进行操作的程序顺序读取数据,进而在每个元素上操作。每个流具有下列基本属性。流数据具有良好定义的开始时间和结束时间。在整个流中,流数据具有固定的元素尺寸和类型。流数据具有固定的元素序列。因此程序不能在流中随机寻找。流数据仅在激活时被读取。当程序从流读取时不能同时对该流写入。一旦流被打开,则流引擎125:计算地址;从二级统一缓存器(其可能需要来自更高级的存储器的缓存服务)提取所定义的数据类型;执行数据类型操纵,诸如零扩展、符号扩展、数据元素整理/调换(诸如矩阵转置);以及将数据直接传送到cpu110中的程序化数据寄存器文件。因此,流引擎125有益于对表现良好的数据的实时数字滤波操作。流引擎125从相应的cpu释放这些存储器提取任务以使能其他处理功能。流引擎125提供以下益处。流引擎125允许多维存储器访问。流引擎125增加功能单元的可用带宽。由于流缓冲器旁通一级数据缓存器123,流引擎125使缓存错失拖延(stalls)的数量最小化。流引擎125降低维持循环所需要的标量操作的数量。流引擎125管理地址指针。流引擎125处理自动释放用于其他计算的地址生成指令间隙(slot)以及d1单元224和d2单元226的地址生成。cpu110对指令流水线进行操作。指令在下面进一步描述的固定长度的指令包中提取。所有指令需要相同数量的流水线阶段来用于提取和解码,但是需要不同数量的执行阶段。图11说明下列流水线阶段:程序提取阶段1110、分派和解码阶段1110以及执行阶段1130。对于所有指令,程序提取阶段1110包括三级。对于所有指令,分派和解码阶段包括三级。执行阶段1130根据指令包括一到四级。提取阶段1110包括程序地址生成级1111(pg)、程序访问级1112(pa)和程序接收级1113(pr)。在程序地址生成级1111(pg)期间,在cpu中产生程序地址并且将读取请求发送到一级指令缓存器l1i的存储器控制器。在程序访问级1112(pa)期间,一级指令缓存器l1i处理该请求、访问其存储器中的数据并且将提取包发送到cpu边界。在程序接收级1113(pr)期间,cpu寄存该提取包。指令总是被一次提取十六个32位宽的间隙,构成提取包。图12说明单个提取包的16个指令1201-1216。提取包在512位(16字)边界上对准。优选实施例采用固定的32位指令长度。固定长度的指令是有利的,其原因有以下几个。固定长度的指令使得解码器容易对准。恰当对准的指令提取可以将复数个指令加载到并行指令解码器中。当预定指令对准存储在与固定指令包提取耦连的存储器(提取包在512位边界上对准)中时,预定指令对准可以获得这种恰当对准的指令提取。对准的指令提取允许并行解码器在指令大小的提取位上的操作。可变长度的指令需要在每个指令可以被解码之前定位每个指令边界的初始步骤。固定长度指令集通常允许更规则的指令字段的布局。这简化每个解码器的结构,有益于宽发布(wideissue)vliw中央处理器。个体指令的执行由每个指令中的p位部分地控制。优选地,该p位是32位宽的间隙的位0。p位确定指令是否与下一个指令并行执行。从较低地址到较高地址扫描指令。如果指令的p位是1,则下一个跟随的指令(较高存储器地址)与该指令并行执行(与该指令在同一个周期内)。如果指令的p位是0,则下一个跟随的指令在该指令之后的周期内被执行。cpu110和一级指令缓存器l1i121流水线相互解耦。从一级指令缓存器l1i返回的提取包可以采用不同数量的时钟周期,这取决于外部情况,诸如是否在一级指令缓存器121中命中或在二级组合式缓存器130中命中。因此程序访问级1112(pa)可以采用几个时钟周期来代替如在其他级中的1个时钟周期。并行执行的指令组成执行包。在优选实施例中,执行包可以包括高达十六个指令。执行包中任何两个指令都不可以使用相同的功能单元。间隙是以下五个类型之一:1)在cpu110的功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225、d2单元226、l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246)的一个上执行的自持式指令;2)无单位指令,诸如nop(无操作)指令或多重nop指令;3)分支指令;4)常量字段扩展;以及5)条件码扩展。这些间隙类型中的一些将在下面进一步解释。分派和解码阶段1110包括指令分派到适当执行单元级1121(ds);指令预解码级1122(d1);以及指令解码及操作数读取级1222(d2)。在指令分派到适当执行单元级1121(ds)期间,提取包被划分成执行包中并且分配给合适的功能单元。在指令预解码级1122(d1)期间,源寄存器、目的地寄存器和相关联的路径被解码用于执行功能单元中的指令。在指令解码及操作数读取级1222(d2)期间,完成更加详细的单元解码,并且从寄存器文件读取操作数。执行阶段1130包括执行级1131-1135(e1-e5)。不同类型的指令需要不同数量的这些级以完成其执行。流水线的这些级对于理解cpu周期边界处的设备状态起到重要的作用。在执行1级1131(e1)期间,估计指令的条件并且对操作数进行操作。如图11所图示说明的,执行1级1131可以接收来自流缓冲器1141和寄存器文件之一(图示性示出为1142)的操作数。对于加载和存储指令,执行地址生成并且将地址修改写入到寄存器文件。对于分支指令,pg阶段中的分支提取包受到影响。如图11所图示说明的,加载和存储指令访问存储器(在此图示性示出为存储器1151)。对于单周期指令,结果被写入到目的地寄存器文件。这假设指令的任何条件都被估计为正确。如果条件被估计为错误,则在执行1级1131之后指令不写入任何结果或不具有任何流水线操作。在执行2级1132(e2)期间,加载指令将地址发送到存储器。存储指令将地址和数据发送到存储器。如果发生饱和,则使结果饱和的单周期指令设置控制状态寄存器(csr)中的sat位。对于2周期指令,结果被写入目的地寄存器文件。在执行3级1133(e3)期间,执行数据存储器访问。如果发生饱和,则使结果饱和的任何多重指令设置控制状态寄存器(csr)中的sat位。对于3周期指令,结果被写入目的地寄存器文件。在执行4级1134(e4)期间,加载指令将数据带到cpu边界。对于4周期指令,结果被写入目的地寄存器文件。在执行5级1135(e5)期间,加载指令将数据写入到寄存器中。这在图11中通过从存储器1151到执行5级1135的输入来图示说明。图13说明本发明使用的功能单元指令的指令编码1300的示例。本领域技术人员将认识到其他执行编码是可行的并且在本发明的范围内。每个指令由32位组成并且控制各个可控功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225、d2单元226、l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246)中的一个的操作。位字段被定义如下。creg字段1301(位29至位31)和z位1302(位28)是用于条件指令的可选字段。这些位被用于条件指令以识别断言寄存器和条件。z位1302(位28)指示断言是否基于断言寄存器中的零或非零。如果z=1,则测试是针对等于零的,如果z=0,则测试是针对非零的。creg=0并且z=0的情况被视为一直正确以允许无条件指令执行。creg字段1301和z字段1302如表1所示被编码在指令中。表1条件指令的执行是根据存储在指定数据寄存器中的值而有条件的。对于所有的指令单元,该数据寄存器在全局标量寄存器文件211中。注意z位栏中的“z”指的是上面提到的零/非零比较选择并且“x”是不关心状态。该编码可以仅指定16个全局寄存器的子集作为断言寄存器。做出该选择以保存指令编码中的位。注意无条件指令不具有这些可选位。优选地,对于无条件指令,字段1301和1302中的这些位(28到31)被用作附加操作码位。dst字段1303(位23到位27)指定相应寄存器文件中的寄存器作为指令结果的目的地。src2/cst字段1304(位18到位22)具有几个含义,其取决于指令操作码字段(位4到位12用于所有指令,并且附加地,位28到位31用于无条件指令)。第一含义指定相应寄存器文件的寄存器作为第二操作数。第二含义是直接常量。根据指令类型,这被视为扩展到指定数据长度的无符号整数和零或者视为扩展到指定数据长度的有符号整数和符号。src1字段1305(位13到位17)指定相应的寄存器文件中的寄存器作为第一源操作数。用于所有指令的操作码字段1306(位4到位12)(并且附加地用于无条件指令的位28到位31)指定指令的类型并且指示适当的指令选项。这包括所使用并且执行操作的功能单元的明确名称。除下面详述的指令选项外,操作码的详细解释超出本发明的范围。e位1037(位2)仅用于直接常量指令,其中常量可以被扩展。如果e=1,则直接常量以下面详述的方式扩展。如果e=0,则直接常量不被扩展。在该情况下,直接常量由src2/cst字段1304(位18到位22)指定。注意该e位1307仅用于一些指令。因此,通过使用恰当的编码,该e位1307可以从不需要它的指令中省略并且该位用作附加操作码位。s位1307(位1)指明标量数据路径侧a115或矢量数据路径侧b116。如果s=0,则选择标量数据路径侧a115。这将功能单元限制到图2中图示说明的l1单元221、s1单元222、m1单元223、n1单元224、d1单元225、d2单元226以及相应的寄存器文件。类似地,s=1选择矢量数据路径侧b116,其将功能单元限制到图2中图示说明的l2单元241、s2单元242、m2单元243、n2单元244、p单元246以及相应的寄存器文件。p位1308(位0)标记执行包。p位确定该指令是否与随后的指令并行执行。从较低地址到较高地址扫描p位。如果对于当前指令p=1,则下一个指令与当前指令并行执行。如果对于当前指令p=0,则下一个指令在当前指令之后的周期中执行。并行执行的所有指令组成执行包。执行包可以包含高达12个指令。执行包中的每个指令必须使用不同的功能单元。存在两种不同的条件码扩展间隙(slot)。每个执行包可以包含这些独特的32位条件码扩展间隙中的每一个,对于同一执行包中的指令,这32位条件码扩展间隙包含4位creg/z字段。图14说明用于条件码扩展间隙0的编码并且图15说明用于条件码扩展间隙1的编码。图14说明用于具有32位的条件码扩展间隙0的编码。字段1401(位28到位31)指定分配到同一执行包中的l1单元221指令的4个creg/z位。字段1402(位27到位24)指定分配到同一执行包中的l2单元241指令的4个creg/z位。字段1403(位19到位23)指定分配到同一执行包中的s1单元222指令的4个creg/z位。字段1404(位16到位19)指定分配到同一执行包中的s2单元242指令的4个creg/z位。字段1405(位12到位15)指定分配到同一执行包中的d1单元225指令的4个creg/z位。字段1406(位8到位11)指定分配到同一执行包中的d2单元245指令的4个creg/z位。字段1407(位6和位7)是未使用的/保留的。字段1408(位0到位5)被编码一组独特位(ccex0)以识别条件码扩展间隙0。一旦检测到条件码扩展间隙0的该独特id,则采用相应的creg/z位来控制同一执行包中任意的l1单元221、l2单元241、s1单元222、s2单元242、d1单元224、d2单元225指令的条件执行。这些creg/z位如表1所示来解读。如果相应的指令是有条件的(包括creg/z位),则条件码扩展间隙0中的相应位覆盖(override)指令中的条件码位。注意执行包不能具有指向特定执行单元的不止一个指令。指令的执行包不能包括不止一个条件码扩展间隙0。因此creg/z位到功能单元指令的映射是清楚的。将creg/z位设置为等于“0000”使得指令是无条件的。因此恰当编码的条件码扩展间隙0可以使得一些相应的指令是有条件的并且一些指令是无条件的。图15说明用于具有32位的条件码扩展间隙1的编码。字段1501(位28到位31)指定分配到同一执行包中的m1单元223指令的4个creg/z位。字段1502(位27到位24)指定分配到同一执行包中的m2单元243指令的4个creg/z位。字段1503(位19到位23)指定分配到同一执行包中的c单元245指令的4个creg/z位。字段1504(位16到位19)指定分配到同一执行包中的n1单元224指令的4个creg/z位。字段1505(位12到位15)指定分配到同一执行包中的n2单元244指令的4个creg/z位。字段1506(位5到位11)是未使用的/保留的。字段1507(位0到位5)被编码一组独特位(ccex1)以识别条件码扩展间隙1。一旦检测到条件码扩展间隙1的该独特id,则采用相应的creg/z位来控制同一执行包中任意的m1单元223、m2单元243、c单元245、n1单元224和n2单元244指令的条件执行。这些creg/z位如表1中所示来解读。如果相应的指令是有条件的(包括creg/z位),则条件码扩展间隙1中相应的位超控指令中的条件码位。注意执行包不可以具有指向特定执行单元的不止一个指令。指令的执行包不可以包括不止一个条件码扩展间隙1。因此creg/z位到功能单元指令的映射是清楚的。将creg/z位设置为等于“0000”来使得指令是无条件的。因此恰当编码的条件码扩展间隙1可以使得一些指令是有条件的并且一些指令是无条件的。如上面结合图13所描述,条件码扩展间隙0和条件码扩展间隙1两者都可以包括p位以定义执行包。在优选实施例中,如图14和图15中所图示说明,码扩展间隙0和条件码扩展间隙1优选具有一直被编码为1的位0(p位)。因此,条件码扩展间隙0和条件码扩展间隙1都不可以在执行包的最后一个指令间隙中。存在两个不同的常量扩展间隙。每个执行包可以包含这些独特32位常量扩展间隙中的每一个,32位常量扩展间隙包括将被串接(concatenate)为高阶位的27位与5位常量字段1305以形成32位常量。如上面的指令编码描述所提到的,仅一些指令将src2/cst字段1304定义为常量而不是源寄存器标识符。这些指令中的至少一些可以采用常量扩展间隙来将该常量扩展到32位。图16说明常量扩展间隙0的字段。每个执行包可以包括常量扩展间隙0的一个实例和常量扩展间隙1的一个实例。图16说明常量扩展间隙01600包括两个字段。字段1601(位5到位31)组成扩展的32位常量的27个最高有效位,该扩展的32位常量包括作为五个最低有效位的目标指令scr2/cst字段1304。字段1602(位0到位4)被编码一组独特位(cstx0)以识别常量扩展间隙0。在优选实施例中,常量扩展间隙01600可以仅被用于扩展同一执行包中的l1单元221指令、d1单元225指令中的数据、s2单元242指令、d2单元226指令中的偏移、m2单元243指令、n2单元244指令、分支指令或c单元245指令中的一个的常量。常量扩展间隙1中除了位0到位4被编码为一组独特位(cstx1)以识别常量扩展间隙1以外与常量扩展间隙0类似。在优选实施例中,常量扩展间隙1可以仅被用于扩展同一执行包中的l2单元241指令、d2单元226指令中的数据、s1单元222指令、d1单元225指令中的偏移、m1单元223指令或n1单元224指令中的一个的常量。以如下方式使用常量扩展间隙0和常量扩展间隙1。目标指令必须具有允许常量规范的类型。如本领域已知的,这通过用如上面关于scr2/cst字段1304所描述的常量的最低有效位来代替一个输入操作数寄存器规范字段来实现。指令解码器113根据指令操作码位确定这种情况(其被称为直接字段)。目标指令还包括一个常量扩展位(e位1307),该常量扩展位专用于发出指定的常量没有被扩展(优选地,常量扩展位=0)还是常量被扩展(优选地,常量扩展位=1)的信号。如果指令解码器113检测到常量扩展间隙0或常量扩展间隙1,其为对应于检测到的常量扩展间隙的指令进一步检查该执行包内的其他指令。仅当一个相应指令具有等于1的常量扩展位(e位1307)时进行常量扩展。图17是说明常量扩展的部分框图1700。图17假设指令解码器113检测同一执行包中的常量扩展间隙和相应的指令。指令解码器113将来自常量扩展间隙的27个扩展位(位字段1601)以及来自相应的指令的5个常量位(位字段1305)供应到串接器1701。串接器1701根据这两部分形成单个32位字。在优选实施例中,来自常量扩展间隙的27个扩展位(位字段1601)是最高有效位并且5个常量位(位字段1305)是最低有效位。该组合的32位字被供应到多路复用器1702的一个输入。来自相应的指令字段1305的5个常量位将第二输入供应到多路复用器1702。多路复用器1702的选择受常量扩展位的状态控制。如果常量扩展位(e位1307)是1(被扩展),则多路复用器1702选择串接的32位输入。如果常量扩展位是0(未扩展),则多路复用器1702选择来自相应的指令字段1305的5个常量位。多路复用器1702将该输出供应到符号扩展单元1703的输入。符号扩展单元1703根据来自多路复用器1703的输入形成最终操作数值。符号扩展单元1703接收控制输入标量/矢量和数据大小。标量/矢量输入指示相应的指令是标量指令还是矢量指令。数据路径侧a115的功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226)可以仅执行标量指令。指向这些功能单元中的一个的任何指令都是标量指令。数据路径侧b116的功能单元l2单元241、s2单元242、m2单元243、n2单元244和c单元245可以执行标量指令或矢量指令。指令解码器113根据操作码位确定指令是标量指令还是矢量指令。p单元246可以仅执行标量指令。数据大小可以是8位(字节b)、16位(半字h)、32位(字w)或64位(双字d)。表2列出用于各种选项的符号扩展单元1703的操作。表2如上面结合图13所描述的,常量扩展间隙0和常量扩展间隙1两者都可以包括p位以定义执行包。在优选实施例中,如在条件码扩展间隙的情况中,常量扩展间隙0和常量扩展间隙1优选具有总被编码为1的位0(p位)。因此,常量扩展间隙0和常量扩展间隙1都不可以在执行包的最后一个指令间隙中。执行包包括常量扩展间隙0或1以及标记为常量扩展(e位=1)的不止一个相应指令在技术上是可行的。对于常量扩展间隙0,这将意味着执行包中的l1单元221指令、d1单元225指令中的数据、s2单元242指令、d2单元226指令中的偏移、m2单元243指令或n2单元244指令中不止一个具有为1的e位。对于常量扩展间隙1,这将意味着执行包中的l2单元241指令、d2单元226指令中的数据、s1单元222指令、d1单元225指令中的偏移、m1单元223指令或n1单元224指令中不止一个具有为1的e位。将相同的常量扩展供应到不止一个指令不被预计为是有用的功能。因此,在一个实施例中,指令解码器113可以确定这种情况是无效操作并且不被支持。替代地,该组合可以由施加到标记为常量扩展的每个相应功能单元指令的常量扩展间隙的扩展位支持。特殊的矢量断言指令使用断言寄存器文件234中的寄存器来控制矢量操作。在当前实施例中,所有这些simd矢量断言指令对选择的数据大小进行操作。数据大小可以包括字节(8位)数据、半字(16位)数据、字(32位)数据、双字(64位)数据、四倍字(128位)数据以及半矢量(256位)数据。断言寄存器的每个位控制simd操作是否根据相应的数据字节来执行。p单元245的操作允许基于不止一个矢量比较的各种复合矢量simd操作。例如,可以使用两个比较来进行范围确定。候选矢量与具有打包在第一数据寄存器内的范围的最小值的第一矢量基准进行比较。使用具有打包在第二数据寄存器内的范围的最大值的第二基准矢量来进行候选矢量的第二比较。两个结果断言寄存器的逻辑比较将允许矢量条件操作确定候选矢量的每个数据部分是在范围内还是在范围外。l1单元221、s1单元222、l2单元241、s2单元242和c单元245通常以单指令多数据(simd)模式进行操作。在该simd模式中,相同的指令被施加到来自两个操作数的打包数据。每个操作数保持设置在预定间隙中的复数个数据元素。simd操作通过在数据边界处的进位控制来启用。这种进位控制使能对变化的数据宽度进行的操作。图18说明进位控制。与门1801接收操作数宽度的算法逻辑单元(对于标量数据路径侧a115功能单元是64位,并且对于矢量数据路径侧b116功能单元是512位)内的位n的进位输出。与门1801还接收将在下面进一步解释的进位控制信号。与门1801的输出被供应到操作数宽度的算法逻辑单元的位n+1的进位输入。与门(诸如与门1801)被设置在可能的数据边界处的每一对数位之间。例如,对于8位数据,这种与门将在位7和位8、位15和位16、位23和位24等之间。每一个这种与门接收相应的进位控制信号。如果数据大小是最小的,则每个进位控制信号是0,从而有效地阻挡相邻位之间的进位传输。如果选择的数据大小需要两个算法逻辑单元区段,则相应的进位控制信号是1。下面的表3示出诸如矢量数据路径侧b116功能单元所使用的512位宽的操作数的情况下的示例进位控制信号,其可以被分为8位区段、16位区段、62位区段、64位区段、128位区段或256位区段。在表3中,上面的32位控制上面几位(位128到位511)进位,并且下面的32位控制下面几位(位0到位127)进位。不需要对最高有效位的进位输出进行控制,因此仅需要63个进位控制信号。表3本领域中典型的是对2的整数幂(2n)的数据大小进行操作。然而,该进位控制技术不限于2的整数幂。本领域技术人员将理解如何将该技术应用到其他数据大小或其他操作数宽度。图19说明本发明的流引擎的概念视图。图19说明单个流的处理过程。流引擎1900包括流地址生成器1901。流地址生成器1901连续生成流元素的地址并且将这些元素地址供应到系统存储器1910。存储器1910调用存储在元素地址处的数据(数据元素)并且将这些数据元素供应到数据先进先出(fifo)存储器1902。数据fifo1902在存储器1910和cpu1920之间提供缓冲。数据格式化器1903接收来自数据fifo存储器1902的数据元素并且根据流定义来提供数据格式化。该处理过程将在下面描述。流引擎1900将来自数据格式化器1903的格式化数据元素供应到cpu1920。cpu1920上的程序消耗该数据并且生成输出。流元素通常存在于正常存储器中。存储器自身不为该流规定特定结构。程序定义流并且因此通过指定以下流属性来规定结构:流的第一元素的地址;流中的元素的大小和类型;流中的数据的格式化;以及与流相关联的地址序列。流引擎根据穿行整个存储器的指针来定义流的元素的地址序列。多级嵌套循环控制指针所采取的路径。循环级的迭代计数指示该级重复的次数。维度给出该循环级的指针位置之间的距离。在基础正向流中,最内部循环一直物理消耗来自存储器的连续元素。该最内部循环的隐式维度是1个元素。指针自身以连续递增的次序逐个元素地移动。在内部循环外部的每个级中,该循环基于该循环级的维度的大小将指针移动到新位置。这种形式的寻址允许程序以小数量的参数指定穿过存储器的规则路径。表4列出基础流的寻址参数。表4上面的定义将流的连续元素映射到存储器中的增加的地址。这对大部分(并非所有的)算法效果良好。一些算法通过以降低的存储器地址、反向流寻址的方式读取元素来更好的服务。例如,根据以下公式,离散卷积计算矢量点积:在大部分dsp代码中,f[]和g[]表示存储器中的阵列。对于每个输出,算法以正向方向读取f[],但是以反向方向读取g[]。实际的滤波器将[x]和[t-x]的指数范围限制到有限数量的元素。为了支持这种模式,流引擎支持以降低的地址顺序读取元素。矩阵乘法运算对流引擎提出了独特的问题。矩阵乘积中的每个元素是来自第一矩阵的行与来自第二矩阵的列之间的矢量点积。程序通常全部以行主序或列主序存储矩阵。行主序将单个行的所有元素连续存储在存储器中。列主序将单个列的所有元素连续存储在存储器中。矩阵通常以与语言的默认阵列顺序相同的顺序存储。作为结果,矩阵乘法运算中的两个矩阵中只有一个映射到流引擎的2维流定义。在典型的示例中,第一索引逐步通过第一阵列上的列而逐步通过第二阵列上的行。该问题并不是流引擎所特有的。矩阵乘法运算的访问模式不能很好地符合大多数通用存储器分级体系。一些软件库转置两个矩阵中的一个,使得在乘法运算期间两者均以逐行(或逐列)方式访问。流引擎用转置的流来支持隐式矩阵转置。转置的流避免在存储器中明确转换数据的成本。代替以严格连续元素顺序访问数据,流引擎以其横向顺序有效交换内部两个循环维度,沿第二维度将元素提取到连续矢量通道中。该算法能够起作用,但是对于小元素尺寸的实施是不切实际的。一些算法工作于多个列和行在一起的矩阵拼接。因此,流引擎定义单独的转置粒度。硬件规定最小的粒度。转置粒度还必须至少是与元素大小一样大的。转置粒度导致流引擎在沿维度1移动之前从维度0提取一个或多个连续元素。当粒度等于元素大小时,这导致从行主序阵列提取单个列。否则,粒度指定每次从行主序阵列提取2个、4个或更多个列。通过交换该描述中的行和列,这也适用于列主序布局。参数granule指示以字节为单位的转置粒度。另一种常见矩阵乘法运算技术交换矩阵乘法的最里面的两个循环。当横穿另一个矩阵的行读取时,生成的内部循环不再向下读取一个矩阵的列。例如,该算法可以将一项提升到内部循环以外,用标量值将其代替。在矢量机上,最内部循环可以通过在单个标量与矢量相乘之后进行矢量求和来非常有效地实现。本发明的dspcpu缺乏标量与矢量乘法。替代地,程序必须横穿矢量的长度重复标量值并且使用矢量与矢量乘法。本发明的流引擎用元素重复模式直接支持该使用模式和相关的使用模式。在该模式中,流引擎读取比全矢量大小更小的颗粒/粒集(granule)并且复制该颗粒以填充下一个矢量输出。流引擎将每个复数处理为具有两个子元素的单个元素,其给出了复数的实部和虚部(直角坐标)或量值部分和角度部分(极坐标)。不是所有的程序或外围设备都与这些子元素应该存在于存储器中的顺序一致。因此,流引擎提供了无成本互换复数的两个子元素的能力。该特征互换元素的一半而不解释元素的内容并且可以用于互换任意类型的子元素对,而不仅仅是复数。算法通常优选以高精度工作,但是高精度值比较低精度值需要更多的存储设备和带宽。通常,程序将在存储器中以低精度存储数据,将这些值提升到较高精度以便计算,然后将这些值降低到较低精度以便存储。流引擎通过允许算法指定一种类型提升水平来直接支持这种方式。在本发明的优选实施例中,每个子元素可以以整数类型的符号扩展或零扩展被提升到下一个较大类型尺寸。同样可行的是流引擎可以支持浮点提升,其分别将16位和32位浮点值提升到32位和64位格式。流引擎将流定义为元素的离散序列,dspcpu消耗连续打包成矢量的元素。矢量与流的相似之处在于它们包含多个同类元素和一些隐式序列。因为流引擎读取流,但是dspcpu消耗矢量,因此流引擎必须以一致的方式将流映射到矢量上。矢量由相同大小的通道(lane)组成,每个通道包含子元素。dspcpu将矢量的最右边的通道指示为通道0,而不管设备的当前端字节序(endian)模式如何。通道编号从右到左递增。矢量内的通道的实际数量根据矢量的长度和子元素的数据大小变化。图20说明矢量中的通道分派的第一示例。矢量2000被划分成8个64位通道(8×64位=512位的矢量长度)。通道0包括位0至位63;通道1包括位64至位125;通道2包括位128至位191;通道3包括位192至位255;通道4包括位256至位319;通道5包括位320至位383;通道6包括位384至位447;通道7包括位448至位511。图21说明矢量中的通道分派的第二示例。矢量2100被划分成16个32位通道(16×32位=512位的矢量长度)。通道0包括位0至位31;通道1包括位32至位63;通道2包括位64至位95;通道3包括位96至位127;通道4包括位128至位159;通道5包括位160至位191;通道6包括位192至位223;通道7包括位224至位255;通道8包括位256至位287;通道9包括位288至位319;通道10包括位320至位351;通道11包括位352至位387;通道12包括位388至位415;通道13包括位416至位447;通道14包括位448至位479;并且通道15包括位480至位511。流引擎将最里面的流维度直接映射到矢量通道。其将该维度内的靠前的元素映射到较低的通道编号并且将靠后的元素映射到较高的通道编号。无论该特定流以增加地址顺序提前还是以减小地址顺序提前,这都是正确的。无论流如何定义顺序,流引擎以增加通道的顺序将元素存放到矢量中。对于非复合数据,其将第一元素放置在cpu提取的第一矢量的通道0中,将第二元素放在通道1中,以此类推。对于复合数据,流引擎将第一元素放置在通道0和通道1中,将第二元素放置在通道2和通道3中,以此类推。不管流方向如何,元素内的子元素保持相同的相对顺序。对于非互换的复合元素,这将每对中具有较低地址的子元素放置在偶数编号的通道中,并且将每对中具有较高地址的子元素放置在奇数编号的通道中。互换的复合元素反转该映射。流引擎用cpu从最内部流维度所能提取的尽可能多的元素填充cpu提取的每个矢量。如果最内部维度不是矢量长度的倍数,则流引擎通过填充零将该维度拉长到多倍矢量长度。因此对于较高维度的流,来自外部维度的每次迭代的第一元素抵达矢量的通道0。流引擎总是将最内部维度映射到矢量中的连续通道。对于转置的流,如果转置交换了维度1和维度0,则最内部维度由沿维度1而非维度0的子元素的群组构成,因为转置交换了这两个维度。二维流相比于一维流表现出很大的多样化。基础二维流从较大的矩形中提取出较小的矩形。转置的二维流逐列而非逐行读取矩形。第二维度与第一维度重叠的循环流执行有限冲击响应(fir)滤波分接,其反复循环或对提供输入样品的滑动窗口的样品进行fir滤波。图22说明基础二维流。由elem_bytes、icnt0、dim1和icnt1代表的内部两个维度给出充分的灵活性以描述从具有维度2211和2212的较大矩形2210去除具有维度2221和2222的较小矩形2220。在该示例中,矩形2220是64位值的9×13的矩形并且矩形2210是较大的11×19的矩形。下面的流参数定义该流:icnt0=9elem_bytes=8icnt1=13dim1=88(11乘以8)因此,0维度2211中的迭代计数是9。1方向2222中的迭代计数是13。注意elem_bytes仅缩放最内部维度。第一维度具有elem_bytes大小的icnt0元素。流地址生成器不缩放外部维度。因此,dim1=88,其是11个元素,其中每个元素被缩放8个字节。图23说明该示例流内的元素的顺序。流引擎以图示为顺序2300的顺序提取该流的元素。前9个元素来自矩阵2200的第一行,从左到右为跃程(hop)1到跃程8。第10个元素至第24个元素来自第二行,等等。当流从第9个元素移动到第10个元素时(图23中的跃程9),流引擎基于指针在内部循环的开始处的位置,而不是指针在第一维度的末端处结束的地方,来计算新位置。这使得dim1独立于elem_bytes和icnt0。dim1一直代表每个连续行的第一字节之间的距离。转置的流在沿维度0访问之前沿维度1访问。以下示例说明一对转置的流,其具有变化的转置粒度。图24说明从具有维度2411和2412的较大矩形2410(14×13)中提取出具有维度2421和2422的较小矩形2420(12×8)。在图24中elem_bytes等于2。图25说明流引擎将如何提取本示例中具有4字节转置粒度的流。提取模式2500从每个行提取元素对(因为值为4的粒度是值为2的elem_bytes的两倍),但是除此之外向下移动各列。一旦它到达一对列的底部,其用下一对列重复该模式。图26说明流引擎将如何提取本示例中具有8字节转置粒度的流。整体结构保持相同。如提取模式2600所示,流引擎从每一行提取4个元素(因为值为8的粒度是值为2的elem_bytes的四倍),随后在列上移动到下一行。迄今为止检查的流从存储器恰好读取每个元素一次。流可以从存储器读取给定元素多次,实际上在一片存储器上循环。fir滤波器表现出两个常见的循环模式。fir重新读取每个输出的相同的滤波分接。fir还从滑动窗口读取输入样品。两个连续的输出将需要来自两个重叠窗口的输入。图27说明流引擎2700的细节。流引擎2700包含三个主区段:流02710;流12720;以及共享的l2接口2730。流02710和流12720两者都包含并行操作的相同硬件。流02710和流12720两者共享l2接口2730。每个流2710和2720提供每周期具有高达512位/周期的cpu。流引擎架构通过其专用流路径和共享的成双l2接口来使能这一效果。每个流引擎2700包括专用的4维流地址生成器2711/2721,其每一个可以每周期产生一个新的非对准请求。地址生成器2711/2721输出与由流参数定义的序列中的元素重叠的512位对准地址。这将在下面进一步描述。每个地址生成器2711/2711连接到专用微工作台后援缓冲器(μtlb)2712/2722。μtlb2712/2722每个周期将单个48位虚拟地址转换为44位物理地址。每个μtlb2712/2722具有8个条目,其覆盖具有4kb页的最小32kb或具有2mb页的最大16mb。每个地址生成器2711/2721每周期产生两个地址。μtlb2712/2722每周期仅转化1个地址。为了保持吞吐量,流引擎2700利用大多数流基准将在同一4kb页内这一事实。因此,地址转化不修改地址的位0至位11。如果aout0和aout1排列在同一4kb页中(aout0[47:12]与aout1[47:12]相同),则μtlb2712/2722仅转化aout0并且重新使用两个地址中的较高位的转化。转化的地址排列在命令队列1713/723中。这些地址与来自相应的存储分派和跟踪块2714/2724的信息对准。流引擎2700不明确管理μtlb2712/2722。系统存储器管理单元(mmu)根据需要在环境切换期间使μtlb无效。存储分派和跟踪块2714/2724管理流的内部存储设备,探索数据的重新使用并且跟踪每片数据的寿命。存储分派和跟踪块2714/2724每周期接受2个虚拟地址并且将这些地址约束到流的数据存储设备中的间隙。流引擎2700将其数据存储组织为间隙的阵列。流引擎2700维持表5中列出的以下元数据以追踪每个间隙中的数据的内容和寿命。表5表6详述了有效(valid)位、即时/准备好(ready)位和激活(active)位的相互作用。表6使用该元数据,存储分派和跟踪块2714/2724可以识别流中的数据重新使用机会。存储分派和跟踪块2714/2724针对每个地址执行以下步骤。它比较地址与其标签阵列中的相关标签。在命中时,其取消与该地址相关联的命令。在错失时,其分派自由间隙,设置valid=1,ready=0,并且更新向外的命令以便将其提取的数据指引到该间隙。无论是哪种情况,间隙编号都与地址相关联。存储分派和跟踪块2714/2724在引用队列中插入该引用。存储分派和跟踪块2714/2724设置active=1并且将lastreference更新到引用队列中的该引用的位置。这是每次插入时引用队列的插入指针的值。该过程将产生的地址转换成表示数据的间隙编号。从这点之后,流引擎不需要直接追踪地址。为了最大化重新使用并且最小化拖延(stalls),流引擎2700以下列顺序分派间隙:如果可用于fifo顺序,则间隙相继跟随最近的分派;最低数量的可用间隙(如果存在);并且如果没有可用的间隙,拖延并且重复这两个步骤直到分派成功。这将倾向于以fifo顺序分派间隙,但是如果特定的重新使用模式抵触该顺序工作,则避免拖延。引用队列2715/2725存储由相应的地址生成器2711/2721产生的引用的序列。该信息驱动数据格式化网络,使得其可以将数据以正确的顺序呈现给cpu。引用队列2715/2725中的每个词条包含用于从数据存储器读出数据并将其对准用于cpu的必要信息。引用队列2715/2725在每个间隙中维持表7中列出的以下信息:表7当地址生成器2711/2721产生新地址时,存储分派和跟踪块2714/2724将引用插入引用队列2715/2725中。当数据变得可用并且流保持寄存器中存在空间时,存储分派和跟踪块2714/2724从引用队列2715/2725中移除引用。当存储分派和跟踪块2714/2724从引用队列2715/2725中移除间隙引用并且格式化数据时,其检查这些引用是否代表对相应间隙的最近引用。存储分派和跟踪块2714/2724比较去除指针的引用队列2715/2725与间隙的记录的lastreference。如果它们匹配,则存储分派和跟踪块2714/2724一旦处理完数据就将间隙标记为未激活。流引擎2700具有用于任意数量元素的数据贮存器2716/2726。深度缓冲允许流引擎领先于该流进行提取,从而隐藏存储器系统延迟。正确的缓冲量可能在每个产品代际(productgeneration)之间发生变化。在当前优选实施例中,流引擎2700为每个流贡献32个间隙。每个间隙持有64个字节的数据。蝴蝶网络/蝶形网络(butterflynetwork)2717/2727由7级蝴蝶网络构成。蝴蝶网络2717/2727接收128字节的输入并且产生64字节的输出。该蝴蝶网络的第一级实际是半级。其收集来自匹配未对准提取的两个间隙的字节并且将它们合并为单个旋转的64字节阵列。剩余的6级形成标准的蝴蝶网络。蝴蝶网络2717/2727执行以下操作:将下一个元素向下旋转到字节通道0;如果被请求,则以2的一次幂提升数据类型;如果被请求,则将复数的实部和虚部互换;如果cpu目前处于大端字节序(endian)模式,将大端字节序转换为小端字节序。用户指定元素大小、类型提升以及实/虚互换作为流的参数的一部分。流引擎2700尝试在cpu对数据有需求之前提取并格式化该数据,使得其可以维持充足的吞吐量。保持寄存器2718/2728提供少量的缓冲,使得该过程保留充足的流水线化。除了流引擎2700提供充足的吞吐量这一事实以外,保持寄存器2718/2728在架构上不是直接可见的。两个流2710/2720共享一对独立的l2接口2730:l2接口a(ifa)2733和l2接口b(ifb)2734。对于1024位/周期的聚合带宽,每个l2接口直接向l2控制器提供512位/周期的吞吐量。l2接口使用基于信用的多核总线架构(mba)协议。l2控制器为每个接口分配其自身的命令信用池(poolofcommandcredits)。当读取l2ram、l2缓存器和msmcram时,该池应该具有足够的信用以使得每个接口可以发送足够的命令来获得充足的回读(read-return)带宽。为了使性能最大化,两个流都可以使用这两个l2接口,从而允许单个流发送2个命令/周期的峰值命令率。每个接口优选一个流在另一个流之上,但是该偏好对于每个请求来说是动态变化的。ifa2733和ifb2734一直优选相反的流,当ifa2733优选流0时,ifb2734优选流1,反之亦然。在每个接口2733/2734之前的仲裁器2731/2732在其具有可用信用的每个周期上应用以下基础协议。仲裁器2731/2732检查优选的流是否具有准备好发送的命令。如果是,则仲裁器2731/2732选择该命令。仲裁器2731/2732接下来检查替代的流是否具有准备好发送的至少两个命令或者一个命令并且没有信用。如果是,则仲裁器2731/2732从该替代流中拉出命令。如果任一个接口发布命令,则对于下一个请求,互换优选流和替代流的注释。使用这种简单的算法,两个接口能够尽可能快地分派请求,同时在两个流之间保持公平。第一规则确保每个流可以在具有可用信用的每个周期上发送请求。第二规则提供了当第二接口空闲时第一流借用另一个流的接口的机制。第三规则为横跨两个接口的每个流扩展带宽需求,确保两个接口都不会自身变成瓶颈。粗粒度旋转器2735/2736使得流引擎2700能够支持转置的矩阵寻址模式。在该模式中,流引擎2700交换其多维循环的两个最内部维度。这对阵列进行逐列访问而非逐行访问。除了启用该转置的访问模式之外,旋转器2735/2736在架构上不是可见的。流定义模板提供包含数据的流的完整结构。迭代计数和维度提供了大部分的结构,而各种标识提供剩余的细节。对于所有包含数据的流,流引擎定义单个流模板。其支持的所有流类型都适合该模板。每个字段上的数字指示256位矢量内的字节数。流引擎定义用于对该流中的元素进行寻址的四级循环嵌套。流模板中的大多数字段直接映射到该算法中的参数。图28说明流模板寄存器2800。字段上的数字是256位矢量内的字节数。表8示出流模板的流字段定义。字段名描述大小/位数icnt0(最里面的)循环0的迭代计数32icnt1循环1的迭代计数32icnt2循环2的迭代计数32icnt3(最外面的)循环3的迭代计数8dim1循环1的有符号的维度32dim2循环2的有符号的维度32dim3循环3的有符号的维度32flags流修饰符标识24表8在当前示例中,dim0一直等于物理定义连续数据的elem_bytes。流模板主要包括32位字段。流模板将icnt3限制到8位并且将flags字段限制到24位。流引擎2700将所有的迭代计数解释为无符号整数并且将所有的维度解释为无缩放的有符号整数。上述模板完全指定元素的类型、流的长度和维度。流指令分别指定起始地址。这通常由存储该起始地址的标量寄存器文件211中的标量寄存器来规范。这允许程序使用相同的模板打开多个流。图29说明标识字段2900的子字段定义。如图28中示出的,标识字段2900是3字节或24位。图29示出字段的位数量。表9示出这些字段的定义。表9元素类型(eltype)字段定义流中的元素的数据类型。该字段的四位的编码如表10所示来定义。表10子元素大小以类型提升和矢量通道宽度为目的确定类型。例如,当流请求类型提升时,16位子元素被提升为32位子元素。由于dspcpu一直以小端字节序顺序列出矢量,因此当dspcpu以大端字节序模式操作时,矢量通道宽度是重要的。总元素大小确定流的最小粒度。在流寻址模型中,其为最内部循环的每个迭代确定流提取的字节数量。流一直读取完整的元素,或者以递增顺序或者以递减顺序。因此,流的最内部维度跨过icnt0×总元素大小的字节。实数-复数类型确定流引擎是否将每个元素视为实数或复数的两个部分(实部/虚部或者量值/角度)。该字段还指定是否互换复数的两个部分。复数类型具有两倍于其子元素大小的总元素大小。否则,子元素大小等于总元素大小。转置(transpose)字段确定流引擎是否以转置的顺序访问流。转置的顺序交换内部的两个寻址级。transpose字段还指示其转置该流的粒度。该字段的四位的编码被定义为如表11所示。表11流引擎2700实际以与元素大小不同的粒度转置。这允许程序从每行提取多列元素。转置粒度必须不小于元素尺寸。提升(promote)字段控制流引擎是否提升流中的子元素以及提升的类型。当被启用时,流引擎2700以单个2的幂数的大小提升类型。该字段的两位的编码如表12所示来定义。promote描述00不提升01无符号整数提升,零扩展10有符号整数提升,符号扩展11浮点提升表12当流指定不提升时,每个子元素占据宽度等于eltype指定的大小的矢量通道。否则,每个子元素占据两倍大的矢量通道。当promote为00时,流引擎提取来自存储器的一半数据以满足相同数量的流提取。提升模式01b和10b将输入的子元素分别视为无符号整数和有符号整数。对于无符号整数,流引擎通过用零填充新的位来提升。对于有符号整数,流引擎通过用符号位的复制品填充新的位来提升。正的有符号整数具有等于0的最高有效位。对于正的有符号整数的提升,新的位被零填充。负的有符号整数具有等于1的最高有效位。对于负的有符号整数的提升,新的位被1填充。提升模式11b将输入的子元素视为浮点数。浮点提升将每个子元素视为浮点类型。流引擎支持两种浮点提升:短浮点(16位)到单精度浮点(32位);单精度浮点(32位)到双精度浮点(64位)。throttle字段控制流引擎如何领先于cpu激进地提取。该字段的两位的编码被定义为如表13所示。throttle描述00最小的节流,最大的提前提取01较少的节流,较多的提前提取10较多的节流,较少的提前提取11最大的节流,最小的提前提取表13throttle不改变流的含义,并且仅作为提示(hint)。流引擎可以忽略该字段。程序不应该依赖于具体的节流行为来判断程序正确性,因为架构不指定精确的节流行为。throttle允许程序员向硬件提供关于程序的自身行为的提示。通过默认,流引擎尝试尽可能远地领先于cpu以隐藏尽可能多的延迟,同时向cpu提供充足的流吞吐量。尽管几种关键应用需要这种水平的吞吐量,但其可能导致其他应用的不良系统水平行为。例如,流引擎丢弃穿过环境切换的所有提取的数据。因此,激进的提前提取可能导致具有大量环境切换的系统中的带宽浪费。如果cpu非常快地消耗数据,则激进的提前提取仅在这些系统中进行感测。dspcpu通过少量的指令和专用寄存器来使流引擎被编程。stropen指令开启流。stropen命令指定指示开启流0或流1的流编号。stropen指定存储如上所述的流模板的流模板寄存器。stropen指令的变元(argument)在表14中列出。变元描述流起始地址寄存器存储流起始地址的标量寄存器流编号流0或流1流模板寄存器存储流模板数据的矢量寄存器表14优选地,流起始地址寄存器是全局标量寄存器文件211中的标量寄存器。stropen指令通过其操作码指定流0或流1。优选地,流模板寄存器是全局矢量寄存器文件221中的矢量寄存器。如果指定的流是激活的,则stropen指令关闭先前的流并且用指定的流代替该流。strclose指令关闭流。strclose命令指定将被关闭的流的流编号。strsave指令捕获指定流的充足的状态信息以便将来重新开始该流。strrstr指令恢复先前保存的流。strsave指令不保存流的任何数据。strsave指令仅保存元数据。该流响应于strrstr指令而重新提取数据。流引擎处于三个状态中的一个:未激活;激活;或冻结。当未激活时,流引擎什么也不做。从未激活的流引擎提取数据的任何尝试都是错误的。程序开启一个流之前,流引擎是未激活的。在程序消耗该流中的所有元素之后或程序关闭该流之后,流引擎也变成未激活。使用流的程序明确激活和去激活流引擎。操作环境经由流引擎的暗示的冻结行为并结合其自己的明确保存和恢复动作来管理穿过环境切换边界的流。激活的流引擎具有与它们相关联的流。程序可以从激活的流引擎提取新的流元素。流引擎保持激活直到随后的一个出现。当流从流中提取最后一个元素时,其变得未激活。当程序明确关闭流时,其变得未激活。当cpu响应中断或异常时,流引擎冻结。当流引擎冻结时,冻结的流引擎捕获用于恢复其所处于的流所必需的所有状态。流引擎响应于中断和异常而冻结。这与特殊指令结合来保存或恢复冻结的流环境,使得操作环境可以干净地切换环境。当cpu返回中断的环境时,冻结的流重新激活。程序经由用于流0的保持寄存器2718并且经由用于流1的保持寄存器2728访问流数据。这些寄存器在其他寄存器文件之外。这些寄存器代表相应的流0和流1的流头(headofstream)。相应的程序指令中的src1字段1305和src2/cst字段1304的专用位编码读取流数据以及流的受控提前(controladvance)。表15示出根据本发明的优选实施例的源操作数字段1305和1304的示例性编码。表15位编码00000到01111(第一子集)指定全局矢量寄存器文件231中的相应的寄存器。注意仅矢量数据路径侧b包括流引擎。对于具有该第一子集中的src1字段1305和src2/cst字段1304位编码的指令,指令解码器113从全局矢量寄存器文件231中指定的寄存器编号为相应的功能单元供应输入操作数。位编码10000到10111(第二子集)指定相应的矢量局部寄存器文件中的相应的寄存器。对于指向l2单元241或s2单元242的指令,该局部寄存器文件是l2/s2局部寄存器文件232。对于指向m2单元243、n2单元244或c单元245的指令,该局部寄存器文件是m2/n2/c局部寄存器文件233。对于具有该第二子集中的src1字段1305和src2/cst字段1304位编码的指令,指令解码器113从相应的局部寄存器文件中指定的寄存器编号为相应的功能单元供应输入操作数,在该实施例中,所述相应的局部寄存器文件是l2/s2局部寄存器文件232或m2/n2/c局部寄存器文件233。在该实施例中,位编码11000到11011是保留的。这些编码没有被使用。指令解码器113可以忽略这些位编码或者可以产生错误。编译器将不产生这些编码。位编码11100和11101指向流0。位编码11110和11111指向流1。位编码11100是流0的读取。在检测到具有编码为11100的src1字段1305和src2/cst字段1304位的指令后,指令解码器113为该指令的功能单元的相应操作数输入端供应存储在保持寄存器2718中的数据。如上面结合图20和图21所公开的,保持寄存器2718持有指定数据流0中的元素。这种数据的供应类似于来自数据寄存器的数据的供应。类似地,位编码11110是流1的读取。在检测到具有编码为11110的src1字段1305和src2/cst字段1304位的指令后,指令解码器113为该指令的功能单元的相应操作数输入端供应存储在保持寄存器2728中的数据。读取位编码11100和11110的流被类似地视为指定位编码的寄存器。因此不止一个功能单元可以从相同的流保持寄存器2718或2728接收输入。单个指令可以为两个输入操作数均指定相同的流保持寄存器2718或2728。指令可以指定来自保持寄存器2718的一个输入操作数,并且指定来自保持寄存器2728的另一个输入操作数,并且两者顺序是任意的。位编码11101和11111触发读取/提前流操作。位编码11101是流0的读取/提前。在检测到具有位编码为11100的src1字段1305和src2/cst字段1304的指令后,指令解码器113向该指令的功能单元的相应操作数输入端供应存储在保持寄存器2718中的数据。然后如上面结合图20和图21所公开的,流引擎2700将流0提前到指定数据流0中的下一组元素。因此保持寄存器2918将存储流0中的下一个元素。类似地,位11111是流1的读取/提前。在检测到具有编码为11110的src1字段1305和src2/cst字段1304位的指令后,指令解码器113向该指令的功能单元的相应操作数输入端供应存储在保持寄存器2728中的数据,并且然后触发流引擎2700提前流1以存储保持寄存器2728中的下一个数据元素。以与位编码11100和11110的读取操作相同的方式来进行数据输入操作。如上所述,读取/提前操作数位编码增加对定义的下一个流数据元素的提前。如前所述,相同的流保持寄存器数据可以被供应给功能单元的不止一个输入端以及不止一个功能单元。因此有可能对同一执行包中的指令进行编码,其中这些输入中的一个是读取编码并且同一流的另一个输入是读取/提前编码。在这种情况下,相应的流被提前。因此,如果任何的流0或流1操作数位编码是读取/提前位编码,则该流提前,无论任何其他流0操作数位编码是读取还是读取/提前。根据流的特性,流数据是只读的。因此表15的位编码不能用于dst字段1303。指令解码器113可以忽略dst字段1303中的这些位编码或者可以产生错误。编译器将不产生这些编码。图30是说明上述流输入操作数编码的部分示意图3000。图30说明对功能单元3020的相应src1输入端的一个指令的src1字段1305进行解码。这些相同的电路被重复以用于src2/cst字段1304和功能单元3020的src2输入端。此外,这些电路被重复以用于可以被同时分派的执行包内的每个指令。指令解码器113接收包含指令的src1字段1305的位13至位17。操作码字段(用于所有指令的位4至位14,以及额外用于无条件指令的位28至位31)明确指定相应的功能单元3020。在该实施例中,功能单元3020可以是l2单元241、s2单元242、m2单元243、n2单元244或c单元245。图30中说明的指令解码器113的相关部分对src1位字段1305进行解码。子解码器3011确定src1位字段1305是否处于从00000到01111的范围内。如果是这种情况,则子解码器3011将相应的寄存器编号供应到全局矢量寄存器文件231。在该示例中,该寄存器字段是src1位字段1305的四个最低有效位。全局矢量寄存器文件231调用存储在对应于该寄存器编号的寄存器中的数据并且将该数据供应到功能单元3020的src1输入端。该解码通常在本领域是已知的。子解码器3012确定src1位字段1305是否处于从10000到10111的范围内。如果是这种情况,则子解码器3012将相应的寄存器编号供应到相应的局部矢量寄存器文件。如果指令指向l2单元241或s2单元242,则相应的局部矢量寄存器文件是局部矢量寄存器文件232。如果指令指向m2单元243、n2单元244或c单元245,则相应的局部矢量寄存器文件是局部矢量寄存器文件233。在该示例中,该寄存器字段是src1位字段1305的三个最低有效位。局部矢量寄存器文件231调用存储在对应于该寄存器编号的寄存器中的数据并且将该数据供应到功能单元3020的src1输入端。相应的局部矢量寄存器文件232/233调用存储在对应于该寄存器编号的寄存器中的数据并且将该数据供应到功能单元3020的src1输入端。该解码通常在本领域是已知的。子解码器3013确定src1位字段1305是否为11100。如果是这种情况,则子解码器3013将流0读取信号供应到流引擎2700。然后,流引擎2700将存储在保持寄存器2718中的流0数据供应到功能单元3020的src1输入端。子解码器3014确定src1位字段1305是否为11101。如果是这种情况,则子解码器3014将流0读取信号供应到流引擎2700。然后,流引擎2700将存储在保持寄存器2718中的流0数据供应到功能单元3020的src1输入端。子解码器3014还将提前信号供应到流0。如前所述,流引擎2700提前在保持寄存器2718中存储流0的下一个连续数据元素。子解码器3015确定src1位字段1305是否为11110。如果是这种情况,则子解码器3015将流1读取信号供应到流引擎2700。然后,流引擎2700将存储在保持寄存器2728中的流1数据供应到功能单元3020的src1输入端。子解码器3016确定src1位字段1305是否为11111。如果是这种情况,则子解码器3016将流1读取信号供应到流引擎2700。然后,流引擎2700将存储在保持寄存器2728中的流1数据供应到功能单元3020的src1输入端。子解码器3014还将提前信号供应到流1。如前所述,流引擎2700提前在保持寄存器2728中存储流2的下一个连续数据元素。类似的电路被用于响应于src2/cst字段1304的位编码而选择供应到功能单元3002的scr2输入端的数据。可以用如上所述的方式向功能单元3020的scr2输入端供应常量输入。致力于操作数规范的指令位的准确数量以及数据寄存器和流的数量是设计选择。本领域技术人员将认识到本申请中描述的其他数量的选择是可能的。尤其是,单个全局矢量寄存器文件的规范以及局部矢量寄存器文件的省略是可能的。本发明采用输入操作数选择字段的位编码来指示流读取并且采用另一个位编码来指示流读取和提前该流。图31说明替代的流引擎3100。流引擎3100类似于图22中说明的流引擎2200。如先前结合图22描述的,流引擎3100包括地址生成器2211/2221、μtlb2212/2222、命令队列2213/2223、存储分派和追踪块2214/2224、引用队列2215/2225、仲裁器2231/2232、l2接口2233/2234、粗调旋转器2235/2236、数据贮存器2216/2225以及蝴蝶网络2217和2227。保持寄存器2218用指示为se0l和se0h的两个保持寄存器3118和3119来代替。保持寄存器3118和3119中的每一个是512位的矢量宽度。保持寄存器3119存储跟随保持寄存器3118的流0数据中的下一个矢量。类似地,保持寄存器2228用类似大小的指示为se1l和se1h的保持寄存器3128和3129来代替。保持寄存器3129存储跟随保持寄存器3128的流1数据中的下一个矢量。流引擎3100允许与流引擎2200不同的流访问。流引擎3100允许以下面描述的方式直接访问se0h和se1h数据。流引擎3100允许访问对应于结合的se0l和se0h数据(se0)的数据的流0双矢量。流引擎3100允许访问对应于结合的se1l和se1h数据(se1)的数据的流1双矢量。保持寄存器3118/3119和3128/3129的这种结构支持以下这些操作。表16列出了这些流访问操作。表16表16列出第一子集以与表15中列出的方式相同的方式访问全局矢量寄存器文件231。表16列出第二子集以与表15中列出的方式相同的方式访问相应的局部矢量寄存器文件242/423。表16列出指示为se0的访问。在解码该源寄存器指示后,流引擎3100将来自保持寄存器3118的数据供应到相应的功能单元,并且将来自保持寄存器3119的数据供应到配对的功能单元,因此支持双矢量操作。表16列出指示为se0++的访问。在解码该源寄存器指示后,流引擎3100将来自保持寄存器3118和3119的双矢量数据供应到支持双矢量操作的成对功能单元并且将流0提前两个矢量(1024位)。表16列出指示为se1和se1++的类似访问,其具有由保持寄存器3128和3129供应的类似双矢量数据。表16列出四个不同的单矢量访问。指示为se0l和se0l++的访问对应于表15中列出的供应来自保持寄存器3118的数据的流0读取和读取/提前操作。指示为se1l和se1l++的访问对应于表15中列出的供应来自保持寄存器3128的数据的流1读取和读取/提前操作。指示为se0h的访问供应来自保持寄存器3119的数据。如上面所提到的,保持寄存器3119存储跟随保持寄存器3118的流0数据中的下一个矢量。指示为se0h++的访问供应来自保持寄存器3119的数据并且将流0提前两个矢量(1024位)。指示为se1h的访问供应来自保持寄存器3129的数据。如上面所提到的,保持寄存器3129存储跟随保持寄存器3128的流1数据中的下一个矢量。指示为se1h++的访问经由输出端outl供应来自保持寄存器3129的数据并且将流1提前两个矢量(1024位)。可以容易地看到5位src1字段1305不能指定来自某个集合的一个操作,该集合包括:从16个全局矢量寄存器中的一个提取;从8个局部矢量寄存器中的一个提取;以及上面描述的12个流编码。可以通过将src1字段1305中的位的数量增加到6位来适应选择的数量。可以通过限制在全局矢量寄存器文件中、在局部矢量寄存器文件中或在这两者中均可访问的寄存器的数量和身份来降低选择的数量。替代的实施例针对双矢量操作进行解码src1字段1305与针对矢量操作进行解码src1字段1305是不同的。表17列出该替代实施例中用于矢量操作的src1字段1305的解码。表17表18列出了用于双矢量操作的src1字段1305的解码。表18对于该替代实施例中的表17和18的两个编码,第一子集和第二子集的解码与表15是相同的。该替代例不需要指令1300的指令编码中的任何改变。用于所有指令的操作码字段1306(位4至位12)(以及额外用于无条件指令的位28至位31)必须指定指令的类型并且明确区分所有双矢量指令与所有矢量指令。因此,使用该替代实施例仅需要使指令解码器113操作数字段解码用于流数据访问的矢量/双矢量编码上的条件句。图32是类似于图25的部分示意图3200,其说明该替代实施例的流输入操作码编码。图32说明解码功能单元3230和配对的功能单元3240的相应src1输入端的一个指令的src1字段1305。这些相同的电路被重复以用于src2/cst字段1304和功能单元3230和3240的src2输入端。此外,这些电路被重复以用于可以被同时分派的执行包内的每个指令。指令解码器113接收包含指令的src1字段1305的位13至位17。操作码字段(用于所有指令的位4至位14以及额外用于无条件指令的位28至位31)明确指定相应的功能单元3230。如果指令是双矢量操作,则该字段也明确指定配对的功能单元3240。在该实施例中,功能单元3230和3240可以是l2单元241、s2单元242、m2单元243、n2单元244或c单元245。图32中说明的指令解码器113的相关部分解码src1位字段1305。如图32所说明的,指令解码器113产生指示正被解码的指令是控制正常的矢量操作还是特殊的双矢量操作的矢量/双矢量(d/dv)信号。该矢量/双矢量信号被供应到3214、3215、3216、3217、3218、3219、3220、3221、3222、3223和3224用于以下面描述的方式来控制。子解码器3211确定src1位字段1305是否处于指定全局矢量寄存器文件231的第一子集中。如果是这种情况,则子解码器3211将相应的寄存器编号供应到全局矢量寄存器文件231。全局矢量寄存器文件231调用存储在对应于该寄存器编号的寄存器中的数据并且将该数据供应到功能单元3230的src1输入端。该解码通常在本领域是已知的。注意解码该第一子集不依赖于矢量/双矢量信号。子解码器3212确定src1位字段1305是否处于指定相应的局部矢量寄存器文件232或233的第二子集中。如果是这种情况,则子解码器2512将相应的寄存器编号供应到相应的局部矢量寄存器文件。如果指令指向l2单元241或s2单元242,则相应的局部矢量寄存器文件是局部矢量寄存器字段232。如果指令指向m2单元243、n2单元244或c单元245,则相应的局部矢量寄存器文件是局部矢量寄存器字段233。局部矢量寄存器文件232/233调用存储在对应于该寄存器编号的寄存器中的数据并且将该数据供应到功能单元3020的src1输入端。相应的局部矢量寄存器文件232/233调用存储在对应于该寄存器编号的寄存器中的数据并且将该数据供应到功能单元2520的src1输入端。该解码通常在本领域是已知的。注意解码该第二子集不依赖于矢量/双矢量信号。如果矢量/双矢量信号指示双矢量操作,则子解码器3213是激活的。子解码器3213确定src1位字段1305是否指定se0。如表18中所列出的,这是“11100”的位编码。如果是这种情况,则子解码器3213将se0读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3118中的流0数据经由输出端outl供应到功能单元3230的src1输入端,并且将存储在保持寄存器3119中的流0数据经由输出端outh供应到配对的功能单元3240的src1输入端。这是采用成对功能单元的双矢量操作。如果矢量/双矢量信号指示双矢量操作,则子解码器3214是激活的。子解码器3214确定src1位字段1305是否指定se0++。如表18中所列出的,这是“11101”的位编码。如果是这种情况,则子解码器3213将se0读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3118中的流0数据经由输出端outl供应到功能单元3230的src1输入端,并且将存储在保持寄存器3119中的流0数据经由输出端outh供应到配对的功能单元3240的src1输入端。这是采用成对功能单元的双矢量操作。子解码器3214还将提前信号供应到流0。流引擎2200提前双矢量的量(512位)并且将下一个流0数据存储在保持寄存器3118和3119中。如果矢量/双矢量信号指示矢量操作,则子解码器3215是激活的。子解码器3215确定src1位字段1305是否指定se0l。如表17中所列出的,这是“11000”的位编码。如果是这种情况,则子解码器3215将se0l读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3128中的流0数据经由输出端outl供应到功能单元3230的src1输入端。如果矢量/双矢量信号指示矢量操作,则子解码器3216是激活的。子解码器3216确定src1位字段1305是否指定se0l++。如表17中所列出的,这是“11001”的位编码。如果是这种情况,则子解码器3215将se0l读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3128中的流0数据经由输出端outl供应到功能单元3230的src1输入端。子解码器3215还将提前信号供应到流0。流引擎2200提前双矢量的量(512位)并且将下一个流0数据存储在保持寄存器3118和3119中。在优选实施例中,所有的流提前都以双矢量(512位)为增量,即使是对于单矢量读取也是如此。如果矢量/双矢量信号指示矢量操作,则子解码器3217是激活的。子解码器3217确定src1位字段1305是否指定se0h。如表17中所列出的,这是“11010”的位编码。如果是这种情况,则子解码器3217将se0h读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3129中的流0数据经由输出端outh供应到功能单元3230的src1输入端。如果矢量/双矢量信号指示矢量操作,则子解码器3218是激活的。子解码器3218确定src1位字段1305是否指定se0h++。如表17中所列出的,这是“11011”的位编码。如果是这种情况,则子解码器3218将se0h读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3129中的流0数据经由输出端outl供应到功能单元3230的src1输入端。子解码器3218还将提前信号供应到流0。流引擎2200提前双矢量的量(512位)并且将下一个流0数据存储在保持寄存器3118和3119中。在优选实施例中,所有的流提前都以双矢量(512位)为增量,即使是对于单矢量读取也是如此。如果矢量/双矢量信号指示双矢量操作,则子解码器3219是激活的。子解码器3219确定src1位字段1305是否指定se1。如表18中所列出的,这是“11110”的位编码。如果是这种情况,则子解码器3219将se1读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3218中的流1数据经由输出端outl供应到功能单元3230的src1输入端,并且将存储在保持寄存器3219中的流1数据经由输出端outh供应到配对的功能单元3240的src1输入端。这是采用成对功能单元的双矢量操作。如果矢量/双矢量信号指示双矢量操作,则子解码器3220是激活的。如表18中所列出的,se1++是“11111”的位编码。子解码器3220确定src1位字段1305是否指定se1++。如果是这种情况,则子解码器3220将se1读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3218中的流1数据经由输出端outl供应到功能单元3230的src1输入端,并且将存储在保持寄存器3219中的流1数据经由输出端outh供应到配对的功能单元3240的src1输入端。这是采用成对功能单元的双矢量操作。子解码器3220还将提前信号供应到流1。流引擎2200提前双矢量的量(512位)并且将下一个流1数据存储在保持寄存器3128和3129中。在优选实施例中,所有的流提前都以双矢量(512位)为增量,即使是对于单矢量读取也是如此。如果矢量/双矢量信号指示矢量操作,则子解码器3221是激活的。子解码器3221确定src1位字段1305是否指定se1l。如表17中所列出的,这是“11100”的位编码。如果是这种情况,则子解码器3221将se1l读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3218中的流1数据经由输出端outl供应到功能单元3230的src1输入端。如果矢量/双矢量信号指示矢量操作,则子解码器3222是激活的。子解码器3222确定src1位字段1305是否指定se1l++。如表17中所列出的,这是“11101”的位编码。如果是这种情况,则子解码器3222将se1l读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3218中的流1数据经由输出端outl供应到功能单元3230的src1输入端。子解码器3222还将提前信号供应到流1。流引擎2200提前双矢量的量(512位)并且将下一个流1数据存储在保持寄存器3128和3129中。在优选实施例中,所有的流提前都以双矢量(512位)为增量,即使是对于单矢量读取也是如此。如果矢量/双矢量信号指示矢量操作,则子解码器3223是激活的。子解码器3223确定src1位字段1305是否指定se1h。如表17中所列出的,这是“11110”的位编码。如果是这种情况,则子解码器3223将se1l读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3219中的流1数据经由输出端outl供应到功能单元3230的src1输入端。如果矢量/双矢量信号指示矢量操作,则子解码器3224是激活的。子解码器3224确定src1位字段1305是否指定se1h++。如表17中所列出的,这是“11111”的位编码。如果是这种情况,则子解码器3224将se1h读取信号供应到流引擎3100。然后,流引擎3100将存储在保持寄存器3219中的流1数据经由输出端outl供应到功能单元3230的src1输入端。子解码器3224还将提前信号供应到流1。流引擎2200提前双矢量的量(512位)并且将下一个流1数据存储在保持寄存器3128和3129中。在优选实施例中,所有的流提前都以双矢量(512位)为增量,即使是对于单矢量读取也是如此。图32进一步说明为双矢量操作供应非流操作数。在解码双矢量操作之后,指令解码器113将对应于src1字段1305的寄存器编号供应到合适的寄存器文件,其或者是全局矢量寄存器文件231或者是相应的局部矢量寄存器文件232或233。寄存器文件将存储在该寄存器编号处的数据供应到主功能单元3230的src1输入端。指令解码器113将相应的寄存器编号供应到合适的寄存器文件以调用双矢量操作的其他矢量。本领域已知的是将双矢量操作中的src1字段1305的有效编码限制到偶数编号的寄存器。偶数编号的寄存器中的数据被供应到主功能单元3230。下一个更高寄存器编号(指定的偶数编号寄存器编号之后的下一个奇数寄存器编号)中的数据被供应到配对的功能单元3240的src1输入端。这在本领域是已知的并且仅为了完整性而说明。类似的电路用于响应于src2/cst字段1304的位编码而选择供应到功能单元3230和3240的scr2输入端的数据。功能单元3230和3240的scr2输入端可以以如上所述的方式被供应有常量输入。因此,对于矢量指令,启用子解码器3215、3216、3217、3218、3221、3222、3223和3243(编程为如表17中所列出的那样)。对于双矢量指令,启用子解码器3213、3214、3219和3220(编程为如表18中所列出的那样)。如表17和表18中所列出,对全局矢量寄存器文件231和相应的局部矢量寄存器文件232或233的编码对于双矢量指令与对于矢量指令是相同的。致力于操作数规范的指令位的准确数量以及数据寄存器和流的数量是设计选择。本领域技术人员将认识到本申请中描述的其他数量的选择是可能的。尤其是,单个全局矢量寄存器文件的规范以及局部矢量寄存器文件的省略是可能的。本发明采用输入操作数选择字段的位编码来指示低流和高流读取、双宽度读取、其他位编码来指示流读取并且提前该流。当前第1页12