Files
Interpreter/Doc/isa/指令编码.md
T
Admin 134f1748ec 指令编码:fmt 位段取消,形态改由前缀分区表达(Q1=010 查表 / Q2 空位待定 / Q3 全组分区)
- 前缀分区:11=RR、10=NONE、011=RRR、010=其他8条(查表)、0010=SLOT+off、
  0011=IMM64、0001=预留(32B)
- 字节 1 = [func:4 | 空:4](空位待全部编码后定)
- 指令集清单:全部 72 行编码按新分区重排;§1 位号表/位图更新
- uses_* 推导:前缀直推 + 010 区查表;编译器优化/指令集优化同步
- op 预算:RR 21/64、NONE 2/64、RRR 26/32、其他 8/32、SLOT+off 8/16、IMM64 1/16
2026-08-24 15:30:59 +08:00

125 lines
5.3 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.
# 指令编码(V2RISC-V 式 op + func + 前缀分区形态)
> 状态:**定案存档**。RISC-V 式指令编码:opcode 定功能、func 定细节、
> **操作数形态由长度组前缀分区表达**(fmt 位段已取消)。
> 与 [`指令集优化.md`](指令集优化.md)(格式/数据模型/待确认)配套。修订:2026-08-24。
## 1. 设计原则(RISC-V 式)
```text
opcode 决定指令的"功能"MOVE/LOAD/ADD…)
func 决定"功能的细节"(宽度/符号/浮点)
操作数形态(RR/RRR/IMM/SLOT/…)由长度组前缀分区 + 小表表达
```
## 2. 指令字结构(头两字节 + 操作数区)
```text
指令 = 字节0 + 字节1 + 操作数区(rd/rs/slot/off…,按形态)
字节 0 字节 1
[长度前缀+分区 | op] [func:4 | 空:4]
↑ ↑
长度+形态分区+操作码 功能细节(空 4 位待全部编码后定)
```
## 3. 前缀编码与形态分区
前缀从最高位起比对,长度与形态分区一体:
| 前缀 | 指令长度 | 分区 | 形态 | op 位宽 | op 空间 | 指令 |
|---|---|---|---|---|---|---|
| `11` | 4B | 11 | **RR** | 6 位 | 64 | MOVE/NOT/NEG/ABS/INC/DEC/浮点单目/舍入/CONV21 |
| `10` | 4B | 10 | **NONE** | 6 位 | 64 | NOP/RET2 |
| `011` | 8B | 011 | **RRR** | 5 位 | 32 | 算术/逻辑/移位/位操作/比较(26) |
| `010` | 8B | 010 | **查表**6 种形态) | 5 位 | 32 | LOADK/LOAD/STORE/JMP/JT/JF/CALL/CAL8,见 §5 |
| `0010` | 16B | 0010 | **SLOT+off** | 4 位 | 16 | LOAD_OFF/STORE_OFF/字符串(8 |
| `0011` | 16B | 0011 | **IMM64** | 4 位 | 16 | LOADK641 |
| `0001` | 32B | 0001 | 预留 | 4 位 | 16 | JTBL/复杂字符串/数组(6,形态待定) |
- **长度自描述**`1` 开头 → 4B、`01` → 8B、`001` → 16B、`0001` → 32B(前缀分区不改变长度判定)
- **op 按组内独立编号**(各区从 0 起)
- 取指:读字节 0 → 前缀定长 → 搬整条;形态由前缀分区直推(010 区查表)
## 4. func 位段(字节 1 高 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=宽度;LOAD/STORE=宽度×符号;ADD..=宽度×符号+浮点;逻辑=宽度;无类型指令 func=0(不使用)
- **字节 1 低 4 位暂空**:待全部指令编码完后决定用途(func 扩位/扩展字段)
## 5. 形态识别(前缀直推 + 010 区查表)
| 前缀 | 形态 | 识别方式 |
|---|---|---|
| `11` | RR | 前缀直推 |
| `10` | NONE | 前缀直推 |
| `011` | RRR | 前缀直推 |
| `010` | 见下表(8 条) | **op 查表** |
| `0010` | SLOT+off | 前缀直推 |
| `0011` | IMM64 | 前缀直推 |
| `0001` | 预留 | 待定 |
**010 区查表(8 条)**
| 子 op | 指令 | 形态 | 操作数区 |
|---|---|---|---|
| 0 | LOADK | IMM | rd=23..16、imm32=55..24、pad=63..56 |
| 1 | LOAD | SLOT | rd=23..16、slot32=55..24、pad=63..56 |
| 2 | STORE | SLOT | 同上 |
| 3 | JMP | JMP | off32=47..16、pad=63..48 |
| 4 | JT | JC | rd=23..16、off32=55..24、pad=63..56 |
| 5 | JF | JC | 同上 |
| 6 | CALL | CALL | fn_id32=47..16、pad=63..48 |
| 7 | CAL | CAL | fb_id16=31..16、slot32=63..32 |
## 6. uses_rd / uses_ra / uses_rb(寄存器越界检查推导)
"哪些字段是寄存器"由形态决定,前缀直推 + 010 查表:
| 形态 | uses_rd | uses_ra | uses_rb |
|---|---|---|---|
| RR11 | ✓ | ✓(rs | — |
| NONE10 | — | — | — |
| RRR011 | ✓ | ✓ | ✓ |
| 010 区 | 查表(IMM/SLOT/JC 的 rd ✓;JMP/CALL/CAL —) | 查表(—) | 查表(—) |
| SLOT+off0010 | ✓ | — | — |
| IMM640011 | ✓ | — | — |
执行:`if (uses_rd && rd >= nregs) → BadOp`——RRR 等大组零查表直推,010 区 8 条查小表。
## 7. 长度组 × 操作数区
| 前缀 | 长度 | 操作数区(bit16 起) |
|---|---|---|
| 11/10 | 4B | RR: rd=23..16、rs=31..24NONE: pad=31..16 |
| 011/010 | 8B | RRR: rd+rs1+rs2+pad;其余见 §5 查表 |
| 0010/0011 | 16B | SLOT+off: rd+slot32+off32+padIMM64: rd+imm64+pad |
| 0001 | 32B | 预留(操作数区 30B,格式待定) |
## 8. 类型系统(编译期)→ func 映射
- **编译期**:19 种 IEC 基础类型,类型检查严格比对——不匹配编译期报错
- **BOOL 约束**:编译器限制 0/1,越界报错;VM 无 BOOL 特例
- **运行时**VM 只认 func 的 10 种"宽度+符号+浮点"组合
- 常量表:条目 8B 原始值(无 tag),LOADK 按 func 解释
## 9. 决策历史
- 用户提出 RISC-V 式:opcode 定功能、func 定细节
- 前缀分区:用户提出 `011`=RRR、`010`=其他(8 条查表);`11`=RR、`10`=NONE4B);`0010`=SLOT+off、`0011`=IMM6416B
- **fmt 位段取消**:形态由前缀分区 + 010 区查表表达;字节 1 = [func:4 | 空:4],空位待全部编码后定
- func 4 位(10 组合);MOVE 只管宽度;19 类型 → 10 func 编译期映射;BOOL 编译器强制 0/1