指令编码: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
+4 -4
View File
@@ -22,8 +22,8 @@
### 2.1 变长指令,前缀编码 + 形态分区
- 指令长度**不固定**:4 / 8 / 16 字节(32 字节预留);**长度与形态由前缀分区一体表达**(见 [`指令编码.md`](指令编码.md)
- **前缀分区**`11`=RR、`10`=NONE4B);`011`=RRR、`010`=其他 8 条(查表)8B);`0010`=SLOT+off、`0011`=IMM6416B);`0001`=预留(32B
- **fmt 位段已取消**(用户定案):形态由前缀分区 + 010 区查表表达
- **前缀分区**`11`=RR、`10`=NONE4B);`011`=RRR、`010 000/001/010/011/100/101`=IMM/SLOT/JMP/JC/CALL/CAL8B);`0010`=SLOT+off、`0011`=IMM6416B);`0001`=预留(32B
- **fmt 位段已取消**(用户定案):形态全部由前缀分区表达(含 010 区内部分区,零查表)
```text
字节 0 字节 1 字节 2..n(按长度组)
@@ -40,14 +40,14 @@
| 长度组 | 指令长度 | 形态分区 | 操作数区 |
|---|---|---|---|
| `11`/`10` | 4 字节 | RR / NONE | rd + rs1(各 1B/ 无 |
| `011`/`010` | 8 字节 | RRR / 其他 8 条(查表 | rd+rs1+rs2 / 见查表 |
| `011`/`010` | 8 字节 | RRR / 010 区六形态(分区直推 | rd+rs1+rs2 / 见指令编码.md §5 |
| `0010`/`0011` | 16 字节 | SLOT+off / IMM64 | rd + slot32 + off32 / rd + imm64 |
| `0001` | 32 字节 | 预留 | 超大立即数/未来扩展 |
- 取指:读字节 0 → 前缀定总长 → 搬 4/8/16 字节
- **推导**(编码在头两字节):
- 指令长度 + 形态 ← 前缀分区(010 区查表)
- uses_rd/uses_ra/uses_rb ← 形态:RRR 全真直推;010 区查表(指令编码.md §6
- uses_rd/uses_ra/uses_rb ← 形态:全部前缀直推(指令编码.md §6
- 数据宽度/符号 ← `func` 位段(查 constexpr 宽度/符号表)
- **字段访问统一为 LOAD/STORE 16B 变体**`LOAD rd, slot, off32`(基槽 + 偏移,编译期算死)——结构体字段与 FB 共享体字段**同一指令**,无单独 LOADF
- **跳转偏移字节化**:off32(字节,相对下一条);pc/code_offset/code_len 全字节单位;code 段 16 字节对齐
+26 -19
View File
@@ -6,13 +6,13 @@
## 编码规则摘要(详见指令编码.md)
- **字节 0** = 长度前缀 + 形态分区 + 主操作码:`11`/`10`+op:64B)、`011`/`010`+op:58B)、`0010`/`0011`+op:416B)、`0001`+op:432B
- **字节 0** = 长度前缀 + 形态分区 + 主操作码:`11`/`10`+op:64B)、`011`/`010 xxx`+op:28B)、`0010`/`0011`+op:416B)、`0001`+op:432B
- **字节 1** = `[func:4 | 空:4]`(空位待全部编码后定)
- **形态由前缀分区表达**(fmt 位段已取消):`11`=RR、`10`=NONE、`011`=RRR、`010`=其他 8 条(查表)`0010`=SLOT+off、`0011`=IMM64
- **形态由前缀分区表达**(fmt 位段已取消,零查表):`11`=RR、`10`=NONE、`011`=RRR、`010 000/001/010/011/100/101`=IMM/SLOT/JMP/JC/CALL/CAL`0010`=SLOT+off、`0011`=IMM64
- **func**(语义随 op):0..7 = 宽度×符号(1B无/1B有/2B无/2B有/4B无/4B有/8B无/8B有)、8=F32、9=F64、`—`=无类型(编码 0 保留)
- disasm 按 func 显示类型后缀(A7 定案):func=3 → `LOAD.I16 r5, s3`
- 无类型指令(跳转/调用/RET/NOP/CALfunc 编码为 0(不使用)
- 010 区 8 条(LOADK/LOAD/STORE/JMP/JT/JF/CALL/CAL)形态查表:见指令编码.md §5
- 010 区 8 条(LOADK/LOAD/STORE/JMP/JT/JF/CALL/CAL)形态由前缀分区直推:见指令编码.md §5
@@ -23,7 +23,7 @@
| 字段 | 位号 | 说明 |
|---|---|---|
| 长度前缀+形态分区 | 4B: bit7..6`11`=RR / `10`=NONE);8B: bit7..5`011`=RRR / `010`=其他);16B: bit7..4`0010`=SLOT+off / `0011`=IMM64);32B: bit7..4`0001`=预留) | 长度与形态分区一体 |
| 长度前缀+形态分区 | 4B: bit7..6`11`=RR / `10`=NONE);8B: bit7..5`011`=RRR / `010`=其他 6 形态分区:bit4..2 形态位 + bit1..0 子 op);16B: bit7..4`0010`=SLOT+off / `0011`=IMM64);32B: bit7..4`0001`=预留) | 长度与形态分区一体 |
| opcode | 4B: bit5..0 / 8B: bit4..0 / 16B: bit3..0 / 32B: bit3..0 | 分区内独立编号(0 起) |
| func | bit15..12 | 功能细节(宽度×符号/浮点),语义随 op |
| (空) | bit11..8 | 待全部指令编码完后决定用途 |
@@ -35,7 +35,12 @@
| `11` | RR | 4B | rd=23..16、rs=31..24 | 前缀直推 |
| `10` | NONE | 4B | pad=31..16 | 前缀直推 |
| `011` | RRR | 8B | rd=23..16、rs1=31..24、rs2=39..32、pad=63..40 | 前缀直推 |
| `010` | IMM/SLOT/JMP/JC/CALL/CAL | 8B | 8 条查表(指令编码.md §5) | **op 查表** |
| `010 000` | IMM | 8B | rd=23..16、imm32=55..24、pad=63..56 | 前缀直推 |
| `010 001` | SLOT | 8B | rd=23..16、slot32=55..24、pad=63..56 | 前缀直推 |
| `010 010` | JMP | 8B | off32=47..16、pad=63..48 | 前缀直推 |
| `010 011` | JC | 8B | rd=23..16、off32=55..24、pad=63..56 | 前缀直推 |
| `010 100` | CALL | 8B | fn_id32=47..16、pad=63..48 | 前缀直推 |
| `010 101` | CAL | 8B | fb_id16=31..16、slot32=63..32 | 前缀直推 |
| `0010` | SLOT+off | 16B | rd=23..16、slot32=55..24、off32=87..56、pad=127..88 | 前缀直推 |
| `0011` | IMM64 | 16B | rd=23..16、imm64=87..24、pad=127..88 | 前缀直推 |
| `0001` | 预留 | 32B | 操作数区 30Bbit 240..16),格式待定 | — |
@@ -67,12 +72,14 @@ bit63 40 bit39 32 bit31 24 bit23 16 bit15 12 bit11 8 bit7
└─────────────────┴──────────┴──────────┴──────────┴─────────┴───────┴───────────┘
```
**010 区(8B = bit63..0**形态查表(指令编码.md §5)——IMM/SLOT/JMP/JC/CALL/CAL 六种操作数布局
**010 区(8B = bit63..0**前缀 `010` + 3 位形态位(bit4..2+ 2 位子 opbit1..0)——形态全部直推
```text
IMM/SLOT: rd=23..16、imm32|slot32=55..24、pad=63..56
JMP/CALL: off32|fn_id32=47..16、pad=63..48
JC: rd=23..16、off32=55..24、pad=63..56
CAL: fb_id16=31..16、slot32=63..32
IMM(010000): rd=23..16、imm32=55..24、pad=63..56
SLOT(010001): rd=23..16、slot32=55..24、pad=63..56
JMP(010010): off32=47..16、pad=63..48
JC(010011): rd=23..16、off32=55..24、pad=63..56
CALL(010100): fn_id32=47..16、pad=63..48
CAL(010101): fb_id16=31..16、slot32=63..32
```
**SLOT+off(前缀 `0010`16B = bit127..0**
@@ -100,8 +107,8 @@ bit127 88 bit87 24 bit23 16 bit15 12 bit11 8 bit7 0
| 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 |
|---|---|---|---|---|---|---|---|
| MOVE | 4B | `11000000` | RR | 宽度:0=1B/1=2B/2=4B/3=8B | rd, rs | 寄存器搬运(只搬宽度,不管符号/浮点) | 核心 |
| LOAD | 8B | `01000001` | SLOT | 全矩阵 0..9 | rd, slot | 槽→寄存器(按 func 读宽+扩展) | 核心 |
| STORE | 8B | `01000010` | SLOT | 全矩阵 0..9 | slot, rs | 寄存器→槽(按 func 写宽) | 核心 |
| LOAD | 8B | `01000100` | SLOT | 全矩阵 0..9 | rd, slot | 槽→寄存器(按 func 读宽+扩展) | 核心 |
| STORE | 8B | `01000101` | SLOT | 全矩阵 0..9 | slot, rs | 寄存器→槽(按 func 写宽) | 核心 |
| LOADK | 8B | `01000000` | IMM | 全矩阵 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 | 字段写 | 核心 |
@@ -179,12 +186,12 @@ bit127 88 bit87 24 bit23 16 bit15 12 bit11 8 bit7 0
| 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 |
|---|---|---|---|---|---|---|---|
| JMP | 8B | `01000011` | JMP | — | off32 | 无条件跳转(相对下一条,字节) | 核心 |
| JT | 8B | `01000100` | JC | — | rd, off | rd≠0 跳转 | 核心 |
| JF | 8B | `01000101` | JC | — | rd, off | rd==0 跳转 | 核心 |
| CALL | 8B | `01000110` | CALL | — | fn_id | 压帧调用(r0..r7 复制) | 核心 |
| JMP | 8B | `01001000` | JMP | — | off32 | 无条件跳转(相对下一条,字节) | 核心 |
| JT | 8B | `01001100` | JC | — | rd, off | rd≠0 跳转 | 核心 |
| JF | 8B | `01001101` | JC | — | rd, off | rd==0 跳转 | 核心 |
| CALL | 8B | `01010000` | CALL | — | fn_id | 压帧调用(r0..r7 复制) | 核心 |
| RET | 4B | `10000001` | NONE | — | — | 弹帧 / MAIN 周期结束 | 核心 |
| CAL | 8B | `01000111` | CAL | — | fb_id, slot | 内建 FB 调用(fb_id 查 [[fb]] 表) | 核心 |
| CAL | 8B | `01010100` | CAL | — | fb_id, slot | 内建 FB 调用(fb_id 查 [[fb]] 表) | 核心 |
| JTBL | 32B | `00010000` | 预留 | — | rd, slot, n | CASE 跳转表 | 预留 |
## 8. 内建 FBCAL + fb_id[[fb]] 表)
@@ -241,10 +248,10 @@ bit127 88 bit87 24 bit23 16 bit15 12 bit11 8 bit7 0
| `11` | RR | 64 | 21 | MOVE/NOT/NEG/ABS/INC/DEC/浮点单目 10/舍入 4/CONV | 43 |
| `10` | NONE | 64 | 2 | NOP/RET | 62 |
| `011` | RRR | 32 | 26 | 算术 6 + 逻辑 6 + 移位 4 + 位操作 4 + CMP 6 | 6 |
| `010` | 其他(查表) | 32 | 8 | LOADK/LOAD/STORE/JMP/JT/JF/CALL/CAL | 24 |
| `010 000`..`010 101` | IMM/SLOT/JMP/JC/CALL/CAL | 6×4 | 8 | LOADK(1)/LOAD·STORE(2)/JMP(1)/JT·JF(2)/CALL(1)/CAL(1) | 16(含 2 个预留形态区) |
| `0010` | SLOT+off | 16 | 8 | LOAD_OFF/STORE_OFF + 字符串 6 | 8 |
| `0011` | IMM64 | 16 | 1 | LOADK64 | 15 |
| `0001` | 预留 | 16 | 6 | JTBL + STR_CONCAT/FIND/REPLACE + ARR_LOAD/STORE | 10 |
> 编码约定:op 按分区独立编号;无类型指令 func=0;010 区形态查表(指令编码.md §5);
> 编码约定:op 按分区独立编号;无类型指令 func=0;010 区形态由前缀分区直推(指令编码.md §5);
> 字符串/数组的具体操作数形态在实现时定稿(`0001` 区)。