You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
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>
|
2 weeks ago |
| .. |
|
MIR.h
|
fix: 修复浮点比较对 NaN 的错误处理(IEEE 754 合规)
|
2 weeks ago |