2014-02-13 43 views
1

我不是裝配專家,所以這可能很簡單。用寄存器值替換常量的組件

如果我有一個期望的恆定值作爲像這樣的參數的指令:

VQSHRN.U32 d0,q0,#16 

我怎樣才能在寄存器中使用值來替換#16,如r0?這條指令甚至可以讓你這樣做,但我還沒有找到有關這種能力的文檔。有沒有一個正常的方法來做到這一點?

萬一這個問題,我正在編寫ARMv7程序集並將其與C++代碼內聯。謝謝。

+2

見http://infocenter.arm.com/help/topic/com.arm.doc.dui0348a /BABDFGBJ.html – Michael

+0

@Michael感謝您的鏈接。除了使用寄存器中的轉換外,我正在嘗試執行上述指令。我想盡可能少地使用說明。有小費嗎?我基本上需要一個向量四捨五入來縮小飽和值。 – user1132959

回答

1

正如@Michael指出的那樣,VQRSHL是這裏合適的shift-by-register指令 - 幸運的是,right恰好是負左。我會用VDUPr0變成適當的移位值向量,然後再縮小VQMOVN。所有這些都可以作爲內部函數,以幫助保持內聯彙編的污穢在海灣,是這樣的:

vshift = vdupq_n_s32(-shift); 
result = vqmovn_u32(vqrshlq_u32(data, vshift)); 
+0

感謝您指出具體說明。這應該工作。僅供參考我試圖複製的C代碼是#define CV_DESCALE(x,n)(((x)+(1 <​​>(n)) – user1132959