From ee1e06c62800f41ba19904135d30d1bf0fcd0a9a Mon Sep 17 00:00:00 2001 From: chentianya Date: Mon, 24 Aug 2026 15:33:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=87=E4=BB=A4=E7=BC=96=E7=A0=81=EF=BC=9A01?= =?UTF-8?q?0=20=E5=8C=BA=E4=B9=9F=E6=94=B9=E5=89=8D=E7=BC=80=E5=88=86?= =?UTF-8?q?=E5=8C=BA=EF=BC=88=E5=BD=A2=E6=80=81=E4=BD=8D3+=E5=AD=90op2?= =?UTF-8?q?=EF=BC=89=EF=BC=8C=E5=85=A8=E9=83=A8=E5=BD=A2=E6=80=81=E5=89=8D?= =?UTF-8?q?=E7=BC=80=E7=9B=B4=E6=8E=A8=E3=80=81=E9=9B=B6=E6=9F=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 预留形态区 --- Doc/isa/指令编码.md | 72 ++++++++++++++++++++++++++----------------- Doc/isa/指令集优化.md | 8 ++--- Doc/isa/指令集清单.md | 45 +++++++++++++++------------ 3 files changed, 74 insertions(+), 51 deletions(-) diff --git a/Doc/isa/指令编码.md b/Doc/isa/指令编码.md index c76e4cf..150c4b5 100644 --- a/Doc/isa/指令编码.md +++ b/Doc/isa/指令编码.md @@ -32,14 +32,20 @@ func 决定"功能的细节"(宽度/符号/浮点) | `11` | 4B | 11 | **RR** | 6 位 | 64 | MOVE/NOT/NEG/ABS/INC/DEC/浮点单目/舍入/CONV(21) | | `10` | 4B | 10 | **NONE** | 6 位 | 64 | NOP/RET(2) | | `011` | 8B | 011 | **RRR** | 5 位 | 32 | 算术/逻辑/移位/位操作/比较(26) | -| `010` | 8B | 010 | **查表**(6 种形态) | 5 位 | 32 | LOADK/LOAD/STORE/JMP/JT/JF/CALL/CAL(8,见 §5) | +| `010 000` | 8B | 010 000 | **IMM** | 2 位 | 4 | LOADK(1) | +| `010 001` | 8B | 010 001 | **SLOT** | 2 位 | 4 | LOAD/STORE(2) | +| `010 010` | 8B | 010 010 | **JMP** | 2 位 | 4 | JMP(1) | +| `010 011` | 8B | 010 011 | **JC** | 2 位 | 4 | JT/JF(2) | +| `010 100` | 8B | 010 100 | **CALL** | 2 位 | 4 | CALL(1) | +| `010 101` | 8B | 010 101 | **CAL** | 2 位 | 4 | CAL(1) | +| `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 | LOADK64(1) | | `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 | -|---|---|---|---| -| RR(11) | ✓ | ✓(rs) | — | -| NONE(10) | — | — | — | -| RRR(011) | ✓ | ✓ | ✓ | -| 010 区 | 查表(IMM/SLOT/JC 的 rd ✓;JMP/CALL/CAL —) | 查表(—) | 查表(—) | -| SLOT+off(0010) | ✓ | — | — | -| IMM64(0011) | ✓ | — | — | +| 前缀 | 形态 | 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..24;NONE: pad=31..16 | -| 011/010 | 8B | RRR: rd+rs1+rs2+pad;其余见 §5 查表 | +| 011/010 | 8B | RRR: rd+rs1+rs2+pad;010 区六形态见 §5 | | 0010/0011 | 16B | SLOT+off: rd+slot32+off32+pad;IMM64: rd+imm64+pad | | 0001 | 32B | 预留(操作数区 30B,格式待定) | @@ -119,6 +135,6 @@ func 决定"功能的细节"(宽度/符号/浮点) ## 9. 决策历史 - 用户提出 RISC-V 式:opcode 定功能、func 定细节 -- 前缀分区:用户提出 `011`=RRR、`010`=其他(8 条查表);`11`=RR、`10`=NONE(4B);`0010`=SLOT+off、`0011`=IMM64(16B) -- **fmt 位段取消**:形态由前缀分区 + 010 区查表表达;字节 1 = [func:4 | 空:4],空位待全部编码后定 +- 前缀分区:用户提出 `011`=RRR、`010`=其他;后定 010 区内部分区(形态位 3 位+子 op 2 位),**全部形态前缀直推、零查表**;`11`=RR、`10`=NONE(4B);`0010`=SLOT+off、`0011`=IMM64(16B) +- **fmt 位段取消**:形态全部由前缀分区表达(010 区内部再分区,零查表);字节 1 = [func:4 | 空:4],空位待全部编码后定 - func 4 位(10 组合);MOVE 只管宽度;19 类型 → 10 func 编译期映射;BOOL 编译器强制 0/1 diff --git a/Doc/isa/指令集优化.md b/Doc/isa/指令集优化.md index 9903f4c..73ad757 100644 --- a/Doc/isa/指令集优化.md +++ b/Doc/isa/指令集优化.md @@ -22,8 +22,8 @@ ### 2.1 变长指令,前缀编码 + 形态分区 - 指令长度**不固定**: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 区查表表达 +- **前缀分区**:`11`=RR、`10`=NONE(4B);`011`=RRR、`010 000/001/010/011/100/101`=IMM/SLOT/JMP/JC/CALL/CAL(8B);`0010`=SLOT+off、`0011`=IMM64(16B);`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 字节对齐 diff --git a/Doc/isa/指令集清单.md b/Doc/isa/指令集清单.md index c1cf61a..3edc753 100644 --- a/Doc/isa/指令集清单.md +++ b/Doc/isa/指令集清单.md @@ -6,13 +6,13 @@ ## 编码规则摘要(详见指令编码.md) -- **字节 0** = 长度前缀 + 形态分区 + 主操作码:`11`/`10`+op:6(4B)、`011`/`010`+op:5(8B)、`0010`/`0011`+op:4(16B)、`0001`+op:4(32B) +- **字节 0** = 长度前缀 + 形态分区 + 主操作码:`11`/`10`+op:6(4B)、`011`/`010 xxx`+op:2(8B)、`0010`/`0011`+op:4(16B)、`0001`+op:4(32B) - **字节 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/CAL)func 编码为 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 | 操作数区 30B(bit 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 位子 op(bit1..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. 内建 FB(CAL + 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` 区)。