指令编码: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
This commit is contained in:
2026-08-24 15:30:59 +08:00
parent fda4f7a3ec
commit 134f1748ec
3 changed files with 203 additions and 256 deletions
+80 -89
View File
@@ -1,57 +1,47 @@
# 指令编码(V2RISC-V 式 op + func
# 指令编码(V2RISC-V 式 op + func + 前缀分区形态
> 状态:**定案存档**。本文独立存储 RISC-V 式指令编码设计(opcode 定功能、func 定细节),
> 与 [`指令集优化.md`](指令集优化.md)(格式/数据模型/待确认)配套
> 定案日期2026-08-24。
> 状态:**定案存档**。RISC-V 式指令编码opcode 定功能、func 定细节
> **操作数形态由长度组前缀分区表达**(fmt 位段已取消)
> 与 [`指令集优化.md`](指令集优化.md)(格式/数据模型/待确认)配套。修订2026-08-24。
## 1. 设计原则(RISC-V 式)
```text
RISC-V: opcode 决定指令的"功能"LOAD/STORE/OP/BRANCH…)
funct3/funct7 决定"功能细节"(宽度/符号/变体
lb 与 lbu 同一 opcodefunct3 区分符号
本方案: op 决定指令的"功能"MOVE/LOAD/ADD…)
func 决定"功能的细节"(宽度/符号/浮点/变体)
func 的语义由 op 决定(随 op 变,不是全局统一表)
opcode 决定指令的"功能"MOVE/LOAD/ADD…)
func 决定"功能细节"(宽度/符号/浮点
操作数形态(RR/RRR/IMM/SLOT/…)由长度组前缀分区 + 小表表达
```
- **opcode 只决定指令的功能**;func 决定功能的细节
- **func 语义随 op 变**MOVE 的 func = 宽度;LOAD 的 func = 宽度×符号;ADD 的 func = 宽度×符号+浮点
## 2. 指令字结构(头两字节 + 操作数区)
```text
指令 = 字节0 + 字节1 + 操作数区(rd/rs/slot/off…,按 fmt 与长度组
指令 = 字节0 + 字节1 + 操作数区(rd/rs/slot/off…,按形态
字节 0 字节 1
[前缀 | op] [func:4 | fmt:4]
↑ ↑
长度+操作码 功能细节 操作数形态
[长度前缀+分区 | op] [func:4 | :4]
↑ ↑
长度+形态分区+操作码 功能细节(空 4 位待全部编码后定)
```
### 2.1 字节 0:长度前缀 + 主操作码(前缀编码,UTF-8/RISC-V 式)
## 3. 前缀编码与形态分区
| 前缀从最高位开始比对) | 指令长度 | 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 → 前缀判定长度 → 搬整条
| 前缀 | 指令长度 | 分区 | 形态 | 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,形态待定) |
### 2.2 字节 1func + fmt(各 4 位
- **长度自描述**`1` 开头 → 4B、`01` → 8B、`001` → 16B、`0001` → 32B(前缀分区不改变长度判定
- **op 按组内独立编号**(各区从 0 起)
- 取指:读字节 0 → 前缀定长 → 搬整条;形态由前缀分区直推(010 区查表)
```text
[func:4 | fmt:4]
高 4 位 = func 功能细节(宽度/符号/浮点)
低 4 位 = fmt 操作数形态
```
## 3. func 位段(4 位,16 种)
## 4. func 位段(字节 1 高 4 位,16 种)
| func | 语义 | 覆盖类型(编译期映射) |
|---|---|---|
@@ -67,67 +57,68 @@ RISC-V: opcode 决定指令的"功能族"LOAD/STORE/OP/BRANCH…)
| 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 种数据语义),无类型概念;类型语义全在编译层
- **func 语义随 op**MOVE=宽度;LOAD/STORE=宽度×符号;ADD..=宽度×符号+浮点;逻辑=宽度;无类型指令 func=0(不使用)
- **字节 1 低 4 位暂空**:待全部指令编码完后决定用途(func 扩位/扩展字段)
## 4. fmt 位段(4 位,9 种格式 + 7 预留
## 5. 形态识别(前缀直推 + 010 区查表
| fmt | 形态 | 说明 |
| 前缀 | 形态 | 识别方式 |
|---|---|---|
| 0 | RR | rd, rsMOVE/NOT/浮点单目) |
| 1 | RRR | rd, ra, rb(算术/比较/位运算) |
| 2 | IMM | rd, 32 位立即数(LOADK/CALL |
| 3 | SLOT | rd, slot32LOAD/STORE/CAL |
| 4 | JMP | off32 |
| 5 | JC | rd, offJT/JF |
| 6 | CALL | fn_id(独立格式,未合并) |
| 7 | CAL | fb_id, slot(独立格式,未合并) |
| 8 | NONE | 无操作数(RET/NOP |
| 9 | SLOT+off | rd, slot, off16B:结构体/FB 字段访问) |
| 10 | IMM64 | rd, imm6416B64 位立即数内嵌) |
| 11..15 | 预留 | |
| `11` | RR | 前缀直推 |
| `10` | NONE | 前缀直推 |
| `011` | RRR | 前缀直推 |
| `010` | 见下表(8 条) | **op 查表** |
| `0010` | SLOT+off | 前缀直推 |
| `0011` | IMM64 | 前缀直推 |
| `0001` | 预留 | 待定 |
- **格式不合并**fmt 4 位足够,CALL/CAL 保持独立格式(U1 闭合为"不合并"
- **16B 形态分配 fmt 9/10**SLOT+off(字段访问)、IMM64(立即数内嵌)——fmt 4 位 16 空间:0..10 用 + 11..15 预留
**010 区查表(8 条)**
## 5. 长度组 × 格式族(操作数区
| 子 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 起) |
|---|---|---|
| 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/复杂字符串) | — |
| 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,格式待定) |
## 6. 类型系统(编译期)→ func 映射
## 8. 类型系统(编译期)→ 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/1TRUE/FALSE),其他值编译期报错;VM 无 BOOL 特例
- **运行时**VM 只认 func 的 10 种"宽度+符号+浮点"组合,机械执行
- 位串(BYTE/WORD/…)与无符号整数同 func——运算语义由 **op** 区分(SHL 是位运算指令、ADD 是算术指令)
- TIME 用 8B 有符号 func(毫秒语义在编译层)
- 常量表:条目 8B 原始值(无 tag),LOADK 按 func 解释(A2 定案不变)
- **编译期**:19 种 IEC 基础类型,类型检查严格比对——不匹配编译期报错
- **BOOL 约束**:编译器限制 0/1,越界报错;VM 无 BOOL 特例
- **运行时**VM 只认 func 的 10 种"宽度+符号+浮点"组合
- 常量表:条目 8B 原始值(无 tag),LOADK 按 func 解释
## 7. 与 RISC-V 的对照
## 9. 决策历史
| | RISC-V | 本方案 |
|---|---|---|
| 主功能 | opcode[6:0] | 前缀 + op(按长度组分治) |
| 细节 | funct33 位)/ funct7 | func4 位,10 组合) |
| 形态 | rd/rs1/rs2/imm 固定位置 | fmt4 位,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 独立格式)
- 用户提出 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