进度说明

lc 2 months ago
parent 751f752f8d
commit 8f807adb08

@ -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 字节栈对齐规范,正确保存和恢复 FPX29与 LRX30
## 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
```
Loading…
Cancel
Save