跳到主要内容

中央处理器(CPU) R3000A

半个水果的头像

半个水果

Little-data

网站创建者/文档维护者

Pinocchio的头像

Pinocchio

整理

pinokio@163.com的头像

pinokio@163.com

翻译

PSX采用的R3000A芯片有些小变动,由MIPS变成LSI,它是一个32位的缩减指令集控制器(RISC)处理器,主频是33.8688MHz,每秒钟能处理3千万条指令。它有4KB的指令缓存、1KB的数据缓存和传输率为132MB/秒的总线,内含一个算术/逻辑运算器(ALU)和一个移位器,但缺少一个浮点运算器(FPU)。在R3000A里,一个字是32位,半字是16位,字节是8位的。PSX里有2个协处理器Cop,Cop0是系统控制器,Cop1是图形处理器(GPU)。

指令缓存

(4KB缓存的管道尺寸为16字节)。可以获得80%左右的命中率,缓存是物理寻址和标识的。

数据缓存

(1KB缓存的管道尺寸为4字节)。也可以获得80%左右的命中率,也是物理寻址和标识的。这是写通缓存,可以保持缓存内容和主存内容一致,为了减少写数据时CPU的停顿,总线接口单元用了一个4深度的写缓冲器以CPU的速度来捕获地址和数据,允许用较慢的速度来写入主存而不影响CPU。

通用寄存器

R3000A使用32个32位的寄存器,一个32位的指令指针,两个32位的乘除寄存器,见下表:

寄存器号码名字用法
R0ZR常量 0
R1AT为汇编程序保留
R2-R3V0-V1计算结果和表达式赋值
R4-R7A0-A3自变量
R8-R15T0-T7临时变量
R16-R23S0-S7全局变量
R24-R25T8-T9额外的临时变量
R26-R27K0-K1为操作系统核心保留
R28GP全局指针
R29SP栈指针
R30FP页面指针
R31RA返回地址

乘除结果寄存器和指令指针

名字描述
HI乘法运算64位结果的高32位,或除法运算的余数
LO乘法运算64位结果的低32位,或除法运算的商
PC指令指针

尽管每个寄存器都有自己的名字,但它们都是一样的,除了2个:R0(ZR)是由硬件指定永远为0的;R31(RA)用于Link或Jump到子程序时保存返回地址,它可以象普通寄存器那样被其他指令读写。

R3000A指令集

指令编码是基于MIPS结构的,这表示了有三种类型指令编码:

I类型(Immediate立即)

oprsrtimmediate

J类型(Jump跳转)

optarget

R类型(Register寄存器)

oprsrtrdshamtfunct

其中:

名称描述
op6位的操作码
rs5位的源寄存器指示器
rt5位的目标寄存器或者跳转条件
immediate16位的立即数,或者跳转或者替换地址
target26位跳转目标地址
rcl5位目标寄存器指示器
shamt5位的移位总数
funct6位的函数段

R3000A指令可以分为下面几个基本组:

装入/储存指令:在内存和通用寄存器之间移动数据,是I类型指令。唯一的寻址模式是寄存器+带符号立即数偏移寻址,这使得可以直接使用3种不同的寻址模式:寄存器+偏移、寄存器直接和立即数。

算术指令:对寄存器执行算术,逻辑和移位操作,当源操作数和结果都是通用寄存器时,是R类型;当源操作数中有一个是16位立即数时,是R类型指令。计算指令使用3个地址格式,所以操作不必影响到源寄存器的内容。

跳转和分支指令:改变程序的控制流。当跳转目标地址是联合一个26位立即数和4位指令指针得到的页面绝对地址,是J类型指令,用于调用子程序;当目标地址是通用寄存器中的32位值时,是R类型,通常用来返回和快速结束;分支指令是I类型,目标地址是指令指针+16位偏移。跳转和链接指令在寄存器R31保存一个返回地址,通常用于调用子程序,子程序的返回地址就存在R31。

协处理器指令:执行协处理器集的操作。协处理器的装入和储存总是I类型;协处理器操作性指令是依赖于协处理器的格式。在R3000A中,系统控制协处理器(cop0)包含了内存管理和异常处理的寄存器。

特殊指令:执行多种任务,包括在特殊和通用寄存器之间移动数据、系统调用和断点操作,总是R类型的。

指令集

下面的表是R3000A的汇编指令。

装入和储存指令

