特点
- 具有五个指令子集,指令格式简单且长度统一;
- OpenRISC 基本指令集 (ORBIS32/64),具有 32 位宽的指令,在内存中以 32 位边界对齐,并对 32 位和 64 位数据进行操作;
- OpenRISC Vector/DSP eXtension (ORVDX64),带有 32 位宽指令,在内存中以 32 位边界对齐,并在 8、16、32 和 64 位数据上运行;
- OpenRISC 浮点扩展 (ORFPX32/64),具有 32 位宽指令,在内存中的 32 位边界上对齐,并在 32 位和 64 位数据上运行;
- OpenRISC 浮点扩展 (ORFPX64A32),具有 32 位宽指令,在内存中的 32 位边界上对齐,并通过配对 32 位寄存器在 32 位硬件上对 64 位数据进行操作;
- 为自定义指令保留的操作码。注:指令分为指令类。在 OpenRISC 1000 实现中只需要实现基本类。
指令子集
ORBIS32
- 32 位整数指令
- 基本 DSP 指令
- 32位加载和存储指令
- 程序流程指令
- 特别指令
ORBIS64
- 64位整数指令
- 64 位加载和存储指令
ORFPX32
- 单精度浮点指令
ORFPX64
- 双精度浮点指令
- 64 位加载和存储指令
ORFPX64A32
- 双精度浮点指令
- 使⽤32位通⽤寄存器对进⾏运算
ORVDX64
- 向量指令
- DSP指令
每个子集中的指令也根据实现重要性分为两个指令类: | class | Description |
---|---|---|
I | I 类中的指令必须始终执行 | |
II | II 类指令是可选的,实现可以根据目标应用程序的要求选择使用此类中的部分或全部指令。 |
3. 相关指令
l.movhi-立即数向高位移动
指令字段

指令格式
介绍
将 16 位立即数K进行零扩展,左移 16 位,然后放入通用寄存器 rD。
32位实现
rD[31:0] ← extz(Immediate) << 16
64位实现
rD[63:0] ← extz(Immediate) << 16
l.ori-按位或
指令字段

指令格式
介绍
立即数经过零扩展并与通用寄存器 rA 的内容在按位逻辑或运算中组合。结果放入通用寄存器 rD。
32/64位实现
rD[31:0] /rD[63:0]← rA[31:0] OR extz(Immediate)
l.mtspr-移至专用寄存器
指令字段

指令格式
介绍
通用寄存器 rB 的内容被移动到由通用寄存器 rA 的内容定义的特殊寄存器中,与立即数进行逻辑或运算。
32/64位实现
spr(rA OR Immediate) ← rB[31:0]
l.mfspr-移出专用寄存器
指令字段

指令格式
介绍
特殊寄存器的内容,由通用 rA 的内容与立即值进行逻辑或操作定义,被移入通用寄存器 rD。
32/64位实现
rD[31:0] ← spr(rA OR Immediate)
rD[63:0] ← spr(rA OR Immediate)
l.jr-跳转寄存器
指令字段

指令格式
介绍
通用寄存器rB的内容就是跳转的有效地址。程序无条件跳转到EA。如果未设置 CPUCFGR[ND],则跳转会延迟一条指令。
请注意,l.sys 不应放在跳转后的延迟槽中。
32/64位实现
PC ← rB
l.nop -无操作
指令字段

指令格式
介绍
该指令除了至少需要一个时钟周期才能完成外,什么都不做。它通常用于填充延迟槽间隙。立即值可用于模拟目的。
32/64位实现
l.or-或
指令字段

指令格式
介绍
通用寄存器 rA 的内容与通用寄存器 rB 的内容在按位逻辑或运算中组合。结果放入通用寄存器 rD。
32/64位实现
rD[31:0] ← rA[31:0] OR rB[31:0]
rD[63:0] ← rA[63:0] OR rB[63:0]
l.xor-异或
指令字段

指令格式
介绍
通用寄存器 rA 的内容与通用寄存器 rB 的内容在按位逻辑异或运算中组合。结果放入通用寄存器 rD。
32/64位实现
rD[31:0]/rD[63:0] ← rA[31:0] XOR rB[31:0]
l.addi-立即数加法
指令字段

