diff --git a/Doc/isa/指令集优化.md b/Doc/isa/指令集优化.md index a91ff35..9903f4c 100644 --- a/Doc/isa/指令集优化.md +++ b/Doc/isa/指令集优化.md @@ -19,37 +19,36 @@ ## 2. 已定案设计 -### 2.1 变长指令,长度编码在 opcode +### 2.1 变长指令,前缀编码 + 形态分区 -- 指令长度**不固定**:4 / 8 / 16 字节(32 字节预留) -- **长度组 = opcode 高 2 位**:`[len:2 | op:6]`;长度组 = 操作数形态(fmt)的自然覆盖 +- 指令长度**不固定**:4 / 8 / 16 字节(32 字节预留);**长度与形态由前缀分区一体表达**(见 [`指令编码.md`](指令编码.md)) +- **前缀分区**:`11`=RR、`10`=NONE(4B);`011`=RRR、`010`=其他 8 条(查表)(8B);`0010`=SLOT+off、`0011`=IMM64(16B);`0001`=预留(32B) +- **fmt 位段已取消**(用户定案):形态由前缀分区 + 010 区查表表达 ```text -字节 0 字节 1 字节 2..n(按长度组) -[len:2 | op:6] [type:5 | fmt:3] 操作数区 +字节 0 字节 1 字节 2..n(按长度组) +[前缀+形态分区 | op] [func:4 | 空:4] 操作数区 ``` -| 位段 | 宽度 | 内容 | +| 位段 | 位号 | 内容 | |---|---|---| -| len | 2 | 4 / 8 / 16B + 32B 预留 | -| op | 6 | 主操作码(64 空间,实际约 30 个) | -| type | 5 | **32 种:19 IEC 基础类型 + 13 预留** | -| fmt | 3 | 8 种形态:**RR、RRR、IMM、SLOT、JMP、JC、NONE、预留** | +| 前缀+分区 | 4B: bit7..6 / 8B: bit7..5 / 16B: bit7..4 / 32B: bit7..4 | 长度与形态分区 | +| op | 4B: bit5..0 / 8B: bit4..0 / 16B: bit3..0 / 32B: bit3..0 | 分区内独立编号 | +| func | bit15..12 | 数据语义(宽度×符号/浮点),语义随 op | +| 空 | bit11..8 | 待全部编码完后定用途 | -**格式合并(9 → 7 种形态)**:`CALL` 并入 **IMM**(fn_id 即 32 位立即数,rd 未用)、`CAL` 并入 **SLOT**(实例号即槽号,rd 未用)——形态相同,指令身份由 op 位段区分。 - -| 长度组 | 指令长度 | 覆盖形态 | 操作数区 | +| 长度组 | 指令长度 | 形态分区 | 操作数区 | |---|---|---|---| -| `00` | 4 字节 | NONE / RR | rd + rs1(各 1B) | -| `01` | 8 字节 | RRR / IMM / SLOT / JMP / JC | + rs2 + slot32/fn_id32/const_id32/off32 | -| `10` | 16 字节 | **SLOT+off**(字段访问)/ IMM64 | + slot32 + off32/imm64 | -| `11` | 32 字节 | 预留 | 超大立即数/未来扩展 | +| `11`/`10` | 4 字节 | RR / NONE | rd + rs1(各 1B)/ 无 | +| `011`/`010` | 8 字节 | RRR / 其他 8 条(查表) | rd+rs1+rs2 / 见查表 | +| `0010`/`0011` | 16 字节 | SLOT+off / IMM64 | rd + slot32 + off32 / rd + imm64 | +| `0001` | 32 字节 | 预留 | 超大立即数/未来扩展 | -- 取指:读字节 0 → `len` 位段定总长 → 搬 4/8/16 字节 -- **位掩码推导**(全部编码在头 2 字节): - - 指令长度 ← `len` 组 - - 操作数形态 ← `fmt`:`uses_rd = fmt∈{RR,RRR,IMM,SLOT,JC}`、`uses_ra = fmt∈{RR,RRR}`、`uses_rb = {RRR}`(CALL/CAL 的 rd 恒 0,按 fmt 检查无害) - - 数据宽度/符号 ← `type`(查 constexpr 宽度/符号表) +- 取指:读字节 0 → 前缀定总长 → 搬 4/8/16 字节 +- **推导**(编码在头两字节): + - 指令长度 + 形态 ← 前缀分区(010 区查表) + - uses_rd/uses_ra/uses_rb ← 形态:RRR 全真直推;010 区查表(指令编码.md §6) + - 数据宽度/符号 ← `func` 位段(查 constexpr 宽度/符号表) - **字段访问统一为 LOAD/STORE 16B 变体**:`LOAD rd, slot, off32`(基槽 + 偏移,编译期算死)——结构体字段与 FB 共享体字段**同一指令**,无单独 LOADF - **跳转偏移字节化**:off32(字节,相对下一条);pc/code_offset/code_len 全字节单位;code 段 16 字节对齐 @@ -146,8 +145,8 @@ | 项 | V1(现状) | V2(定案) | |---|---|---| | 指令长度 | 固定 32bit | **变长 4/8/16B**,长度在 opcode | -| opcode | 0..33 乱序,无位域 | `[len:2\|op:6]` + `[type:5\|fmt:3]` 位域 | -| 格式 | 9 种(RR/RRR/IMM/SLOT/JMP/JC/CALL/CAL/NONE) | **7 种形态**(CALL→IMM、CAL→SLOT 合并)+ 1 预留 | +| opcode | 0..33 乱序,无位域 | `[前缀+形态分区\|op]` + `[func:4\|空:4]` | +| 格式 | 9 种(RR/RRR/IMM/SLOT/JMP/JC/CALL/CAL/NONE) | **形态由前缀分区表达**(11/10/011/010查表/0010/0011),fmt 位段取消 | | 寄存器编号 | 8 位(256/帧) | 8 位(256/帧,不变) | | 变量访问 | 立即数槽号直接寻址 | **槽表引用 → 值区**(两级间接) | | 槽 | 8B 定宽 | 8B 引用表({addr:u32}) |