指令格式和描述
Load ByteLB rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
寻址字节符号扩展后装到rt
Load Byte UnsignedLBU rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
寻址字节0扩展后装到rt
Load HalfwordLH rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
寻址半字符号扩展后装到rt
Load Halfword UnsignedLHU rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
寻址半字0扩展后装到rt
Load WordLW rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
寻址字装到rt
Load Word LeftLWL rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
寻址字左移位,使得寻址字节是字的左字节,然后合并到rt寄存器
Load Word RightLWR rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
寻址字右移位,使得寻址字节是字的右字节,然后合并到rt寄存器
Store ByteSB rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
储存rt寄存器的最低有效字节到寻址位置
Store HalfwordSH rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
储存rt寄存器的最低有效半字到寻址位置
Store WordSW rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
储存rt寄存器的最低有效字到寻址位置
Store Word LeftSWL rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
rt寄存器右移位,然后储存到寻址字节
Store Word RightSWR rt, offset (base)
符号扩展16位偏移+寄存器中的基址寻址
rt寄存器左移位,然后储存到寻址字节

算术指令

ALU立即指令

指令格式和描述
ADD ImmediateADDI rt, rs, immediate
寄存器rs加16位符号扩展数到寄存器rt。2补数溢出自陷
ADD Immediate UnsignedADDIU rt, rs, immediate
寄存器rs加16位符号扩展数到寄存器rt。溢出不自陷
Set on Less Than ImmediateSLTI rt, rs, immediate
比较16位符号扩展立即数和带符号32位整数rs,如果rs小于立即数,rt是1,否则是0
Set on Less Than Unsigned ImmediateSLTIU rt, rs, immediate
比较16位符号扩展立即数和无符号32位整数rs,如果rs小于立即数,rt是1,否则是0。溢出不自陷
AND ImmediateANDI rt, rs, immediate
0扩展16位立即数‘与’寄存器rs到寄存器rt
OR ImmediateORI rt, rs, immediate
0扩展16位立即数‘或’寄存器rs到寄存器rt
Exclusive OR ImmediateXORI rt, rs, immediate
0扩展16位立即数‘异或’寄存器rs到寄存器rt
Load Upper ImmediateLUI rt, immediate
16位立即数左移16位。设置字的最低有效16位为0,结果存到rt

3操作数R类型指令

指令格式和描述
AddADD rd, rs, rt
寄存器rs+rt,32位结果存到寄存器rd
2的补数溢出自陷
ADD UnsignedADDU rd, rs, rt
寄存器rs+rt,32位结果存到寄存器rd
不自陷
SubtractSUB rd, rs, rt
寄存器rs-rt,32位结果存到寄存器rd
2的补数溢出自陷
Subtract UnsignedSUBU rd, rs, rt
寄存器rs-rt,32位结果存到寄存器rd
不自陷
Set on Less ThanSLT rd, rs, rt
比较寄存器rs和rt(32位带符号整数),如果rs小于rt,rd=1,否则rt=0
Set on Less Than UnsignedSLTU rd, rs, rt
比较寄存器rs和rt(32位无符号整数),如果rs小于rt,rd=1,否则rt=0
ANDAND rd, rs, rt
rs‘与’rt,结果存到rd
OROR rd, rs, rt
rs‘或’rt,结果存到rd
Exclusive ORXOR rd, rs, rt
rs‘异或’rt,结果存到rd
NORNOR rd, rs, rt
rs‘或非’rt,结果存到rd

移位操作指令

指令格式和描述
Shift Left LogicalSLL rd, rt, shamt
寄存器rt左移shamt位,低位补0,32位结果存在rd
Shift Right LogicalSRL rd, rt, shamt
寄存器rt右移shamt位,高位补0,32位结果存在rd
Shift Right ArithmeticSRA rd, rt, shamt
寄存器rt左移shamt位,符号扩展高位,32位结果存在rd
Shift Left Logical VariableSLLV rd, rt, rs
寄存器rt左移,移位数是寄存器rs的低5位,低位补0,32位结果存在rd
Shift Right Logical VariableSRLV rd, rt, rs
寄存器rt右移,移位数是寄存器rs的低5位,高位补0,32位结果存在rd
Shift Right Arithmetic VariableSRAV rd, rt, rs
寄存器rt左移,移位数是寄存器rs的低5位,符号扩展高位,32位结果存在rd

乘除运算指令

指令格式和描述
MultiplyMULT rs, rt
寄存器rs和rt作为2的补数相乘,64位结果存在寄存器HI/LO
Multiply UnsignedMULTU rs, rt
寄存器rs和rt作为无符号数相乘,64位结果存在寄存器HI/LO
DivideDIV rs, rt
寄存器rs和rt作为2的补数相除,32位商存在寄存器LO,32位余数存在寄存器HI
Divide UnsignedDIVU rs, rt
寄存器rs和rt作为无符号数相除,32位商存在寄存器LO,32位余数存在寄存器HI
Move From HIMFHI rd
移动寄存器HI的值到rd
Move From LOMFLO rd
移动寄存器LO的值到rd
Move To HIMTHI rd
移动寄存器rd的值到HI
Move To LOMTLO rd
移动寄存器rd的值到LO

跳转和转移指令

跳转指令

