指令编码(V2:RISC-V 式 op + func)
状态:定案存档。本文独立存储 RISC-V 式指令编码设计(opcode 定功能、func 定细节),
与 指令集优化.md(格式/数据模型/待确认)配套。
定案日期:2026-08-24。
1. 设计原则(RISC-V 式)
- opcode 只决定指令的功能;func 决定功能的细节
- func 语义随 op 变:MOVE 的 func = 宽度;LOAD 的 func = 宽度×符号;ADD 的 func = 宽度×符号+浮点
2. 指令字结构(头两字节 + 操作数区)
2.1 字节 0:长度前缀 + 主操作码(前缀编码,UTF-8/RISC-V 式)
| 前缀(从最高位开始比对) |
指令长度 |
op 位宽 |
op 空间 |
1 |
4 字节 |
7 位 |
128 |
01 |
8 字节 |
6 位 |
64 |
001 |
16 字节 |
5 位 |
32 |
0001 |
32 字节(预留) |
4 位 |
16 |
- 长度自描述:前缀本身即长度,未来 64B 可续
00001(无限延伸)
- op 按组分治:各长度组的 opcode 独立编号(4B 的 MOVE=0 与 8B 的 LOAD=0 不冲突,前缀已区分)
- 取指:读字节 0 → 前缀判定长度 → 搬整条
2.2 字节 1:func + fmt(各 4 位)
3. func 位段(4 位,16 种)
| func |
语义 |
覆盖类型(编译期映射) |
| 0 |
1 字节、无符号 |
BOOL、BYTE、USINT |
| 1 |
1 字节、有符号 |
SINT |
| 2 |
2 字节、无符号 |
WORD、UINT |
| 3 |
2 字节、有符号 |
INT |
| 4 |
4 字节、无符号 |
DWORD、UDINT、DATE |
| 5 |
4 字节、有符号 |
DINT |
| 6 |
8 字节、无符号 |
LWORD、ULINT、DT、TOD |
| 7 |
8 字节、有符号 |
LINT、TIME |
| 8 |
F32 |
REAL |
| 9 |
F64 |
LREAL |
| 10..15 |
预留 |
|
- func 语义随 op:
- MOVE:只表达宽度(1/2/4/8B 搬运),不管符号/浮点
- LOAD/STORE:宽度×符号(读几字节 + 符号/零扩展)
- ADD/SUB/MUL/DIV:宽度×符号(整数饱和)+ F32/F64(浮点 IEEE)
- 逻辑(AND/OR/NOT/位运算):宽度(BOOL 情况由编译器保证 0/1 输入)
- 跳转/调用/CAL/无类型指令:func 不使用(保留 0)
- VM 只认 func(10 种数据语义),无类型概念;类型语义全在编译层
4. fmt 位段(4 位,9 种格式 + 7 预留)
| fmt |
形态 |
说明 |
| 0 |
RR |
rd, rs(MOVE/NOT/浮点单目) |
| 1 |
RRR |
rd, ra, rb(算术/比较/位运算) |
| 2 |
IMM |
rd, 32 位立即数(LOADK/CALL) |
| 3 |
SLOT |
rd, slot32(LOAD/STORE/CAL) |
| 4 |
JMP |
off32 |
| 5 |
JC |
rd, off(JT/JF) |
| 6 |
CALL |
fn_id(独立格式,未合并) |
| 7 |
CAL |
fb_id, slot(独立格式,未合并) |
| 8 |
NONE |
无操作数(RET/NOP) |
| 9..15 |
预留 |
|
- 格式不合并:fmt 4 位足够,CALL/CAL 保持独立格式(U1 闭合为"不合并")
5. 长度组 × 格式族(操作数区)
| 长度组 |
格式族 |
操作数区 |
| 4B |
NONE / RR |
rd + rs1(各 1B) |
| 8B |
RRR / IMM / SLOT / JMP / JC / CALL / CAL |
+ rs2 + slot32/fn_id32/const_id32/off32 |
| 16B |
SLOT+off(字段访问)/ IMM64 |
+ slot32 + off32/imm64 |
| 32B |
预留(JTBL/复杂字符串) |
— |
6. 类型系统(编译期)→ func 映射
- 编译期:19 种 IEC 基础类型(BOOL/BYTE/WORD/DWORD/LWORD/SINT/INT/DINT/LINT/USINT/UINT/UDINT/ULINT/TIME/REAL/LREAL/DATE/TOD/DT),类型检查严格比对——类型不匹配编译期报错,不进 VM
- BOOL 约束:编译器限制 BOOL 只能填 0/1(TRUE/FALSE),其他值编译期报错;VM 无 BOOL 特例
- 运行时:VM 只认 func 的 10 种"宽度+符号+浮点"组合,机械执行
- 位串(BYTE/WORD/…)与无符号整数同 func——运算语义由 op 区分(SHL 是位运算指令、ADD 是算术指令)
- TIME 用 8B 有符号 func(毫秒语义在编译层)
- 常量表:条目 8B 原始值(无 tag),LOADK 按 func 解释(A2 定案不变)
7. 与 RISC-V 的对照
|
RISC-V |
本方案 |
| 主功能 |
opcode[6:0] |
前缀 + op(按长度组分治) |
| 细节 |
funct3(3 位)/ funct7 |
func(4 位,10 组合) |
| 形态 |
rd/rs1/rs2/imm 固定位置 |
fmt(4 位,9 形态) |
| 宽度×符号 |
lb/lbu/lh/lhu/lw/lwu/ld |
func 0..9 全矩阵 |
| 指令长 |
定长 32 位(+RVC 压缩 16 位) |
变长 4/8/16/32B(前缀编码) |
8. 决策历史
- 用户提出 RISC-V 式:opcode 只决定功能,func 决定细节(例:MOVE 按 func 分搬运宽度)
- func 4 位(16 种)够用;10 组合实际使用
- MOVE 只搬宽度不管符号/浮点(例为示意,宽度按 func 全矩阵 1/2/4/8B)
- 19 类型 → 10 func 由编译器映射;类型检查严格,不匹配编译期报错
- BOOL 编译器强制 0/1,越界报错
- 字节 1 = [func:4 | fmt:4] → fmt 4 位 → 格式合并作废(CALL/CAL 独立格式)