shrink
|
a14a9cde0d
|
7th Optimization reached 338.219s
|
18 hours ago |
Shrink
|
4df492feb9
|
lab6: add loop optimizations, parallel runtime, and asm backend fixes
|
22 hours ago |
zjx
|
9e8984d740
|
lab5寄存器分配实现
|
3 days ago |
zjx
|
15a663e61c
|
lab4功能已实现
|
1 week ago |
zjx
|
bca490f52e
|
修改逻辑使编译通过
|
1 month ago |
zjx
|
f15ad90289
|
优化核心指令选择逻辑
|
1 month ago |
Shrink
|
346a9c4099
|
fix: 修复浮点比较对 NaN 的错误处理(IEEE 754 合规)
问题描述:
ARM64 的浮点比较指令 fcmp 后,使用标准条件码(如 b.lt)对 NaN
操作数会产生错误结果。例如 NaN < -1e-6 错误地返回 true,导致
my_sqrt(NaN) 陷入死循环,vector_mul3.sy 测试无法退出。
根本原因:
- fcmp NaN, x 设置标志位 NZCV = 0011 (N=0, Z=0, C=1, V=1)
- b.lt 条件为 N!=V,对 NaN 为 0!=1 = true ✗ 错误
- IEEE 754 要求 NaN 与任何数比较(除!=)都应返回 false
修复方案:
1. 添加 FBcond 指令(浮点条件分支)
2. 新增 FloatCondSuffix() 函数返回 IEEE 754 兼容的条件码:
- Lt: lt → mi (N==1,对 NaN 返回 false ✓)
- Le: le → ls (!(C==1 && Z==0),对 NaN 返回 false ✓)
- Gt/Ge/Eq/Ne: 保持不变(已正确处理 NaN)
3. 在浮点比较后使用 FBcond 而不是 Bcond
4. FCmpRR (cset) 也使用 FloatCondSuffix
测试结果:
✓ NaN < -1e-6 正确返回 false(之前错误返回 true)
✓ vector_mul3.sy 正常退出(之前死循环)
✓ my_sqrt(NaN) 不再陷入无限循环
符合标准:
此修复使编译器生成的浮点比较代码完全符合 IEEE 754 标准。
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
1 month ago |
Shrink
|
693f54adf7
|
fix: 消除 Br 和 CondBr 未处理的编译警告
在 LowerInstruction 的 switch 中添加 Br 和 CondBr case。
这两个指令在 LowerModule 中已经处理,不会传递到 LowerInstruction,
但为了消除编译器的 -Wswitch 警告,添加这两个 case 并直接返回。
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
1 month ago |
Shrink
|
3078c4cc5a
|
fix: 修复大偏移量栈访问时的寄存器冲突问题
问题描述:
在访问本地数组时,如果数组基址偏移量超过 4095,PrintAddrFromX29
会使用 X10 作为临时寄存器来加载偏移量。但 Lowering.cpp 中已经
使用 X10 存储数组索引偏移量,导致寄存器冲突,数组访问地址错误。
修复方案:
1. 添加 PhysReg::W11 和 PhysReg::X11 到寄存器枚举
2. PrintAddrFromX29 和 PrintStackAccess 改用 X11 作为临时寄存器
3. 在 PhysRegName 中添加对 W11 和 X11 的支持
测试结果:
- 浮点数组操作正确
- 矩阵乘法测试通过
- 功能测试 95_float.sy 和 22_matrix_multiply.sy 完全通过
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
1 month ago |
Shrink
|
4413cfc4f5
|
阶段性保存
|
1 month ago |
Shrink
|
1fbdbb2ea1
|
feat: 实现完整数组支持 + 初步浮点支持 (18/21测试通过)
主要改动:
## 数组功能 (完整实现)
- 实现GEP指令支持全局数组、局部数组、指针参数的元素访问
- 支持2D数组的线性化和正确的地址计算
- 修复指针参数传递(区分数组地址传递和指针值加载)
- 添加LoadIndirect/StoreIndirect/LoadStackAddr等MIR指令
- 支持array[i][j]多维数组访问
## 浮点类型系统 (框架完成)
- IR类型系统: 添加Float32和PtrFloat32类型
- ConstantFloat: 实现浮点常量及Context管理
- IRGen: 支持float变量声明、浮点字面量、函数参数/返回值
- MIR寄存器: 添加S0-S10浮点寄存器
- MIR指令: 添加FAddRR/FSubRR/FMulRR/FDivRR/FCmpRR等浮点opcodes
- IRBuilder: CreateAllocaF32/CreateAllocaF32Array支持
## 测试结果
- 功能测试: 10/11 通过 (90.9%)
✓ 数组、函数、矩阵运算、图算法等全部通过
✗ 95_float (需完整浮点实现)
- 性能测试: 8/10 编译成功 (80%)
✓ 01_mm2 (矩阵乘法,输出验证正确)
✗ large_loop_array_2, vector_mul3 (需浮点支持)
- 总计: 18/21 (85.7%)
## 待完成
- Lowering.cpp中float的load/store/算术操作处理
- AsmPrinter.cpp中浮点汇编指令生成
- float与int的类型转换
关键修复:
- 修复GEP结果存储机制(使用8字节指针槽)
- 修复函数调用时数组参数传递(LoadStackAddr vs LoadStack)
- 修复15_graph_coloring的segfault问题
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
1 month ago |
Lane0218
|
b1155d8fa9
|
refactor(dev): 统一 IR/MIR 接口命名风格
|
3 months ago |
Lane0218
|
e9d7b4a058
|
refactor(dev): unify user-facing diagnostics
|
3 months ago |
Lane0218
|
b939fc40ee
|
feat(mir): 增加 Lab3 AArch64 MVP 后端与 --emit-asm 支持
|
3 months ago |
Lane0218
|
cf2e6e0b46
|
chore(misc): 按目录结构设计初始化工程骨架
|
5 months ago |