VDSP float 加減法對應 __float32_add/__float32_sub(libdsp/fpadd.asm),減法即翻轉減數符號後跳入加法。
y == 0:直接回傳 x(25 cycles)x == 0:直接回傳 y(26 cycles)x == Inf 且 y 合法 → 回傳 x(50 cycles)y == Inf 且同號 → 回傳 x(50 cycles)Inf + -Inf 或含 NaN → 回傳 NaNx 合法,y 為 NaN/Inf → 直接回傳 y(40 cycles)尾數 23 位 + 隱含位,指數差 > 24 時較小數無法影響結果,直接回傳較大數(136 cycles)。
代碼會比較指數,若 y > x 則交換運算元:
CC = R3 <= R2 (IU)
IF CC JUMP .no_swap
// 交換邏輯
.no_swap:
實測:
add(10000, 10)(無交換)→ 136 cyclesadd(10, 10000)(需交換)→ 132 cycles **更快**原因:JUMP 不被取時 pipeline 需清空(10 cycles),被取時僅 6 cycles。編譯器將「不交換」作為預測路徑,導致常見情況(大數在前)反而較慢。類似 Linux kernel likely/unlikely 優化思想。
FLT_MAX + FLT_MAX → Inf。