指令格式和描述
JumpJ target
左移26位target地址,加上PC的高4位,1个指令延时后跳转。
Jump and LinkJAL target
左移26位target地址,加上PC的高4位,1个指令延时后跳转。下一个指令地址放到r31(链接寄存器)
Jump RegisterJR rs
跳转到寄存器rs中的地址,1个指令延时
Jump and Link RegisterJALR rs, rd
跳转到寄存器rs中的地址,1个指令延时。下一个指令地址放到r31(链接寄存器)

分支指令

指令格式和描述
.分支目标:
所有分支指令目标地址是这样计算的:指令地址加上16位偏移地址(左移2位后扩展符号到32位),全部的分支都是1个指令延时。
Branch on EqualBEQ rs, rt, offset
如果rs等于rt,转移到目标地址
Branch on Not EqualBNE rs, rt, offset
如果rs不等于rt,转移到目标地址
Branch on Less than or Equal ZeroBLEZ rs, offset
如果rs小于等于0,转移到目标地址
Branch on Greater Than ZeroBGTZ rs, offset
如果rs大于0,转移到目标地址
Branch on Less Than ZeroBLTZ rs, offset
如果rs小于0,转移到目标地址
Branch on Greater than or Equal ZeroBGEZ rs, offset
如果rs大于等于0,转移到目标地址
Branch on Less Than Zero And LinkBLTZAL rs, offset
如果rs小于0,转移到目标地址。下一个指令地址存到r31
Branch on greater than or Equal Zero And LinkBGEZAL rs, offset
如果rs大于等于0,转移到目标地址。下一个指令地址存到r31

特殊指令

指令格式和描述
System CallSYSCALL
初始化系统调用自陷,立刻转移控制到异常处理
BreakpointBREAK
初始化断点自陷,立刻转移控制到异常处理

协处理器指令

指令格式和描述
Load Word to Co-processorLWCz rt, offset (base)
16位符号扩展偏移+基址寻址
寻址字装到z协处理器单元的寄存器rt
Store Word from Co-processorSWCz rt, offset (base)
16位符号扩展偏移+基址寻址
z协处理器单元的寄存器rt存到内存寻址字
Move To Co-processorMTCz rt, rd
移动CPU寄存器rt到z协处理器单元的寄存器rd
Move from Co-processorMFCz rt,rd
移动z协处理器单元的寄存器rd到CPU寄存器rt
Move Control To Co-processorCTCz rt,rd
移动CPU寄存器rt到z协处理器单元的控制寄存器rd
Move Control From Co-processorCFCz rt,rd
移动z协处理器单元的控制寄存器rd到CPU寄存器rt
Move Control To Co-processorCOPz cofun
协处理器z进行一个操作,R3000A的状态不会被协处理器改变

系统控制协处理器(COP0)指令

指令格式和描述
Move To CP0MTC0 rt, rd
储存CPU寄存器rt到CP0寄存器rd。这个命令跟在普通储存操作之后。
Move From CP0MFC0 rt, rd
装载CP0寄存器rd到CPU寄存器rt
Read Indexed TLB EntryTLBR
装载Index寄存器指定的TLB条目到EntryHi和EntryLo寄存器
Write Indexed TLB EntryTLBWI
装载EntryHi和EntryLo寄存器到Index寄存器指定的TLB条目
Write Random TLB EntryTLBWR
装载EntryHi和EntryLo寄存器到Random寄存器指定的TLB条目
Probe TLB for Matching EntryTLBP
装载和EntryHi和EntryLo匹配的TLB条目地址到Index寄存器,如果没有TLB条目匹配,设置Index寄存器的高顺序位
Restore From ExceptionRFE
恢复前一个中断掩码和状态寄存器的模式位到当前状态位,恢复旧的状态位到前一个状态位。

R3000A操作码编码

下面是MIPS结构的操作码编码

操作码

28...26
38…2901234567
0SPECIALBCONDJJALBEQBNEBLEZBGTZ
1ADDIADDIUSLTISLTIUANDIORIXORILUI
2COP0COP1COP2COP3
3
4LBLHLWLLWLBULHULWR
5SBSHSWLSWSWR
6LWC0LWC1LWC2LWC3
7SWC0SWC1SWC2SWC3

特殊

2…0
5…301234567
0SLLSRLSRASLLVSRLVSRAV
1JRJALRSYSCALLBREAK
2MFHIMTHIMFLOMTLO
3MULTMULTUDIVDIVU
4ADDADDUSUBSUBUANDORXORNOR
5SLTSLTU
6
7

条件跳转

8…16
20…1901234567
0BLTZBGEZ
1
2BLTZALBGEZAL

协处理器z

23…21
25…2401234567
0MFCFMTCT
1BC

协处理器特殊操作

协处理器0(COP0)

2…0
4…301234567
0TLBRTLBWITLBWR
1TLBP
2RFE
3