2010-01-18 101 views
1

我目前嘗試使用ARM彙編代碼編寫iPhone的VFP單元的程序。 VFP可以做浮點計算,但是AFAIK沒有整數算術。但是,它可以將float轉換爲有符號整數(4字節)。另外,根據這個快速參考:http://www.voti.nl/hvu/arm/ARMquickref.pdf 它似乎不支持任何移位操作彙編:將浮點值轉換爲帶符號的字節

我想要做的是轉換4個浮點數,我敢肯定,每個大於-127和小於127成4個有符號的字節。我可以將浮點數轉換爲有符號整數,然後將值向左移動12個字節(分別爲接下來的兩個值的8個和4個字節),並將所有四個位按比例或運算。

然而,由於轉移不可用,我需要找到另一種方式來做到這一點。此外 - 我不能使用整數算術(所以我不能乘以已轉換的整數2^n爲了轉移,但我不得不在浮標上工作)。

任何人都知道我能做到嗎?

btw對那些熟悉ARM體系結構的人來說 - 我不想切換到Thumb指令,因爲這是在一個對許多元素進行操作的循環中完成的,我不想在這裏面的拇指和胳膊指令之間切換。循環(因爲那很貴)

謝謝!

編輯:

另一個問題:我怎麼能正常化有三個元素的向量?

回答

2

您希望VFP ftosis指令將單精度FP值轉換爲4字節整數。如果您在S0-S3四個浮點,然後做後:

ftosis s0, s0 
ftosis s1, s1 
ftosis s2, s2 
ftosis s3, s3 

你在S0-S3四個4字節的整數,可連續存儲到存儲與fstm

在支持NEON的ARM處理器上,可以使用vcvt.s32.f32 q0, q0通過一條指令執行四次轉換。


編輯回答您的後續問題,這裏有一個簡單的例子功能,需要輸入一個指針到四個花車在內存中,並返回打包成一個單一的int32_t轉換值:

_floatToPackedInt: 
    fldmias r0, {s4-s7} 
    ftosizs s0, s4 
    ftosizs s1, s5 
    ftosizs s2, s6 
    ftosizs s3, s7 
    fmrrs r0, r1, {s0,s1} 
    fmrrs r2, r3, {s2,s3} 
    uxtb  r0, r0 
    uxtb  r1, r1 
    uxtb  r2, r2 
    orr  r0, r0, r1, lsl #8 
    orr  r0, r0, r2, lsl #16 
    orr  r0, r0, r3, lsl #24 
    bx  lr 

我沒有真正付出任何努力來調整這一點,因爲如果它們對性能至關重要,您不希望以這種方式進行轉換;你寧願要麼操作大數值的數組,也要管理這些代碼,以便多次轉換同時進行,或者將其與其他正在進行有用工作的操作交錯。

您也可以在uxtb之前插入ssat s,以使超出範圍的值飽和而不是打包。

此外,請注意,此代碼在ARMv7內核上的性能較差;你一定想在該平臺上使用NEON矢量操作。

+0

是的,我知道這一點 - 但問題是從signed int轉換爲signed byte!最後,我想沒有4個4字節的整數,但是在一個寄存器中有4個1字節的帶符號的字節 – genesys 2010-01-18 23:34:36

+0

對不起,一點也不清楚,那就是你想從你的問題中得到的結果(「然後將值移動12個字節到左邊」等等)。您可以直接在NEON上執行此操作,但是在僅具有VFP的ARM內核上,您需要將轉換後的值移回通用寄存器並將其壓縮爲字節。 – 2010-01-18 23:45:54

+0

你確定嗎?有按位或 - 所以我thoght也許我可以建立一些使用浮點算術。如果我將我的float在-127 <= f <= 127的範圍內,我不能乘以#4096(= 2^12),然後使用ftosis將其轉換爲int?這不會導致與將轉換後的int向左移動12位相同嗎? - 如果沒有,也許你可以回答我的第二個問題? (請參閱上面問題中的編輯) – genesys 2010-01-18 23:59:21