《TigerSHARC处理器技术及其应用》课件第5章_第1页
《TigerSHARC处理器技术及其应用》课件第5章_第2页
《TigerSHARC处理器技术及其应用》课件第5章_第3页
《TigerSHARC处理器技术及其应用》课件第5章_第4页
《TigerSHARC处理器技术及其应用》课件第5章_第5页
已阅读5页,还剩367页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章TS系列DSP的指令系统5.1TS系列DSP的数据格式5.2TS系列DSP的指令结构和寄存器5.3存储器的寻址和访问方式5.4TS处理器的指令5.5TS处理器的指令并行规则和约束条件5.1TS系列DSP的数据格式

5.1.1单精度浮点数据格式

如图5.1-1所示,32位单精度浮点格式包含一个符号位s,24位的尾数(23位小数加上1位隐含位)和8位无符号量指数e。图5.1-1IEEE32位的单精度浮点数据格式(正常字)对于标准化的数据,尾数由一个23位小数f和一个隐含位1组成,该隐含位默认在尾数中的f22之前。二进制的小数点默认在隐含位和f22之间。小数的最低有效位(LSB)是f0;指数的LSB是e0。

隐含位有效地增加了浮点尾数的精度,用实际储存在数据格式中的23位表示24位数据。该位也保证了IEEE标准化数字格式中的任何浮点数的尾数总是大于等于1、小于2。在单精度格式中,正常字无符号指数e的范围是1≤e≤254。这个指数比实际值偏移了+127(254/2)。为了计算准确的无偏移指数,应从e中减去127。

IEEE标准也提供了几种特殊的单精度浮点格式的数据类型:

(1)指数值为255(全1)、尾数值为非零小数的浮点数被认为不是数(NAN)。NAN通常作为数据流控制、未初始化数和无效操作结果(如0乘以∞)的标志。

(2)无穷可用一个指数为255、尾数为零的浮点数表示。注意,因为小数是有符号数,所以正、负无穷大都能被表示。

(3)零可用零指数和零小数表示。像无穷一样,正零和负零都能被表示。5.1.2扩展精度浮点数据格式

扩展精度浮点数据格式为40位宽,它有与标准格式相同的8位指数,但尾数为32位。该数据格式如图5.1-2所示。除了尾数变化外,扩展精度浮点格式和IEEE标准格式相同。需要说明的是,扩展精度在存储时需要占用64位宽度。图5.1-240位扩展精度浮点数据格式(扩展字)5.1.3定点数据格式

TS系列DSP支持16、32和64位数据的定点小数和整数格式。在这些格式中,数可以是有符号数(2的补码)或无符号数。图5.1-3~图5.1-6给出了32位宽度时有符号整数、有符号小数、无符号整数和无符号小数的格式。8位宽度、16位宽度和64位宽度定点数据的格式可以此类推得到。在小数格式中,隐含的二进制小数点被放在最高有效位的左边。在整数格式中,这个二进制小数点被理解为放在LSB的右边。

DSP还支持8位定点有符号整数数据格式。8位和16位格式的数据总是被打包在32位的寄存器中,如:一个32位的寄存器可以存放四个8位或两个16位的字,两个32位的寄存器可以存放八个8位或四个16位的字,四个寄存器可以存放十六个8位或八个16位的字。图5.1-332位定点有符号整数(正常字)的格式图5.1-432位定点有符号小数(正常字)的格式图5.1-532位定点无符号整数(正常字)的格式图5.1-632位定点无符号小数(正常字)的格式5.2TS系列DSP的指令结构和寄存器

5.2.1指令行结构

1)指令行结构

在一个指令行中,TS系列DSP可以安排1~4个32位的指令。除了极少指令外,在8级深度的流水中上可以每周期执行一个指令行。指令槽和指令行的结构如图5.2-1所示。图5.2-1指令槽和指令行的结构指令行语法规定如下:

(1)每个指令行包含1~4个32位指令槽(即指令字)。

(2)每个指令槽之间用一个分号“ ; ”隔开。

(3)指令行的结束用两个分号“ ;;”标识。

(4)每个指令槽是32位的操作码。

(5)某些指令(如立即数扩展)需要两个32位操作码,占用两个指令槽。

(6)某些指令(如程序流控制、条件和立即数扩展)必须位于特殊的指令槽。指令是32位的,它可以激活DSP的一个或多个执行单元来完成若干操作。大多数情况下,DSP总是并行地执行同一指令行中的指令,偶然会出现延迟执行的情况。DSP从程序存储器中一次可预取4个字(128位)的指令,但指令行并不一定正好是4字的。不管指令行宽度(1~4个指令)如何,在存储器中,指令行是一个接续一个存储的,一个新的指令行紧接着前一个指令行结束的位置开始。指令行的结束用指令字的最高有效位(MSB)标识。

2)指令符号约定

在详细介绍TS系列DSP的指令集之前,先简要介绍汇编指令的语法及其符号约定,以便帮助读者建立汇编指令的初步印象。同时在后续章节中,将会给出许多基于汇编指令的程序片段,以便更好地认识和理解DSP的内核、I/O资源的功能。下面简要说明汇编指令语法的基本符号约定,这些符号约定见表5.2-1。

语法汇集表中为了便于区分,约定关键字、选项为大写,标号为小写,但实际编程时,它们大写、小写均可。

例如,在指令汇集表中的如下指令:

{X | Y | XY}{S | B}Rs=MAX | MIN(Rm,Rn){({U}{Z})};

在实际程序中可以写成下面的任何一种形式:

XR3=MIN(R2,R1);

YBR2=MAX(R1,R0)(UZ);

XYSR2=MAX(R3,R4)(U);

3)指令的组成要素

指令的组成要素包括:

运算符号:+、-、*、=

关键保留字:如MAX、ABS等操作码,DAB、BR等选项,ALE、JN等条件码

寄存器名:如XR3、R3、J5、MR0、PR1

立即数:<Immn>表示n位立即数,可以写成多种制式,如十六进制的#0x12ab、十进制的#13、二进制的#0b111

标号:用户定义的分支地址、子程序名5.2.2寄存器名称和使用

TS系列DSP汇编语法中,寄存器命名语法规则为计算指令提供了许多选择。如在一个指令中,可以指定寄存器所在运算块、寄存器宽度、寄存器的操作数字长和寄存器操作数数据格式等,DSP的编译语法也支持整数或小数和实数或复数类型选择。图5.2-2给出了寄存器的部分语法规则。图5.2-2寄存器组寄存器命名规则如图5.2-2所示,寄存器名R的前面可以加3个前缀,分别对运算块、操作数字长和操作数类型进行选择;寄存器的后缀可以对寄存器的宽度进行选择。

