步骤E:文档收尾——基址寻址落地同步(编译器优化/寄存器码/用例对照/指令与映像/指令集清单/指令执行)
This commit is contained in:
+14
-10
@@ -8,8 +8,8 @@ compiler 模块的代码生成。输入:`Project` + `Unit`(AST)+ `LinkResu
|
|||||||
|
|
||||||
- 寄存器分配:局部/变量固定寄存器,表达式临时值往后编号,`nregs` 写进函数头
|
- 寄存器分配:局部/变量固定寄存器,表达式临时值往后编号,`nregs` 写进函数头
|
||||||
- 跳转先留洞、后回填(字节单位,相对下一条);`AND` / `OR` **必须编成跳转**(短路),禁止两边都算
|
- 跳转先留洞、后回填(字节单位,相对下一条);`AND` / `OR` **必须编成跳转**(短路),禁止两边都算
|
||||||
- 常量表(`LOADK`,8B 原始值无 tag,按 func 解释)、全局/实例槽(`LOAD` / `STORE` / `LOAD_OFF` / `STORE_OFF`)
|
- 常量表(`LOADK`,8B 原始值无 tag,按 func 解释)、全局/实例槽(`LOAD` / `STORE` / `LOAD_OFF` / `STORE_OFF`)、FB 共享体基址访问(`LOAD_PTR` / `STORE_PTR`)
|
||||||
- `CALL fn_id` 有界帧;用户 FB 调用**内联展开**;内建 `CAL fb_id, 实例槽`
|
- `CALL fn_id` 有界帧;用户 FB **共享体函数化**(r1 = 实例指针);内建 `CAL fb_id, 实例槽`
|
||||||
- 拼装映像:V2 头 128B / 函数表 / 常量表 / 字节码 / 槽表 / 值段 + SHA-256 尾部
|
- 拼装映像:V2 头 128B / 函数表 / 常量表 / 字节码 / 槽表 / 值段 + SHA-256 尾部
|
||||||
- `max_stack`:MAIN + FUNCTION 调用图 DAG 最坏路径 Σ(12 + nregs×8);递归 = 编译期报错
|
- `max_stack`:MAIN + FUNCTION 调用图 DAG 最坏路径 Σ(12 + nregs×8);递归 = 编译期报错
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ compiler 模块的代码生成。输入:`Project` + `Unit`(AST)+ `LinkResu
|
|||||||
|
|
||||||
- **槽表两级**:指令操作数 = **槽号**(u32)→ 槽表条目 → 值区字节偏移;`slot_addr(slot)` 由 VM/Image 提供
|
- **槽表两级**:指令操作数 = **槽号**(u32)→ 槽表条目 → 值区字节偏移;`slot_addr(slot)` 由 VM/Image 提供
|
||||||
- 全局按 GVL 声明序编槽;**FB 实例 = 1 个槽表条目**,字段在实例基址上按偏移访问(字段偏移编译期按 1/2/4/8 对齐计算,字段类型 = machine.toml `[[fb]]` 表)
|
- 全局按 GVL 声明序编槽;**FB 实例 = 1 个槽表条目**,字段在实例基址上按偏移访问(字段偏移编译期按 1/2/4/8 对齐计算,字段类型 = machine.toml `[[fb]]` 表)
|
||||||
- 字段访问 `fb.Q`:`LOAD_OFF rd, <实例槽>, <偏移>` / `STORE_OFF <实例槽>, <偏移>, rs`(16B SLOT+off 指令);I/Q/M 同普通槽(`LOAD` / `STORE`)
|
- 字段访问 `fb.Q`:`LOAD_OFF rd, <实例槽>, <偏移>` / `STORE_OFF <实例槽>, <偏移>, rs`(16B SLOT+off 指令,调用点/输出读用);FB 共享体函数体内:`LOAD_PTR` / `STORE_PTR rd, r1, <偏移>`(16B RS+off,基址寄存器 r1 = 实例指针);I/Q/M 同普通槽(`LOAD` / `STORE`)
|
||||||
- 函数帧寄存器:`FUNCTION` 结果固定 **r0**,`VAR_INPUT` 从 r1 起按声明序,`VAR` 续后;PROGRAM / FB 变量从 r0 起按声明序
|
- 函数帧寄存器:`FUNCTION` 结果固定 **r0**,`VAR_INPUT` 从 r1 起按声明序,`VAR` 续后;PROGRAM / FB 变量从 r0 起按声明序
|
||||||
|
|
||||||
### 调用约定(v1 冻结,VM 12.9 按此实现)
|
### 调用约定(v1 冻结,VM 12.9 按此实现)
|
||||||
@@ -73,22 +73,26 @@ IF <cond → t> JF t, L_else
|
|||||||
L_end:
|
L_end:
|
||||||
WHILE L_loop: <cond → t> JF t, L_end <body> JMP L_loop L_end:
|
WHILE L_loop: <cond → t> JF t, L_end <body> JMP L_loop L_end:
|
||||||
|
|
||||||
FB 调用(用户,内联展开):
|
FB 调用(用户,共享体):
|
||||||
<每个实参求值 → 临时> STORE_OFF <实例槽>, <字段偏移>, 临时
|
<每个实参求值 → 临时> STORE_OFF <实例槽>, <字段偏移>, 临时
|
||||||
<内联体:LOAD_OFF 读输入字段、算输出、STORE_OFF 写输出字段>
|
LOADK r1, <实例值区地址> CALL <fb_fn_id>
|
||||||
|
(FB 函数体内:字段访问 = LOAD_PTR/STORE_PTR rd, r1, <字段偏移>)
|
||||||
内建 实参同左 → CAL <fb_id>, <实例槽>
|
内建 实参同左 → CAL <fb_id>, <实例槽>
|
||||||
```
|
```
|
||||||
|
|
||||||
- 常量统一进常量表(8B 原始值,位模式去重;BOOL / 整数 / 时间 / 浮点 / 日期),`const_id` = 首次出现序;`LOADK` 按 func 解释位模式
|
- 常量统一进常量表(8B 原始值,位模式去重;BOOL / 整数 / 时间 / 浮点 / 日期),`const_id` = 首次出现序;`LOADK` 按 func 解释位模式
|
||||||
- 指令 func 位段 = 语言类型对应(`func_of_name`:宽度 × 符号 + F32/F64)
|
- 指令 func 位段 = 语言类型对应(`func_of_name`:宽度 × 符号 + F32/F64)
|
||||||
|
|
||||||
## 用户 FB 调用内联(v1 定案)
|
## 用户 FB 共享体(函数化,2026-08-26 实施)
|
||||||
|
|
||||||
FB 体共享会与「绝对字段地址」冲突(不同实例基址不同),v1 选择**调用点内联展开**:
|
FB 体共享会与「绝对字段地址」冲突(不同实例基址不同),V1 内联;V2 改为**共享体函数化**:
|
||||||
|
|
||||||
- 调用点:实参写入该实例字段 → 内联该 FB 的函数体(字段地址按本实例基址算死)→ 字段读取自然可用
|
- FB 编译为**独立共享函数**(fn_id 收集序):`r1` = 实例指针(值区地址,隐藏参数/this),字段访问 `LOAD_PTR/STORE_PTR rd, r1, 字段偏移`
|
||||||
- 代价:字节码随调用点数膨胀;v1 规模可接受;以后可升级为「基址寄存器寻址」指令
|
- 调用点:实参 `STORE_OFF`(绝对槽)→ `LOADK r1, c(实例addr)` → `CALL fb_fn_id`(2 条指令替代整个展开体)
|
||||||
- FB 无递归、无动态实例,内联安全
|
- 嵌套(FB 函数内调 FUNCTION):实参区 r1..r7 会覆盖实例指针 → 调用点自动 `MOVE t, r1` / 调用后 `MOVE r1, t` 保护
|
||||||
|
- `VAR_TEMP` 落 FB 帧寄存器,帧每周期重建 → 天然每次调用重置(内联期的寄存器隔离 hack 退役)
|
||||||
|
- 多实例共享同一函数体,状态经 r1 指针隔离(`count` 等 `VAR` 仍在实例字段)
|
||||||
|
- FB 无递归、无动态实例(链接层保证),函数化安全
|
||||||
|
|
||||||
## 映像拼装(V2)
|
## 映像拼装(V2)
|
||||||
|
|
||||||
|
|||||||
@@ -78,15 +78,15 @@ PROGRAM MAIN → fn0: RET(nregs=8, 4 字节)✓
|
|||||||
| max_stack | 192 = (12+11×8) + (12+10×8) | ✓ 编译期 DAG |
|
| max_stack | 192 = (12+11×8) + (12+10×8) | ✓ 编译期 DAG |
|
||||||
| 映射 | add: a=r1 b=r2 result=r0;main: x=r8 | ✓ |
|
| 映射 | add: a=r1 b=r2 result=r0;main: x=r8 | ✓ |
|
||||||
|
|
||||||
## 15_fb_instance:用户 FB 内联
|
## 15_fb_instance:用户 FB 共享体(函数化)
|
||||||
|
|
||||||
| 源码 | 指令 | 结论 |
|
| 源码 | 指令 | 结论 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| starter(start:=TRUE,...) | LOADK(TRUE)/STORE_OFF r9,s0,0;LOADK(FALSE)/STORE_OFF r10,s0,1 | ✓ 字段@0/1 |
|
| starter(start:=TRUE,...) | LOADK(TRUE)/STORE_OFF r9,s0,0;LOADK(FALSE)/STORE_OFF r10,s0,1 → LOADK.U32 r1,1 → CALL 0 | ✓ 实参绝对槽 + r1 实例指针 |
|
||||||
| Q := start AND NOT stop | LOAD_OFF s0,0 / JF / LOAD_OFF s0,1 / NOT / MOVE / STORE_OFF s0,2 | ✓ 内联+短路 |
|
| Q := start AND NOT stop | fn0(共享体):LOAD_PTR.U8 r8,r1,0 / JF / LOAD_PTR.U8 r10,r1,1 / NOT / MOVE / STORE_PTR.U8 r8,r1,2 | ✓ 基址寻址+短路 |
|
||||||
| q := starter.Q | LOAD_OFF r8, s0, 2 | ✓ |
|
| q := starter.Q | LOAD_OFF r8, s0, 2 | ✓ 输出读绝对槽 |
|
||||||
|
|
||||||
值段 3B、映射 start@0 stop@1 q@2 ✓
|
值段 3B、映射 start@0 stop@1 q@2 ✓;fn0 单函数体服务所有实例 ✓
|
||||||
|
|
||||||
## 17_ton:内建 TON
|
## 17_ton:内建 TON
|
||||||
|
|
||||||
@@ -112,8 +112,8 @@ PROGRAM MAIN → fn0: RET(nregs=8, 4 字节)✓
|
|||||||
|
|
||||||
| 源码 | 指令 | 结论 |
|
| 源码 | 指令 | 结论 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| starter(start:=I0_0, stop:=I0_1) | LOAD.U8 r8,s1 → STORE_OFF s4,0;LOAD.U8 r9,s2 → STORE_OFF s4,1 | ✓ I 读 |
|
| starter(start:=I0_0, stop:=I0_1) | LOAD.U8 r8,s1 → STORE_OFF s4,0;LOAD.U8 r9,s2 → STORE_OFF s4,1 → LOADK.U32 r1 → CALL 0 | ✓ I 读 + 共享体调用 |
|
||||||
| Q := start AND NOT stop AND NOT EmergencyStop | LOAD_OFF s4,0/JF/LOAD_OFF s4,1/NOT/MOVE/JF/LOAD s0(急停)/NOT/MOVE/STORE_OFF s4,2 | ✓ 双短路+全局 |
|
| Q := start AND NOT stop AND NOT EmergencyStop | fn0:LOAD_PTR r1,0/JF/LOAD_PTR r1,1/NOT/MOVE/JF/LOAD s0(急停)/NOT/MOVE/STORE_PTR r1,2 | ✓ 基址+双短路+全局 |
|
||||||
| Q0_0 := starter.Q | LOAD_OFF s4,2 / STORE.U8 r8,s3 | ✓ Q 写 |
|
| Q0_0 := starter.Q | LOAD_OFF s4,2 / STORE.U8 r8,s3 | ✓ Q 写 |
|
||||||
|
|
||||||
槽表 5 条(addr 0..4)、值段 7B ✓
|
槽表 5 条(addr 0..4)、值段 7B ✓
|
||||||
|
|||||||
@@ -36,8 +36,8 @@
|
|||||||
### 3.1 FB 共享体(基址寻址)——消除内联膨胀
|
### 3.1 FB 共享体(基址寻址)——消除内联膨胀
|
||||||
|
|
||||||
- **现状问题**:FB 每调用一次复制一份体,字节码膨胀
|
- **现状问题**:FB 每调用一次复制一份体,字节码膨胀
|
||||||
- **V2 定案**:`LOAD/STORE rd, slot, off32`(16B 长度组,SLOT+off 形态)即基址寻址——结构体字段与 FB 共享体字段**同一指令**(LOADF 已取消);FB 体编译**一次**,运行时按实例槽 + 编译期算死的字段偏移定位
|
- **V2 定案(已实施,2026-08-26 阶段5)**:FB 编译为**独立共享函数**,调用点 `LOADK r1, c(实例地址)` + `CALL`;函数体内字段访问用 `LOAD_PTR/STORE_PTR rd, r1, off`(16B RS+off 形态,寄存器基址 + 偏移)——同一实例可被多个调用点复用;字段偏移编译期算死
|
||||||
- 收益:字节码不再随调用点膨胀;代价:每次字段访问多一个偏移操作数
|
- 收益:字节码不再随调用点膨胀(多实例共享一份函数体);VAR_TEMP 落 FB 帧寄存器天然每调用重置;代价:每次字段访问多一个偏移操作数
|
||||||
|
|
||||||
### 3.2 类型驱动语义(type 位段红利)
|
### 3.2 类型驱动语义(type 位段红利)
|
||||||
|
|
||||||
@@ -103,4 +103,5 @@
|
|||||||
|
|
||||||
- V1 定案(12.8):用户 FB 内联 / FUNCTION CALL / 内建 FB CAL_*;短路必须跳转;固定寄存器分配
|
- V1 定案(12.8):用户 FB 内联 / FUNCTION CALL / 内建 FB CAL_*;短路必须跳转;固定寄存器分配
|
||||||
- V2 讨论:用户确认 V1 内联现状;提出 V2 用基址寻址消除内联膨胀(已定案)
|
- V2 讨论:用户确认 V1 内联现状;提出 V2 用基址寻址消除内联膨胀(已定案)
|
||||||
|
- V2 实施(2026-08-26):FB 共享体落地——LOAD_PTR/STORE_PTR(RS+off)+ FB 函数化(r1 实例指针),内联机制退役
|
||||||
- 类型扩展:19 IEC 基础类型(type:5);禁隐式转换 + 字面量适配;进制前缀定案
|
- 类型扩展:19 IEC 基础类型(type:5);禁隐式转换 + 字面量适配;进制前缀定案
|
||||||
|
|||||||
+6
-4
@@ -43,7 +43,7 @@ CMake 目标:`isa`(`STATIC`),无依赖;`vm` PUBLIC 链 `isa`。公开
|
|||||||
| 项 | V2 定案 |
|
| 项 | V2 定案 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 指令宽度 | **变长 4/8/16/32B**,长度与形态由**前缀分区**表达 |
|
| 指令宽度 | **变长 4/8/16/32B**,长度与形态由**前缀分区**表达 |
|
||||||
| 前缀 | `11`=RR、`10`=NONE、`011`=RRR、`010 000..101`=IMM/SLOT/JMP/JC/CALL/CAL、`0010`=SLOT+off、`0011`=IMM64、`0001`=预留(32B) |
|
| 前缀 | `11`=RR、`10`=NONE、`011`=RRR、`010 000..101`=IMM/SLOT/JMP/JC/CALL/CAL、`0010`=SLOT+off / RS+off、`0011`=IMM64、`0001`=预留(32B) |
|
||||||
| 头部 | 字节 0 = `[前缀+分区\|op]`;字节 1 = `[func:4\|空:4]`(空位延后定) |
|
| 头部 | 字节 0 = `[前缀+分区\|op]`;字节 1 = `[func:4\|空:4]`(空位延后定) |
|
||||||
| func | 4 位:0..7 = 宽度×符号(1/2/4/8B×有/无)、8=F32、9=F64;无类型指令 = 0 |
|
| func | 4 位:0..7 = 宽度×符号(1/2/4/8B×有/无)、8=F32、9=F64;无类型指令 = 0 |
|
||||||
| 寄存器 | 编号 8 位(**256 = 寻址上限**),值 int64;**每帧按函数头 nregs 动态分配** |
|
| 寄存器 | 编号 8 位(**256 = 寻址上限**),值 int64;**每帧按函数头 nregs 动态分配** |
|
||||||
@@ -86,12 +86,12 @@ CMake 目标:`isa`(`STATIC`),无依赖;`vm` PUBLIC 链 `isa`。公开
|
|||||||
| `010 100` | 8B | CALL | 2 位 | 4 | 前缀直推 |
|
| `010 100` | 8B | CALL | 2 位 | 4 | 前缀直推 |
|
||||||
| `010 101` | 8B | CAL | 2 位 | 4 | 前缀直推 |
|
| `010 101` | 8B | CAL | 2 位 | 4 | 前缀直推 |
|
||||||
| `010 110/111` | 8B | 预留 | 2 位 | 8 | — |
|
| `010 110/111` | 8B | 预留 | 2 位 | 8 | — |
|
||||||
| `0010` | 16B | SLOT+off | 4 位 | 16 | 前缀直推 |
|
| `0010` | 16B | SLOT+off / RS+off | 4 位 | 16 | 前缀直推 |
|
||||||
| `0011` | 16B | IMM64 | 4 位 | 16 | 前缀直推 |
|
| `0011` | 16B | IMM64 | 4 位 | 16 | 前缀直推 |
|
||||||
| `0001` | 32B | 预留(N2) | 4 位 | 16 | — |
|
| `0001` | 32B | 预留(N2) | 4 位 | 16 | — |
|
||||||
|
|
||||||
- op 按分区独立编号(0 起);取指:读字节 0 → 前缀定长 → 搬整条
|
- op 按分区独立编号(0 起);取指:读字节 0 → 前缀定长 → 搬整条
|
||||||
- **uses_rd/uses_ra/uses_rb 全部前缀直推**(零查表):RRR 三寄存器全真;RR 的 rd/rs;IMM/SLOT/JC/SLOT+off/IMM64 仅 rd;JMP/CALL/CAL/NONE 无
|
- **uses_rd/uses_ra/uses_rb 全部前缀直推**(零查表):RRR 三寄存器全真;RR 的 rd/rs;IMM/SLOT/JC/SLOT+off/RS+off/IMM64 的 rd;RS+off 另含 rs(基址寄存器);JMP/CALL/CAL/NONE 无
|
||||||
|
|
||||||
### 3.2 func 位段(字节 1 高 4 位)
|
### 3.2 func 位段(字节 1 高 4 位)
|
||||||
|
|
||||||
@@ -126,6 +126,7 @@ CMake 目标:`isa`(`STATIC`),无依赖;`vm` PUBLIC 链 `isa`。公开
|
|||||||
| CALL | fn_id32=47..16、pad=63..48(**rd 恒 0**) |
|
| CALL | fn_id32=47..16、pad=63..48(**rd 恒 0**) |
|
||||||
| CAL | fb_id16=31..16、slot32=63..32(**rd 恒 0**) |
|
| CAL | fb_id16=31..16、slot32=63..32(**rd 恒 0**) |
|
||||||
| SLOT+off | rd=23..16、slot32=55..24、off32=87..56、pad=127..88 |
|
| SLOT+off | rd=23..16、slot32=55..24、off32=87..56、pad=127..88 |
|
||||||
|
| RS+off | rd=23..16、rs=31..24(基址寄存器)、off32=87..56、pad=127..88 |
|
||||||
| IMM64 | rd=23..16、imm64=87..24、pad=127..88 |
|
| IMM64 | rd=23..16、imm64=87..24、pad=127..88 |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -192,7 +193,8 @@ CMake 目标:`isa`(`STATIC`),无依赖;`vm` PUBLIC 链 `isa`。公开
|
|||||||
- `MOVE rd, rs`(RR,func=宽度 0..3):寄存器间按宽度搬运(高位清 0),不管符号/浮点
|
- `MOVE rd, rs`(RR,func=宽度 0..3):寄存器间按宽度搬运(高位清 0),不管符号/浮点
|
||||||
- `LOAD rd, slot` / `STORE slot, rs`(SLOT,func 全矩阵):槽表[slot].addr → 值区按 func 读/写宽度
|
- `LOAD rd, slot` / `STORE slot, rs`(SLOT,func 全矩阵):槽表[slot].addr → 值区按 func 读/写宽度
|
||||||
- `LOADK rd, const_id`(IMM,func 全矩阵):常量表条目 8B 原始值,按 func 解释
|
- `LOADK rd, const_id`(IMM,func 全矩阵):常量表条目 8B 原始值,按 func 解释
|
||||||
- `LOAD_OFF rd, slot, off` / `STORE_OFF slot, off, rs`(SLOT+off):字段访问(结构体/FB 共享体统一)
|
- `LOAD_OFF rd, slot, off` / `STORE_OFF slot, off, rs`(SLOT+off):字段访问(绝对实例槽,调用点/输出读用)
|
||||||
|
- `LOAD_PTR rd, rs, off` / `STORE_PTR rd, rs, off`(RS+off):**基址寻址**——rs 寄存器 = 值区地址(实例指针),addr+off 直读值区(FB 共享体函数体内字段访问)
|
||||||
|
|
||||||
### 6.2 逻辑与位运算
|
### 6.2 逻辑与位运算
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -41,7 +41,7 @@
|
|||||||
| `010 011` | JC | 8B | rd=23..16、off32=55..24、pad=63..56 | 前缀直推 |
|
| `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 100` | CALL | 8B | fn_id32=47..16、pad=63..48 | 前缀直推 |
|
||||||
| `010 101` | CAL | 8B | fb_id16=31..16、slot32=63..32 | 前缀直推 |
|
| `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 | 前缀直推 |
|
| `0010` | SLOT+off / RS+off | 16B | SLOT+off: rd=23..16、slot32=55..24、off32=87..56;RS+off: rd=23..16、rs=31..24、off32=87..56、pad=127..88 | 前缀直推 |
|
||||||
| `0011` | IMM64 | 16B | rd=23..16、imm64=87..24、pad=127..88 | 前缀直推 |
|
| `0011` | IMM64 | 16B | rd=23..16、imm64=87..24、pad=127..88 | 前缀直推 |
|
||||||
| `0001` | 预留 | 32B | 操作数区 30B(bit 240..16),格式待定 | — |
|
| `0001` | 预留 | 32B | 操作数区 30B(bit 240..16),格式待定 | — |
|
||||||
|
|
||||||
@@ -112,6 +112,8 @@ bit127 88 bit87 24 bit23 16 bit15 12 bit11 8 bit7 0
|
|||||||
| LOADK | 8B | `01000000` | IMM | 全矩阵 0..9 | rd, const_id | 常量表→寄存器(按 func 解释) | 核心 |
|
| LOADK | 8B | `01000000` | IMM | 全矩阵 0..9 | rd, const_id | 常量表→寄存器(按 func 解释) | 核心 |
|
||||||
| LOAD_OFF | 16B | `00100000` | SLOT+off | 全矩阵 0..9 | rd, slot, off | 字段读(结构体/FB 共享体) | 核心 |
|
| LOAD_OFF | 16B | `00100000` | SLOT+off | 全矩阵 0..9 | rd, slot, off | 字段读(结构体/FB 共享体) | 核心 |
|
||||||
| STORE_OFF | 16B | `00100001` | SLOT+off | 全矩阵 0..9 | slot, off, rs | 字段写 | 核心 |
|
| STORE_OFF | 16B | `00100001` | SLOT+off | 全矩阵 0..9 | slot, off, rs | 字段写 | 核心 |
|
||||||
|
| LOAD_PTR | 16B | `00101000` | RS+off | 全矩阵 0..9 | rd, rs, off | 基址读(rs 寄存器 = 值区地址 + 偏移;FB 共享体) | 核心 |
|
||||||
|
| STORE_PTR | 16B | `00101001` | RS+off | 全矩阵 0..9 | rd, rs, off | 基址写 | 核心 |
|
||||||
| LOADK64 | 16B | `00110000` | IMM64 | 全矩阵 0..9 | rd, imm64 | 64 位立即数内嵌(免查表) | 预留 |
|
| LOADK64 | 16B | `00110000` | IMM64 | 全矩阵 0..9 | rd, imm64 | 64 位立即数内嵌(免查表) | 预留 |
|
||||||
|
|
||||||
## 3. 逻辑与位运算
|
## 3. 逻辑与位运算
|
||||||
@@ -270,7 +272,7 @@ bit127 88 bit87 24 bit23 16 bit15 12 bit11 8 bit7 0
|
|||||||
| `10` | NONE | 64 | 2 | NOP/RET | 62 |
|
| `10` | NONE | 64 | 2 | NOP/RET | 62 |
|
||||||
| `011` | RRR | 32 | 26 | 算术 6 + 逻辑 6 + 移位 4 + 位操作 4 + CMP 6 | 6 |
|
| `011` | RRR | 32 | 26 | 算术 6 + 逻辑 6 + 移位 4 + 位操作 4 + CMP 6 | 6 |
|
||||||
| `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 个预留形态区) |
|
| `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 |
|
| `0010` | SLOT+off / RS+off | 16 | 10 | LOAD_OFF/STORE_OFF + LOAD_PTR/STORE_PTR + 字符串 6 | 6 |
|
||||||
| `0011` | IMM64 | 16 | 1 | LOADK64 | 15 |
|
| `0011` | IMM64 | 16 | 1 | LOADK64 | 15 |
|
||||||
| `0001` | 预留 | 16 | 6 | JTBL + STR_CONCAT/FIND/REPLACE + ARR_LOAD/STORE | 10 |
|
| `0001` | 预留 | 16 | 6 | JTBL + STR_CONCAT/FIND/REPLACE + ARR_LOAD/STORE | 10 |
|
||||||
|
|
||||||
|
|||||||
+6
-3
@@ -77,8 +77,10 @@ RET:
|
|||||||
槽号 slot(指令操作数,u32)→ 槽表条目(8B:addr:u32 + 预留:u32)→ 值区字节偏移 addr
|
槽号 slot(指令操作数,u32)→ 槽表条目(8B:addr:u32 + 预留:u32)→ 值区字节偏移 addr
|
||||||
LOAD rd, slot → rd = 读 value[addr .. addr+宽)(按 func 宽度 + 扩展)
|
LOAD rd, slot → rd = 读 value[addr .. addr+宽)(按 func 宽度 + 扩展)
|
||||||
STORE slot, rs → 写 value[addr .. addr+宽) = rs(按 func 宽度截断)
|
STORE slot, rs → 写 value[addr .. addr+宽) = rs(按 func 宽度截断)
|
||||||
LOAD_OFF rd, slot, off → 读 value[addr+off .. ](FB 字段访问)
|
LOAD_OFF rd, slot, off → 读 value[addr+off .. ](FB 字段访问,绝对槽)
|
||||||
STORE_OFF slot, off, rs → 写 value[addr+off .. ](FB 字段访问)
|
STORE_OFF slot, off, rs → 写 value[addr+off .. ](FB 字段访问,绝对槽)
|
||||||
|
LOAD_PTR rd, rs, off → 读 value[regs[rs] + off .. ](基址寻址:rs = 实例指针,FB 共享体函数体内)
|
||||||
|
STORE_PTR rd, rs, off → 写 value[regs[rs] + off .. ](基址寻址)
|
||||||
```
|
```
|
||||||
|
|
||||||
槽表条目数 = `n_slots`;槽号越界(`slot >= n_slots`)或地址 + 宽度越出值段 → `BadSlot`。
|
槽表条目数 = `n_slots`;槽号越界(`slot >= n_slots`)或地址 + 宽度越出值段 → `BadSlot`。
|
||||||
@@ -97,7 +99,8 @@ STORE_OFF slot, off, rs → 写 value[addr+off .. ](FB 字段访问)
|
|||||||
| `JMP off` | `pc += off` |
|
| `JMP off` | `pc += off` |
|
||||||
| `JT rd, off` / `JF rd, off` | `reg[rd] != 0`(JT)/ `== 0`(JF)时 `pc += off` |
|
| `JT rd, off` / `JF rd, off` | `reg[rd] != 0`(JT)/ `== 0`(JF)时 `pc += off` |
|
||||||
| `LOAD / STORE` | 见数据区访问(槽表两级) |
|
| `LOAD / STORE` | 见数据区访问(槽表两级) |
|
||||||
| `LOAD_OFF / STORE_OFF` | 见数据区访问(FB 字段) |
|
| `LOAD_OFF / STORE_OFF` | 见数据区访问(FB 字段,绝对实例槽) |
|
||||||
|
| `LOAD_PTR / STORE_PTR` | 见数据区访问(基址寻址:rs 寄存器 = 值区地址 + 偏移;FB 共享体) |
|
||||||
| `CAL fb_id, slot` | 见内置 FB(15 条) |
|
| `CAL fb_id, slot` | 见内置 FB(15 条) |
|
||||||
| `CALL fn_id` / `RET` | 见帧与调用栈 |
|
| `CALL fn_id` / `RET` | 见帧与调用栈 |
|
||||||
| `NOP` | 空转 |
|
| `NOP` | 空转 |
|
||||||
|
|||||||
Reference in New Issue
Block a user