- Types.h:func 宽度/符号表(kFuncWidth/kFuncSigned)、饱和模板(各宽度 __int128 中间量 + 除法 A:除零返回被除数/MIN/-1 夹界/截断)、删 TypeTag - Op.h/.cpp:前缀分区 + 72 条指令表(与 machine.toml 强校验一致)、 uses_rd/rs1/rs2 直推、kFbNames(15 内建 FB) - Instr.h:变长 instr_len、位号 get/set(含 JC off@55..24、SLOT_OFF off@87..56)、 enc_* 发射器 - Encode.h/.cpp:decode/encode 往返、disasm(类型后缀 + CAL fb 名 + 未知 0x dump) - isa_test V2:饱和边界/func 表/前缀定长/位号往返/编解码/disasm/uses_*/指令表 修复的实现 bug:find_op 字符串比较(指针==)、set_byte0 11/10 与 010xxx 分支、 CAL 字段约定((slot<<16)|fb_id)、disasm 未知前缀 used 长度 状态:vm/executor 编译暂破(V1 代码引用旧 isa 接口),4-2 同步
isa
归执行器侧,只管指令定义。CMake 目标:isa(STATIC),无依赖;被 vm 依赖。
compiler 不依赖 isa——指令 opcode / 类型元数据 / FB 布局全部来自 compiler/machine.toml(见 指令配置.md)。.stb 映像读写由 compiler(写侧)与 vm(读侧)各自实现。
STCompiler → compiler (编码查 machine.toml,自带 .stb 写)
BytecodeExecutor → vm → isa (isa 只管指令;vm 自带 .stb 读)
操作码、指令字以 doc/isa/指令与映像.md 为准。 头文件实现该文,本 README 不另当规范。.stb 结构拆解见 doc/isa/stb文件格式.md。指令/类型/FB 登记见 doc/isa/指令配置.md。
公开头:isa/include/isa/。
做 / 不做
做: 操作码与 32-bit 指令字、BOOL/INT/TIME 定宽与饱和、编解码、一条指令的文本转储。
不做: 映像读写(compiler/vm 各自实现)、toml/关键字/符号表/AST、VM 执行 switch(在 vm)、扫描周期、I/O 采样。
目录与 CMake
isa/
CMakeLists.txt
README.md
include/isa/
Types.h # 宽度、饱和
Op.h # 操作码枚举 + OpFormat/OpClass + kOpDefs 表 + 助记符
Instr.h # 32-bit 打包/拆字段(inline)
Encode.h # encode / decode / disasm
src/
Encode.cpp
add_library(isa STATIC src/Encode.cpp)
target_include_directories(isa PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
vm:target_link_libraries(vm PUBLIC isa);compiler 不链 isa。
实现说明
Types.h:Bool=uint8_t、Int=int16_t、Time=int64_t(毫秒,理由见规范文);sat_add/sub/mul/div(饱和规则见规范文);TypeTag(0/1/2,.stb常量表契约)Op.h:enum Op : uint8_t(数值即编码,与machine.toml强校验一致);OpFormat(RR/RRR/IMM/SLOT/JMP/JC/CALL/CAL/NONE)与OpClass(Plain/Instance);34 条kOpDefs{ name, format, cls };mnemonic/format/op_class查表Encode.cpp:encode/decode往返 +disasm(按 format 表驱动,文本与规范文一致)
测试
tests/isa_test(链 isa):饱和、操作码冻结值、指令打包、encode/decode 往返、disasm 文本、OpClass 分类。
验收
cmake --build过;ctest过(isa_roundtrip等 14 个用例全绿)vm只#include <isa/...>;compiler不引用isa- 操作码有变:先改
compiler/machine.toml+ 本目录 + 测试,再改两端