1)运算块选择

前缀1是运算块选择前缀,用于选择寄存器所在的运算块,指出指令中使用的寄存器属于哪个运算块。前缀1有四种选择:X表示仅使用运算块X中的寄存器,Y表示仅使用运算块Y中的寄存器;XY(或不加前缀)表示同时使用两个运算块中的寄存器;YX也表示同时使用两个运算块中的寄存器,但是其数据加载方式与XY方式有所不同。下面是几个运算模块选择的指令实例:

XR0=R1+R2;; //指令仅在X块中执行,使用寄存器XR0、XR1和XR2

YR1=R5+R6;; /指令仅在Y块中执行,使用寄存器YR1、YR5和YR6

XYR0=R0+R2;; //指令同时在X和Y块中执行,使用寄存器XR0、XR2、YR0和YR2

R0=R22+R3;; //指令同时在X和Y块中执行,使用寄存器XR0、XR22、XR3、YR0、YR22//和YR3

在指令中前缀1是可选项,在指令语法中,可选项使用花括弧{}。为了表示各选项之间的选择,指令语法定义在选项之间放置一个垂线“|”。下列语法定义的例子表明了计算块选择的不同:例:

{X | Y | XY}Rs=Rm+Rn;;//花括弧内包含的是可选项,“|”线表示分开选择

XYR0=R1+R0;; //实际指令中,没有花括弧也没有竖线

2)操作数长度和数据格式的选择

前缀2是操作数字长选择前缀,用于选择所用寄存器中操作数的字长。单、双和四寄存器组寄存器(Rs,Rsd,Rsq)中保存着指令的操作数(输入和输出),根据操作数字长,一个寄存器里可放置多个操作数。为了选择操作数字长,可在寄存器名前选择一个和寄存器宽度相等或比寄存器宽度小的字长符号。具体方法如下:

(1) B——字节(8位)数据,在单个32位寄存器中的数据被当做四个8位数。例如,使用字节操作数时的寄存器名为BR1、BR1:0和BR3:0。

(2) S——短字(16位)数据,在单个32位寄存器中的数据被当做两个16位字。例如用短字操作数的寄存器名为SR1、SR1:0和SR3:0。

(3)无——正常字(32位)数据。如用正常字操作数的寄存器名为R0、R1:0和R3:0。

(4) L——长字(64位)数据。如用长字操作数的寄存器名为LR1:0。

B、S和L选项仅适用于ALU和移位器操作。乘法器操作数长度的选择则稍有不同。

前缀3是寄存器中操作数格式选择前辍,用于选择定点或浮点数据格式。为了区别定点和浮点数据,在寄存器名前用F表示寄存器包含有浮点数据。如果没有F前缀,则表示该寄存器中是定点数据。

需要说明的是,操作数字长会影响指令的执行。例如:

SRsd=Rmd+Rnd;;

该指令表示四个短字数据加操作,存储在两个寄存器对中。下面是这种类型指令的一个实例,其结果如图5.2-3所示。

SR1:0=R31:30+R25:24;;

在这个指令中,指令在寄存器对中执行64位的操作,可以同时完成对4对16位字长的操作数的加法运算,同时得到4个16位的运算结果。图5.2-3两个寄存器中四个短字操作数的加操作

3)寄存器宽度选择

寄存器后缀用于选择所用寄存器的宽度。每个独立的寄存器组寄存器(XR31~0和YR31~0)的宽度都是32位的。为了支持比32位字更宽的数据字长,DSP汇编语法允许将多个寄存器组合,以支持较长的字。指定寄存器宽度的寄存器命名语法规则如下:

(1) Rs、Rm或Rn:表示包含一个32位字(或更少位数)的单寄存器,如R1、XR2等。

(2) Rsd、Rmd或Rnd:表示包含一个64位字(或更少位数)的双寄存器。例如,寄存器名R1:0,XR3:2等。低位的寄存器序号要求能被2整除。

(3) Rsq、Rmq或Rnq:表示包含一个128位字(或更少位数)的四寄存器。例如,寄存器名R3:0,XR7:4。最低位的寄存器序号要求必须能被4整除。

4)寄存器组语法概要

在计算指令和存储器加载/存储指令中,将使用数据寄存器组。在使用数据寄存器时,其名称的语法约定如下:

{X | Y | XY}{F}Rsd=Rmd+Rnd;;

(1) {X | Y | XY}—寄存器名前缀X、Y或XY(无前缀相当于XY)选择一个或两个计算块来执行指令。括弧里的这些选项是可选的,而竖线表示只能选择其中一个。

(2) {F}—寄存器名前缀F表示操作数为浮点格式,省略则表示操作数为定点格式。

(3) Rsd—结果是双寄存器,用d表示。寄存器名采用R#:# 格式,低位的寄存器序号必须能被2整除(如在R1:0中)。

(4) Rmd,Rnd—输入是两个寄存器。m和n表示必须为不同的寄存器。 5.3存储器的寻址和访问方式

5.3.1直接和间接寻址

直接寻址使用立即数作为修正值。地址采用预修正(pre-modify)模式,修正后的地址作为访问地址。如以下的指令就是使用直接寻址的寄存器加载指令(存储器读):

YR1=[J31+0X00015F00];;

在上述指令中,方括号 [] 中是操作数的地址,由于J31的值为0,因此指令从存储器单元0X00015F00读出一个32位字放入寄存器YR1中。间接寻址使用一个非零的变址值,用寄存器或立即数作为修正值。如图5.3-1所示,有两种类型的间接寻址方式,一种是预修正(pre-modify)模式,另一种是后修正(post-modify)模式。图5.3-1预修正和后修改间接寻址对于预修正寻址模式,指令中使用[Jm+Jn]操作符。在预修正模式中,指令计算变址值Jm+修改值Jn,并且作为地址访问存储器,访问后变址寄存器Jm的内容保持不变。例如下面的指令:

XR0=[J0+J1];;

指令从存储位置J0+J1(变址值+修正值)读一个32位字,并送到寄存器XR0中。变址寄存器J0的值在指令执行后保持不变。对于后修正模式,指令中使用[Jm+=Jn]操作符。指令使用变址寄存器的原值作为地址访问存储器,并把读出的值加载到目的寄存器或存储源寄存器的值。在完成存储器访问之后,变址寄存器Jm的内容被修正值Jm+Jn更新。例如下面的指令:

XR0=[J0+=J1];;