指令格式
介绍
立即数经过符号扩展后与通用寄存器 rA 的内容相加形成结果。结果放入通用寄存器 rD。
该指令将在无符号溢出时设置进位标志,在有符号溢出时设置溢出标志。
32/64位实现
rD[31:0]/rD[63:0] ← rA[31:0] /rD[63:0]+ exts(Immediate)
SR[CY] ← carry (unsigned overflow)
SR[OV] ← signed overflow
l.rfe-从异常中返回
指令字段

指令格式
介绍
执行该指令会部分恢复处理器在异常发生之前的状态。该指令没有延迟槽。
32/64位实现
PC ← EPCR
SR ← ESR
l.jal-跳转链接
指令字段

指令格式
介绍
立即数左移两位,符号扩展到程序计数器宽度,然后添加到跳转指令的地址。结果是跳转的有效地址。程序无条件跳转到EA。如果未设置 CPUCFGR[ND],则跳转会延迟一条指令。延迟槽之后的指令地址放在链接寄存器 r9 中(参见第 354 页的寄存器使用)。
链接寄存器的值,如果作为延迟槽中的操作数读取,将是新值,而不是旧值。如果链接寄存器写入延迟槽,则写入的值将替换 l.jal 指令存储的值。
请注意,l.sys 不应放在跳转后的延迟槽中。
32/64位实现
PC ← exts(Immediate << 2) + JumpInsnAddr
LR ← CPUCFGR[ND] ? JumpInsnAddr + 4 : DelayInsnAddr + 4
l.jal是一个MIPS指令,它用于无条件跳转到一个指定的地址,并将下一条指令的地址保存到链接寄存器(ra)中。其语法如下:
l.jal target_address
其中,target_address是要跳转到的地址。在跳转之前,程序计数器(PC)会被保存到链接寄存器(ra)中,以便在跳转返回时能够返回到正确的地址。跳转后,PC将被设置为目标地址,程序将从该地址继续执行。
l.sw-存储单个字
指令字段

指令格式
介绍
偏移量被符号扩展并添加到通用寄存器 rA 的内容中。总和代表一个有效地址。通用寄存器 rB 的低 32 位存储到 EA 寻址的内存位置。
32/64位实现
EA ← exts(Immediate) + rA[31:0]/rA[63:0]
(EA)[31:0] ← rB[31:0]
l.lwz-加载单个字并用零扩展
指令字段

指令格式
介绍
偏移量被符号扩展并添加到通用寄存器 rA 的内容中。总和代表一个有效地址。内存中由 EA 寻址的单个字被加载到通用寄存器 rD 的低 32 位。通用寄存器 rD 的高位被替换为零。
32/64位实现
32:
EA ← exts(Immediate) + rA[31:0]
rD[31:0] ← (EA)[31:0]
64:
EA ← exts(Immediate) + rA[63:0]
rD[31:0] ← (EA)[31:0]
rD[63:32] ← 0
l.sfne-如果不相等则设置标志
指令字段

指令格式
介绍
比较通用寄存器 rA 和 rB 的内容。如果内容不相等,则设置比较标志;否则清除比较标志。
32/64位实现
SR[F] ← rA[31:0] != rB[31:0]
SR[F] ← rA[63:0] != rB[63:0]
l.bf-标志分支
指令字段

指令格式
介绍
立即值左移两位,符号扩展到程序计数器宽度,然后添加到分支指令的地址。结果是分支的有效地址。如果标志被设置,程序分支到 EA。如果未设置 CPUCFGR[ND],则分支会延迟一条指令发生。
32/64位实现
EA ← exts(Immediate << 2) + BranchInsnAddr
PC ← EA if SR[F] set
l.divu-除无符号
指令字段

指令格式
介绍
通用寄存器rA的内容除以通用寄存器rB的内容,结果放入通用寄存器rD。两个操作数都被视为无符号整数。如果结果不是整数,则应截断小数部分。
32/64位实现
rD[31:0] ← rA[31:0] / rB[31:0]
SR[CY] ← rB[31:0] == 0
rD[63:0] ← rA[63:0] / rB[63:0]
SR[CY] ← rB[63:0] == 0
l.sfnei-如果不等于立即设置标志
指令字段

