定义指令字长为32位,并把寄存器堆扩展到32个通用32位寄存器。一套包含8个寄存器的寄存器堆,对于一个优化好的进程,足够安排所有的本地变量。采用寄存器窗技术可以提高系统的吞吐率。使CPI<1.一套32位寄存器阵列能够实现4个嵌套深度的进程。
1.指令格式的设计
指令可以分为四大类:
类别 |
说明 |
运算类 |
寄存器数据算术逻辑运算 |
访存类 |
主存储器访问(Load/Store) |
跳转类 |
分支跳转(控制转移、条件与非条件) |
特殊类 |
对诸如程序计数器PC等特殊寄存器操作的特殊指令 |
指令格式可以分为两大类:访存和寻址指令,无访存操作指令
访存和寻址指令:
F1:寄存器寻址
Opcode |
RC |
RA |
RB |
31 24 19 14 5 0
F2:偏移量间接寻址
Opcode |
RC |
RA |
Offset14 |
31 24 19 14 0
F3:绝对寻址
Opc. |
Address30 |
31 30 0
F4:PC间接偏移寻址
Opcode |
CC |
Offset19 |
31 24 19 0
无访存操作的指令:
F5:寄存器操作
Opcode |
DEST |
SRCA |
SRCB |
31 24 19 14 5 0
F6:寄存器和立即数操作
Opcode |
DEST |
SRCA |
Immedicate14 |
31 24 19 14 0
F7:立即数操作
Opcode |
DEST |
Immediate19 |
31 24 19 0
F8:特殊寄存器操作
Opcode |
RC |
SA |
|
31 24 19 14 0
F9:特殊寄存器操作
Opcode |
SC |
RB |
31 24 19 5 0
F10:可用于多种操作
Opcode |
Imm4 |
31 24 4 0
F11:可用于多种操作
Opcode |
|
31 24 0
指令格式含义的说明:
名称 |
含义 |
Opcode |
指令操作码 |
RA RB RC |
通用寄存器地址,作为访存和特殊指令的源和目的操作数、存储器地址、或索引寄存器 |
Offset n |
地址偏移量常数,条件跳转的目标地址,如n位 |
Address30 |
绝对地址 |
CC |
条件跳转码 |
SRCA SRCB DEST |
算术和逻辑运算的源和目的寄存器地址 |
Immediate n |
算术和逻辑运算的立即数,也用在软件中断中,如n位 |
Imm n |
Immediate n的缩写 |
SA SC |
特殊寄存器的地址 |
名称 |
说明 |
REG |
寄存器阵列(通用寄存器) |
rA,rC |
寄存器REG[RA],REG[RB] |
rB |
寄存器REG[RB]或者是在最低两位Offset14再扩展00,01,10,11 |
cc |
跳转条件码CC |
srcA,dest |
寄存器REG[SRCA],REG[DEST] |
srcB |
寄存器REG[SRCB]或Immediate14 |
sA,sC |
特殊寄存器SA和SC |
MEM[n] |
扩展寄存器的地址n |
N,Z,C,V |
状态标志位 |
公共操作符表示寄存器或存储器之间的操作:
操作符 |
说明 |
A?expr |
赋值 |
A?àB |
交换 |
A>>B |
将A右移B指定的位数 |
A<<B |
将A左移B指定的位数 |
A>>>B |
将A循环右移B指定的位数 |
{A,B} |
拼接 |
A|B |
按位逻辑“或” |
A&B |
按位逻辑“与” |
A^B |
按位逻辑“异或” |
~A |
按位求反 |
A + B |
加 |
A - B |
减 |
特殊寄存器的种类包括:程序计数器PC、返回地址RPC、旧PC值LPC、状态寄存器SR、向量基址寄存器VBR、硬件中断标志寄存器HWISR、异常标志寄存器EXCSR、软件中断标志寄存器SWISR、硬件中断返回程序计数器HWIRPC、异常返回程序计数器EXCRPC、软件中断返回程序计数器SWIRPC、硬件中断地址HWIADR、异常地址EXCADR。
访存类装载和存储指令:
这类指令除了从存储器中取出指令外,他们自身还要访问存储器,与存储器交换数据。一个处理器字是32位,还有2个字节的16位半字和8位字节。
按字访问的存储器地址通常受字长的限制,即地址的最低两位都是零。对于半字的读取,地址最低位是零。为了提高效率,可以对地址值仅保存不带最低两位的地址值,只在需要的时候进行扩展。
访存类指令用操作数rA、rB和rC作为地址操作数。当rA和rC表示的是寄存器RA和RC时,rB的值依赖操作数的种类。操作数可以是通用寄存器中的数值,也可以是14位常数再拓展00、01,、10、11所形成的16位数值。
存储器用4种不同的寻址方式。在索引寄存器相对寻址中(F1格式),存储器的地址通过基址寄存器rA和索引寄存器rB求和得到。
偏移量间接寻址(F2格式)是寄存器rA和rB代表的偏移量求和得到地址的寻址方式。这种寻址方式可用于简单的矩阵数据读/写,堆栈操作和本地变量的管理。
STORE指令的rC寄存器保存操作数地址,用于将数据装载到存储器相应位置。由于处理器具有延迟装载的特性,目的寄存器在下一个周期才能完成新的数值的装载。
助记符 |
名称 |
格式 |
说明 |
LDU LDU.D LDU.B |
装载无符号字 装载无符号半字 装载无符号字节 |
F1,2 F1,2 F1,2 |
rC?MEM[rA+rB](字) rC?MEM[rA+rB](半字) rC?MEM[rA+rB](字节) |
LDS LDS.D LDS.B |
装载有符号字 装载有符号半字 装载有符号字节 |
F1,2 F1,2 F1,2 |
rC?MEM[rA+rB](字) rC?MEM[rA+rB](半字) rC?MEM[rA+rB](字节) |
ST ST.D ST.B |
存储字 存储半字 存储字节 |
F1,2 F1,2 F1,2 |
MEM[rA+rB]?rC MEM[rA+rB]?rC(低16位半字) MEM[rA+rB]?rC(低8位字节) |
SWP |
交换字 |
F1,2 |
rC?MEM[rA+rB] |
跳转类指令
跳转类指令(控制转移、分支跳转)通过改变程序计数器PC来改变程序流的执行顺序。紧跟着跳转类指令之后,有一条位于延迟槽中的延迟指令在程序流跳转之前执行,即使此时程序流不发生跳转,延迟指令也会进入流水线。
如果跳转指令不执行,同时延迟槽中是一条ANNUL指令,这条延迟指令才会被忽略。
绝对地址Address30(F3格式)专门供CALL指令使用。由于CALL指令的跳转目的指令只可能是32位字长的指令,所以绝对地址在最低位扩展00。
为了支持高级语言,设计PC-偏移量相对寻址的指令形式(F4格式)。BCC指令(条件跳转)包含了19位的常数偏移量,作为相对跳转地址。这个相对地址距离是用有符号数表示的,并在最低位扩展两个0。指令执行时,这个相对地址与PC中的地址值相加,这样覆盖了
范围的存储器地址空间。
子程序可以通过CALL指令调用,而子程序返回则通过综合的CTR指令RET来完成。
RISC处理器的一个特点是在CALL指令之后的返回地址是由用户负责保存的,这个返回地址是紧跟在延迟槽之后的地址。这个地址在CALL指令执行期间自动送入特殊寄存器RPC(Return -PC),随后这个地址值只能通过特殊指令LRFS Rb,RPC 指令被保存到一个随机通用寄存器Rb中。子程序返回使用前面提到的RET Rb指令完成。
综合的跳转类指令JMP可以实现程序流向保存在寄存器中的地址处跳转。条件跳转类指令称为BCC指令,包括BGT、BLE等等。
非条件跳转包括CALL、JMP、RET、SEI、RET1和HALT指令。
助记符 |
名称 |
格式 |
如果cc, 则执行 |
BGT
BLE BGE BLT BHI BLS |
符号数大于时跳转
符号数小于等于时跳转 符号数大于等于时跳转 符号数小于时跳转 无符号数大于时跳转 无符号数小于等于时跳转 |
F4
F4 F4 F4 F4 F4 |
~((N^V)|Z) PC?PC+{Offset19,00}
(N^V)|Z PC?PC+{Offset19,00} ~(N^V)|Z PC?PC+{Offset19,00} (N^V)&~Z PC?PC+{Offset19,00} ~(C|Z) PC?PC+{Offset19,00} C|Z PC?PC+{Offset19,00} |
BPL
BMI BNE BEQ BVC BVS BCC BCS |
正数时跳转
负数时跳转 不等时跳转 相等时跳转 无溢出时跳转 溢出时跳转 无进位时跳转 有进位时跳转 |
F4
F4 F4 F4 F4 F4 F4 F4 |
~N PC?PC+{Offset19,00}
N PC?PC+{Offset19,00} ~Z PC?PC+{Offset19,00} Z PC?PC+{Offset19,00} ~V PC?PC+{Offset19,00} V PC?PC+{Offset19,00} ~C PC?PC+{Offset19,00} C PC?PC+{Offset19,00} |
BT
BF |
为真时跳转
为假时跳转 |
F4
F4 |
true PC?PC+{Offset19,00}
false |
XXX.A |
带.A参数 |
F4 |
对于上面的指令,延迟指令都会执行;但当带有.A参数时,如果跳转未执行,则放弃延迟槽指令。 |
CALL
JMP RET SWI RET1 |
调用
跳转 返回 软件中断 中断返回 |
F3
F9 F9 F10 F11 |
RPC?PC,PC?{Address30,00}执行延迟槽指令
PC?rB 执行延迟槽指令 PC?rB 执行延迟槽指令 PC?VBR|{1,Imm4,000}保存处理器状态 恢复保存处理器状态 |
HALT |
中止 |
F11 |
中止并等待复位 |
运算类指令
运算类指令不需要存储器操作。这类指令用到3个操作数srcA,srcB和dest。srcA和dest分别代表寄存器地址SRCA和DEST,srcB根据opcode的定义,分别可以表示寄存器REG或者一个14位的常数立即数。
所以可以进行两个寄存器之间的运算(格式F5),也可以进行立即数与寄存器之间的操作(格式F6),最后还可以单独进行立即数操作(格式F7)。
处理器运算中的负数是用2的补码表示的。对于立即数,最高位将根据常数的符号位补齐32位。
逻辑运算对32位操作数是按位执行的。移位操作和循环移位执行时,数据移位的位数由寄存器SRCB中的值给出。
除了LDH指令,所有的运算类指令都可以使用带.F参数。如果指令带这个参数,运算结果的标志位将会保存进标志寄存器中,供后续的跳转指令使用。
标志位 |
名称 |
计算 |
带.F参数的运算类指令 |
N |
负 |
dest[31] |
所有指令 |
Z |
零 |
~(|dest[31,0]) |
所有指令 |
C |
进位 |
dest[32]
~dest[32] srcA[srcB-1] 0 未定义 |
ADD,ADDC,LSL
SUB,SUBC LSR ,ASR ,ROT ,if srcB>0 LSR ,ASR ,ROT ,if srcB=0 其他指令 |
V |
溢出 |
Carry[32]~Carry[31]
未定义 |
ADD,ADDC,SUB,SUBC
其他指令 |
助记符 |
名称 |
格式 |
说明 |
ADD
ADDC SUB SUBC |
加
带进位位加 减 带借位位减 |
F5,6
F5,6 F5,6 F5,6 |
dest ? srcA + srcB
dest ? srcA + srcB + C dest ? srcA – srcB dest ? srcA – srcB – C |
AND
OR XOR |
与
或 异或 |
F5,6
F5,6 F5,6 |
dest ? srcA & srcB
dest ? srcA | srcB dest ? srcA ^ srcB |
LSL
LSR ASR ROT |
逻辑左移
逻辑右移 算术右移 循环移位 |
F5,6
F5,6 F5,6 F5,6 |
dest ? srcA << srcB
dest ? srcA >> srcB dest ? srcA >> srcB 最高位扩展符号位 dest ? srcA >>> srcB |
XXX.F |
.F参数 |
对于上面的所有指令,标志位根据目的寄存器的值设定标志位 |
|
LDH |
高位装载 |
F7 |
dest?{Immediate19,0…0}目的寄存器最高位由Immediate19替换 |
特殊类指令
特殊类指令完成特殊寄存器与通用寄存器中数据的交换功能。对于特殊寄存器的读写权限根据内核/用户模式信号确定。
助记符 |
名称 |
格式 |
说明 |
LRFS
SRIS CLC |
从特殊寄存器进行装载
保存寄存器数据到特殊寄存器 清除Cache |
F8
F9 F11 |
rC?sA rC通用寄存器,sA特殊寄存器
sC?rB sC特殊寄存器,rB通用寄存器 清除Cache |
在处理器模式KERNEL_MODE下,13个特殊寄存器均可读可写。在用户模式USER_MODE下,特殊寄存器PC、RPC以及LPC可以进行读和写,但是状态寄存器SR只能进行读操作,只有最后几位SR[3:0]可以进行写操作,对其他位的写操作无效。对禁止读/写的寄存器进行操作将会导致一个异常中断PRIVILEGE_VIOLATION。还有使用不带操作数的指令格式F11的控制指令CLC。
综合指令
助记符 |
名称 |
实现 |
CLR
NEG NOP NOT JMP RET |
清除
求负数 无操作 按位求反 跳转 子程序返回 |
XOR Rd,R0,R0
SUB Rd,R0,Rd XOR R0,R0,R0 XOR Rd,Ra,-1 SRIS PC,Rb SRIS PC,Rb |
原文地址:https://www.cnblogs.com/1mpanda/p/8350489.html