指令从存储器位置J0(原值)处读一个32位的字,并传送到寄存器XR0中。在存储器访问之后,变址寄存器J0更新为新值J0+J1(变址值+修正值)。5.3.2循环寻址

IALU支持寻址循环缓冲区,循环缓冲区是一个地址范围,其中包含IALU存储器操作依次重复访问的数据,以循环模式使地址指针回转,来重复访问该地址范围。存储器读或写访问指令中用操作符CB选择循环寻址模式。

为了寻址一个循环缓冲区,IALU让指针遍历缓冲区。每次访问后,用一个正或负修正值修改和更新指针。如果指针落到缓冲区的外面,则IALU从此值中减去或加上缓冲区的长度,使指针回转,指到缓冲区的起始区域。

IALU使用寄存器文件和专用循环寻址寄存器寻址循环缓冲区。用于循环缓冲区的寄存器及其作用如下:

(1)指针寄存器。它包含IALU在地址总线上的输出值。在指令语法中,指针寄存器用Jm或Km表示。这个寄存器可以是J-IALU中的J3~J0或K-IALU中的K3~K0。

(2)修正值寄存器。它提供后修正方式的修改量(正的或负的),IALU在每个存储器访问的最后一步把修正值加到指针寄存器。修正值寄存器可以是与指针寄存器在同一个IALU中的寄存器文件中的任意一个寄存器,修正值也可以是立即数而不是寄存器。修正值的大小,无论是来自于寄存器还是立即数,必须小于循环缓冲区的长度。

(3)长度寄存器。它必须与指针寄存器相对应,例如,J0对应JL0,K0对应KL0等。长度寄存器用于设置循环缓冲区的大小和IALU的指针寄存器所能访问的地址范围。如果长度寄存器的值是零,则循环缓冲区操作是无效的。

(4)基址寄存器。它必须与指针寄存器相对应,例如,J0对JB0,K0对KB0等。基址寄存器(缓冲区的基地址)或基址寄存器加长度寄存器(缓冲区的末地址)的值与每次访问后修改的指针值进行比较,来判断是否应该回转。由于循环寻址要求在每次访问后更新指针,所以IALU不支持循环寻址的预修改寻址方式。循环寻址只能使用后修改寻址方式。

建立循环缓冲区的步骤如下所示,其字访问方式的说明如图5.3-2所示。

(1)把缓冲区的起始地址加载到所选择的J-IALU或K-IALU指针寄存器中。在J-IALU中,J3~J0可以是指针寄存器;在K-IALU中,K3~K0可以是指针寄存器。

(2)把缓冲区的基地址载入到与指针寄存器相对应的基地址寄存器中,如JB0与J0相对应。

(3)把缓冲区的长度载入到与指针寄存器相对应的长度寄存器中,如JL0与J0相对应。

(4)把修正值(步进值)载入到指针寄存器所在的同一个IALU中的寄存器文件中的寄存器。此外,修正值也可以是立即数。循环缓冲寻址程序示例如下:

.sectionprogram;

JB0=0X100000;;/*设置基地址*/

JL0=11;;/*设置缓冲区的长度*/

J0=0X100000;/*设置起始地址的位置*/

XR0=CB[J0+=4];;/*从地址0X100000加载*/

XR0=CB[J0+=4];;/*从地址0X100004加载*/

XR0=CB[J0+=4];;/*从地址0X100008加载*/

XR0=CB[J0+=4];;/*从地址0X100001加载*/

XR0=CB[J0+=4];;/*从地址0X100005加载*/

XR0=CB[J0+=4];;/*从地址0X100009加载*/

XR0=CB[J0+=4];;/*从地址0X100002加载*/

XR0=CB[J0+=4];;/*从地址0X100006加载*/

XR0=CB[J0+=4];;/*从地址0X10000A加载*/

XR0=CB[J0+=4];;/*从地址0X100003加载*/

XR0=CB[J0+=4];;/*从地址0X100007加载*/

XR0=CB[J0+=4];;/*回转到地址0X100000加载*/图5.3-2字访问的顺序循环寻址5.3.3位反序寻址

IALU通过位反序进位操作符(BR)支持位反序寻址。当这个操作符用于一个间接后修改读或写访问时,进位位向右移动(而不是向左移动)。

图5.3-3说明了位反序进位的操作情况,对规则的加运算0xA5A5+0x2121,结果是0xB6B6;对带位反序进位的同一加运算,结果是0x9494。图5.3-3位反序进位运算(BR选项)与循环缓冲操作一样,位反序寻址只能用寄存器J3~J0或K3~K0执行,但不像循环缓冲区那样,在IALU中不需要为位反序寻址建立相关的基址和长度寄存器。位反序运算也不存在地址越界问题。

以下程序实例说明了位反序寻址方式。

#defineN8 /*N=8;/位反序的单元个数;N必须是2的幂*/

.sectiondata1;

.alignN;

/*把输入缓冲区的起始地址与N的整数倍地址对齐;假设这个例子中地址是0x1000000000000000*/

.varinput[N]={0,1,2,3,4,5,6,7};

.varoutput[N];

.sectionprogram;

_main:

j0=j31+ADDRESS(input);; /*输入指针*/

j4=j31+ADDRESS(output);; /*输出指针*/

LC0=N;; /*设置循环数*/

_my_loop:

xr0=BR[J0+=N/2];; /*带位反序的数据读;修正值必须等于N/2*/

ifNLCOE,jump_my_loop;[j4+=1]=xr0;; /*线性写*/图5.3-4也对位反序进位的字访问次序进行了说明。在上面的程序实例中应注意以下几点:

(1)位反序寻址的缓冲区的长度必须是2的幂(2n),并且所寻址的数据缓冲区的起始地址必须是缓冲区长度的整数倍。例如在实例中,缓冲区的长度是8,缓冲区的起始地址是8的整数倍。

(2)汇编器可以计算一个表达式的值。例如,当N/2出现在代码中时,汇编器认为表达式的值为4。同时,汇编器的ADDRESS()操作符用于计算一个符号的地址。

(3)在重复位反序访问的循环( _my_loop)中,每一次重复写到J4所指地址的数据是0、4、2、1、6、5、3和7。在图5.3-4中,应注意每个重复读访问时的位反序进位操作,以及它们是怎样影响每次访问地址的。

(4)图5.3-4中,使用了一个条件跳转指令来完成存储器的重复读和写访问。图5.3-4带BR的后修改操作5.3.4存储器的访问类型

1.正常的读/写访问