指令格式
介绍
将通用寄存器 rA 的内容与符号扩展立即数进行比较。如果两个值不相等,则设置比较标志;否则清除比较标志。
32/64位实现
SR[F] ← rA[31:0] != exts(Immediate)
SR[F] ← rA[63:0] != exts(Immediate)
l.sfeqi-如果立即等于则设置标志
指令字段

指令格式
介绍
将通用寄存器 rA 的内容与符号扩展立即数进行比较。如果两个值相等,则设置比较标志;否则清除比较标志。
32/64位实现
SR[F] ← rA[31:0] == exts(Immediate)
SR[F] ← rA[63:0] == exts(Immediate)
l.bf-标志分支
指令字段

指令格式
介绍
立即数左移两位,符号扩展到程序计数器宽度,然后添加到分支指令的地址。结果是分支的有效地址。如果标志被设置,程序分支到 EA。如果未设置 CPUCFGR[ND],则分支会延迟一条指令发生。
其中 label
是要跳转到的目标标签,它通常是一个程序中定义的标签(例如 test_ok
或 test_fail
)。如果指令执行时条件成立(即条件码满足跳转条件),则程序跳转到 label
标签处执行,否则继续顺序执行后面的指令。
条件码是由之前执行的指令所设置的标志位组成的,例如比较指令 l.sfeq
可以设置等于标志位,然后 l.bf
指令可以根据等于标志位来判断是否跳转。需要注意的是,l.bf
指令本身并不会修改条件码,它只是使用条件码来判断是否跳转。
需要特别注意的是,l.bf
指令有延迟槽(delay slot)的概念。在跳转之前,指令的下一条指令也会被执行一次,然后才会跳转到目标标签处执行。因此,在编写代码时要考虑到延迟槽的影响,避免出现逻辑错误。
32/64位实现
EA ← exts(Immediate << 2) + BranchInsnAddr
PC ← EA if SR[F] set
EA ← exts(Immediate << 2) + BranchInsnAddr
PC ← EA if SR[F] set s
l.sb-存储字节
指令字段

指令格式
介绍
偏移量被符号扩展并添加到通用寄存器 rA 的内容中。总和代表一个有效地址。通用寄存器 rB 的低 8 位存储到 EA 寻址的内存位置。
32/64位实现
EA ← exts(Immediate) + rA[31:0]
(EA)[7:0] ← rB[7:0]
EA ← exts(Immediate) + rA[63:0]
(EA)[7:0] ← rB[7:0]
l.sh-存储半字
指令字段

指令格式
介绍
偏移量被符号扩展并添加到通用寄存器 rA 的内容中。总和代表一个有效地址。通用寄存器 rB 的低 16 位存储到 EA 寻址的内存位置。
32/64位实现
EA ← exts(Immediate) + rA[31:0]
(EA)[15:0] ← rB[15:0]
EA ← exts(Immediate) + rA[63:0]
(EA)[15:0] ← rB[15:0]
l.lhz-加载半字并用零扩展
指令字段

指令格式
介绍
偏移量被符号扩展并添加到通用寄存器 rA 的内容中。总和代表一个有效地址。 EA 寻址的存储器中的半字被加载到通用寄存器 rD 的低 16 位。通用寄存器 rD 的高位被替换为零。
32/64位实现
EA ← exts(Immediate) + rA[31:0]
rD[15:0] ← (EA)[15:0]
rD[31:16] ← 0
EA ← exts(Immediate) + rA[63:0]
rD[15:0] ← (EA)[15:0]
rD[63:16] ← 0
l.andi-半字立即数按位与
指令字段

指令格式
介绍
立即值被零扩展并与通用寄存器 rA 的内容在按位逻辑与运算中组合。结果放入通用寄存器 rD。
32/64位实现
rD[31:0] ← rA[31:0] AND extz(Immediate)
rD[63:0] ← rA[63:0] AND extz(Immediate)