From 134f1748ec9df6d6860a71864e6610b141a18c83 Mon Sep 17 00:00:00 2001 From: chentianya Date: Mon, 24 Aug 2026 15:30:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=87=E4=BB=A4=E7=BC=96=E7=A0=81=EF=BC=9Afm?= =?UTF-8?q?t=20=E4=BD=8D=E6=AE=B5=E5=8F=96=E6=B6=88=EF=BC=8C=E5=BD=A2?= =?UTF-8?q?=E6=80=81=E6=94=B9=E7=94=B1=E5=89=8D=E7=BC=80=E5=88=86=E5=8C=BA?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=EF=BC=88Q1=3D010=20=E6=9F=A5=E8=A1=A8=20/=20?= =?UTF-8?q?Q2=20=E7=A9=BA=E4=BD=8D=E5=BE=85=E5=AE=9A=20/=20Q3=20=E5=85=A8?= =?UTF-8?q?=E7=BB=84=E5=88=86=E5=8C=BA=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 前缀分区: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 --- Doc/compiler/编译器优化.md | 4 +- Doc/isa/指令编码.md | 169 +++++++++++----------- Doc/isa/指令集清单.md | 286 ++++++++++++++++--------------------- 3 files changed, 203 insertions(+), 256 deletions(-) diff --git a/Doc/compiler/编译器优化.md b/Doc/compiler/编译器优化.md index b1e55ce..bad5742 100644 --- a/Doc/compiler/编译器优化.md +++ b/Doc/compiler/编译器优化.md @@ -54,7 +54,7 @@ ### 3.4 变长指令对 codegen 的影响 - **跳转回填改字节单位**:`patch_jump` 按字节(off32,相对下一条),pc/code_offset/code_len 全字节化 -- 发射器(E_*)按 fmt 决定长度组(4/8/16B),指令缓冲按字节追加 +- 发射器(E_*)按前缀分区决定长度组(4/8/16B),指令缓冲按字节追加 - 取指/对齐:code 段 16 字节对齐 ### 3.5 类型系统扩展(ST 层) @@ -86,7 +86,7 @@ | Typecheck | 禁隐式转换(严格一致)+ 字面量上下文适配、19 类型元数据 | | Linker | 槽表条目分配(addr:u32)、FB 实例字段偏移 | | Codegen | E_* 变长发射、字节化回填、槽表+值区 layout、FB 共享体(16B 变体) | -| MachineConfig / machine.toml | type 表 19 条(base/width/signed/tag)、fmt/type 位段互锁校验 | +| MachineConfig / machine.toml | type 表 19 条(base/width/signed/tag)、前缀分区/func 位段校验 | ## 6. 实施阶段(合并进指令集优化.md §6) diff --git a/Doc/isa/指令编码.md b/Doc/isa/指令编码.md index 33d85f6..c76e4cf 100644 --- a/Doc/isa/指令编码.md +++ b/Doc/isa/指令编码.md @@ -1,57 +1,47 @@ -# 指令编码(V2:RISC-V 式 op + func) +# 指令编码(V2:RISC-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 同一 opcode,funct3 区分符号 - -本方案: 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/浮点单目/舍入/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) | +| `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,形态待定) | -### 2.2 字节 1:func + 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, rs(MOVE/NOT/浮点单目) | -| 1 | RRR | rd, ra, rb(算术/比较/位运算) | -| 2 | IMM | rd, 32 位立即数(LOADK/CALL) | -| 3 | SLOT | rd, slot32(LOAD/STORE/CAL) | -| 4 | JMP | off32 | -| 5 | JC | rd, off(JT/JF) | -| 6 | CALL | fn_id(独立格式,未合并) | -| 7 | CAL | fb_id, slot(独立格式,未合并) | -| 8 | NONE | 无操作数(RET/NOP) | -| 9 | SLOT+off | rd, slot, off(16B:结构体/FB 字段访问) | -| 10 | IMM64 | rd, imm64(16B:64 位立即数内嵌) | -| 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 | +|---|---|---|---| +| RR(11) | ✓ | ✓(rs) | — | +| NONE(10) | — | — | — | +| RRR(011) | ✓ | ✓ | ✓ | +| 010 区 | 查表(IMM/SLOT/JC 的 rd ✓;JMP/CALL/CAL —) | 查表(—) | 查表(—) | +| SLOT+off(0010) | ✓ | — | — | +| IMM64(0011) | ✓ | — | — | + +执行:`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..24;NONE: pad=31..16 | +| 011/010 | 8B | RRR: rd+rs1+rs2+pad;其余见 §5 查表 | +| 0010/0011 | 16B | SLOT+off: rd+slot32+off32+pad;IMM64: 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/1(TRUE/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(按长度组分治) | -| 细节 | funct3(3 位)/ funct7 | func(4 位,10 组合) | -| 形态 | rd/rs1/rs2/imm 固定位置 | fmt(4 位,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`=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 e430e6c..c1cf61a 100644 --- a/Doc/isa/指令集清单.md +++ b/Doc/isa/指令集清单.md @@ -6,173 +6,126 @@ ## 编码规则摘要(详见指令编码.md) -- **字节 0** = 长度前缀 + 主操作码:`1`+op:7(4B)、`01`+op:6(8B)、`001`+op:5(16B)、`0001`+op:4(32B) -- **字节 1** = `[func:4 | fmt:4]` +- **字节 0** = 长度前缀 + 形态分区 + 主操作码:`11`/`10`+op:6(4B)、`011`/`010`+op:5(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 - **func**(语义随 op):0..7 = 宽度×符号(1B无/1B有/2B无/2B有/4B无/4B有/8B无/8B有)、8=F32、9=F64、`—`=无类型(编码 0 保留) -- **fmt**:0=RR、1=RRR、2=IMM、3=SLOT、4=JMP、5=JC、6=CALL、7=CAL、8=NONE - 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 -## 1. fmt 格式与字段位号 +## 1. 前缀分区与字段位号 ### 1.1 通用头部(字节 0 + 字节 1,所有指令相同) | 字段 | 位号 | 说明 | |---|---|---| -| 长度前缀 | 4B: bit7 / 8B: bit7..6 / 16B: bit7..5 / 32B: bit7..4 | `1` / `01` / `001` / `0001` | -| opcode | 4B: bit6..0 / 8B: bit5..0 / 16B: bit4..0 / 32B: bit3..0 | 组内独立编号(0 起) | +| 长度前缀+形态分区 | 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`=预留) | 长度与形态分区一体 | +| opcode | 4B: bit5..0 / 8B: bit4..0 / 16B: bit3..0 / 32B: bit3..0 | 分区内独立编号(0 起) | | func | bit15..12 | 功能细节(宽度×符号/浮点),语义随 op | -| fmt | bit11..8 | 操作数形态(下表) | +| (空) | bit11..8 | 待全部指令编码完后决定用途 | -### 1.2 fmt 位号总表(操作数区 = bit16 起;pad = 对齐填充,编码固定 0) +### 1.2 形态分区总表(操作数区 = bit16 起;pad = 对齐填充,编码固定 0) -| fmt | 形态 | 长度组 | 操作数区字段位号 | -|---|---|---|---| -| 0 | RR | 4B | rd=23..16、rs=31..24 | -| 1 | RRR | 8B | rd=23..16、rs1=31..24、rs2=39..32、pad=63..40 | -| 2 | IMM | 8B | rd=23..16、imm32=55..24、pad=63..56 | -| 3 | SLOT | 8B | rd=23..16、slot32=55..24、pad=63..56 | -| 4 | JMP | 8B | off32=47..16、pad=63..48 | -| 5 | JC | 8B | rd=23..16、off32=55..24、pad=63..56 | -| 6 | CALL | 8B | fn_id32=47..16、pad=63..48 | -| 7 | CAL | 8B | fb_id16=31..16、slot32=63..32 | -| 8 | NONE | 4B | pad=31..16 | -| 9 | SLOT+off | 16B | rd=23..16、slot32=55..24、off32=87..56、pad=127..88 | -| 10 | IMM64 | 16B | rd=23..16、imm64=87..24、pad=127..88 | -| 11..15 | 预留 | 32B | 操作数区 30B(bit 240..16),格式待定 | +| 前缀 | 形态 | 长度组 | 操作数区字段位号 | 识别方式 | +|---|---|---|---|---| +| `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 查表** | +| `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),格式待定 | — | ### 1.3 各位图(bit 从左(高)到右(低);小端字节序:字节 0 = bit0..7 在右端) -**fmt=0 RR(4B = bit31..0)** +**RR(前缀 `11`,4B = bit31..0)** ```text bit31 24 bit23 16 bit15 12 bit11 8 bit7 0 ┌────────────────┬────────────────┬───────────┬─────────┬───────────┐ -│ rs:8 (31..24) │ rd:8 (23..16) │ func:4 │ fmt:4 │ 前缀1+op:7 │ +│ rs:8 (31..24) │ rd:8 (23..16) │ func:4 │ 空:4 │ 前缀11+op:6│ └────────────────┴────────────────┴───────────┴─────────┴───────────┘ ``` -**fmt=1 RRR(8B = bit63..0)** +**NONE(前缀 `10`,4B = bit31..0)** ```text -bit63 40 bit39 32 bit31 24 bit23 16 bit15 12 bit11 8 bit7 0 -┌─────────────────┬──────────┬──────────┬──────────┬─────────┬───────┬──────────┐ -│ pad:24 (63..40) │ rs2:8 │ rs1:8 │ rd:8 │ func:4 │ fmt:4 │ 前缀01+op6│ -│ │ (39..32) │ (31..24) │ (23..16) │ (15..12)│(11..8)│ (7..0) │ -└─────────────────┴──────────┴──────────┴──────────┴─────────┴───────┴──────────┘ +bit31 16 bit15 12 bit11 8 bit7 0 +┌──────────────────┬─────────┬───────┬───────────┐ +│ pad:16 (31..16) │ func:4 │ 空:4 │ 前缀10+op:6│ +└──────────────────┴─────────┴───────┴───────────┘ ``` -**fmt=2 IMM(8B = bit63..0)** +**RRR(前缀 `011`,8B = bit63..0)** ```text -bit63 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0 -┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐ -│ pad:8 (63..56)│ imm32 (55..24)│ rd:8 (23..16)│ func:4 │ fmt:4 │ 前缀01+op6│ -└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘ +bit63 40 bit39 32 bit31 24 bit23 16 bit15 12 bit11 8 bit7 0 +┌─────────────────┬──────────┬──────────┬──────────┬─────────┬───────┬───────────┐ +│ pad:24 (63..40) │ rs2:8 │ rs1:8 │ rd:8 │ func:4 │ 空:4 │ 前缀011+op5│ +│ │ (39..32) │ (31..24) │ (23..16) │ (15..12)│(11..8)│ (7..0) │ +└─────────────────┴──────────┴──────────┴──────────┴─────────┴───────┴───────────┘ ``` -**fmt=3 SLOT(8B = bit63..0)** +**010 区(8B = bit63..0)**:形态查表(指令编码.md §5)——IMM/SLOT/JMP/JC/CALL/CAL 六种操作数布局: ```text -bit63 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0 -┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐ -│ pad:8 (63..56)│ slot32 (55..24)│ rd:8 (23..16)│ func:4 │ fmt:4 │前缀01+op6│ -└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘ +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 ``` -**fmt=4 JMP(8B = bit63..0)** -```text -bit63 48 bit47 16 bit15 12 bit11 8 bit7 0 -┌──────────────┬─────────────┬─────────┬───────┬──────────┐ -│ pad:16 │ off32 (47..16)│ func:4 │ fmt:4 │前缀01+op6│ -│ (63..48) │ │ (15..12)│(11..8)│ (7..0) │ -└──────────────┴─────────────┴─────────┴───────┴──────────┘ -``` - -**fmt=5 JC(8B = bit63..0)** -```text -bit63 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0 -┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐ -│ pad:8 (63..56)│ off32 (55..24)│ rd:8 (23..16)│ func:4 │ fmt:4 │ 前缀01+op6│ -└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘ -``` - -**fmt=6 CALL(8B = bit63..0)** -```text -bit63 48 bit47 16 bit15 12 bit11 8 bit7 0 -┌──────────────┬─────────────┬─────────┬───────┬──────────┐ -│ pad:16 │ fn_id32 │ func:4 │ fmt:4 │前缀01+op6│ -│ (63..48) │ (47..16) │ (15..12)│(11..8)│ (7..0) │ -└──────────────┴─────────────┴─────────┴───────┴──────────┘ -``` - -**fmt=7 CAL(8B = bit63..0)** -```text -bit63 32 bit31 16 bit15 12 bit11 8 bit7 0 -┌────────────────┬──────────────┬─────────┬───────┬──────────┐ -│ slot32 (63..32)│ fb_id16 │ func:4 │ fmt:4 │ 前缀01+op6│ -│ │ (31..16) │ (15..12)│(11..8)│ (7..0) │ -└────────────────┴──────────────┴─────────┴───────┴──────────┘ -``` - -**fmt=8 NONE(4B = bit31..0)** -```text -bit31 16 bit15 12 bit11 8 bit7 0 -┌──────────────────┬─────────┬───────┬──────────┐ -│ pad:16 (31..16) │ func:4 │ fmt:4 │ 前缀1+op7 │ -└──────────────────┴─────────┴───────┴──────────┘ -``` - -**fmt=9 SLOT+off(16B = bit127..0)** +**SLOT+off(前缀 `0010`,16B = bit127..0)** ```text bit127 88 bit87 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0 ┌─────────────────┬──────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐ -│ pad:40 │ off32 │ slot32 │ rd:8 │ func:4 │ fmt:4 │ 前缀001+op5│ -│ (127..88) │ (87..56) │ (55..24) │ (23..16) │ (15..12)│(11..8)│ (7..0) │ +│ pad:40 │ off32 │ slot32 │ rd:8 │ func:4 │ 空:4 │ 前缀0010+op4│ +│ (127..88) │ (87..56) │ (55..24) │ (23..16) │ (15..12)│(11..8)│ (7..0) │ └─────────────────┴──────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘ ``` -**fmt=10 IMM64(16B = bit127..0)** +**IMM64(前缀 `0011`,16B = bit127..0)** ```text bit127 88 bit87 24 bit23 16 bit15 12 bit11 8 bit7 0 ┌─────────────────┬────────────┬──────────────┬─────────┬───────┬──────────┐ -│ pad:40 │ imm64 │ rd:8 │ func:4 │ fmt:4 │ 前缀001+op5│ +│ pad:40 │ imm64 │ rd:8 │ func:4 │ 空:4 │ 前缀0011+op4│ │ (127..88) │ (87..24) │ (23..16) │ (15..12)│(11..8)│ (7..0) │ └─────────────────┴────────────┴──────────────┴─────────┴───────┴──────────┘ ``` -**fmt=11..15 预留(32B)**:操作数区 30B(bit 240..16),格式待实现时定稿。 +**32B 预留(前缀 `0001`)**:操作数区 30B(bit 240..16),格式待实现时定稿。 ## 2. 数据搬运 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| -| MOVE | 4B | `10000000` | RR(0) | 宽度:0=1B/1=2B/2=4B/3=8B | rd, rs | 寄存器搬运(只搬宽度,不管符号/浮点) | 核心 | -| LOAD | 8B | `01011010` | SLOT(3) | 全矩阵 0..9 | rd, slot | 槽→寄存器(按 func 读宽+扩展) | 核心 | -| STORE | 8B | `01011011` | SLOT(3) | 全矩阵 0..9 | slot, rs | 寄存器→槽(按 func 写宽) | 核心 | -| LOADK | 8B | `01011100` | IMM(2) | 全矩阵 0..9 | rd, const_id | 常量表→寄存器(按 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 写宽) | 核心 | +| 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 | 字段写 | 核心 | -| LOADK64 | 16B | `00100010` | IMM64 | 全矩阵 0..9 | rd, imm64 | 64 位立即数内嵌(免查表) | 预留 | +| LOADK64 | 16B | `00110000` | IMM64 | 全矩阵 0..9 | rd, imm64 | 64 位立即数内嵌(免查表) | 预留 | ## 3. 逻辑与位运算 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| -| NOT | 4B | `10000010` | RR(0) | 无符号宽度 0/2/4/6 | rd, rs | BOOL 逻辑非 / 位串按位取反 | 核心 | -| AND | 8B | `01000110` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 按宽度逐位与(BOOL 由编译器保证 0/1) | 核心 | -| OR | 8B | `01000111` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位或 | 核心 | -| XOR | 8B | `01001000` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位异或 | 核心 | -| NAND | 8B | `01001001` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位与非 | 扩展 | -| NOR | 8B | `01001010` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位或非 | 扩展 | -| XNOR | 8B | `01001011` | RRR(1) | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位同或 | 扩展 | -| SHL | 8B | `01001100` | RRR(1) | 无符号宽度 0/2/4/6 | rd, rs, n | 左移(n 在 rb) | 扩展 | -| SHR | 8B | `01001101` | RRR(1) | 0..7(宽度×符号,算术/逻辑右移) | rd, rs, n | 右移 | 扩展 | -| ROL | 8B | `01001110` | RRR(1) | 无符号宽度 0/2/4/6 | rd, rs, n | 循环左移(位串) | 扩展 | -| ROR | 8B | `01001111` | RRR(1) | 无符号宽度 0/2/4/6 | rd, rs, n | 循环右移 | 扩展 | -| GETBIT | 8B | `01011000` | RRR(1) | — | rd, rs, bit | 取位(bit 在 rb) | 扩展 | -| SETBIT | 8B | `01011001` | RRR(1) | — | rd, rs, bit | 置位 | 扩展 | -| CLRBIT | 8B | `01011010` | RRR(1) | — | rd, rs, bit | 清位 | 扩展 | -| TOGBIT | 8B | `01011011` | RRR(1) | — | rd, rs, bit | 翻转位 | 扩展 | +| NOT | 4B | `11000001` | RR | 无符号宽度 0/2/4/6 | rd, rs | BOOL 逻辑非 / 位串按位取反 | 核心 | +| AND | 8B | `01100110` | RRR | 无符号宽度 0/2/4/6 | rd, ra, rb | 按宽度逐位与(BOOL 由编译器保证 0/1) | 核心 | +| OR | 8B | `01100111` | RRR | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位或 | 核心 | +| XOR | 8B | `01101000` | RRR | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位异或 | 核心 | +| NAND | 8B | `01101001` | RRR | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位与非 | 扩展 | +| NOR | 8B | `01101010` | RRR | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位或非 | 扩展 | +| XNOR | 8B | `01101011` | RRR | 无符号宽度 0/2/4/6 | rd, ra, rb | 逐位同或 | 扩展 | +| SHL | 8B | `01101100` | RRR | 无符号宽度 0/2/4/6 | rd, rs, n | 左移(n 在 rb) | 扩展 | +| SHR | 8B | `01101101` | RRR | 0..7(宽度×符号,算术/逻辑右移) | rd, rs, n | 右移 | 扩展 | +| ROL | 8B | `01101110` | RRR | 无符号宽度 0/2/4/6 | rd, rs, n | 循环左移(位串) | 扩展 | +| ROR | 8B | `01101111` | RRR | 无符号宽度 0/2/4/6 | rd, rs, n | 循环右移 | 扩展 | +| GETBIT | 8B | `01110110` | RRR | — | rd, rs, bit | 取位(bit 在 rb) | 扩展 | +| SETBIT | 8B | `01110111` | RRR | — | rd, rs, bit | 置位 | 扩展 | +| CLRBIT | 8B | `01111000` | RRR | — | rd, rs, bit | 清位 | 扩展 | +| TOGBIT | 8B | `01111001` | RRR | — | rd, rs, bit | 翻转位 | 扩展 | > 注:SETBIT/CLRBIT/TOGBIT 的"目标可槽"形式(`slot, bit`)后续可在 16B 组扩展(op 预留)。 @@ -180,58 +133,58 @@ bit127 88 bit87 24 bit23 16 bit15 12 bit11 8 bit7 0 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| -| ADD | 8B | `01000000` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 整数饱和 / 浮点 IEEE / 无符号 | 核心 | -| SUB | 8B | `01000001` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 减 | 核心 | -| MUL | 8B | `01000010` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 乘 | 核心 | -| DIV | 8B | `01000011` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 除(整数零除/浮点 ±inf) | 核心 | -| MOD | 8B | `01000100` | RRR(1) | 0..7(整数) | rd, ra, rb | 取模 | 扩展 | -| EXPT | 8B | `01000101` | RRR(1) | 0..9 | rd, ra, rb | 幂 | 扩展 | -| NEG | 4B | `10000100` | RR(0) | 0..9 | rd, rs | 取负 | 扩展 | -| ABS | 4B | `10000101` | RR(0) | 0..9 | rd, rs | 绝对值 | 扩展 | -| INC | 4B | `10000110` | RR(0) | 0..9 | rd, rs | 自增 | 扩展 | -| DEC | 4B | `10000111` | RR(0) | 0..9 | rd, rs | 自减 | 扩展 | -| SQRT | 4B | `10001000` | RR(0) | 浮点 8/9 | rd, rs | 平方根 | 扩展 | -| SIN | 4B | `10001001` | RR(0) | 浮点 8/9 | rd, rs | 正弦 | 扩展 | -| COS | 4B | `10001010` | RR(0) | 浮点 8/9 | rd, rs | 余弦 | 扩展 | -| TAN | 4B | `10001011` | RR(0) | 浮点 8/9 | rd, rs | 正切 | 扩展 | -| ASIN | 4B | `10001100` | RR(0) | 浮点 8/9 | rd, rs | 反正弦 | 扩展 | -| ACOS | 4B | `10001101` | RR(0) | 浮点 8/9 | rd, rs | 反余弦 | 扩展 | -| ATAN | 4B | `10001110` | RR(0) | 浮点 8/9 | rd, rs | 反正切 | 扩展 | -| LN | 4B | `10001111` | RR(0) | 浮点 8/9 | rd, rs | 自然对数 | 扩展 | -| LOG | 4B | `10010000` | RR(0) | 浮点 8/9 | rd, rs | 常用对数 | 扩展 | -| EXP | 4B | `10010001` | RR(0) | 浮点 8/9 | rd, rs | 指数 | 扩展 | -| ROUND | 4B | `10010010` | RR(0) | 浮点 8/9 | rd, rs | 四舍五入(浮点→整数) | 扩展 | -| TRUNC | 4B | `10010011` | RR(0) | 浮点 8/9 | rd, rs | 截断 | 扩展 | -| FLOOR | 4B | `10010100` | RR(0) | 浮点 8/9 | rd, rs | 向下取整 | 扩展 | -| CEIL | 4B | `10010101` | RR(0) | 浮点 8/9 | rd, rs | 向上取整 | 扩展 | +| ADD | 8B | `01100000` | RRR | 全矩阵 0..9 | rd, ra, rb | 整数饱和 / 浮点 IEEE / 无符号 | 核心 | +| SUB | 8B | `01100001` | RRR | 全矩阵 0..9 | rd, ra, rb | 减 | 核心 | +| MUL | 8B | `01100010` | RRR | 全矩阵 0..9 | rd, ra, rb | 乘 | 核心 | +| DIV | 8B | `01100011` | RRR | 全矩阵 0..9 | rd, ra, rb | 除(整数零除/浮点 ±inf) | 核心 | +| MOD | 8B | `01100100` | RRR | 0..7(整数) | rd, ra, rb | 取模 | 扩展 | +| EXPT | 8B | `01100101` | RRR | 0..9 | rd, ra, rb | 幂 | 扩展 | +| NEG | 4B | `11000010` | RR | 0..9 | rd, rs | 取负 | 扩展 | +| ABS | 4B | `11000011` | RR | 0..9 | rd, rs | 绝对值 | 扩展 | +| INC | 4B | `11000100` | RR | 0..9 | rd, rs | 自增 | 扩展 | +| DEC | 4B | `11000101` | RR | 0..9 | rd, rs | 自减 | 扩展 | +| SQRT | 4B | `11000110` | RR | 浮点 8/9 | rd, rs | 平方根 | 扩展 | +| SIN | 4B | `11000111` | RR | 浮点 8/9 | rd, rs | 正弦 | 扩展 | +| COS | 4B | `11001000` | RR | 浮点 8/9 | rd, rs | 余弦 | 扩展 | +| TAN | 4B | `11001001` | RR | 浮点 8/9 | rd, rs | 正切 | 扩展 | +| ASIN | 4B | `11001010` | RR | 浮点 8/9 | rd, rs | 反正弦 | 扩展 | +| ACOS | 4B | `11001011` | RR | 浮点 8/9 | rd, rs | 反余弦 | 扩展 | +| ATAN | 4B | `11001100` | RR | 浮点 8/9 | rd, rs | 反正切 | 扩展 | +| LN | 4B | `11001101` | RR | 浮点 8/9 | rd, rs | 自然对数 | 扩展 | +| LOG | 4B | `11001110` | RR | 浮点 8/9 | rd, rs | 常用对数 | 扩展 | +| EXP | 4B | `11001111` | RR | 浮点 8/9 | rd, rs | 指数 | 扩展 | +| ROUND | 4B | `11010000` | RR | 浮点 8/9 | rd, rs | 四舍五入(浮点→整数) | 扩展 | +| TRUNC | 4B | `11010001` | RR | 浮点 8/9 | rd, rs | 截断 | 扩展 | +| FLOOR | 4B | `11010010` | RR | 浮点 8/9 | rd, rs | 向下取整 | 扩展 | +| CEIL | 4B | `11010011` | RR | 浮点 8/9 | rd, rs | 向上取整 | 扩展 | ## 5. 比较 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| -| CMP_EQ | 8B | `01010000` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 相等 | 核心 | -| CMP_NE | 8B | `01010001` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 不等 | 核心 | -| CMP_LT | 8B | `01010010` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 小于(无符号/浮点按 func) | 核心 | -| CMP_LE | 8B | `01010011` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 小于等于 | 核心 | -| CMP_GT | 8B | `01010100` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 大于 | 核心 | -| CMP_GE | 8B | `01010101` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 大于等于 | 核心 | +| CMP_EQ | 8B | `01110000` | RRR | 全矩阵 0..9 | rd, ra, rb | 相等 | 核心 | +| CMP_NE | 8B | `01110001` | RRR | 全矩阵 0..9 | rd, ra, rb | 不等 | 核心 | +| CMP_LT | 8B | `01110010` | RRR | 全矩阵 0..9 | rd, ra, rb | 小于(无符号/浮点按 func) | 核心 | +| CMP_LE | 8B | `01110011` | RRR | 全矩阵 0..9 | rd, ra, rb | 小于等于 | 核心 | +| CMP_GT | 8B | `01110100` | RRR | 全矩阵 0..9 | rd, ra, rb | 大于 | 核心 | +| CMP_GE | 8B | `01110101` | RRR | 全矩阵 0..9 | rd, ra, rb | 大于等于 | 核心 | ## 6. 转换 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| -| CONV | 4B | `10010110` | RR(0) | **目标类型** 0..9 | rd, rs | 类型转换(src 值已在寄存器,按目标 func 截断/扩展/舍入;舍入模式随目标为浮点→整数时取 TRUNC 语义) | 扩展 | +| CONV | 4B | `11010100` | RR | **目标类型** 0..9 | rd, rs | 类型转换(src 值已在寄存器,按目标 func 截断/扩展/舍入;舍入模式随目标为浮点→整数时取 TRUNC 语义) | 扩展 | ## 7. 控制流 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| -| JMP | 8B | `01011111` | JMP(4) | — | off32 | 无条件跳转(相对下一条,字节) | 核心 | -| JT | 8B | `01100000` | JC(5) | — | rd, off | rd≠0 跳转 | 核心 | -| JF | 8B | `01100001` | JC(5) | — | rd, off | rd==0 跳转 | 核心 | -| CALL | 8B | `01011101` | CALL(6) | — | fn_id | 压帧调用(r0..r7 复制) | 核心 | -| RET | 4B | `10000011` | NONE(8) | — | — | 弹帧 / MAIN 周期结束 | 核心 | -| CAL | 8B | `01011110` | CAL(7) | — | fb_id, slot | 内建 FB 调用(fb_id 查 [[fb]] 表) | 核心 | +| 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 复制) | 核心 | +| RET | 4B | `10000001` | NONE | — | — | 弹帧 / MAIN 周期结束 | 核心 | +| CAL | 8B | `01000111` | CAL | — | fb_id, slot | 内建 FB 调用(fb_id 查 [[fb]] 表) | 核心 | | JTBL | 32B | `00010000` | 预留 | — | rd, slot, n | CASE 跳转表 | 预留 | ## 8. 内建 FB(CAL + fb_id,[[fb]] 表) @@ -257,15 +210,15 @@ bit127 88 bit87 24 bit23 16 bit15 12 bit11 8 bit7 0 | 指令 | 组 | 字节0 编码 | fmt | 语义 | 状态 | |---|---|---|---|---|---| -| STR_LEN | 16B | `00100011` | SLOT+off | 字符串长度 | 预留 | -| STR_CMP | 16B | `00100100` | SLOT+off | 比较 | 预留 | -| STR_EQ | 16B | `00100101` | SLOT+off | 相等 | 预留 | -| STR_MID | 16B | `00100110` | SLOT+off | 取子串 | 预留 | -| STR_LEFT | 16B | `00100111` | SLOT+off | 左侧子串 | 预留 | -| STR_RIGHT | 16B | `00101000` | SLOT+off | 右侧子串 | 预留 | -| STR_CONCAT | 32B | `00010011` | 预留 | 拼接 | 预留 | -| STR_FIND | 32B | `00010001` | 预留 | 查找 | 预留 | -| STR_REPLACE | 32B | `00010010` | 预留 | 替换 | 预留 | +| STR_LEN | 16B | `00100010` | SLOT+off | 字符串长度 | 预留 | +| STR_CMP | 16B | `00100011` | SLOT+off | 比较 | 预留 | +| STR_EQ | 16B | `00100100` | SLOT+off | 相等 | 预留 | +| STR_MID | 16B | `00100101` | SLOT+off | 取子串 | 预留 | +| STR_LEFT | 16B | `00100110` | SLOT+off | 左侧子串 | 预留 | +| STR_RIGHT | 16B | `00100111` | SLOT+off | 右侧子串 | 预留 | +| STR_CONCAT | 32B | `00010001` | 预留 | 拼接 | 预留 | +| STR_FIND | 32B | `00010010` | 预留 | 查找 | 预留 | +| STR_REPLACE | 32B | `00010011` | 预留 | 替换 | 预留 | ## 10. 数组(未来) @@ -279,16 +232,19 @@ bit127 88 bit87 24 bit23 16 bit15 12 bit11 8 bit7 0 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| -| NOP | 4B | `10000001` | NONE(8) | — | — | 空操作(占位/对齐) | 核心 | +| NOP | 4B | `10000000` | NONE | — | — | 空操作(占位/对齐) | 核心 | -## 12. op 预算核对(前缀编码按组分治) +## 12. op 预算核对(前缀分区按组分治) -| 组 | op 空间 | 已分配 | 指令 | 余量 | -|---|---|---|---|---| -| 4B(op:7) | 128 | 23 | MOVE/NOP/NOT/RET/NEG/ABS/INC/DEC + 浮点单目 10 + 舍入 4 + CONV | 105 | -| 8B(op:6) | 64 | 34 | 算术 6 + 逻辑 6 + 移位 4 + 位操作 4 + CMP 6 + LOAD/STORE/LOADK/CALL/CAL/JMP/JT/JF 8 | 30 | -| 16B(op:5) | 32 | 10 | LOAD_OFF/STORE_OFF/LOADK64 + 字符串 6 + ARR_LEN | 22 | -| 32B(op:4) | 16 | 6 | JTBL + STR_CONCAT/FIND/REPLACE + ARR_LOAD/STORE | 10 | +| 前缀 | 分区 | op 空间 | 已分配 | 指令 | 余量 | +|---|---|---|---|---|---| +| `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 | +| `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;SETBIT 系列的目标可槽形式与 -> 字符串/数组的具体操作数形态在实现时定稿(fmt 列「预留」)。 +> 编码约定:op 按分区独立编号;无类型指令 func=0;010 区形态查表(指令编码.md §5); +> 字符串/数组的具体操作数形态在实现时定稿(`0001` 区)。