LEEF指令字长为32位;主要分为LD/ST、CTR、ALU、Special四类;LEEF处理器包含32个通用寄存器
LEEF指令格式
A)访存和寻址指令
F1: 寄存器寻址
Opcode
|
RC
|
RA
|
|
RB
|
F2: 偏移量间接寻址
Opcode
|
RC
|
RA
|
offset14
|
F3: 绝对寻址
Opcode
|
Address30
|
F4: PC间接偏移寻址
Opcode
|
cc
|
Offset19
|
B)无访存操作的指令
F5: 寄存器操作
Opcode
|
DEST
|
SRCA
|
|
SRCB
|
F6: 寄存器与立即数操作
Opcode
|
DEST
|
SRCA
|
imm14
|
F7: 立即数操作
Opcode
|
DEST
|
Imm19
|
F8: 特殊寄存器操作
Opcode
|
RC
|
SA
|
|
F9: 特殊寄存器操作
Opcode
|
RC
|
|
|
F10: 多种其他操作
Opcode
|
|
Imm4
|
F11: 多种其他操作
Opcode
|
|
ALU算术逻辑运算指令
ALU指令不需要存储器操作,这类指令用到3个操作数DEST、SRCA、SRCB或者DEST、SRCA、Imm14。即采用格式F5和F6。
另外,对于高位装载指令LDH,采用F7格式。
说明:
1) 14位立即数的高位用符号位Imm[13]补齐
2) 除了LDH指令外,所有ALU指令都可以使用.F参数。如果使用这个参数,计算结果的标志位会保存到标志寄存器。
表1. 带.F参数ALU指令的标志位的计算
标志位
|
名称
|
计算
|
指令分类
|
N
|
负
|
dest[31]
|
所有ALU指令
|
Z
|
零
|
~(|dest[31:0])
|
所有ALU指令
|
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
|
溢出
|
dest[32]^dest[31]
0
|
ADD,ADDC,SUB,SUBC
其他
|
表2 ALU指令说明
助记符
|
名称
|
格式
|
说明
|
ADD
ADDC
SUB
SUBC
|
加
带进位加
减
带进位减
|
F5、F6
F5、F6
F5、F6
F5、F6
|
dest
<- srcA + srcB
dest
<- srcA + srcB + C
dest
<- srcA - srcB
dest
<- srcA + srcB - C
|
AND
OR
XOR
|
与
或
异或
|
F5、F6
F5、F6
F5、F6
|
dest
<- srcA& srcB
dest
<- srcA | srcB
dest
<- srcA ^ srcB
|
LSL
LSR
ASR
ROT
|
逻辑左移
逻辑右移
算术右移
循环移动
|
F5、F6
F5、F6
F5、F6
F5、F6
|
dest
<- srcA << srcB
dest
<- srcA >> srcB
dest
<- srcA >> srcB 高位符号扩展
dest
<- srcA >>> srcB
|
XXX.F
|
.F参数
|
F5、F6
|
|
LDH
|
高位装载
|
F7
|
dest
ß{Imm19,0…0}目的寄存器高位由Imm19替换
|
MAC存储器访问指令
LD/ST指令需要存储器操作,这类指令用到3个操作数rC、rA、rB或者rC、rA、offset14。即采用格式F1和F2。
存储器除了要访问32位字外还要能访问4个8位字节、2个16位半字,但是,为了提高效率,对地址值仅保存不带最低两位的地址值,只在需要的时候扩展上去。
表3. MAC指令说明
助记符
|
名称
|
格式
|
说明
|
LDU
LDU.D
LDU.B
|
装载无符号字
装载无符号半字
装载无符号字节
|
F1、F2
F1、F2
F1、F2
|
rC <- MEM[rA + rB]
|
LDS
LDS.D
LDS.B
|
装载有符号字
装载有符号半字
装载有符号字节
|
F1、F2
F1、F2
F1、F2
|
rC
<-MEM[rA + rB]
高位扩展符号位
|
ST
ST.D
ST.B
|
存储字
存储半字
存储字节
|
F1、F2
F1、F2
F1、F2
|
rC ->MEM[rA + rB]
|
SWP
|
交换字
|
F1、F2
|
rC
<--> MEM[rA + rB]
|