當我想將一個 32 位無符號整數(例如駐留在暫存器 r0 中)轉換為 VFP 的單精度浮點數(例如存盤在 s0 中)時,我使用:
vmov.f32 s0, r0
vcvt.f32.u32 s0, s0
然而,令人驚訝的是(至少對我而言)沒有用于將 64 位無符號或有符號整數轉換為單精度(或雙精度)浮點數的匯編指令。
我完成這項作業的方式如下:
bottomInt .req r0
topInt .req r1
bottomFloat .req s0
topFloat .req s1
@ Convert the 64-bit unsigned int:
vmov.f32 bottomFloat, bottomInt
vcvt.f32.u32 bottomFloat, bottomFloat
vmov.f32 topFloat, topInt
vcvt.f32.u32 topFloat, topFloat
@ Prepare multiplication with 2^32:
multiplierInt .req r2
multiplierFloat .req s2
mov multiplierInt, #0x10000
vmov.f32 multiplierFloat, multiplierInt
vcvt.f32.u32 multiplierFloat, multiplierFloat
@ Multiply the upper word of the unsigned int:
vmul.f32 topFloat, multiplierFloat
vmul.f32 topFloat, multiplierFloat
@ Add the two floating-point numbers:
vadd.f32 finalFloat, topFloat, bottomFloat
有沒有更好、更優雅的方法來實作這一點?
uj5u.com熱心網友回復:
即使可以表示精確的結果,您提出的方法也是不精確的,所以我不會使用它。
運行時庫功能__aeabi_ul2f并__aeabi_ul2d提供您請求的確切行為。
在一般情況下,我建議您只呼叫這些函式。例如,像:https ://godbolt.org/z/j7jT6eWGY
如果(且僅當)您需要在程式中如此熱點的代碼中重復執行此操作,以至于您無法承受函式呼叫的開銷,那么我建議您反匯編這些函式的庫代碼并將它行內。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/459710.html
