diff --git a/Doc/isa/指令集清单.md b/Doc/isa/指令集清单.md index b9e18df..2590d98 100644 --- a/Doc/isa/指令集清单.md +++ b/Doc/isa/指令集清单.md @@ -1,76 +1,109 @@ -# 指令集清单(V2 草案) +# 指令集清单(V2 编码定案) -> 状态:**草案**。全功能目标下的完整指令清单,与 [`指令集优化.md`](指令集优化.md) 配套—— -> 该文定义指令**格式**(变长/位段/长度组),本文列出指令**清单**(名称/组/格式/操作数/状态)。 -> 组 = 长度组(前缀编码:`1`=4B、`01`=8B、`001`=16B、`0001`=32B);fmt = 操作数形态。 -> type 列:`有` = 用 type 位段(宽度/符号/浮点语义)、`无` = type=NONE、`dst` = type 位段为转换目标类型。 -> 操作数记法:rd=目标寄存器、rs/ra/rb=源寄存器、slot=槽号、off=字段偏移、const_id=常量表下标、fn_id=函数下标、fb_id=内建 FB id。 +> 状态:**已编码**。全功能指令清单,全部指令已按 [`指令编码.md`](指令编码.md) 的 +> RISC-V 式格式(前缀长度组 + op + func + fmt)分配编码。 +> 状态列:`核心` = v1 实现;`扩展` = v1 后实现;`预留` = 仅留编码/未来。 -**状态列**:`核心` = v1 实现;`扩展` = v1 后实现;`预留` = 仅留编码/未来。 +## 编码规则摘要(详见指令编码.md) + +- **字节 0** = 长度前缀 + 主操作码:`1`+op:7(4B)、`01`+op:6(8B)、`001`+op:5(16B)、`0001`+op:4(32B) +- **字节 1** = `[func:4 | fmt:4]` +- **func**(语义随 op):0..7 = 宽度×符号(1B无/1B有/2B无/2B有/4B无/4B有/8B无/8B有)、8=F32、9=F64、`—`=无类型(编码 0 保留) +- **fmt**:0=RR、1=RRR、2=IMM、3=SLOT、4=JMP、5=JC、6=CALL、7=CAL、8=NONE +- disasm 按 func 显示类型后缀(A7 定案):func=3 → `LOAD.I16 r5, s3` +- 无类型指令(跳转/调用/RET/NOP/CAL)func 编码为 0(不使用) ## 1. 数据搬运 -| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 | -|---|---|---|---|---|---|---| -| MOVE | 4B | RR | 无 | rd, rs | 寄存器间搬运(int64 全宽) | 核心 | -| NOP | 4B | NONE | 无 | — | 空操作 | 核心 | -| LOAD | 8B | SLOT | 有 | rd, slot | 槽→寄存器(按 type 读宽+扩展) | 核心 | -| STORE | 8B | SLOT | 有 | slot, rs | 寄存器→槽(按 type 写宽) | 核心 | -| LOADK | 8B | IMM | 有 | rd, const_id | 常量表→寄存器(按 type 解释) | 核心 | -| LOAD_OFF | 16B | SLOT+off | 有 | rd, slot, off | 字段读(结构体/FB 共享体) | 核心 | -| STORE_OFF | 16B | SLOT+off | 有 | slot, off, rs | 字段写 | 核心 | -| LOADK64 | 16B | IMM64 | 有 | rd, imm64 | 64 位立即数内嵌(免查表) | 预留 | +| 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | +|---|---|---|---|---|---|---|---| +| MOVE | 4B | `10000000` | RR(0) | 宽度:0=1B/1=2B/2=4B/3=8B | rd, rs | 寄存器搬运(只搬宽度,不管符号/浮点) | 核心 | +| LOAD | 8B | `01011010` | SLOT(3) | 全矩阵 0..9 | rd, slot | 槽→寄存器(按 func 读宽+扩展) | 核心 | +| STORE | 8B | `01011011` | SLOT(3) | 全矩阵 0..9 | slot, rs | 寄存器→槽(按 func 写宽) | 核心 | +| LOADK | 8B | `01011100` | IMM(2) | 全矩阵 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 | `00100010` | IMM64 | 全矩阵 0..9 | rd, imm64 | 64 位立即数内嵌(免查表) | 预留 | ## 2. 逻辑与位运算 -| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 | -|---|---|---|---|---|---|---| -| NOT | 4B | RR | 有 | rd, rs | 按 type:BOOL 逻辑非 / 位串取反 | 核心 | -| AND / OR / XOR | 8B | RRR | 有 | rd, ra, rb | 按 type 位宽 | 核心 | -| NAND / NOR / XNOR | 8B | RRR | 有 | rd, ra, rb | 扩展三态 | 扩展 | -| SHL / SHR | 8B | RRR | 有 | rd, rs, n | 左移/右移(SHR 按 type 符号:算术/逻辑) | 扩展 | -| ROL / ROR | 8B | RRR | 有 | rd, rs, n | 循环移位(位串) | 扩展 | -| GETBIT | 8B | RRR | 无 | rd, rs, bit | 取位(位号在 rb) | 扩展 | -| SETBIT / CLRBIT / TOGBIT | 8B | RRR | 无 | slot/rd, rs, bit | 置位/清位/翻转(目标可槽) | 扩展 | +| 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | +|---|---|---|---|---|---|---|---| +| NOT | 4B | `10000010` | RR(0) | 无符号宽度 0/2/4/6 | rd, rs | BOOL 逻辑非 / 位串按位取反 | 核心 | +| AND | 8B | `01000110` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 按宽度逐位与(BOOL 由编译器保证 0/1) | 核心 | +| OR | 8B | `01000111` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位或 | 核心 | +| XOR | 8B | `01001000` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位异或 | 核心 | +| NAND | 8B | `01001001` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位与非 | 扩展 | +| NOR | 8B | `01001010` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位或非 | 扩展 | +| XNOR | 8B | `01001011` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位同或 | 扩展 | +| SHL | 8B | `01001100` | RRR(1) | 无符号宽度 0/2/4/6 | rd, rs, n | 左移(n 在 rb) | 扩展 | +| SHR | 8B | `01001101` | RRR(1) | 0..7(宽度×符号,算术/逻辑右移) | rd, rs, n | 右移 | 扩展 | +| ROL | 8B | `01001110` | RRR(1) | 无符号宽度 0/2/4/6 | rd, rs, n | 循环左移(位串) | 扩展 | +| ROR | 8B | `01001111` | RRR(1) | 无符号宽度 0/2/4/6 | rd, rs, n | 循环右移 | 扩展 | +| GETBIT | 8B | `01011000` | RRR(1) | — | rd, rs, bit | 取位(bit 在 rb) | 扩展 | +| SETBIT | 8B | `01011001` | RRR(1) | — | rd, rs, bit | 置位 | 扩展 | +| CLRBIT | 8B | `01011010` | RRR(1) | — | rd, rs, bit | 清位 | 扩展 | +| TOGBIT | 8B | `01011011` | RRR(1) | — | rd, rs, bit | 翻转位 | 扩展 | + +> 注:SETBIT/CLRBIT/TOGBIT 的"目标可槽"形式(`slot, bit`)后续可在 16B 组扩展(op 预留)。 ## 3. 算术 -| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 | -|---|---|---|---|---|---|---| -| ADD / SUB / MUL / DIV | 8B | RRR | 有 | rd, ra, rb | 整数饱和 / 浮点 IEEE / 无符号按 type | 核心 | -| MOD | 8B | RRR | 有 | rd, ra, rb | 取模 | 扩展 | -| NEG | 4B | RR | 有 | rd, rs | 取负 | 扩展 | -| ABS | 4B | RR | 有 | rd, rs | 绝对值 | 扩展 | -| INC / DEC | 4B | RR | 有 | rd, rs | 自增/自减 | 扩展 | -| EXPT | 8B | RRR | 有 | rd, ra, rb | 幂(整数/浮点) | 扩展 | -| SQRT | 4B | RR | 有 | rd, rs | 平方根 | 扩展 | -| SIN / COS / TAN / ASIN / ACOS / ATAN | 4B | RR | 有 | rd, rs | 三角函数(浮点) | 扩展 | -| LN / LOG / EXP | 4B | RR | 有 | rd, rs | 对数/指数(浮点) | 扩展 | -| ROUND / TRUNC / FLOOR / CEIL | 4B | RR | 有 | rd, rs | 舍入(浮点→整数) | 扩展 | +| 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | +|---|---|---|---|---|---|---|---| +| ADD | 8B | `01000000` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 整数饱和 / 浮点 IEEE / 无符号 | 核心 | +| SUB | 8B | `01000001` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 减 | 核心 | +| MUL | 8B | `01000010` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 乘 | 核心 | +| DIV | 8B | `01000011` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 除(整数零除/浮点 ±inf) | 核心 | +| MOD | 8B | `01000100` | RRR(1) | 0..7(整数) | rd, ra, rb | 取模 | 扩展 | +| EXPT | 8B | `01000101` | RRR(1) | 0..9 | rd, ra, rb | 幂 | 扩展 | +| NEG | 4B | `10000100` | RR(0) | 0..9 | rd, rs | 取负 | 扩展 | +| ABS | 4B | `10000101` | RR(0) | 0..9 | rd, rs | 绝对值 | 扩展 | +| INC | 4B | `10000110` | RR(0) | 0..9 | rd, rs | 自增 | 扩展 | +| DEC | 4B | `10000111` | RR(0) | 0..9 | rd, rs | 自减 | 扩展 | +| SQRT | 4B | `10001000` | RR(0) | 浮点 8/9 | rd, rs | 平方根 | 扩展 | +| SIN | 4B | `10001001` | RR(0) | 浮点 8/9 | rd, rs | 正弦 | 扩展 | +| COS | 4B | `10001010` | RR(0) | 浮点 8/9 | rd, rs | 余弦 | 扩展 | +| TAN | 4B | `10001011` | RR(0) | 浮点 8/9 | rd, rs | 正切 | 扩展 | +| ASIN | 4B | `10001100` | RR(0) | 浮点 8/9 | rd, rs | 反正弦 | 扩展 | +| ACOS | 4B | `10001101` | RR(0) | 浮点 8/9 | rd, rs | 反余弦 | 扩展 | +| ATAN | 4B | `10001110` | RR(0) | 浮点 8/9 | rd, rs | 反正切 | 扩展 | +| LN | 4B | `10001111` | RR(0) | 浮点 8/9 | rd, rs | 自然对数 | 扩展 | +| LOG | 4B | `10010000` | RR(0) | 浮点 8/9 | rd, rs | 常用对数 | 扩展 | +| EXP | 4B | `10010001` | RR(0) | 浮点 8/9 | rd, rs | 指数 | 扩展 | +| ROUND | 4B | `10010010` | RR(0) | 浮点 8/9 | rd, rs | 四舍五入(浮点→整数) | 扩展 | +| TRUNC | 4B | `10010011` | RR(0) | 浮点 8/9 | rd, rs | 截断 | 扩展 | +| FLOOR | 4B | `10010100` | RR(0) | 浮点 8/9 | rd, rs | 向下取整 | 扩展 | +| CEIL | 4B | `10010101` | RR(0) | 浮点 8/9 | rd, rs | 向上取整 | 扩展 | ## 4. 比较 -| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 | -|---|---|---|---|---|---|---| -| CMP_EQ / NE / LT / LE / GT / GE | 8B | RRR | 有 | rd, ra, rb | 按 type:有/无符号/浮点/IEEE(NaN 传播) | 核心 | +| 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | +|---|---|---|---|---|---|---|---| +| CMP_EQ | 8B | `01010000` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 相等 | 核心 | +| CMP_NE | 8B | `01010001` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 不等 | 核心 | +| CMP_LT | 8B | `01010010` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 小于(无符号/浮点按 func) | 核心 | +| CMP_LE | 8B | `01010011` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 小于等于 | 核心 | +| CMP_GT | 8B | `01010100` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 大于 | 核心 | +| CMP_GE | 8B | `01010101` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 大于等于 | 核心 | ## 5. 转换 -| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 | -|---|---|---|---|---|---|---| -| CONV | 4B | RR | dst | rd, rs | 类型转换(dst 在 type 位段;src 值已在寄存器,按 dst 宽度截断/扩展/舍入) | 扩展 | -| TRUNC(并入 CONV 舍入模式) | — | — | — | — | 舍入模式由 CONV 的 op 变体或独立指令(见上) | 扩展 | +| 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | +|---|---|---|---|---|---|---|---| +| CONV | 4B | `10010110` | RR(0) | **目标类型** 0..9 | rd, rs | 类型转换(src 值已在寄存器,按目标 func 截断/扩展/舍入;舍入模式随目标为浮点→整数时取 TRUNC 语义) | 扩展 | ## 6. 控制流 -| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 | -|---|---|---|---|---|---|---| -| JMP | 8B | JMP | 无 | off32 | 无条件跳转(相对下一条,字节) | 核心 | -| JT / JF | 8B | JC | 无 | rd, off | rd≠0/==0 跳转 | 核心 | -| CALL | 8B | IMM | 无 | fn_id | 压帧调用(r0..r7 复制) | 核心 | -| RET | 4B | NONE | 无 | — | 弹帧 / MAIN 周期结束 | 核心 | -| CAL | 8B | SLOT | 无 | fb_id, slot | 内建 FB 调用(fb_id 查 [[fb]] 表) | 核心 | -| JTBL | 32B | 预留 | 无 | rd, slot, n | CASE 跳转表 | 预留 | +| 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | +|---|---|---|---|---|---|---|---| +| JMP | 8B | `01011111` | JMP(4) | — | off32 | 无条件跳转(相对下一条,字节) | 核心 | +| JT | 8B | `01100000` | JC(5) | — | rd, off | rd≠0 跳转 | 核心 | +| JF | 8B | `01100001` | JC(5) | — | rd, off | rd==0 跳转 | 核心 | +| CALL | 8B | `01011101` | CALL(6) | — | fn_id | 压帧调用(r0..r7 复制) | 核心 | +| RET | 4B | `10000011` | NONE(8) | — | — | 弹帧 / MAIN 周期结束 | 核心 | +| CAL | 8B | `01011110` | CAL(7) | — | fb_id, slot | 内建 FB 调用(fb_id 查 [[fb]] 表) | 核心 | +| JTBL | 32B | `00010000` | 预留 | — | rd, slot, n | CASE 跳转表 | 预留 | ## 7. 内建 FB(CAL + fb_id,[[fb]] 表) @@ -87,41 +120,46 @@ | 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… | 扩展 | +| 11 | SR / RS | s1/r/s/q… | 扩展 | | 12 | PWM | in/pt/q… | 扩展 | | 13 | RTC | 日期时钟字段 | 扩展 | ## 8. 字符串(未来,元数据段 + 16/32B) -| 指令 | 组 | fmt | 语义 | 状态 | -|---|---|---|---|---| -| STR_LEN | 16B | SLOT+off | 字符串长度 | 预留 | -| STR_CMP / STR_EQ | 16B | SLOT+off | 比较(按元数据段定长/变长) | 预留 | -| STR_CONCAT | 32B | 预留 | 拼接 | 预留 | -| STR_MID / STR_LEFT / STR_RIGHT | 16B/32B | 预留 | 取子串 | 预留 | -| STR_FIND / STR_REPLACE | 32B | 预留 | 查找/替换 | 预留 | +| 指令 | 组 | 字节0 编码 | fmt | 语义 | 状态 | +|---|---|---|---|---|---| +| STR_LEN | 16B | `00100011` | SLOT+off | 字符串长度 | 预留 | +| STR_CMP | 16B | `00100100` | SLOT+off | 比较 | 预留 | +| STR_EQ | 16B | `00100101` | SLOT+off | 相等 | 预留 | +| STR_MID | 16B | `00100110` | SLOT+off | 取子串 | 预留 | +| STR_LEFT | 16B | `00100111` | SLOT+off | 左侧子串 | 预留 | +| STR_RIGHT | 16B | `00101000` | SLOT+off | 右侧子串 | 预留 | +| STR_CONCAT | 32B | `00010011` | 预留 | 拼接 | 预留 | +| STR_FIND | 32B | `00010001` | 预留 | 查找 | 预留 | +| STR_REPLACE | 32B | `00010010` | 预留 | 替换 | 预留 | ## 9. 数组(未来) -| 指令 | 组 | fmt | 语义 | 状态 | -|---|---|---|---|---| -| ARR_LEN | 16B | SLOT+off | 数组长度 | 预留 | -| ARR_LOAD / ARR_STORE | 32B | 预留 | 索引访问(基槽+index) | 预留 | +| 指令 | 组 | 字节0 编码 | fmt | 语义 | 状态 | +|---|---|---|---|---|---| +| ARR_LEN | 16B | `00101001` | SLOT+off | 数组长度 | 预留 | +| ARR_LOAD | 32B | `00010100` | 预留 | 索引读(基槽+index) | 预留 | +| ARR_STORE | 32B | `00010101` | 预留 | 索引写 | 预留 | ## 10. 系统 -| 指令 | 组 | fmt | 语义 | 状态 | -|---|---|---|---|---| -| NOP | 4B | NONE | 空操作(占位/对齐) | 核心 | +| 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | +|---|---|---|---|---|---|---|---| +| NOP | 4B | `10000001` | NONE(8) | — | — | 空操作(占位/对齐) | 核心 | ## 11. op 预算核对(前缀编码按组分治) -| 组 | op 空间 | v1 核心用量 | 扩展/预留量 | -|---|---|---|---| -| 4B(op:7) | 128 | MOVE/NOP/NOT/RET ≈ 4 | 124(浮点单目/舍入/CONV 等) | -| 8B(op:6) | 64 | ADD..CMP/LOAD/STORE/LOADK/CALL/CAL/JMP/JT/JF ≈ 19 | 45(位运算/移位/GETBIT 等) | -| 16B(op:5) | 32 | LOAD_OFF/STORE_OFF ≈ 2 | 30(LOADK64/字符串/数组) | -| 32B(op:4) | 16 | 0 | 16(JTBL/复杂字符串) | +| 组 | op 空间 | 已分配 | 指令 | 余量 | +|---|---|---|---|---| +| 4B(op:7) | 128 | 23 | MOVE/NOP/NOT/RET/NEG/ABS/INC/DEC + 浮点单目 10 + 舍入 4 + CONV | 105 | +| 8B(op:6) | 64 | 34 | 算术 6 + 逻辑 6 + 移位 4 + 位操作 4 + CMP 6 + LOAD/STORE/LOADK/CALL/CAL/JMP/JT/JF 8 | 30 | +| 16B(op:5) | 32 | 10 | LOAD_OFF/STORE_OFF/LOADK64 + 字符串 6 + ARR_LEN | 22 | +| 32B(op:4) | 16 | 6 | JTBL + STR_CONCAT/FIND/REPLACE + ARR_LOAD/STORE | 10 | -> 注:以上为全功能**目标清单**,v1 只实现「核心」列;「扩展/预留」列给出指令格式占位, -> 具体操作数形态(如 GETBIT 的槽/寄存器目标、CONV 舍入模式)在实现时定稿。 +> 编码约定:op 按组独立编号;无类型指令 func=0;SETBIT 系列的目标可槽形式与 +> 字符串/数组的具体操作数形态在实现时定稿(fmt 列「预留」)。