Files
Interpreter/Doc/isa/指令编码.md
T
Admin 134f1748ec 指令编码:fmt 位段取消,形态改由前缀分区表达(Q1=010 查表 / Q2 空位待定 / Q3 全组分区)
- 前缀分区: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
2026-08-24 15:30:59 +08:00

5.3 KiB
Raw Blame History

指令编码(V2RISC-V 式 op + func + 前缀分区形态)

状态:定案存档。RISC-V 式指令编码:opcode 定功能、func 定细节、 操作数形态由长度组前缀分区表达fmt 位段已取消)。 与 指令集优化.md(格式/数据模型/待确认)配套。修订:2026-08-24。

1. 设计原则(RISC-V 式)

opcode 决定指令的"功能"MOVE/LOAD/ADD…)
func   决定"功能的细节"(宽度/符号/浮点)
操作数形态(RR/RRR/IMM/SLOT/…)由长度组前缀分区 + 小表表达

2. 指令字结构(头两字节 + 操作数区)

指令 = 字节0 + 字节1 + 操作数区(rd/rs/slot/off…,按形态)

字节 0                 字节 1
[长度前缀+分区 | op]   [func:4 | 空:4]
  ↑                      ↑
  长度+形态分区+操作码     功能细节(空 4 位待全部编码后定)

3. 前缀编码与形态分区

前缀从最高位起比对,长度与形态分区一体:

前缀 指令长度 分区 形态 op 位宽 op 空间 指令
11 4B 11 RR 6 位 64 MOVE/NOT/NEG/ABS/INC/DEC/浮点单目/舍入/CONV21
10 4B 10 NONE 6 位 64 NOP/RET2
011 8B 011 RRR 5 位 32 算术/逻辑/移位/位操作/比较(26
010 8B 010 查表6 种形态) 5 位 32 LOADK/LOAD/STORE/JMP/JT/JF/CALL/CAL8,见 §5
0010 16B 0010 SLOT+off 4 位 16 LOAD_OFF/STORE_OFF/字符串(8
0011 16B 0011 IMM64 4 位 16 LOADK641
0001 32B 0001 预留 4 位 16 JTBL/复杂字符串/数组(6,形态待定)
  • 长度自描述1 开头 → 4B、01 → 8B、001 → 16B、0001 → 32B(前缀分区不改变长度判定)
  • op 按组内独立编号(各区从 0 起)
  • 取指:读字节 0 → 前缀定长 → 搬整条;形态由前缀分区直推(010 区查表)

4. func 位段(字节 1 高 4 位,16 种)

func 语义 覆盖类型(编译期映射)
0 1 字节、无符号 BOOL、BYTE、USINT
1 1 字节、有符号 SINT
2 2 字节、无符号 WORD、UINT
3 2 字节、有符号 INT
4 4 字节、无符号 DWORD、UDINT、DATE
5 4 字节、有符号 DINT
6 8 字节、无符号 LWORD、ULINT、DT、TOD
7 8 字节、有符号 LINT、TIME
8 F32 REAL
9 F64 LREAL
10..15 预留
  • func 语义随 opMOVE=宽度;LOAD/STORE=宽度×符号;ADD..=宽度×符号+浮点;逻辑=宽度;无类型指令 func=0(不使用)
  • 字节 1 低 4 位暂空:待全部指令编码完后决定用途(func 扩位/扩展字段)

5. 形态识别(前缀直推 + 010 区查表)

前缀 形态 识别方式
11 RR 前缀直推
10 NONE 前缀直推
011 RRR 前缀直推
010 见下表(8 条) op 查表
0010 SLOT+off 前缀直推
0011 IMM64 前缀直推
0001 预留 待定

010 区查表(8 条)

子 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
RR11 ✓(rs
NONE10
RRR011
010 区 查表(IMM/SLOT/JC 的 rd ✓;JMP/CALL/CAL —) 查表(—) 查表(—)
SLOT+off0010
IMM640011

执行:if (uses_rd && rd >= nregs) → BadOp——RRR 等大组零查表直推,010 区 8 条查小表。

7. 长度组 × 操作数区

前缀 长度 操作数区(bit16 起)
11/10 4B RR: rd=23..16、rs=31..24NONE: pad=31..16
011/010 8B RRR: rd+rs1+rs2+pad;其余见 §5 查表
0010/0011 16B SLOT+off: rd+slot32+off32+padIMM64: rd+imm64+pad
0001 32B 预留(操作数区 30B,格式待定)

8. 类型系统(编译期)→ func 映射

  • 编译期:19 种 IEC 基础类型,类型检查严格比对——不匹配编译期报错
  • BOOL 约束:编译器限制 0/1,越界报错;VM 无 BOOL 特例
  • 运行时VM 只认 func 的 10 种"宽度+符号+浮点"组合
  • 常量表:条目 8B 原始值(无 tag),LOADK 按 func 解释

9. 决策历史

  • 用户提出 RISC-V 式:opcode 定功能、func 定细节
  • 前缀分区:用户提出 011=RRR、010=其他(8 条查表);11=RR、10=NONE4B);0010=SLOT+off、0011=IMM6416B
  • fmt 位段取消:形态由前缀分区 + 010 区查表表达;字节 1 = [func:4 | 空:4],空位待全部编码后定
  • func 4 位(10 组合);MOVE 只管宽度;19 类型 → 10 func 编译期映射;BOOL 编译器强制 0/1