fract16 加法由 __builtin_add_fr1x16 實現,減法對應 __builtin_sub_fr1x16,皆單週期完成。
R0.L = R1.L + R0.L (S) // (S) 表示飽和
R0 = R0.L (X)
0x7FFF(約 0.99997)飽和至 0x7FFF。0x8000(-1.0)飽和至 0x8000。[-1, 1-2^-15]。+ 運算子的差異r = x + y; // 非內建函數
// 組合語言:R0 = R0 + R1 (NS) // 無飽和
// R0 = R0.L (X)
編譯器視為 32-bit 整數加法後取低 16 位,**不飽和**,會產生環繞結果,非預期行為。
同理使用 __builtin_sub_fr1x16,內部以加負數實現,同具飽和特性。
結論:必須使用內建函數確保 DSP 語意正確,避免隱性 Bug。