Blackfin双核处理器与应用开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 寄存器文件

图1-1提供了本章论述相关主题的图形指南,显示了数据寄存器文件和计算单元之间的关系。单功能乘法器、ALU和移位器指令能够自由地访问Rn,多功能操作或许有些限制。附加寄存器A0和A1提供了40bit累加器结果,专用于ALU,且主要用于乘累加功能。算术操作的传统模式,如小数和整数是在指令中直接指定的。圆整模式是在算术状态寄存器(ASTAT)中指定的,它也记录了计算操作结果的状态/条件。

2.1.1 寄存器文件

ADSP-BF561处理器的计算单元有3个明确的寄存器组:数据寄存器文件、指针寄存器文件和数据地址产生器(DAG)寄存器。数据寄存器文件为计算单元从数据总线接收操作数并存储计算结果,指针寄存器文件含有寻址操作的指针,DAG寄存器有专用于零开销循环缓冲的寄存器。处理器中字是32位宽,H代表32位寄存器的高16位,L代表32位寄存器的低16位。处理器寄存器文件如图2-1所示。

图2-1 寄存器文件

数据寄存器文件 数据寄存器文件包含8个寄存器Rn(R[7:0]),每个32位宽。每一个寄存器又可看做一对独立的16位寄存器,每个表示低半部分或高半部分,如32位寄存器R0可看做两个独立的寄存器R0.L和R0.H。有3条独立的总线(2条读、1条写)连接寄存器文件和L1数据存储器,每条总线都是32位宽。Rn和存储器之间的传送可以在每个周期内搬移多达4个16位的有效数据。下面指令表示一个32-bit和一个16-bit操作:

        R2=R1 + R2;        /* 32-bit addition */
        R2.L=R1.H * R0.L;  /* 16-bit multiplication */

累加寄存器 处理器有两个专有的40位的累加寄存器(A0和A1)。A0.W包含了A0的低32位,A0.L包含了A0.W中的低16位,A0.H包含了A0.W中的高16位,A0.X包含了A0的高8位,可用An、An.W、An.L、An.H和An.X来访问,例如:

        A0=A1;          /* 40-bit move */
        A1.W=R7;        /* 32-bit move */
        A0.H=R5.H;      /* 16-bit move */
        R6.H=A0.X;      /* read 8-bit value and sign extend to 16 bits */

指针寄存器 通用地址指针寄存器,也称为P寄存器,包括6个P寄存器文件Pn(P[5:0])、1个帧指针(FP)用于指向当前进程的活动记录、1个堆栈指针(SP)用于指向运行时堆栈中最近一次使用的位置。P寄存器是32位宽的,主要用于地址计算,也可以在一组限定的算术操作集内用于一般的整数算术操作,如用做计数器,但P寄存器的算术运算不会影响ASTAT寄存器的状态标志。

DAG寄存器组 DSP指令中主要使用DAG寄存器组来寻址,包含下列寄存器:I[3:0]包含索引地址、M[3:0]包含修改值、B[3:0]包含基地址、L[3:0]包含长度值。所有的DAG寄存器都是32位宽的,其中I(索引)寄存器和B(基址)寄存器包含存储器8-bit字节的地址,I寄存器含有一个有效地址,M(修改)寄存器含有用于在I寄存器上进行加或减的偏移值。B寄存器和L(长度)寄存器定义循环缓冲,B寄存器存储缓冲的起始地址,L寄存器存储长度,按字节计。每个L和B寄存器对是与对应的I寄存器相关联的,如L0和B0总是和I0相关联;但任意的M寄存器都可和任意的I寄存器关联,如I0可被M3修改。

表2-1列出了寄存器文件指令,表中符号说明如下:

表2-1 寄存器文件指令汇总

[1] 不是所有的寄存器组合都是合法的。

(1)Allreg表示:R[7:0]、P[5:0]、SP、FP、I[3:0]、M[3:0]、B[3:0]、L[3:0]、A0.X、A0.W、A1.X、A1.W、ASTAT、RETS、RETI、RETX、RETN、RETE、LC[1:0]、LT[1:0]、LB[1:0]、USP、SEQSTAT、SYSCFG、CYCLES和CYCLES2。

(2)An表示ALU结果寄存器A0或A1之一。

(3)Dreg表示任意一个Rn

(4)Sysreg表示系统寄存器ASTAT、SEQSTAT、SYSCFG、RETI、RETX、RETN、RETE或RETS、LC[1:0]、LT[1:0]、LB[1:0]、CYCLES和CYCLES2。

(5)Preg表示任一指针寄存器、FP或SP寄存器。

(6)Dreg_even表示R0、R2、R4或R6。

(7)Dreg_odd表示R1、R3、R5或R7。

(8)DPreg表示任意Rn或任意指针寄存器、FP或SP寄存器。

(9)Dreg_lo表示任意Rn低16位。

(10)Dreg_hi表示任意Rn高16位。

(11)An.L表示累加器An.W的低16位。

(12)An.H表示累加器An.W的高16位。

(13)Dreg_byte表示任意一个数据寄存器的低8位。

(14)Option(X)表示符号扩展。

(15)Option(Z)表示零扩展。

(16)*指示这个标志可以置位或清0、依赖于指令的计算结果。

(17)**指示这个标志清0。

(18)-指示无作用。

2.1.2 使用计算状态

乘法器、ALU、移位器将根据操作结果更新ASTAT寄存器里的溢出和其他状态标志,为了使用计算得到的状态条件,可以在指令执行后使用条件指令测试CC标志(ASTAT寄存器位5),这个方法允许监视每个指令的结果。ASTAT寄存器是32位的,有一些位是保留的,为确保未来兼容性,写该寄存器时对那些保留位应该写回读取到的值。ASTAT寄存器位图描述如图2-2所示。

图2-2 算术状态寄存器(ASTAT)