diff --git a/Doc/isa/指令集优化.md b/Doc/isa/指令集优化.md index 1e9008a..22acad4 100644 --- a/Doc/isa/指令集优化.md +++ b/Doc/isa/指令集优化.md @@ -97,7 +97,10 @@ - **type 位段红利**:CMP/算术按类型自动语义——无符号类型无符号比较、整数饱和到类型宽度(模板化)、浮点走 IEEE 754(无饱和,溢出→±inf)、读取按宽度+符号/零扩展 - **浮点表示**:REAL 4B / LREAL 8B,值区 4/8 字节对齐;寄存器 int64 位模式搬运(REAL 低 4 字节),运算时按 type 重解释 -- 常量表 `tag` 契约升级:tag = type 位段值(0..18) +- **常量表契约(A2 定案)**:条目 = **8 字节原始值(无 tag)**,按位模式去重; + `LOADK rd, const_id`(8B IMM 形态)**用指令 type 位段**解释(读 width 字节、按符号扩展), + 与 LOAD 语义统一;同一常量可被不同 type 的 LOADK 复用(字面量按上下文适配的落地)。 + V1 的 {tag, value} 契约废弃。IMM64 形态(16B 内嵌 64 位值)**保留编码、v1 不发射**。 - **ST 层**:19 类型名全量进关键字;**进制前缀** `2#`/`8#`/`16#` 支持(浮点无前缀);浮点十进制字面量(`1.5`、`-2.5e3`) - **类型转换**:**禁止隐式变量转换**(赋值/比较/算术要求类型严格一致,Typecheck 阶段报错);**字面量按上下文适配**(`5` 可赋 INT/REAL/DINT 等,编译期解释,非运行时转换);显式转换函数(`INT_TO_REAL()`)v1 不做 @@ -163,7 +166,7 @@ | # | 项 | 说明 | |---|---|---| | A1 | 元数据段格式 | 结构体/字符串的表 schema(类型描述、字段表条目)——v1 预留但格式未定 | -| A2 | 常量内嵌 vs 常量表 | LOADK(8B IMM,const_id32 查常量表)与 IMM64(16B,内嵌 64 位值)的分工——TIME/ULINT/LREAL 常量走哪条 | +| ~~A2~~ | ~~常量内嵌 vs 常量表~~ | **已定案**:常量表(8B LOADK 查表);LOADK 用 type 位段解释;条目 8B 无 tag;IMM64 预留不发射 | | A3 | 内建 FB 字段类型化 | CAL_* 的实例字段在 V2 值区是类型化布局(TON.et=TIME、q=BOOL 等),字段宽度/偏移怎么定 | | A4 | DATE/TOD/DT 字面量 | IEC 语法 `D#2026-8-24`、`TOD#12:30:00`、`DT#2026-8-24-12:30:00` 是否 v1 支持 | | A5 | 算术语义细化 | 各宽度饱和规则(SINT/DINT/LINT 模板)、TIME/DATE 运算(TIME+TIME、TIME 比较)、浮点比较(NaN/±inf 语义) | @@ -208,3 +211,4 @@ - LOADF 取消:用户指出 LOADF 与 LOAD 无本质区别(仅数据搬运)→ 字段访问统一 LOAD/STORE 16B 变体 - 类型转换:用户定「禁止隐式变换,编译阶段检查」+ 字面量按上下文适配 - 字面量:用户定支持 IEC 进制前缀(2#/8#/16#) +- A2 定案:LOADK 用 type 位段解释常量值(与 LOAD 语义统一);常量表条目 8B 无 tag;IMM64 预留不发射