正常的读/写访问通过通用寄存器载入或存储数据,在指令中需要指定目的寄存器或源寄存器。当源或目的寄存器的大小与IALU访问的操作符匹配时,正常访问就发生。例如,当目的寄存器是单寄存器时,IALU不需要指明操作符,此时操作是32位的;当目的寄存器是双寄存器时,IALU操作符应该为L,此时操作是64位的;当目的寄存器是四寄存器时,IALU操作符应该为Q,操作是128位的。在上述几种情况下,它们之间就是匹配的。图5.3-5正常读访问的寄存器数据传递

2.广播式读存储器

广播式读存储器可以将相同的数据加载到运算模块中的数据寄存器。这种指令读取由源操作数指明的32位字数据,并将其同时传送到两个计算块的目的寄存器中。当源寄存器的宽度与IALU访问操作符相匹配时,广播访问发生。图5.3-6是广播式操作的数据传递过程。注意,指令中的目的寄存器是两个运算模块。图5.3-6双寄存器广播读访问

3.合并的存储器读/写访问

合并的存储器读/写访问加载或保存运算模块的数据寄存器中的数据。合并读或写32位字时,将指令中所指出的不同数据载入到两个计算块的目的寄存器中。当源或目的寄存器的宽度是IALU访问的操作数宽度的一半时,发生合并访问,且寄存器的名字使用XY(或没有前缀)或YX,表示两个计算块。XY(或没有前缀)和YX语法将产生不同的结果。

对单个存储器加载或存储的访问,不存在存储器中的数据排队的问题,变址寄存器可以指向任何地址。图5.3-7双寄存器

5.3.5寄存器传送和立即数扩展操作

1.通用寄存器传送操作

IALU支持通用寄存器之间的数据传送,也支持用15或32位的立即数加载通用寄存器。IALU所支持的Ureg传送和加载指令包括:

Ureg_s=〈Imm15〉|〈Imm32〉;/*把15或32位的立即数加载到单个Ureg*/

Ureg_s=Ureg_m;/*把单个Ureg(32位)的内容传送到另一个Ureg中*/

Ureg_sd=Ureg_md;/*把一个双Ureg的内容(64位)传送到另外的Ureg中*/

/*在计算块或IALU寄存器堆中标数字的寄存器可以看做双寄存器*/

Ureg_sd=Ureg_mq;/*传送一个四Ureg(128位)的内容到另外的Ureg中在计算块或IALU寄存器堆中标数字的寄存器可以看做/*四寄存器*/

2.立即数扩展操作

许多IALU指令允许立即数作为操作数。对于数据寻址指令立即数大于8位时,或对于通用寄存器加载的指令立即数大于15位时,由于立即数太长,不能容纳在一个32位的指令中,此时需使用两个指令槽,一个指令槽用于存放指令,另一个指令槽用于存放扩展数据。

DSP自动支持立即数扩展,但程序员必须意识到某个指令需要一个立即数扩展,并要留出一个指令槽用于扩展。例如,在一个使用三个指令槽(而不是四个)的指令行里,DSP会自动使用第二个指令段作为立即数扩展,程序员应把需要扩展的指令放在指令行的第一个指令槽。注意,在一个单指令行中只能有一个立即数扩展。 5.4TS处理器的指令

5.4.1ALU指令

大部分ALU指令都有与之相关联的可选项,这样可以灵活地使用指令。当然,不同的选项适应不同的指令群,而不是所有的选项都适合所有指令。指令选项出现在指令段末端的圆括弧中。

ALU指令选项可以组合使用,具体列于表5.4-1中。ALU指令选项的含义如下:

(1)有符号/无符号选项()/(U)。ALU中可以使用8、16、32或64位表示定点数据,并且可以使用最多达四个32位数据寄存器来表示它们。在ALU中的定点和浮点数据可以是无符号或有符号数,有符号数总是采用2的补码表示。

(2)饱和选项(S)。对有符号数,无论何时发生溢出,AV标志都被置位,当选择了饱和选项后会把最大正值或最小负值作为结果输出。对无符号数发生饱和时,将把最大值或零作为结果输出。最大值和最小值指的是输出格式所能表示的最大值和最小值。如,在16位的短字运算中,最大的正数、最小的负数和最大无符号数分别是0x7FFF、0x8000和0xFFFF。

饱和运算中,标志AV和AC反映饱和操作之前的ALU操作状态。一方面,无符号数操作饱和时,输出饱和值,但AV标志位保持不变。另一方面,又根据饱和结果设置标志位AN和AZ的值,反映饱和结果的符号以及结果是否为零。使用饱和模式后,即使发生溢出期间,也能正确判定条件AEQ、ALT和ALE。

(3)扩展选项(X)。对于ABS指令,X选项提供一个扩展的输出范围。没有X时,输出范围是从0到正的最大有符号数(0x0~0x7F…F)。使用X选项时,扩展输出范围为0x0~0xFF…F。在扩展范围内,输出数值是无符号的。

(4)截断选项(T)。对ALU指令,支持如T选项的截断,该选项确定结果的取舍模式。DSP支持两种取舍模式,向零取舍和向最近值取舍。

●向最近值取舍(不带T选项)。如果取舍前的结果不能确切地用目的格式表示,则取舍的结果最接近取舍前的数值;如果取舍前的结果恰好是目的格式中最接近的两个数的中间值(相差一个最低有效位),则取舍的结果是最低有效位为零的数。

●向零取舍(使用T选项)。如果取舍前的结果不能确切地用目的格式表示,则取舍的结果是最接近零的数值,这与截断相同。

以上两种截取模式也适用于小数定点乘运算。但是,乘法器只执行向最近值取舍操作;对定点操作,乘法器使用局部结果寄存器,实时截取时,读取结果高位舍弃低位。

(5)返回零选项(Z)。对于MAX/MIN指令,如果第二个输入寄存器包含最大值(对于MAX)或最小值(对于MIN),使用Z选项将改变操作,返回零值。如以下指令:

Rsd=MAX(Rmd,Rnd);; //ALU判断Rmd或Rnd中哪个值最大,并在Rsd中保存该最大值

Rsd=MAX(Rmd,Rnd)(Z);; //ALU判断Rmd或Rnd中哪个值最大,若Rmd值大,则ALU在Rsd

//中放置最大值;如果Rnd值大,则ALU把零放在Rsd中

(6)小数/整数的选项(I)。TS101的定点数可以是8、16、32或64位,最长可以是四个32位的数据寄存器(128位)。在ALU中,小数或整数格式供EXPAND和COMPACT指令使用,默认是小数格式。使用I选项就选择整数模式。

下面是ALU的各种指令,其中给出了其可能影响的状态标志位和指令选项。

1.加法/减法

