指令集清单(V2 编码定案)
状态:已编码。全功能指令清单,全部指令已按 指令编码.md 的
RISC-V 式格式(前缀长度组 + op + func + fmt)分配编码。
状态列:核心 = v1 实现;扩展 = v1 后实现;预留 = 仅留编码/未来。
编码规则摘要(详见指令编码.md)
- 字节 0 = 长度前缀 + 形态分区 + 主操作码:
11/10+op:6(4B)、011/010 xxx+op:2(8B)、0010/0011+op:4(16B)、0001+op:4(32B)
- 字节 1 =
[func:4 | 空:4](空位待全部编码后定)
- 形态由前缀分区表达(fmt 位段已取消,零查表):
11=RR、10=NONE、011=RRR、010 000/001/010/011/100/101=IMM/SLOT/JMP/JC/CALL/CAL、0010=SLOT+off、0011=IMM64
- func(语义随 op):0..7 = 宽度×符号(1B无/1B有/2B无/2B有/4B无/4B有/8B无/8B有)、8=F32、9=F64、
—=无类型(编码 0 保留)
- disasm 按 func 显示类型后缀(A7 定案):func=3 →
LOAD.I16 r5, s3
- 无类型指令(跳转/调用/RET/NOP/CAL)func 编码为 0(不使用)
- 010 区 8 条(LOADK/LOAD/STORE/JMP/JT/JF/CALL/CAL)形态由前缀分区直推:见指令编码.md §5
1. 前缀分区与字段位号
1.1 通用头部(字节 0 + 字节 1,所有指令相同)
| 字段 |
位号 |
说明 |
| 长度前缀+形态分区 |
4B: bit7..6(11=RR / 10=NONE);8B: bit7..5(011=RRR / 010=其他 6 形态分区:bit4..2 形态位 + bit1..0 子 op);16B: bit7..4(0010=SLOT+off / 0011=IMM64);32B: bit7..4(0001=预留) |
长度与形态分区一体 |
| opcode |
4B: bit5..0 / 8B: bit4..0 / 16B: bit3..0 / 32B: bit3..0 |
分区内独立编号(0 起) |
| func |
bit15..12 |
功能细节(宽度×符号/浮点),语义随 op |
| (空) |
bit11..8 |
待全部指令编码完后决定用途 |
1.2 形态分区总表(操作数区 = bit16 起;pad = 对齐填充,编码固定 0)
| 前缀 |
形态 |
长度组 |
操作数区字段位号 |
识别方式 |
11 |
RR |
4B |
rd=23..16、rs=31..24 |
前缀直推 |
10 |
NONE |
4B |
pad=31..16 |
前缀直推 |
011 |
RRR |
8B |
rd=23..16、rs1=31..24、rs2=39..32、pad=63..40 |
前缀直推 |
010 000 |
IMM |
8B |
rd=23..16、imm32=55..24、pad=63..56 |
前缀直推 |
010 001 |
SLOT |
8B |
rd=23..16、slot32=55..24、pad=63..56 |
前缀直推 |
010 010 |
JMP |
8B |
off32=47..16、pad=63..48 |
前缀直推 |
010 011 |
JC |
8B |
rd=23..16、off32=55..24、pad=63..56 |
前缀直推 |
010 100 |
CALL |
8B |
fn_id32=47..16、pad=63..48 |
前缀直推 |
010 101 |
CAL |
8B |
fb_id16=31..16、slot32=63..32 |
前缀直推 |
0010 |
SLOT+off |
16B |
rd=23..16、slot32=55..24、off32=87..56、pad=127..88 |
前缀直推 |
0011 |
IMM64 |
16B |
rd=23..16、imm64=87..24、pad=127..88 |
前缀直推 |
0001 |
预留 |
32B |
操作数区 30B(bit 240..16),格式待定 |
— |
1.3 各位图(bit 从左(高)到右(低);小端字节序:字节 0 = bit0..7 在右端)
RR(前缀 11,4B = bit31..0)
NONE(前缀 10,4B = bit31..0)
RRR(前缀 011,8B = bit63..0)
010 区(8B = bit63..0):前缀 010 + 3 位形态位(bit4..2)+ 2 位子 op(bit1..0)——形态全部直推:
SLOT+off(前缀 0010,16B = bit127..0)
IMM64(前缀 0011,16B = bit127..0)
32B 预留(前缀 0001):操作数区 30B(bit 240..16),格式待实现时定稿。
2. 数据搬运
| 指令 |
组 |
字节0 编码 |
fmt |
func |
操作数 |
语义 |
状态 |
| MOVE |
4B |
11000000 |
RR |
宽度:0=1B/1=2B/2=4B/3=8B |
rd, rs |
寄存器搬运(只搬宽度,不管符号/浮点) |
核心 |
| LOAD |
8B |
01000100 |
SLOT |
全矩阵 0..9 |
rd, slot |
槽→寄存器(按 func 读宽+扩展) |
核心 |
| STORE |
8B |
01000101 |
SLOT |
全矩阵 0..9 |
slot, rs |
寄存器→槽(按 func 写宽) |
核心 |
| LOADK |
8B |
01000000 |
IMM |
全矩阵 0..9 |
rd, const_id |
常量表→寄存器(按 func 解释) |
核心 |
| LOAD_OFF |
16B |
00100000 |
SLOT+off |
全矩阵 0..9 |
rd, slot, off |
字段读(结构体/FB 共享体) |
核心 |
| STORE_OFF |
16B |
00100001 |
SLOT+off |
全矩阵 0..9 |
slot, off, rs |
字段写 |
核心 |
| LOADK64 |
16B |
00110000 |
IMM64 |
全矩阵 0..9 |
rd, imm64 |
64 位立即数内嵌(免查表) |
预留 |
3. 逻辑与位运算
| 指令 |
组 |
字节0 编码 |
fmt |
func |
操作数 |
语义 |
状态 |
| NOT |
4B |
11000001 |
RR |
无符号宽度 0/2/4/6 |
rd, rs |
BOOL 逻辑非 / 位串按位取反 |
核心 |
| AND |
8B |
01100110 |
RRR |
无符号宽度 0/2/4/6 |
rd, ra, rb |
按宽度逐位与(BOOL 由编译器保证 0/1) |
核心 |
| OR |
8B |
01100111 |
RRR |
无符号宽度 0/2/4/6 |
rd, ra, rb |
逐位或 |
核心 |
| XOR |
8B |
01101000 |
RRR |
无符号宽度 0/2/4/6 |
rd, ra, rb |
逐位异或 |
核心 |
| NAND |
8B |
01101001 |
RRR |
无符号宽度 0/2/4/6 |
rd, ra, rb |
逐位与非 |
扩展 |
| NOR |
8B |
01101010 |
RRR |
无符号宽度 0/2/4/6 |
rd, ra, rb |
逐位或非 |
扩展 |
| XNOR |
8B |
01101011 |
RRR |
无符号宽度 0/2/4/6 |
rd, ra, rb |
逐位同或 |
扩展 |
| SHL |
8B |
01101100 |
RRR |
无符号宽度 0/2/4/6 |
rd, rs, n |
左移(n 在 rb) |
扩展 |
| SHR |
8B |
01101101 |
RRR |
0..7(宽度×符号,算术/逻辑右移) |
rd, rs, n |
右移 |
扩展 |
| ROL |
8B |
01101110 |
RRR |
无符号宽度 0/2/4/6 |
rd, rs, n |
循环左移(位串) |
扩展 |
| ROR |
8B |
01101111 |
RRR |
无符号宽度 0/2/4/6 |
rd, rs, n |
循环右移 |
扩展 |
| GETBIT |
8B |
01110110 |
RRR |
— |
rd, rs, bit |
取位(bit 在 rb) |
扩展 |
| SETBIT |
8B |
01110111 |
RRR |
— |
rd, rs, bit |
置位 |
扩展 |
| CLRBIT |
8B |
01111000 |
RRR |
— |
rd, rs, bit |
清位 |
扩展 |
| TOGBIT |
8B |
01111001 |
RRR |
— |
rd, rs, bit |
翻转位 |
扩展 |
注:SETBIT/CLRBIT/TOGBIT 的"目标可槽"形式(slot, bit)后续可在 16B 组扩展(op 预留)。
4. 算术
| 指令 |
组 |
字节0 编码 |
fmt |
func |
操作数 |
语义 |
状态 |
| ADD |
8B |
01100000 |
RRR |
全矩阵 0..9 |
rd, ra, rb |
整数饱和 / 浮点 IEEE / 无符号 |
核心 |
| SUB |
8B |
01100001 |
RRR |
全矩阵 0..9 |
rd, ra, rb |
减 |
核心 |
| MUL |
8B |
01100010 |
RRR |
全矩阵 0..9 |
rd, ra, rb |
乘 |
核心 |
| DIV |
8B |
01100011 |
RRR |
全矩阵 0..9 |
rd, ra, rb |
除(整数零除/浮点 ±inf) |
核心 |
| MOD |
8B |
01100100 |
RRR |
0..7(整数) |
rd, ra, rb |
取模 |
扩展 |
| EXPT |
8B |
01100101 |
RRR |
0..9 |
rd, ra, rb |
幂 |
扩展 |
| NEG |
4B |
11000010 |
RR |
0..9 |
rd, rs |
取负 |
扩展 |
| ABS |
4B |
11000011 |
RR |
0..9 |
rd, rs |
绝对值 |
扩展 |
| INC |
4B |
11000100 |
RR |
0..9 |
rd, rs |
自增 |
扩展 |
| DEC |
4B |
11000101 |
RR |
0..9 |
rd, rs |
自减 |
扩展 |
| SQRT |
4B |
11000110 |
RR |
浮点 8/9 |
rd, rs |
平方根 |
扩展 |
| SIN |
4B |
11000111 |
RR |
浮点 8/9 |
rd, rs |
正弦 |
扩展 |
| COS |
4B |
11001000 |
RR |
浮点 8/9 |
rd, rs |
余弦 |
扩展 |
| TAN |
4B |
11001001 |
RR |
浮点 8/9 |
rd, rs |
正切 |
扩展 |
| ASIN |
4B |
11001010 |
RR |
浮点 8/9 |
rd, rs |
反正弦 |
扩展 |
| ACOS |
4B |
11001011 |
RR |
浮点 8/9 |
rd, rs |
反余弦 |
扩展 |
| ATAN |
4B |
11001100 |
RR |
浮点 8/9 |
rd, rs |
反正切 |
扩展 |
| LN |
4B |
11001101 |
RR |
浮点 8/9 |
rd, rs |
自然对数 |
扩展 |
| LOG |
4B |
11001110 |
RR |
浮点 8/9 |
rd, rs |
常用对数 |
扩展 |
| EXP |
4B |
11001111 |
RR |
浮点 8/9 |
rd, rs |
指数 |
扩展 |
| ROUND |
4B |
11010000 |
RR |
浮点 8/9 |
rd, rs |
四舍五入(浮点→整数) |
扩展 |
| TRUNC |
4B |
11010001 |
RR |
浮点 8/9 |
rd, rs |
截断 |
扩展 |
| FLOOR |
4B |
11010010 |
RR |
浮点 8/9 |
rd, rs |
向下取整 |
扩展 |
| CEIL |
4B |
11010011 |
RR |
浮点 8/9 |
rd, rs |
向上取整 |
扩展 |
5. 比较
| 指令 |
组 |
字节0 编码 |
fmt |
func |
操作数 |
语义 |
状态 |
| CMP_EQ |
8B |
01110000 |
RRR |
全矩阵 0..9 |
rd, ra, rb |
相等 |
核心 |
| CMP_NE |
8B |
01110001 |
RRR |
全矩阵 0..9 |
rd, ra, rb |
不等 |
核心 |
| CMP_LT |
8B |
01110010 |
RRR |
全矩阵 0..9 |
rd, ra, rb |
小于(无符号/浮点按 func) |
核心 |
| CMP_LE |
8B |
01110011 |
RRR |
全矩阵 0..9 |
rd, ra, rb |
小于等于 |
核心 |
| CMP_GT |
8B |
01110100 |
RRR |
全矩阵 0..9 |
rd, ra, rb |
大于 |
核心 |
| CMP_GE |
8B |
01110101 |
RRR |
全矩阵 0..9 |
rd, ra, rb |
大于等于 |
核心 |
6. 转换
| 指令 |
组 |
字节0 编码 |
fmt |
func |
操作数 |
语义 |
状态 |
| CONV |
4B |
11010100 |
RR |
目标类型 0..9 |
rd, rs |
类型转换(src 值已在寄存器,按目标 func 截断/扩展/舍入;舍入模式随目标为浮点→整数时取 TRUNC 语义) |
扩展 |
7. 控制流
| 指令 |
组 |
字节0 编码 |
fmt |
func |
操作数 |
语义 |
状态 |
| JMP |
8B |
01001000 |
JMP |
— |
off32 |
无条件跳转(相对下一条,字节) |
核心 |
| JT |
8B |
01001100 |
JC |
— |
rd, off |
rd≠0 跳转 |
核心 |
| JF |
8B |
01001101 |
JC |
— |
rd, off |
rd==0 跳转 |
核心 |
| CALL |
8B |
01010000 |
CALL |
— |
fn_id |
压帧调用(r0..r7 复制) |
核心 |
| RET |
4B |
10000001 |
NONE |
— |
— |
弹帧 / MAIN 周期结束 |
核心 |
| CAL |
8B |
01010100 |
CAL |
— |
fb_id, slot |
内建 FB 调用(fb_id 查 fb 表) |
核心 |
| JTBL |
32B |
00010000 |
预留 |
— |
rd, slot, n |
CASE 跳转表 |
预留 |
8. 内建 FB(CAL + fb_id,fb 表)
| fb_id |
FB |
字段(类型化) |
状态 |
| 0 |
TON |
in/pt/q/et = BOOL/TIME/BOOL/TIME |
核心 |
| 1 |
TOF |
同上 |
核心 |
| 2 |
TP |
同上 |
核心 |
| 3 |
CTU |
cu/r/pv(INT)/q/cv(INT) 单字 |
核心 |
| 4 |
DCTU |
cu/r/pv(DINT)/q/cv(DINT) 双字 |
核心 |
| 5 |
CTD |
cd/ld/pv(INT)/q/cv(INT) |
核心 |
| 6 |
DCTD |
cd/ld/pv(DINT)/q/cv(DINT) |
核心 |
| 7 |
CTUD |
cu/cd/r/lu/pv(INT)/qu/qd/cv(INT) |
核心 |
| 8 |
DCTUD |
cu/cd/r/lu/pv(DINT)/qu/qd/cv(DINT) |
核心 |
| 9 |
R_TRIG |
clk/q = BOOL/BOOL |
核心 |
| 10 |
F_TRIG |
clk/q = BOOL/BOOL |
核心 |
| 11 |
SR / RS |
s1/r/s/q… |
扩展 |
| 12 |
PWM |
in/pt/q… |
扩展 |
| 13 |
RTC |
日期时钟字段 |
扩展 |
9. 字符串(未来,元数据段 + 16/32B)
| 指令 |
组 |
字节0 编码 |
fmt |
语义 |
状态 |
| STR_LEN |
16B |
00100010 |
SLOT+off |
字符串长度 |
预留 |
| STR_CMP |
16B |
00100011 |
SLOT+off |
比较 |
预留 |
| STR_EQ |
16B |
00100100 |
SLOT+off |
相等 |
预留 |
| STR_MID |
16B |
00100101 |
SLOT+off |
取子串 |
预留 |
| STR_LEFT |
16B |
00100110 |
SLOT+off |
左侧子串 |
预留 |
| STR_RIGHT |
16B |
00100111 |
SLOT+off |
右侧子串 |
预留 |
| STR_CONCAT |
32B |
00010001 |
预留 |
拼接 |
预留 |
| STR_FIND |
32B |
00010010 |
预留 |
查找 |
预留 |
| STR_REPLACE |
32B |
00010011 |
预留 |
替换 |
预留 |
10. 数组(未来)
| 指令 |
组 |
字节0 编码 |
fmt |
语义 |
状态 |
| ARR_LEN |
16B |
00101001 |
SLOT+off |
数组长度 |
预留 |
| ARR_LOAD |
32B |
00010100 |
预留 |
索引读(基槽+index) |
预留 |
| ARR_STORE |
32B |
00010101 |
预留 |
索引写 |
预留 |
11. 系统
| 指令 |
组 |
字节0 编码 |
fmt |
func |
操作数 |
语义 |
状态 |
| NOP |
4B |
10000000 |
NONE |
— |
— |
空操作(占位/对齐) |
核心 |
12. op 预算核对(前缀分区按组分治)
| 前缀 |
分区 |
op 空间 |
已分配 |
指令 |
余量 |
11 |
RR |
64 |
21 |
MOVE/NOT/NEG/ABS/INC/DEC/浮点单目 10/舍入 4/CONV |
43 |
10 |
NONE |
64 |
2 |
NOP/RET |
62 |
011 |
RRR |
32 |
26 |
算术 6 + 逻辑 6 + 移位 4 + 位操作 4 + CMP 6 |
6 |
010 000..010 101 |
IMM/SLOT/JMP/JC/CALL/CAL |
6×4 |
8 |
LOADK(1)/LOAD·STORE(2)/JMP(1)/JT·JF(2)/CALL(1)/CAL(1) |
16(含 2 个预留形态区) |
0010 |
SLOT+off |
16 |
8 |
LOAD_OFF/STORE_OFF + 字符串 6 |
8 |
0011 |
IMM64 |
16 |
1 |
LOADK64 |
15 |
0001 |
预留 |
16 |
6 |
JTBL + STR_CONCAT/FIND/REPLACE + ARR_LOAD/STORE |
10 |
编码约定:op 按分区独立编号;无类型指令 func=0;010 区形态由前缀分区直推(指令编码.md §5);
字符串/数组的具体操作数形态在实现时定稿(0001 区)。