将原先基于单个 pending 字符串和少量硬编码特判的 RegPeephole, 重构为可扩展的流式小窗口 peephole 框架。
本次改动主要包括:
-
为汇编输出引入轻量结构化表示 AsmLine
- 将每一行分类为 empty / comment / directive / label / instruction
- 对 instruction 进一步拆分为 opcode + operands
- 为后续规则匹配提供统一、稳定的表示层
-
将原有实现改为 3 行滑动窗口 + fixed-point 规则迭代
- 保持流式处理,不再缓存整份 .s
- 每次读入一行后在小窗口内反复应用规则,直到局部稳定
- 只在确认前缀不再被后续规则改写后才写回目标输出流
- 保留原实现“低额外内存占用”的优点,同时提升可维护性与可扩展性
-
把原有 peephole 逻辑迁移到统一规则表中
- 删除自拷贝:mv x, x / fmv.s f, f
- 删除跳到下一标签的 j
- 相邻 store-load 转发:sw->lw、sd->ld、fsw->flw
-
新增一组安全、保守的局部 peephole 规则
- no-op immediate 归一化:addi/ori/xori 的 0 立即数形式改写为 mv
- 来回拷贝消除:mv a, b; mv b, a
- 条件/无条件跳转到下一标签的删除
- 分支取反吸收后继 j:bcond L1; j L2; L1:
- 跳转重定向:j L1; L1:; j L2
- 重复 load 删除
- 重复 store 删除
- 连续 store 覆盖前一条 store 的删除
- load-store round trip 删除:从同地址读出后又原样写回
-
明确当前框架边界
- 规则仍然保持保守,只处理最多 3 行的局部窗口
- 不做跨 label / block 的全局分析
- 不引入 alias analysis 或更激进的机器级推理
- 使当前实现更适合作为后续继续扩展 peephole pattern 的基础框架
-
更新 src/asm/README.md
- 补充 RegPeephole 的新工作流程
- 说明结构化行类型、窗口模型、规则分类与当前能力边界
- 同步示例与设计说明,避免文档与实现脱节
验证:
- cmake --build build
- src/scripts/asm_test.sh test/custom/basic.sy -O0
- src/scripts/asm_test.sh test/tests2026/functional
- src/scripts/asm_test.sh test/tests2026/h_functional
结果:
- functional: 100/100 通过
- h_functional: 40/40 通过