|
|
|
|
@ -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
|
|
|
|
|
```
|
|
|
|
|
|