Files
Interpreter/Doc/isa/指令集清单.md
T

128 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 指令集清单(V2 草案)
> 状态:**草案**。全功能目标下的完整指令清单,与 [`指令集优化.md`](指令集优化.md) 配套——
> 该文定义指令**格式**(变长/位段/长度组),本文列出指令**清单**(名称/组/格式/操作数/状态)。
> 组 = 长度组(前缀编码:`1`=4B、`01`=8B、`001`=16B、`0001`=32B);fmt = 操作数形态。
> type 列:`有` = 用 type 位段(宽度/符号/浮点语义)、`无` = type=NONE、`dst` = type 位段为转换目标类型。
> 操作数记法:rd=目标寄存器、rs/ra/rb=源寄存器、slot=槽号、off=字段偏移、const_id=常量表下标、fn_id=函数下标、fb_id=内建 FB id。
**状态列**`核心` = v1 实现;`扩展` = v1 后实现;`预留` = 仅留编码/未来。
## 1. 数据搬运
| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 |
|---|---|---|---|---|---|---|
| MOVE | 4B | RR | 无 | rd, rs | 寄存器间搬运(int64 全宽) | 核心 |
| NOP | 4B | NONE | 无 | — | 空操作 | 核心 |
| LOAD | 8B | SLOT | 有 | rd, slot | 槽→寄存器(按 type 读宽+扩展) | 核心 |
| STORE | 8B | SLOT | 有 | slot, rs | 寄存器→槽(按 type 写宽) | 核心 |
| LOADK | 8B | IMM | 有 | rd, const_id | 常量表→寄存器(按 type 解释) | 核心 |
| LOAD_OFF | 16B | SLOT+off | 有 | rd, slot, off | 字段读(结构体/FB 共享体) | 核心 |
| STORE_OFF | 16B | SLOT+off | 有 | slot, off, rs | 字段写 | 核心 |
| LOADK64 | 16B | IMM64 | 有 | rd, imm64 | 64 位立即数内嵌(免查表) | 预留 |
## 2. 逻辑与位运算
| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 |
|---|---|---|---|---|---|---|
| NOT | 4B | RR | 有 | rd, rs | 按 typeBOOL 逻辑非 / 位串取反 | 核心 |
| AND / OR / XOR | 8B | RRR | 有 | rd, ra, rb | 按 type 位宽 | 核心 |
| NAND / NOR / XNOR | 8B | RRR | 有 | rd, ra, rb | 扩展三态 | 扩展 |
| SHL / SHR | 8B | RRR | 有 | rd, rs, n | 左移/右移(SHR 按 type 符号:算术/逻辑) | 扩展 |
| ROL / ROR | 8B | RRR | 有 | rd, rs, n | 循环移位(位串) | 扩展 |
| GETBIT | 8B | RRR | 无 | rd, rs, bit | 取位(位号在 rb | 扩展 |
| SETBIT / CLRBIT / TOGBIT | 8B | RRR | 无 | slot/rd, rs, bit | 置位/清位/翻转(目标可槽) | 扩展 |
## 3. 算术
| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 |
|---|---|---|---|---|---|---|
| ADD / SUB / MUL / DIV | 8B | RRR | 有 | rd, ra, rb | 整数饱和 / 浮点 IEEE / 无符号按 type | 核心 |
| MOD | 8B | RRR | 有 | rd, ra, rb | 取模 | 扩展 |
| NEG | 4B | RR | 有 | rd, rs | 取负 | 扩展 |
| ABS | 4B | RR | 有 | rd, rs | 绝对值 | 扩展 |
| INC / DEC | 4B | RR | 有 | rd, rs | 自增/自减 | 扩展 |
| EXPT | 8B | RRR | 有 | rd, ra, rb | 幂(整数/浮点) | 扩展 |
| SQRT | 4B | RR | 有 | rd, rs | 平方根 | 扩展 |
| SIN / COS / TAN / ASIN / ACOS / ATAN | 4B | RR | 有 | rd, rs | 三角函数(浮点) | 扩展 |
| LN / LOG / EXP | 4B | RR | 有 | rd, rs | 对数/指数(浮点) | 扩展 |
| ROUND / TRUNC / FLOOR / CEIL | 4B | RR | 有 | rd, rs | 舍入(浮点→整数) | 扩展 |
## 4. 比较
| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 |
|---|---|---|---|---|---|---|
| CMP_EQ / NE / LT / LE / GT / GE | 8B | RRR | 有 | rd, ra, rb | 按 type:有/无符号/浮点/IEEENaN 传播) | 核心 |
## 5. 转换
| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 |
|---|---|---|---|---|---|---|
| CONV | 4B | RR | dst | rd, rs | 类型转换(dst 在 type 位段;src 值已在寄存器,按 dst 宽度截断/扩展/舍入) | 扩展 |
| TRUNC(并入 CONV 舍入模式) | — | — | — | — | 舍入模式由 CONV 的 op 变体或独立指令(见上) | 扩展 |
## 6. 控制流
| 指令 | 组 | fmt | type | 操作数 | 语义 | 状态 |
|---|---|---|---|---|---|---|
| JMP | 8B | JMP | 无 | off32 | 无条件跳转(相对下一条,字节) | 核心 |
| JT / JF | 8B | JC | 无 | rd, off | rd≠0/==0 跳转 | 核心 |
| CALL | 8B | IMM | 无 | fn_id | 压帧调用(r0..r7 复制) | 核心 |
| RET | 4B | NONE | 无 | — | 弹帧 / MAIN 周期结束 | 核心 |
| CAL | 8B | SLOT | 无 | fb_id, slot | 内建 FB 调用(fb_id 查 [[fb]] 表) | 核心 |
| JTBL | 32B | 预留 | 无 | rd, slot, n | CASE 跳转表 | 预留 |
## 7. 内建 FBCAL + fb_id[[fb]] 表)
| fb_id | FB | 字段(类型化) | 状态 |
|---|---|---|---|
| 0 | TON | in/pt/q/et = BOOL/TIME/BOOL/TIME | 核心 |
| 1 | TOF | 同上 | 核心 |
| 2 | TP | 同上 | 核心 |
| 3 | CTU | cu/r/pv(INT)/q/cv(INT) 单字 | 核心 |
| 4 | DCTU | cu/r/pv(DINT)/q/cv(DINT) 双字 | 核心 |
| 5 | CTD | cd/ld/pv(INT)/q/cv(INT) | 核心 |
| 6 | DCTD | cd/ld/pv(DINT)/q/cv(DINT) | 核心 |
| 7 | CTUD | cu/cd/r/lu/pv(INT)/qu/qd/cv(INT) | 核心 |
| 8 | DCTUD | cu/cd/r/lu/pv(DINT)/qu/qd/cv(DINT) | 核心 |
| 9 | R_TRIG | clk/q = BOOL/BOOL | 核心 |
| 10 | F_TRIG | clk/q = BOOL/BOOL | 核心 |
| 11 | SR / RS(锁存) | s1/r/s/q… | 扩展 |
| 12 | PWM | in/pt/q… | 扩展 |
| 13 | RTC | 日期时钟字段 | 扩展 |
## 8. 字符串(未来,元数据段 + 16/32B)
| 指令 | 组 | fmt | 语义 | 状态 |
|---|---|---|---|---|
| STR_LEN | 16B | SLOT+off | 字符串长度 | 预留 |
| STR_CMP / STR_EQ | 16B | SLOT+off | 比较(按元数据段定长/变长) | 预留 |
| STR_CONCAT | 32B | 预留 | 拼接 | 预留 |
| STR_MID / STR_LEFT / STR_RIGHT | 16B/32B | 预留 | 取子串 | 预留 |
| STR_FIND / STR_REPLACE | 32B | 预留 | 查找/替换 | 预留 |
## 9. 数组(未来)
| 指令 | 组 | fmt | 语义 | 状态 |
|---|---|---|---|---|
| ARR_LEN | 16B | SLOT+off | 数组长度 | 预留 |
| ARR_LOAD / ARR_STORE | 32B | 预留 | 索引访问(基槽+index) | 预留 |
## 10. 系统
| 指令 | 组 | fmt | 语义 | 状态 |
|---|---|---|---|---|
| NOP | 4B | NONE | 空操作(占位/对齐) | 核心 |
## 11. op 预算核对(前缀编码按组分治)
| 组 | op 空间 | v1 核心用量 | 扩展/预留量 |
|---|---|---|---|
| 4Bop:7 | 128 | MOVE/NOP/NOT/RET ≈ 4 | 124(浮点单目/舍入/CONV 等) |
| 8Bop:6 | 64 | ADD..CMP/LOAD/STORE/LOADK/CALL/CAL/JMP/JT/JF ≈ 19 | 45(位运算/移位/GETBIT 等) |
| 16Bop:5 | 32 | LOAD_OFF/STORE_OFF ≈ 2 | 30LOADK64/字符串/数组) |
| 32Bop:4 | 16 | 0 | 16JTBL/复杂字符串) |
> 注:以上为全功能**目标清单**,v1 只实现「核心」列;「扩展/预留」列给出指令格式占位,
> 具体操作数形态(如 GETBIT 的槽/寄存器目标、CONV 舍入模式)在实现时定稿。