RISC处理器设计(二)------指令集的设计

定义指令字长为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

时间: 2024-07-30 07:46:08

RISC处理器设计(二)------指令集的设计的相关文章

RISC处理器设计(一)------体系结构的选择

RISC处理器指令和变量数目非常少但结构复杂,因此RISC处理器可实现更高的并行性.本文设计的RISC处理机的特点如下: (1)指令简单且数量较少 通过对程序的静态指令进行静态分析,最终只将最常见的指令在RISC处理器中实现,其他指令由编译器综合实现.要实现这一特性以及减少诸如数据相关或程序跳转引起的流水线冲突较少,主要依赖于合适的编译器和特殊硬件来实现.指令集的简单也带来了相对简单的指令传送机制,可以减少对存储器进行指令的读和写操作. (2)格式固定而且指令长度简短 简单指令基本上字长是固定的

RISC处理器设计(七)------Cache和寄存器堆的选择

1.通用指令Cache MPC 因为访存类指令占据了存储器的接口,阻止了新的指令进入处理器.因此在冯诺依曼体系结构下,单存储器接口会产生冲突问题. 在RIB模式下(精简指令缓冲器),只保存在访存类指令执行时需要从存储器中取出的指令,将其存入Cache中. 通过这种方法,访存类指令执行的开销可以在Cache命中的情况下减少到一个半周期以内. MPC包含16项,每一项包含两个部分.每一个部分中保存一条指令.还有一个TAG区域保留,作为地址和处理器模式的标识位(KERNEL_MODE或USER_MOD

justinmind夜话:数据母板系列视频教程之原型设计二十一条军规

案例描述:使用数据母板实现原型设计二十一条军规 知识点: 数据母板 效果图: 本站在线效果预览:(原型文件) 原型下载地址:数据母板原型设计二十一条军规 .vp  数据母板原型设计二十一条军规.html 在线视频: 实现步骤:

软件UI设计二

接上篇博客 UI设计一 二.如何设计UI--大道至简 如何设计UI,四个字足矣:大道至简. 2.1 原则 1.搜索--模糊到极致 这不是我说的,是老师说的,是百度说的,是谷歌说的,看证据就在这里: 一个搜索框,解决所有问题.看看我们是怎么设计的:  一个查询页面有两个以上的查询条件,让用户去填写,美其名曰是"精确查询"其实,是我们设计人员错了,这样方便的不是用户,而是我们开发人员,方便了我们编程,并没有方便用户,用户要是知道那么精确,就不必使用系统了,就是用户不清楚,我们要做到,在用户

【闲聊产品】之二:交互设计还得自己来

移动互联网行业发展到今天,单从技术的地位上来看,核心的软件技术还是被Google.Apple.微软这些巨头掌握着,比如windows.iOS源码,始终会作为一个操作系统的门槛不会被公开,而这些系统平台下衍生的SDK和开发工具却是这些巨头们极力推广的对象. 所以对于大部分不是以技术作为核心竞争力的互联网公司来说,他们其实是在这些巨头们订下的技术标准和自己公司业务做一个整合从而实现成长,因此单从技术的角度来讲,技术固然重要,但已经不是最大的瓶颈了. 如今只要一个技术人员愿意花时间钻研,可供你进步的资

ASP.NET MVC +EasyUI 权限设计(二)环境搭建

请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问common.cnblogs.com这个域名,一直出现"Aborted",非常的郁闷. 页面就是这样子的,不知道为什么,难道是不是我的3个终端有问题吧,还是园子的服务器有问题呢?还是路由器的问题呢?到现在这个问题还没解决,郁闷死了!弄得心情非常的不爽. 好吧,不在说这个问题了,开始我们的正

游戏UI框架设计(二) : 最简版本设计

最简版本设计 --最简版本设计 为降低难度决定先讲解一个最简版本,阐述UI框架的核心设计理念.这里先定义三个核心功能: 1:UI窗体的自动加载功能. 2:缓存UI窗体. 3:窗体生命周期(状态)管理. UI框架设计主要目的,就是尽可能的完成一些与具体游戏功能逻辑无关的一些底层事务性的功能实现.这些功能最好是自动或者是半自动的实现,无须客户程序(调用框架的程序)过多处理与关心. 对于以上功能,笔者定义了UI框架的相关四个核心类: BaseUIForms    基础UI窗体脚本(父类,其他窗体都继承

程矢Axure夜话:中继器系列视频教程之中继器原型设计二十一条军规

程矢Axure夜话:中继器系列视频教程之中继器原型设计二十一条军规 案例描述:中继器实现原型设计二十一条军规 知识点: 中继器分页 效果图: 在线效果预览: AxShare在线效果预览: 原型下载地址:中继器原型设计二十一条军规 .rp 在线视频: 实现步骤: 更新中-..

iOS数据持久化之二——归档与设计可存储化的数据模型基类

iOS数据持久化之二--归档与设计可存储化的数据模型基类 一.引言 在上一篇博客中,我们介绍了用plist文件进行数据持久化的方法.虽然简单易用,但随着开发的深入,你会发现,这种方式还是有很大的局限性.试想,如果我们可以将用户的登录返回信息模型,游戏中角色的属性信息模型进行直接的持久化存取,那是不是非常爽的事,幸运的是,我们可以通过归档,来设计一个这样的数据模型. 二.先来精通归档吧 归档也是iOS提供给开发者的一种数据存储的方式,事实上,几乎所有的数据类型都可以通过归档来进行存取.其存储与读取