{X|Y|XY}{S|B}Rs=Rm+|-Rn{({S|SU}{NF})};

{X|Y|XY}{L|S|B}Rsd=Rmd+|-Rnd{({S|SU}{NF})};

寄存器Rm加/减Rn,结果存入Rs寄存器。计算结果影响的标志位集合:{AZ,AN,AV,AC},可以使用的指令选项集合:

{(),(S),(SU),(NF)},其中标志NF仅适合于TS20XS(以后不再说明)。

MAX_SN、MIN_SN和MAX_UN分别用来表示计算结果的有符号定点数最大值、有符号定点数最小值和无符号定点数最大值。例如,如果输出的数据为短字格式,则MAX_SN=0x7fff、MIN_SN=0x8000、MAX_UN=0xffff。饱和模式下的加法:

(1)有符号数的饱和模式,使用后缀选项(S)。

如果Rm+Rn的值溢出MAX_SN值,则结果Rs=MAX_SN;

如果Rm+Rn的值下溢出MIN_SN值,则结果Rs=MIN_SN。

(2)无符号数的饱和模式,使用后缀选项(SU)。

如果Rm+Rn的值溢出MAX_UN值,则结果Rs=MAX_UN。饱和模式下的减法:

(1)有符号数的饱和模式,使用后缀选项(S)。

如果Rm-Rn的值溢出MAX_SN值,则结果Rs=MAX_SN;

如果Rm-Rn的值下溢出MIN_SN值,则结果Rs=MIN_SN。

(2)无符号数的饱和模式,使用后缀选项(SU)。

如果Rm-Rn的值溢出MAX_UN值,则结果Rs=MAX_UN;图5.4-1ALU饱和加/减

2.带进位/借位的加法/减法

{X|Y|XY}Rs=Rm+CI{-1};

{X|Y|XY}LRsd=Rmd+CI{-1};

{X|Y|XY}Rs=Rm+Rn+CI{({S|SU}{NF})};

{X|Y|XY}Rs=Rm-Rn+CI-1{({S|SU}{NF})};

{X|Y|XY}LRsd=Rmd+Rnd+CI{({S|SU}{NF})};

{X|Y|XY}LRsd=Rmd-Rnd+CI-1{({S|SU}{NF})};寄存器Rm带进位加或带借位减Rn,结果存储在Rs寄存器。可以不含寄存器Rn,进位/借位(CI)由X/YSTAT中AC标志决定。

计算结果影响标志位和后缀可选项同加法/减法操作。

对于带进位加法:

(1)有符号数的饱和模式,使用后缀选项(S)。

如果Rm+CI>MAX_SN值,则结果Rs=MAX_SN;

如果Rm+Rn+CI<MIN_SN值,则结果Rs=MIN_SN。

(2)无符号数的饱和模式,使用后缀选项(SU)。

如果Rm+Rn+CI>MAX_UN值,则结果Rs=MAX_UN。

对于带借位的减法:

(1)有符号数的饱和模式,使用后缀选项(S)。

如果Rm - Rn + CI - 1>MAX_SN值,则结果Rs = MAX_SN;

如果Rm - Rn + CI - 1<MIN_SN值,则结果Rs = MIN_SN;

(2)无符号数的饱和模式,使用后缀选项(SU)。

如果Rm - Rn + CI - 1<0,则结果Rs = 0;

举例:

xR2 = 0x00000001;;xR0=0xFFFFFFFF;;

xR1 = R0 + R0;; //产生进位

xR3 = R2 + R2 + CI;; //结果为xR3=0x00000003,XSTAT=0

R9 = R3 - R10 + CI - 1;; //如果R3 = 0x17,R10 = 0x4,且前一次ALU操作的进位标志位1,//则R9 = 0x13,并且设置进位标志AC = 1

3.带除2的加法/减法

{X|Y|XY}{S|B}Rs=(Rm+|-Rn)/2{({T}{U}{NF})};

{X|Y|XY}{L|S|B}Rsd=(Rmd+|-Rnd)/2{({T}{U}{NF})};

计算寄存器Rm与寄存器Rn的和或差,再除以2。因为加法产生的进位是通过将结果右移来实现的,所以除2后将不产生溢出,结果向最近的偶数舍入靠近(无偏舍入)或截断。一旦无符号数操作出现负的结果,则结果将为零,并且设置溢出标志位为1。

计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC},可以使用的指令选项集合:{(),(T),(U),(TU),(NF)}。加法的进位是通过右移入MSB(最高位,即符号位)产生的,应遵循以下原则:

(1)有符号输入——带选项()和(T),如果AV=1,那么将Cn移入MSB,否则结果算术右移。

(2)无符号输入——带选项(U)和(TU),对于加法,将Cn移入MSB;对于减法,将0移入MSB。

举例:

R9=(R3+R5)/2;; //向最近偶数舍入

//如果R3=0x1,R5=0x2,则R9=0x2;

//如果R3=0x2,R5=0x3,则R9=0x2;

//如果R3=0x7FFFFFFF,R5=0x1,则移入进位,R9=0x40000000;

//如果R3=0x80000001,R5=0x1,则算术右移,R9=0xC0000001。

4.绝对值/和或差的绝对值

{X|Y|XY}{S|B}Rs=ABSRm{(NF)};

{X|Y|XY}{L|S|B}Rsd=ABSRmd{(NF)};

{X|Y|XY}{S|B}Rs=ABS(Rm+Rn){({X}{NF})};

{X|Y|XY}{L|S|B}Rsd=ABS(Rmd+Rnd){({X}{NF})};

{X|Y|XY}{S|B}Rs=ABS(Rm-Rn){({X|U}{NF})};

{X|Y|XY}{L|S|B}Rsd=ABS(Rmd-Rnd){({X|U}{NF})};

计算寄存器Rm和寄存器Rn的和值或差值,然后将和值或差值的绝对值存放在寄存器Rs中。如果寄存器Rn省略的话,则计算寄存器Rm的绝对值。对于加法,选项X提供了输出扩展范围。不使用选项X时,计算结果的正常输出范围为零到最大的正值,即从0~0x7F…F。如果结果超过这个范围,则结果经过饱和处理输出为最大正数。如果使用选项X,则计算结果输出值将扩展到0x0~0xF…F内的无符号数。

对于减法,选项X也提供了输出扩展范围。不使用选项X时,计算结果的正常输出范围为零到最大的正值,即从0~0x7F…F。正常的输出范围既适用于有符号运算,也适用于无符号运算。计算结果如果不在这个范围内,则结果经过饱和处理输出为最大正数。使用选项X时,计算结果输出值将扩展到0x0~0xF…F内的无符号数,且认为源操作数为有符号数。计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC},可以使用的指令选项集合:{(),(X),(U),(NF)}。

