Files
Interpreter/Doc/isa/指令集清单.md
T
Admin fda4f7a3ec 指令集清单:新增 §1 fmt 格式与字段位号(opcode/func/imm/rs1/rs2/rd 逐位标注)
- 1.1 通用头部位号表(长度前缀/opcode/func/fmt)
- 1.2 fmt 位号总表(11 形态 + 预留,操作数区 bit16 起)
- 1.3 各位图:RR/RRR/IMM/SLOT/JMP/JC/CALL/CAL/NONE/SLOT+off/IMM64
  逐位标注(含 pad 填充位);32B 预留格式待定
- 16B 形态分配 fmt 9(SLOT+off)/10(IMM64);指令编码.md 同步
- 原指令章节顺延为 2..12
2026-08-24 15:01:54 +08:00

295 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 指令集清单(V2 编码定案)
> 状态:**已编码**。全功能指令清单,全部指令已按 [`指令编码.md`](指令编码.md) 的
> RISC-V 式格式(前缀长度组 + op + func + fmt)分配编码。
> 状态列:`核心` = v1 实现;`扩展` = v1 后实现;`预留` = 仅留编码/未来。
## 编码规则摘要(详见指令编码.md)
- **字节 0** = 长度前缀 + 主操作码:`1`+op:74B)、`01`+op:68B)、`001`+op:516B)、`0001`+op:432B
- **字节 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/CALfunc 编码为 0(不使用)
## 1. fmt 格式与字段位号
### 1.1 通用头部(字节 0 + 字节 1,所有指令相同)
| 字段 | 位号 | 说明 |
|---|---|---|
| 长度前缀 | 4B: bit7 / 8B: bit7..6 / 16B: bit7..5 / 32B: bit7..4 | `1` / `01` / `001` / `0001` |
| opcode | 4B: bit6..0 / 8B: bit5..0 / 16B: bit4..0 / 32B: bit3..0 | 组内独立编号(0 起) |
| func | bit15..12 | 功能细节(宽度×符号/浮点),语义随 op |
| fmt | bit11..8 | 操作数形态(下表) |
### 1.2 fmt 位号总表(操作数区 = bit16 起;pad = 对齐填充,编码固定 0)
| fmt | 形态 | 长度组 | 操作数区字段位号 |
|---|---|---|---|
| 0 | RR | 4B | rd=23..16、rs=31..24 |
| 1 | RRR | 8B | rd=23..16、rs1=31..24、rs2=39..32、pad=63..40 |
| 2 | IMM | 8B | rd=23..16、imm32=55..24、pad=63..56 |
| 3 | SLOT | 8B | rd=23..16、slot32=55..24、pad=63..56 |
| 4 | JMP | 8B | off32=47..16、pad=63..48 |
| 5 | JC | 8B | rd=23..16、off32=55..24、pad=63..56 |
| 6 | CALL | 8B | fn_id32=47..16、pad=63..48 |
| 7 | CAL | 8B | fb_id16=31..16、slot32=63..32 |
| 8 | NONE | 4B | pad=31..16 |
| 9 | SLOT+off | 16B | rd=23..16、slot32=55..24、off32=87..56、pad=127..88 |
| 10 | IMM64 | 16B | rd=23..16、imm64=87..24、pad=127..88 |
| 11..15 | 预留 | 32B | 操作数区 30Bbit 240..16),格式待定 |
### 1.3 各位图(bit 从左(高)到右(低);小端字节序:字节 0 = bit0..7 在右端)
**fmt=0 RR4B = bit31..0**
```text
bit31 24 bit23 16 bit15 12 bit11 8 bit7 0
┌────────────────┬────────────────┬───────────┬─────────┬───────────┐
│ rs:8 (31..24) │ rd:8 (23..16) │ func:4 │ fmt:4 │ 前缀1+op:7 │
└────────────────┴────────────────┴───────────┴─────────┴───────────┘
```
**fmt=1 RRR8B = bit63..0**
```text
bit63 40 bit39 32 bit31 24 bit23 16 bit15 12 bit11 8 bit7 0
┌─────────────────┬──────────┬──────────┬──────────┬─────────┬───────┬──────────┐
│ pad:24 (63..40) │ rs2:8 │ rs1:8 │ rd:8 │ func:4 │ fmt:4 │ 前缀01+op6│
│ │ (39..32) │ (31..24) │ (23..16) │ (15..12)│(11..8)│ (7..0) │
└─────────────────┴──────────┴──────────┴──────────┴─────────┴───────┴──────────┘
```
**fmt=2 IMM8B = bit63..0**
```text
bit63 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0
┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐
│ pad:8 (63..56)│ imm32 (55..24)│ rd:8 (23..16)│ func:4 │ fmt:4 │ 前缀01+op6│
└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘
```
**fmt=3 SLOT8B = bit63..0**
```text
bit63 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0
┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐
│ pad:8 (63..56)│ slot32 (55..24)│ rd:8 (23..16)│ func:4 │ fmt:4 │前缀01+op6│
└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘
```
**fmt=4 JMP8B = bit63..0**
```text
bit63 48 bit47 16 bit15 12 bit11 8 bit7 0
┌──────────────┬─────────────┬─────────┬───────┬──────────┐
│ pad:16 │ off32 (47..16)│ func:4 │ fmt:4 │前缀01+op6│
│ (63..48) │ │ (15..12)│(11..8)│ (7..0) │
└──────────────┴─────────────┴─────────┴───────┴──────────┘
```
**fmt=5 JC8B = bit63..0**
```text
bit63 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0
┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐
│ pad:8 (63..56)│ off32 (55..24)│ rd:8 (23..16)│ func:4 │ fmt:4 │ 前缀01+op6│
└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘
```
**fmt=6 CALL8B = bit63..0**
```text
bit63 48 bit47 16 bit15 12 bit11 8 bit7 0
┌──────────────┬─────────────┬─────────┬───────┬──────────┐
│ pad:16 │ fn_id32 │ func:4 │ fmt:4 │前缀01+op6│
│ (63..48) │ (47..16) │ (15..12)│(11..8)│ (7..0) │
└──────────────┴─────────────┴─────────┴───────┴──────────┘
```
**fmt=7 CAL8B = bit63..0**
```text
bit63 32 bit31 16 bit15 12 bit11 8 bit7 0
┌────────────────┬──────────────┬─────────┬───────┬──────────┐
│ slot32 (63..32)│ fb_id16 │ func:4 │ fmt:4 │ 前缀01+op6│
│ │ (31..16) │ (15..12)│(11..8)│ (7..0) │
└────────────────┴──────────────┴─────────┴───────┴──────────┘
```
**fmt=8 NONE4B = bit31..0**
```text
bit31 16 bit15 12 bit11 8 bit7 0
┌──────────────────┬─────────┬───────┬──────────┐
│ pad:16 (31..16) │ func:4 │ fmt:4 │ 前缀1+op7 │
└──────────────────┴─────────┴───────┴──────────┘
```
**fmt=9 SLOT+off16B = bit127..0**
```text
bit127 88 bit87 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0
┌─────────────────┬──────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐
│ pad:40 │ off32 │ slot32 │ rd:8 │ func:4 │ fmt:4 │ 前缀001+op5│
│ (127..88) │ (87..56) │ (55..24) │ (23..16) │ (15..12)│(11..8)│ (7..0) │
└─────────────────┴──────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘
```
**fmt=10 IMM6416B = bit127..0**
```text
bit127 88 bit87 24 bit23 16 bit15 12 bit11 8 bit7 0
┌─────────────────┬────────────┬──────────────┬─────────┬───────┬──────────┐
│ pad:40 │ imm64 │ rd:8 │ func:4 │ fmt:4 │ 前缀001+op5│
│ (127..88) │ (87..24) │ (23..16) │ (15..12)│(11..8)│ (7..0) │
└─────────────────┴────────────┴──────────────┴─────────┴───────┴──────────┘
```
**fmt=11..15 预留(32B**:操作数区 30B(bit 240..16),格式待实现时定稿。
## 2. 数据搬运
| 指令 | 组 | 字节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 位立即数内嵌(免查表) | 预留 |
## 3. 逻辑与位运算
| 指令 | 组 | 字节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 预留)。
## 4. 算术
| 指令 | 组 | 字节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 | 向上取整 | 扩展 |
## 5. 比较
| 指令 | 组 | 字节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 | 大于等于 | 核心 |
## 6. 转换
| 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 |
|---|---|---|---|---|---|---|---|
| CONV | 4B | `10010110` | RR(0) | **目标类型** 0..9 | rd, rs | 类型转换(src 值已在寄存器,按目标 func 截断/扩展/舍入;舍入模式随目标为浮点→整数时取 TRUNC 语义) | 扩展 |
## 7. 控制流
| 指令 | 组 | 字节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 跳转表 | 预留 |
## 8. 内建 FBCAL + 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 | `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` | 预留 | 替换 | 预留 |
## 10. 数组(未来)
| 指令 | 组 | 字节0 编码 | fmt | 语义 | 状态 |
|---|---|---|---|---|---|
| ARR_LEN | 16B | `00101001` | SLOT+off | 数组长度 | 预留 |
| ARR_LOAD | 32B | `00010100` | 预留 | 索引读(基槽+index) | 预留 |
| ARR_STORE | 32B | `00010101` | 预留 | 索引写 | 预留 |
## 11. 系统
| 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 |
|---|---|---|---|---|---|---|---|
| NOP | 4B | `10000001` | NONE(8) | — | — | 空操作(占位/对齐) | 核心 |
## 12. op 预算核对(前缀编码按组分治)
| 组 | op 空间 | 已分配 | 指令 | 余量 |
|---|---|---|---|---|
| 4Bop:7 | 128 | 23 | MOVE/NOP/NOT/RET/NEG/ABS/INC/DEC + 浮点单目 10 + 舍入 4 + CONV | 105 |
| 8Bop:6 | 64 | 34 | 算术 6 + 逻辑 6 + 移位 4 + 位操作 4 + CMP 6 + LOAD/STORE/LOADK/CALL/CAL/JMP/JT/JF 8 | 30 |
| 16Bop:5 | 32 | 10 | LOAD_OFF/STORE_OFF/LOADK64 + 字符串 6 + ARR_LEN | 22 |
| 32Bop:4 | 16 | 6 | JTBL + STR_CONCAT/FIND/REPLACE + ARR_LOAD/STORE | 10 |
> 编码约定:op 按组独立编号;无类型指令 func=0;SETBIT 系列的目标可槽形式与
> 字符串/数组的具体操作数形态在实现时定稿(fmt 列「预留」)。