指令编码:010 区也改前缀分区(形态位3+子op2),全部形态前缀直推、零查表

- 010 000/001/010/011/100/101 = IMM/SLOT/JMP/JC/CALL/CAL
- 8 条指令编码更新:LOADK=01000000、LOAD=01000100、STORE=01000101、
  JMP=01001000、JT=01001100、JF=01001101、CALL=01010000、CAL=01010100
- uses_* 全部前缀直推(无查表);三份文档同步
- 010 区预算:6 形态区 × 4 + 2 预留形态区
This commit is contained in:
2026-08-24 15:33:26 +08:00
parent 1c0c4d02f2
commit ee1e06c628
3 changed files with 74 additions and 51 deletions
+44 -28
View File
@@ -32,14 +32,20 @@ func 决定"功能的细节"(宽度/符号/浮点)
| `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 |
| `010 000` | 8B | 010 000 | **IMM** | 2 位 | 4 | LOADK1 |
| `010 001` | 8B | 010 001 | **SLOT** | 2 位 | 4 | LOAD/STORE2 |
| `010 010` | 8B | 010 010 | **JMP** | 2 位 | 4 | JMP1 |
| `010 011` | 8B | 010 011 | **JC** | 2 位 | 4 | JT/JF2 |
| `010 100` | 8B | 010 100 | **CALL** | 2 位 | 4 | CALL1 |
| `010 101` | 8B | 010 101 | **CAL** | 2 位 | 4 | CAL1 |
| `010 110/111` | 8B | 010 11x | 预留 | 2 位 | 4+4 | — |
| `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 区查表
- 取指:读字节 0 → 前缀定长 → 搬整条;**形态全部由前缀分区直推**(含 010 区内部分区
## 4. func 位段(字节 1 高 4 位,16 种)
@@ -60,52 +66,62 @@ func 决定"功能的细节"(宽度/符号/浮点)
- **func 语义随 op**MOVE=宽度;LOAD/STORE=宽度×符号;ADD..=宽度×符号+浮点;逻辑=宽度;无类型指令 func=0(不使用)
- **字节 1 低 4 位暂空**:待全部指令编码完后决定用途(func 扩位/扩展字段)
## 5. 形态识别(前缀直推 + 010 区查表)
## 5. 形态识别(全部前缀直推,零查表)
| 前缀 | 形态 | 识别方式 |
|---|---|---|
| `11` | RR | 前缀直推 |
| `10` | NONE | 前缀直推 |
| `011` | RRR | 前缀直推 |
| `010` | 见下表(8 条) | **op 查表** |
| `010 000` | IMM | 前缀直推 |
| `010 001` | SLOT | 前缀直推 |
| `010 010` | JMP | 前缀直推 |
| `010 011` | JC | 前缀直推 |
| `010 100` | CALL | 前缀直推 |
| `010 101` | CAL | 前缀直推 |
| `0010` | SLOT+off | 前缀直推 |
| `0011` | IMM64 | 前缀直推 |
| `0001` | 预留 | 待定 |
**010 区查表(8 条**
**010 区内部分区(8 条,形态位 3 位 + 子 op 2 位**
| 子 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 |
| 完整前缀 | 指令 | 子 op | 形态 | 操作数区 |
|---|---|---|---|---|
| `010 000` | LOADK | 00 | IMM | rd=23..16、imm32=55..24、pad=63..56 |
| `010 001` | LOAD | 00 | SLOT | rd=23..16、slot32=55..24、pad=63..56 |
| `010 001` | STORE | 01 | SLOT | 同上 |
| `010 010` | JMP | 00 | JMP | off32=47..16、pad=63..48 |
| `010 011` | JT | 00 | JC | rd=23..16、off32=55..24、pad=63..56 |
| `010 011` | JF | 01 | JC | 同上 |
| `010 100` | CALL | 00 | CALL | fn_id32=47..16、pad=63..48 |
| `010 101` | CAL | 00 | 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 | ✓ | — | — |
| 前缀 | 形态 | uses_rd | uses_ra | uses_rb |
|---|---|---|---|---|
| `11` | RR | ✓ | ✓(rs | — |
| `10` | NONE | — | — | — |
| `011` | RRR | ✓ | ✓ | ✓ |
| `010 000` | IMM | ✓ | — | — |
| `010 001` | SLOT | ✓ | — | — |
| `010 010` | JMP | — | — | — |
| `010 011` | JC | ✓ | — | — |
| `010 100` | CALL | — | — | — |
| `010 101` | CAL | — | — | — |
| `0010` | SLOT+off | ✓ | — | — |
| `0011` | IMM64 | ✓ | — | — |
执行:`if (uses_rd && rd >= nregs) → BadOp`——RRR 等大组零查表直推,010 区 8 条查小表
执行:`if (uses_rd && rd >= nregs) → BadOp`——所有指令零查表,形态由前缀直推
## 7. 长度组 × 操作数区
| 前缀 | 长度 | 操作数区(bit16 起) |
|---|---|---|
| 11/10 | 4B | RR: rd=23..16、rs=31..24NONE: pad=31..16 |
| 011/010 | 8B | RRR: rd+rs1+rs2+pad其余见 §5 查表 |
| 011/010 | 8B | RRR: rd+rs1+rs2+pad010 区六形态见 §5 |
| 0010/0011 | 16B | SLOT+off: rd+slot32+off32+padIMM64: rd+imm64+pad |
| 0001 | 32B | 预留(操作数区 30B,格式待定) |
@@ -119,6 +135,6 @@ 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],空位待全部编码后定
- 前缀分区:用户提出 `011`=RRR、`010`=其他;后定 010 区内部分区(形态位 3 位+子 op 2 位),**全部形态前缀直推、零查表**`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