举例:

R5=ABSR4;; //如果R4=0x80000000,那么R5=0x7FFFFFFF且AV、AN置1

//如果R4=0x7FFFFFFF,那么R5=0x7FFFFFFF

//如果R4=0xF0000000,那么R5=0x10000000且AN置1

XR3=ABS(R0+R1);; //如果XR0=0x80000001且XR1=0x80000001,

//那么XR3=0x7FFFFFFF且XSTAT:AOS=1,AC=0,AV=1,AN=0,AZ=0

5.补码运算

{X|Y|XY}{S|B}Rs=-Rm{(NF)};

{X|Y|XY}{L|S|B}Rsd=-Rmd{(NF)};

计算寄存器Rm的补码,将结果存入寄存器Rs。如果源操作数是指定格式可表示的最小负数,那么计算结果为最大正值。

计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC}。

6.最大值/最小值

{X|Y|XY}{S|B}Rs=MAX|MIN(Rm,Rn){({U}{Z}{NF})};

{X|Y|XY}{L|S|B}Rsd=MAX|MIN(Rmd,Rnd){({U}{Z}{NF})};

比较寄存器Rm和寄存器Rn,将两者中最大(较大)或最小(较小)的数存入寄存器Rs中。按照数据宽度,可以进行字节—字节,短字—短字、字—字和长字—长字的比较。每次比较的最大值或最小值将传入结果寄存器中相应的字节/短字/字。使用(Z)选项求最大值时,如果Rm>=Rn时,结果寄存器Rs=Rm,否则Rs=0;求最小值时,如果Rm<=Rn,则结果寄存器Rs=Rm,否则Rs=0。

计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC},可以使用的指令选项集合:{(),(U),(UZ),(NF)}。

举例:

SR9:8=MAX(R3:2,R1:0);; //如图5.4-2(a)所示

SR9:8=MAX(R3:2,R1:0)(Z);; //如图5.4-2(b)所示

SR9:8=MIN(R3:2,R1:0);; //如图5.4-2(c)所示

SR9:8=MIN(R3:2,R1:0)(Z);; //如图5.4-2(d)所示图5.4-2最大值/最小值指令举例

7.维特比最大值/最小值

{X|Y|XY}S|BRsd=VMAX|VMIN(Rmd,Rnd){(NF)};

比较寄存器Rm和寄存器Rn,将维特比最大(较大)数或维特比最小(较小)数存入寄存器Rs中。按照数据宽度,可以进行字节—字节或短字—短字的比较。每次比较的最大值传入结果寄存器中相应的字节/短字。在选择位标志将放入PR1:0高4或8位之前,PR1:0中对应位的原有内容将相应右移。维特比最大值运算法则:

fori=0ton-1(对于8字节n为8,对于四短字n为4)

ifRm(i)>=Rn(i)then

Rs(i)=Rm(i)

PR1:0={1,PR1:0[63:1]}

else

Rs(i)=Rn(i)

PR1:0={0,PR1:0[63:1]}

end(if)

end(for)维特比最小值运算法则:

fori=0ton-1(对于八进制字节n为8,对于四短字n为4)

ifRm(i)<Rn(i)then

Rs(i)=Rm(i)

PR1:0={1,PR1:0[63:1]}

else

Rs(i)=Rn(i)

PR1:0={0,PR1:0[63:1]}

end(if)

end(for)计算结果影响标志位情况与最大值/最小值运算相同。

举例:

初始化PR1:0=0xabc01281987fed35

SR9:8=VMAX(R3:2,R1:0);; //如图5.4-3(a)所示。

初始化PR1:0=0xabc01281987fed35

SR9:8=VMIN(R1:0,R3:2);; //如图5.4-3(b)所示。图5.4-3维特比最大值/最小值指令举例

8.递增/递减

{X|Y|XY}{S|B}Rs=INC|DECRm{({S|SU}{NF})};

{X|Y|XY}{L|S|B}Rsd=INC|DECRmd{({S|SU}{NF})};

将寄存器Rm加1或减1,结果存入寄存器Rs。

(1)有符号数的饱和模式,使用后缀选项(S)。

如果Rm+1>MAX_SN值,则结果Rs=MAX_SN;

如果Rm-1<MIN_SN值,则结果Rs=MIN_SN。

(2)无符号数的饱和模式,使用后缀选项(SU)。

如果Rm-1<0值,则结果Rs=0;

如果(Rm+1)>MAX_U,则结果Rs=MAX_U。

计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC},后缀可选项与最大值/最小值运算相同。

9.比较

{X|Y|XY}{S|B}COMP(Rm,Rn){(U)};

{X|Y|XY}{L|S|B}COMP(Rnd,Rnd){(U)};

比较寄存器Rm和寄存器Rn的数值,如果相等,则AZ置1;如果寄存器Rm小于寄存器Rn,则AN置1。按照数据宽度,可以进行字节—字节,短字—短字或字—字比较。值得注意的是,在进行多数据元素比较时(例如,指令BCOMP(Rm,Rn)),标志由各自比较结果的标志值通过逻辑或(OR)确定。

计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC},可以使用的指令选项集合:{(),(U)}。举例:

COMP(R3,R5);; //如果R3=0xFFFFFFFF,R5=0x0,那么AN=1且AZ=0

COMP(R3,R5)(U);;/*如果R3=0xFFFFFFFF,R5=0x0,那么AN=0且AZ=0,

R3=0x00000000,R5=0x7F7F0000*/

XBCOMP(R3,R5);;

IfXALT,JUMPmy_label;; /*如果寄存器R3中只要有一个字节比R5中相应的字节的值小,则程序执行跳转*/

XBCOMP(R5,R3);;

IFNXALEJUMPmy_label; //*如果寄存器R3中所有的字节都比R5中相应的字节的值小,则程序执行跳转*/10. CLIP

{X|Y|XY}{S|B}Rs=CLIPRmBYRn{(NF)};

{X|Y|XY}{L|S|B}Rsd=CLIPRmdBYRnd{(NF)};

如果Rm的绝对值小于Rn的绝对值,则将寄存器Rm中的有符号数存入寄存器Rs中;否则,如果Rm中的数值为正值,则将|Rn|存入到寄存器Rs,如果Rm是负的,将-|Rn|存入寄存器Rs。计算结果影响标志位的情况与最大值/最小值运算相同。图5.4-4CLIP指令举例

11.累加和

{X|Y|XY}Rs=SUMSRm|BRm{({U}{NF})};

