2012-04-01 35 views
2

我們知道在NEON上,SIMD寄存器q0q7與浮點寄存器s0s31共享。所以下面的代碼有一個bug:NEON有沒有像「emms」這樣的東西?

float_t fRatio = (float_t)srcWidth/dstWidth; 

// NEON asm modified q0~q7 
MyNeonFunctionPtr1(pData, Stride, (int32_t)(fHorRatio*m_iHorScale)); 

// following sentence use wrong "fHorRatio", 
// which is modified by "MyNeonFunctionPtr1"; 

int32_t vertStepLuma = (int32_t)(fHorRatio*m_iVertScale); 

在x86中,emms可以解決它。但我如何在NEON上做到這一點?我的臨時解決方案是在vertStepLuma上使用volatile。有沒有更好的辦法?謝謝!

回答

2

你使用gcc內聯彙編嗎?然後使用clobber列表。您通知GCC您將使用特定的寄存器,並且gcc將不會在內聯asm塊之後存儲它們的值。在這裏閱讀:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.3

否則,如果是在其他地方實施的外部函數,那麼ABI決定了你被允許腐敗只Q4,Q5,Q6和Q7寄存器:ARM to C calling convention, NEON registers to save修復功能,保護寄存器(Q0-Q3),或在你自己保存這些寄存器的地方建立一個內聯程序集。

+0

它是外部函數。你的建議很有幫助! – lcljesse 2012-04-01 06:03:37

+1

反過來也一樣。 ABI規定您不得損壞Q4-Q7 – 2012-04-02 19:11:56

+0

Ooops。抱歉。是的,這是相反的方式,而不是我寫的。 – 2012-04-02 20:04:43

0

那麼,被調用者(函數)在覆蓋之前只應保留Q4-Q7並恢復它們,這意味着調用者應該知道其他寄存器保持不變的事實。因此,調用者必須在函數調用之前保留Q0-Q3,Q8-Q15,並在返回時恢復它們。 (編譯器自動執行此操作)

+0

哎呀,對不起。它應該是對馬丁斯答案的評論。 – 2012-04-03 02:34:34

相關問題