Files
Interpreter/Doc/isa/指令编码.md
T
Admin 5b10c2c826 文档:新建指令编码.md——RISC-V 式 op+func 编码定案存档
- 前缀长度组(1/01/001/0001 定 4/8/16/32B)+ op 按组分治
- 字节 1 = [func:4|fmt:4];func 10 组合(宽度×符号+F32/F64)语义随 op
- fmt 4 位 9 格式(格式合并作废,CALL/CAL 独立)
- 19 类型 → 10 func 编译期映射;BOOL 0/1 编译器强制
- 与 RISC-V 对照表 + 决策历史
2026-08-24 14:43:16 +08:00

5.6 KiB
Raw Blame History

指令编码(V2RISC-V 式 op + func

状态:定案存档。本文独立存储 RISC-V 式指令编码设计(opcode 定功能、func 定细节), 与 指令集优化.md(格式/数据模型/待确认)配套。 定案日期:2026-08-24。

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

RISC-V:  opcode 决定指令的"功能族"LOAD/STORE/OP/BRANCH…)
         funct3/funct7 决定"功能细节"(宽度/符号/变体)
         lb 与 lbu 同一 opcodefunct3 区分符号

本方案:  op 决定指令的"功能"MOVE/LOAD/ADD…)
         func 决定"功能的细节"(宽度/符号/浮点/变体)
         func 的语义由 op 决定(随 op 变,不是全局统一表)
  • opcode 只决定指令的功能func 决定功能的细节
  • func 语义随 op 变MOVE 的 func = 宽度;LOAD 的 func = 宽度×符号;ADD 的 func = 宽度×符号+浮点

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

指令 = 字节0 + 字节1 + 操作数区(rd/rs/slot/off…,按 fmt 与长度组)

字节 0                 字节 1
[前缀 | op]            [func:4 | fmt:4]
  ↑                      ↑          ↑
  长度+主操作码           功能细节    操作数形态

2.1 字节 0:长度前缀 + 主操作码(前缀编码,UTF-8/RISC-V 式)

前缀(从最高位开始比对) 指令长度 op 位宽 op 空间
1 4 字节 7 位 128
01 8 字节 6 位 64
001 16 字节 5 位 32
0001 32 字节(预留) 4 位 16
  • 长度自描述:前缀本身即长度,未来 64B 可续 00001(无限延伸)
  • op 按组分治:各长度组的 opcode 独立编号(4B 的 MOVE=0 与 8B 的 LOAD=0 不冲突,前缀已区分)
  • 取指:读字节 0 → 前缀判定长度 → 搬整条

2.2 字节 1func + fmt(各 4 位)

[func:4 | fmt:4]
  高 4 位 = func   功能细节(宽度/符号/浮点)
  低 4 位 = fmt    操作数形态

3. func 位段(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 语义随 op
    • MOVE:只表达宽度(1/2/4/8B 搬运),不管符号/浮点
    • LOAD/STORE:宽度×符号(读几字节 + 符号/零扩展)
    • ADD/SUB/MUL/DIV:宽度×符号(整数饱和)+ F32/F64(浮点 IEEE
    • 逻辑(AND/OR/NOT/位运算):宽度(BOOL 情况由编译器保证 0/1 输入)
    • 跳转/调用/CAL/无类型指令:func 不使用(保留 0)
  • VM 只认 func(10 种数据语义),无类型概念;类型语义全在编译层

4. fmt 位段(4 位,9 种格式 + 7 预留)

fmt 形态 说明
0 RR rd, rsMOVE/NOT/浮点单目)
1 RRR rd, ra, rb(算术/比较/位运算)
2 IMM rd, 32 位立即数(LOADK/CALL
3 SLOT rd, slot32LOAD/STORE/CAL
4 JMP off32
5 JC rd, offJT/JF
6 CALL fn_id(独立格式,未合并)
7 CAL fb_id, slot(独立格式,未合并)
8 NONE 无操作数(RET/NOP
9..15 预留
  • 格式不合并fmt 4 位足够,CALL/CAL 保持独立格式(U1 闭合为"不合并"

5. 长度组 × 格式族(操作数区)

长度组 格式族 操作数区
4B NONE / RR rd + rs1(各 1B
8B RRR / IMM / SLOT / JMP / JC / CALL / CAL + rs2 + slot32/fn_id32/const_id32/off32
16B SLOT+off(字段访问)/ IMM64 + slot32 + off32/imm64
32B 预留(JTBL/复杂字符串)

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

  • 编译期19 种 IEC 基础类型(BOOL/BYTE/WORD/DWORD/LWORD/SINT/INT/DINT/LINT/USINT/UINT/UDINT/ULINT/TIME/REAL/LREAL/DATE/TOD/DT),类型检查严格比对——类型不匹配编译期报错,不进 VM
  • BOOL 约束:编译器限制 BOOL 只能填 0/1(TRUE/FALSE),其他值编译期报错;VM 无 BOOL 特例
  • 运行时VM 只认 func 的 10 种"宽度+符号+浮点"组合,机械执行
  • 位串(BYTE/WORD/…)与无符号整数同 func——运算语义由 op 区分(SHL 是位运算指令、ADD 是算术指令)
  • TIME 用 8B 有符号 func(毫秒语义在编译层)
  • 常量表:条目 8B 原始值(无 tag),LOADK 按 func 解释(A2 定案不变)

7. 与 RISC-V 的对照

RISC-V 本方案
主功能 opcode[6:0] 前缀 + op(按长度组分治)
细节 funct33 位)/ funct7 func4 位,10 组合)
形态 rd/rs1/rs2/imm 固定位置 fmt4 位,9 形态)
宽度×符号 lb/lbu/lh/lhu/lw/lwu/ld func 0..9 全矩阵
指令长 定长 32 位(+RVC 压缩 16 位) 变长 4/8/16/32B(前缀编码)

8. 决策历史

  • 用户提出 RISC-V 式:opcode 只决定功能,func 决定细节(例:MOVE 按 func 分搬运宽度)
  • func 4 位(16 种)够用;10 组合实际使用
  • MOVE 只搬宽度不管符号/浮点(例为示意,宽度按 func 全矩阵 1/2/4/8B
  • 19 类型 → 10 func 由编译器映射;类型检查严格,不匹配编译期报错
  • BOOL 编译器强制 0/1,越界报错
  • 字节 1 = [func:4 | fmt:4] → fmt 4 位 → 格式合并作废CALL/CAL 独立格式)