{X|Y|XY}Rs=SUMSRmd|BRmd{({U}{NF})};

将寄存器Rm中的字节/短字相加,结果存入Rs。如果字节/短字是有符号的,则在相加之前对它们作符号扩展。计算结果采用右对齐方式,例如,二进制小数点总是在结果最低有效位的右侧。

计算结果影响标志位的情况与最大值/最小值运算相同。可以使用的指令选项集合:

{(),(U),(NF)}。

举例:

XR4=SUMSR3:2;; //如图5.4-5(a)所示

XR4=SUMSR3:2(U);; //如图5.4-5(b)所示图5.4-5数位累加和指令举例

12.统计1的个数

{X|Y|XY}Rs=ONESRm|Rmd{(NF)};

统计寄存器Rm中32位二进制数据中1的个数,结果存入寄存器Rs。

计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC}。

举例:

R6=ONESR3;; //如果R3=b#00…011101,那么R6=0x00…04

13.并行结果寄存器装载/传送

{X|Y|XY}PR1:0=Rmd{(NF)};

{X|Y|XY}Rsd=PR1:0{(NF)};

将Rmd的数加载到寄存器PR1:0,或将寄存器PR1:0中的数传输到寄存器Rsd。

计算结果影响标志位的情况与最大值/最小值运算相同。

14.位FIFO增量

{X|Y|XY}Rs=BFOINCRmd{(NF)};

将双寄存器Rmd的两个寄存器的低7位相加获得和值,然后将和值除以64,得到的余数存入到Rs的最低6位,如图5.4-6所示。图5.4-6位FIFO增量指令计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC}。

举例:

Rs=BFOINCRmd; //如果Rmd=0x0…0300…020,那么Rs=0x0…010且AN置1

15.并行累加的绝对值

{X|Y|XY}PR0|PR1+=ABS(SRmd-SRnd){({U}{NF})};

{X|Y|XY}PR0|PR1+=ABS(BRmd-BRnd){({U}{NF})};

将双寄存器Rnd中的字节/短字减去双寄存器Rmd中的字节/短字获得差值,然后将差值结果以短字/字节方式取绝对值,接着将绝对值横向求和且与PR寄存器的单值相加,最后结果存入PR寄存器。无论后缀选项(U)是否使用,PR寄存器中的值都为有符号数据,且饱和模式总是有效。

计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC},可以使用的指令选项集合:{(),(U),(NF)}。

举例:

XPR0+=ABS(SR3:2-SR1:0);; //如图5.4-7所示图5.4-7并行累加的绝对值指令举例

16.带并行累加的横向求和

{X|Y|XY}PR0|PR1+=SUMSRm{({U}{NF})};

{X|Y|XY}PR0|PR1+=SUMSRmd{({U}{NF})};

{X|Y|XY}PR0|PR1+=SUMBRm{({U}{NF})};

{X|Y|XY}PR0|PR1+=SUMBRmd{({U}{NF})};将Rm内容以短字/字节方式相加获得和值,然后再把该和值与PR寄存器中的值相加,并把最后的和值存回PR寄存器。如果字节/短字是有符号数,则在相加之前把它们作符号扩展,然后进行运算。PR寄存器的值总是右对齐的,例如,二进制小数点总是在最低有效位的右侧。PR的寄存器可以是有符号或无符号的,且存入寄存器PR的加法时钟采用饱和模式。

计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC}(由最后的PR加法决定),可以使用的指令选项集合:{(),(U),(NF)}。

举例:

PR0+=SUMSR3:2;; //如图5.4-8所示图5.4-8带并行累加的横向求和指令举例

17.双操作加法/减法

{X|Y|XY}{S|B}Rs=Rm+Rn,Ra=Rm-Rn{(NF)};

{X|Y|XY}{L|S|B}Rsd=Rmd+Rnd,Rad=Rmd-Rnd{(NF)};

同时完成寄存器Rm和Rn之间的加法和减法,运算结果分别存入寄存器Rs和Ra。饱和模式始终有效,且结果均为有符号数。

计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC}。

举例:

R9=R4+R8,R2=R4-R8;; //如果R4=8,R8=2,那么R9=10且R2=6

18.传递

{X|Y|XY}Rs=PASSRm;

{X|Y|XY}LRsd=PASSRmd;

通过ALU将寄存器Rm的数传递给寄存器Rs,影响相应的标志位。

计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC}。

举例:

XR6=PASSR3;;/*如果R3=0x80000000,那么R6=0x80000000且XSTAT:AC=0,AV=0,AN=1,AZ=0*/

19.逻辑与/与非/或/异或/非

{X|Y|XY}Rs=RmAND|ANDNOT|OR|XORRn{(NF)};

{X|Y|XY}LRsd=RmdAND|ANDNOT|OR|XORRnd{(NF)};

{X|Y|XY}Rs=NOTRm{(NF)};

{X|Y|XY}LRsd=NOTRmd{(NF)};

指令AND、ANDNOT、OR、XOR和NOT分别实现寄存器Rm和Rn的逻辑“与”、“与非”、“或”、“异或”和逻辑“取补”功能。

计算结果影响标志位的情况与最大值/最小值运算相同。举例:(/*b#表示二进制*/)

R5=R4ANDR8;; //如果R4=b#…1001、R8=b#…1100,则R5=b#…1000

R5=R4ANDNOTR8;; //如果R4=b#…1001、R8=b#…1100,则R5=b#…0001

R5=R3ORR4;; //如果R3=b#…1001、R4=b#…1100,则R5=b#…1101

R3=R2XORR7;; //如果R2=b#…1001、R7=b#…1100,则R3=b#…0101

R6=NOTR3;; //如果R3=b#00…011101,则R6=b#11…100010

20.扩展

{X|Y|XY}Rsd=EXPANDSRm{+|-SRn}{({I|IU}{NF})};

{X|Y|XY}Rsq=EXPANDSRmd{+|-SRnd}{({I|IU}{NF})};

{X|Y|XY}SRsd=EXPANDBRm{+|-BRn}{({I|IU}{NF})};

{X|Y|XY}SRsq=EXPANDBRmd{+|-BRnd}{({I|IU}{NF})};将寄存器Rm和Rn相加或相减,将得到的结果进行扩展,8位扩展到16位或16位扩展到32位;操作数寄存器Rn可以省略,此时实现对寄存器Rm的扩展;如果是小数格式,则在结果末尾添0;如果是整数,则在结果前添0(或1,如果对有符号整数作符号扩展)进行符号扩展,最后将结果存入定点寄存器Rs。扩展约定如下:

