文档:指令集优化——补 REAL/LREAL(float/double)、FB/FC 内联现状与 V2 基址寻址方向

- §2.4 类型表 16 种满编(type:4),含 C 对应列;浮点表示/常量 tag/字面量
- §2.7 新增:V1 三种调用处理(FB 内联/FC CALL/CAL_*)+ V2 基址寻址消除内联膨胀
- §3 差异表加 FB 行;§4 待确认加 FB 共享体与浮点字面量;§7 决策历史补记
This commit is contained in:
2026-08-24 10:52:46 +08:00
parent b70bea6b54
commit 3ec803c5a8
+35 -14
View File
@@ -69,23 +69,25 @@
- 初值**整合在 .stb 内分段**(用户决策,ELF 式):槽表段 / 值段 / 元数据段并列,单文件 SHA-256 校验 - 初值**整合在 .stb 内分段**(用户决策,ELF 式):槽表段 / 值段 / 元数据段并列,单文件 SHA-256 校验
- 寻址规模(用户决策):**全 32 位**——槽号 u32(2^32 引用)、值区地址 u324GB) - 寻址规模(用户决策):**全 32 位**——槽号 u32(2^32 引用)、值区地址 u324GB)
### 2.4 类型系统:IEC 整数族扩展 ### 2.4 类型系统:IEC 标量族扩展16 种满编)
`type` 位段候选**type:416 种)**——14 个 IEC 标量 + REAL + 预留 1;**结构体/字符串/数组不占位段**,走元数据段字段表(`LOADF rd, slot, field_id`,宽度从元数据查) `type` 位段:**type:416 种)**16 个 IEC 标量**满编零预留**BOOL + 位串 4 + 有符号 4 + 无符号 4 + TIME + REAL + LREAL;**结构体/字符串/数组不占位段**,走元数据段字段表(`LOADF rd, slot, field_id`,宽度从元数据查)。将来新增标量类型需扩 type:5(32 种)——待确认(见 §4 项 2)。
| type | 宽度 | 符号 | type | 宽度 | 符号 | | type | 类型 | 宽度 | 符号 | C 对应 | type | 类型 | 宽度 | 符号 | C 对应 |
|---|---|---|---|---|---| |---|---|---|---|---|---|---|---|---|---|
| BOOL | 1B | — | SINT | 1B | 有 | | 0 | BOOL | 1B | — | bool | 8 | LINT | 8B | 有 | int64_t |
| BYTE | 1B | 无 | INT | 2B | | | 1 | BYTE | 1B | 无 | uint8_t | 9 | USINT | 1B | 无 | uint8_t |
| WORD | 2B | 无 | DINT | 4B | | | 2 | WORD | 2B | 无 | uint16_t | 10 | UINT | 2B | 无 | uint16_t |
| DWORD | 4B | 无 | LINT | 8B | | | 3 | DWORD | 4B | 无 | uint32_t | 11 | UDINT | 4B | 无 | uint32_t |
| LWORD | 8B | 无 | USINT | 1B | 无 | | 4 | LWORD | 8B | 无 | uint64_t | 12 | ULINT | 8B | 无 | uint64_t |
| TIME | 8B | 有(ms) | UINT | 2B | | | 5 | SINT | 1B | 有 | int8_t | 13 | TIME | 8B | 有(ms) | int64_t |
| | | | UDINT | 4B | 无 | | 6 | INT | 2B | 有 | int16_t | 14 | **REAL** | 4B | IEEE754 | **float** |
| | | | ULINT | 8B | 无 | | 7 | DINT | 4B | 有 | int32_t | 15 | **LREAL** | 8B | IEEE754 | **double** |
- **type 位段红利**:CMP/算术按类型自动语义——无符号类型无符号比较、饱和到类型宽度(模板化)、读取按宽度+符号/零扩展 - **type 位段红利**:CMP/算术按类型自动语义——无符号类型无符号比较、整数饱和到类型宽度(模板化)、浮点走 IEEE 754(无饱和,溢出→±inf)、读取按宽度+符号/零扩展
- 常量表 `tag` 契约升级:tag = type 位段值(0..14 - **浮点表示**REAL 4B / LREAL 8B,值区 4/8 字节对齐;寄存器 int64 位模式搬运(REAL 低 4 字节),运算时按 type 重解释
- 常量表 `tag` 契约升级:tag = type 位段值(0..15),REAL=14 / LREAL=15 存位模式
- **ST 字面量**:浮点十进制字面量(`1.5``-2.5e3`)v1 是否支持——待确认(见 §4 项 10)
### 2.5 映像格式(头 128 字节,16 对齐) ### 2.5 映像格式(头 128 字节,16 对齐)
@@ -108,6 +110,20 @@
- **I/Q/M 六条 LOAD/STORE 合并为 LOAD/STORE 两条**(单一值区,语义标签交给 sidecar)——待确认(见 §4) - **I/Q/M 六条 LOAD/STORE 合并为 LOAD/STORE 两条**(单一值区,语义标签交给 sidecar)——待确认(见 §4)
- 结构体 v1 **只留编码(LOADF + 元数据段)不实现语法**——待确认(见 §4 - 结构体 v1 **只留编码(LOADF + 元数据段)不实现语法**——待确认(见 §4
### 2.7 调用与内联策略(V1 现状 + V2 方向)
**V1 现状**POU 调用三种处理方式:
| 对象 | V1 处理 | 原因 |
|---|---|---|
| 用户 FBFUNCTION_BLOCK | **调用点内联展开**(字节码随调用点数膨胀) | 12.8 定案:FB 体访问**绝对字段地址**(`LOAD_GLOBAL rd, 基槽+字段序`),不同实例基址不同,共享函数体无法复用;无递归、无动态实例 → 内联安全 |
| FUNCTIONFC | 独立函数 + `CALL fn_id` 帧栈 | FC 无状态,参数/结果走寄存器约定(r1..r7 / r0),无字段地址冲突;递归在前层被拒(用例 19) |
| 内建 FBTON/CTU/…) | `CAL_*` 指令(VM 运行时原语 `do_cal`) | 定时器/计数器是 VM 侧状态机,天然共享 |
代价:内联 = 字节码膨胀(FB 每调用一次复制一份体),V1 规模可接受;寄存器码.md 注记「以后可升级为基址寄存器寻址指令」。
**V2 机会**:槽表模型下 FB 体可共享——FB 实例字段经「槽表条目 → 值区地址」定位,若引入**基址寻址指令**(如 `LOAD rd, base_slot, field_off` / `STORE base_slot, field_off, rs`,base 槽取自寄存器或立即数),FB 体编译一次、运行时按实例基址定位字段,**消除内联膨胀**。16 字节长度组(SLOT+off)已为此预留。是否实施 → 待确认(见 §4 项 9)。
## 3. 与 V1 的差异对照 ## 3. 与 V1 的差异对照
| 项 | V1(现状) | V2(草案) | | 项 | V1(现状) | V2(草案) |
@@ -121,6 +137,7 @@
| 宽度信息 | 无(定宽) | **type 位段**RISC-V lb/lh/lw 式) | | 宽度信息 | 无(定宽) | **type 位段**RISC-V lb/lh/lw 式) |
| 类型 | BOOL/INT/TIME | **14 IEC 标量 + REAL 预留** | | 类型 | BOOL/INT/TIME | **14 IEC 标量 + REAL 预留** |
| 结构体 | 不支持 | 元数据段字段表(预留) | | 结构体 | 不支持 | 元数据段字段表(预留) |
| FB 调用 | 用户 FB **内联展开**(字节码膨胀) | 基址寻址指令共享 FB 体(待确认 §4) |
| 寻址空间 | 槽 65535512KB | 槽 2^32、值区 4GB | | 寻址空间 | 槽 65535512KB | 槽 2^32、值区 4GB |
| 初值 | 槽内 | 值段(逻辑分段,同文件) | | 初值 | 槽内 | 值段(逻辑分段,同文件) |
| 跳转/pc | 条数单位 | **字节单位**(待确认 §4 | | 跳转/pc | 条数单位 | **字节单位**(待确认 §4 |
@@ -138,6 +155,8 @@
| 6 | **ST 语言层类型支持**:12 类型名进关键字全量支持 vs 仅类型系统支持 | 全量 / 仅系统 | 全量(声明即可用) | | 6 | **ST 语言层类型支持**:12 类型名进关键字全量支持 vs 仅类型系统支持 | 全量 / 仅系统 | 全量(声明即可用) |
| 7 | **类型转换规则**:隐式升宽(SINT→INT→DINT→LINT、BYTE→WORD→…)允许、降宽禁止 | 按此 / 全显式 | 隐式升宽 | | 7 | **类型转换规则**:隐式升宽(SINT→INT→DINT→LINT、BYTE→WORD→…)允许、降宽禁止 | 按此 / 全显式 | 隐式升宽 |
| 8 | **字面量**IEC 进制前缀(2#/8#/16#)是否 v1 支持 | 十进制 only / 进制前缀 | 十进制 only | | 8 | **字面量**IEC 进制前缀(2#/8#/16#)是否 v1 支持 | 十进制 only / 进制前缀 | 十进制 only |
| 9 | **FB 共享体**:基址寻址指令(LOAD/STORE rd, base_slot, field_off)消除用户 FB 内联膨胀 | 实施 / 维持内联 | 实施(16B 长度组已预留) |
| 10 | **REAL/LREAL**:浮点类型与 C float/double 对应(4B/8BIEEE 754);type 位段随之满编 16 标量(零预留) | type:4 满编 / type:5 留扩展 | 见 §2.4 |
## 5. 影响面清单 ## 5. 影响面清单
@@ -168,4 +187,6 @@
- 寻址规模:用户选「全 32 位」(槽号 u32 + 地址 u32 - 寻址规模:用户选「全 32 位」(槽号 u32 + 地址 u32
- 指令长度:用户定「变长指令,长度编码在 opcode」;此前 128bit 固定长度方案被否 - 指令长度:用户定「变长指令,长度编码在 opcode」;此前 128bit 固定长度方案被否
- 寄存器:用户定「编号 8 位(256/帧)维持现状」,容量恒定式 8bit×256=16bit×128=32bit×64=64bit×32 - 寄存器:用户定「编号 8 位(256/帧)维持现状」,容量恒定式 8bit×256=16bit×128=32bit×64=64bit×32
- 类型扩展:用户提出 IEC 整数族(BYTE..ULINT 12 种)+ REAL/LREAL= C float/doubleIEEE 754
- 调用策略:确认 V1 用户 FB 内联 / FUNCTION 走 CALL / 内建 FB 走 CAL_*;V2 探索基址寻址指令消除内联膨胀
- 类型扩展:用户提出 IEC 整数族 12 种(BYTE..ULINT - 类型扩展:用户提出 IEC 整数族 12 种(BYTE..ULINT