diff --git a/doc/lab3-进度.md b/doc/lab3-进度.md new file mode 100644 index 0000000..c1f9f88 --- /dev/null +++ b/doc/lab3-进度.md @@ -0,0 +1,70 @@ +# Lab3:指令选择与汇编生成 - 开发进度与总结 + +本文档总结了实验 3 的任务目标、实现细节及当前进度,旨在为后续开发(如优化或改进)提供清晰的参考。 + +## 1. 实验任务概述 + +本阶段的任务是实现编译器的后端部分,将 Lab2 产生的 LLVM 风格中间表示(IR)翻译为 ARM64/AArch64 汇编代码。生成的汇编代码需能够: + +- 通过交叉编译器(`aarch64-linux-gnu-gcc`)与 SysY 标准库(`sylib.c`)进行链接。 +- 在 QEMU 模拟器或真实 AArch64 环境中正确执行。 +- 完整覆盖 SysY 2022 规范,包括标量运算、多维数组访问、函数递归调用、浮点数运算及标准库函数交互。 + +## 2. 当前实现状态 + +**目前处于初步完成阶段**。虽然初步测试能够通过全部 21 个官方功能与性能测试用例,但部分用例仍存在缺陷,后端生成效率和代码质量仍有较大提升空间。 + +## 3. 核心逻辑与关键实现点 + +- **指令映射与选择**: + - 实现了从 IR 到机器指令(MachineInstr)的映射。 + - 针对 SysY 特有的运算(如取模 `%`),通过 `sdiv` 和 `msub` 指令组合实现。 + - 针对比较运算,采用了 `cmp` 配合 `cset` 生成布尔值的方案。 +- **全量浮点支持**: + - 引入了 S0-S15 浮点寄存器体系。 + - 实现了浮点算术(`fadd`, `fsub`, `fmul`, `fdiv`)、比较(`fcmp`)及类型转换(`scvtf`, `fcvtzs`)。 +- **多维数组地址计算(GEP)**: + - 实现了递归的地址偏移计算逻辑。 + - 能够根据数组各维度的大小自动计算复合索引对应的内存地址。 +- **大栈帧访问防御机制**: + - 针对 `vector_mul3` 等需要超大局部数组的用例,后端使用 `X16` 寄存器加载大偏移量。 + - 解决了 `ldur/stur` 指令在偏移量超过 256 字节或 `add` 超过 4KB 时的溢出报错问题。 +- **多函数栈帧管理**: + - 实现了每个函数独立的 `Prologue`(序言)和 `Epilogue`(尾声)。 + - 严格遵循 16 字节栈对齐规范,正确保存和恢复 FP(X29)与 LR(X30)。 + +## 4. 遗留问题与不足 + +当前实现仍存在以下显著问题,需要后续进一步优化和修复: + +- **2025-MYO-20.sy 缺陷**:该用例在当前代码下运行虽然通过,但其逻辑对输入数据的兼容性处理较为脆弱,可能存在边界条件下访问异常的问题,急需改进优化。 +- **执行性能极低**: + - **性能测试耗时过长:目前的 10 个性能测试用例运行速度非常慢,看对lab3是否有影响**。 + - **冗余指令严重**:由于采用了全栈槽模型(所有变量均存储在内存中),导致生成的汇编中充斥着大量的 `ldr/str` 指令。 +- **寄存器分配缺失**:目前完全没有实现真正的寄存器分配逻辑(Lab5 任务),寄存器利用率极低。 +- **调用约定限制**:当前仅支持前 8 个参数通过寄存器传递,尚未实现参数超过 8 个时的栈传参逻辑,不满足复杂函数调用的全量要求。 +- **缺乏指令优化**:生成的指令序列较为死板,未进行窥孔优化或指令合并(如 `add` 移位操作的充分利用)。 + +## 5. 编译与运行指南 + +### 编译项目 + +```bash +cmake -S . -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build -j "$(nproc)" +``` + +### 自动化全量验证 + +```bash +# 运行整合后的 21 个官方用例测试脚本 +./scripts/test_lab3_final.sh +``` + +### 官方脚本单例验证 + +```bash +# 格式:./scripts/verify_asm.sh <.sy文件> <结果目录> --run +./scripts/verify_asm.sh test/test_case/functional/simple_add.sy test/test_result/manual --run +``` +