Rsd=EXPANDSRm扩展两个短字为两个正常字

Rsq=EXPANDSRmd扩展四个短字为四个正常字

SRsd=EXPANDBRm扩展四个字节字为四个短字

SRsq=EXPANDBRmd扩展八个字节字为八个短字

计算结果影响标志位的情况与最大值/最小值运算相同,可以使用的指令选项集合:{(),(I),(IU),(NF)}。举例:

Rsd=EXPANDSRm; //如图5.4-9所示

Rsq=EXPANDSRmd;

{X|Y|XY}Rsd=EXPANDSRm+SRn;//如图5.4-10所示

{X|Y|XY}Rsq=EXPANDSRmd+SRnd;图5.4-9扩展指令举例图5.4-10扩展指令举例

21.压缩

{X|Y|XY}SRs=COMPACTRmd{+|-Rnd}{({T|I|IS|ISU}{NF})};

{X|Y|XY}BRs=COMPACTSRmd{+|-SRnd}{({T|I|IS|ISU}{NF})};

{X|Y|XY}Rs=COMPACTLRmd{({U|IS|ISU}{NF})};

{X|Y|XY}LRsd=COMPACTQRmq{({U|IS|ISU}{NF})};将寄存器Rmd和寄存器Rnd相加或者相减,然后把结果压缩为低精度的数据类型,将最后的结果存入寄存器Rs;操作数寄存器Rnd可以省略,此时仅仅压缩寄存器Rmd。压缩指令类型如下:

SRs=COMPACTRmd两个正常字压缩成两个短字

BRs=COMPACTSRmd四个短字压缩成八个字节

Rs=COMPACTLRmd一个长字压缩成一个正常字

LRsd=COMPACTQRmq一个四字压缩成一个长字这些指令支持两种数据类型:小数(默认)和整数,使用选项(I)、(IS)或(ISU)。

小数压缩是将结果的高半部分传入目的操作数寄存器,既可以采用向最近偶数舍入(默认)方式,也可以采用截断低半部分(带选项(T))。仅当舍入后结果大于最大正数时,才产生溢出现象,此时,结果按照饱和处理(假定数据是有符号的)。整数压缩是将结果的低半部分传入目的寄存器。当进行压缩整数处理时,可以选饱和模式,也可以不选择饱和模式。如果选择不饱和模式(默认),则源操作数的最高位仅用来判定有符号数是否溢出,如果次高位与最高位(符号位)的值不同,则溢出标志位置1;如果采用有符号数饱和模式(选项(IS)),一旦结果溢出(溢出条件同不选择饱和模式的溢出条件),对于正数,结果为0x7FF…F;对于负数,结果为0x800…0;如果采用无符号饱和模式(选项(ISU)),则溢出条件为高位不全为零,且饱和结果总是0xFF…F。

计算结果影响的标志位集合:{AZ,AN,AV(AOS),AC},可以使用的指令选项集合:{(),(T),(I),(IS),(ISU),(NF)}。举例:

{X|Y|XY}SRs=COMPACTRmd;; //如图5.4-11所示

{X|Y|XY}SRs=COMPACTRmd+Rnd; //如图5.4-12所示

{X|Y|XY}BRsq=COMPACTSRmd+SRnd;图5.4-11压缩指令举例图5.4-12压缩指令举例

22.合并

{X|Y|XY}BRsd=MERGERm,Rn{(NF)};

{X|Y|XY}BRsq=MERGERmd,Rnd{(NF)};

{X|Y|XY}SRsd=MERGERm,Rn{(NF)};

{X|Y|XY}SRsq=MERGERmd,Rnd{(NF)};

合并(调换)寄存器Rm和Rn中的数据,结果存入寄存器Rs。该指令也可以用来重复地调换短字和字节的合并结果,如图5.4-13所示。图5.4-13合并指令

23.序列变换(字节)

{X|Y|XY}Rsd=PERMUTE(Rmd,Rn){(NF)};

依据控制字寄存器Rn,从寄存器Rmd选择字节组成结果存入Rsd。

寄存器Rn被划分成8组(每组4位,半个字节),寄存器Rmd被划分成8个字节,Rn中的每组控制Rmd中相应的字节。例如,Rn中的组2(11:8位)控制Rmd中相应的字节2(23:16位)。控制字选择Rmd中一个字节写入Rsd中相应的字节。Rn的组编码如下:

(1) b#0000:选择字节0(低字的7:0位);

(2) b#0001:选择字节1(低字的15:8位);

(3) b#0010:选择字节2(低字的23:16位);

(4) b#0011:选择字节3(低字的31:24位);

(5) b#0100:选择字节4(高字的7:0位);

(6) b#0101:选择字节5(高字的15:8位);

(7) b#0110:选择字节6(高字的23:16位);

(8) b#0111:选择字节7(高字的31:24位);

(9) b#1XXX:保留。寄存器Rn中的不同组可能指向寄存器Rmd的同一字节,此时,Rmd的相应字节被多次复制。该指令不影响标志。

举例:

R1:0=0x01234567_89abcdef

R4=0x03172454

R7:6=permute(R1:0,R4)

结果R7:6是0xef89cd01_ab674567。

24.序列变换(短字)

{X|Y|XY}Rsq=PERMUTE(Rmd,-Rmd,Rn){(NF)};

依据控制字Rn,从操作数和-Rmd(Rmd短字方式2的补码)中选择位组成结果Rsq。

Rn被分成8组(每组4位),Rmd被分成8个短字。Rn中的每组控制Rmd中相应的短字。例如,Rn中的组2(11:8位)控制Rmd中相应的短字2(23:16位)。控制字选择Rmd中的哪一个短字写入到Rsq中的相应位置。Rn中的一组译码如下:

(1) b#0000:选择短字0-Rmd的15:0位;

(2) b#0001:选择短字1-Rmd的31:16位;

(3) b#0010:选择短字2-Rmd的47:32位;

(4) b#0011:选择短字3-Rmd的63:48位;

(5) b#0100:选择短字0-Rmd的15:0位反码;

(6) b#0101:选择短字1-Rmd的31:16位反码;

(7) b#0110:选择短字2-Rmd的47:32位反码;

(8) b#0111:选择短字3-Rmd的63:48位反码;

(9) b#1XXX:保留。

Rn中的不同组可能指向Rmd的同一短字。这时,Rmd的同一短字被多次复制到Rsq。

这个指令不能与移位指令和ALU指令并行执行(因为四字结果的指令不能和移位指令并行工作),但它能与乘法指令、TR加载或THR加载指令并行执行。

计算结果影响的标志位集合:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论