2013-03-13 26 views
1

擁有裝入NEON寄存器uint32x4_tr1r3r4我有以下代碼:NEON簡單向量賦值內在?

r3 = veorq_u32(r0,r3); 
r4 = r1;  
r1 = vandq_u32(r1,r3); 
r4 = veorq_u32(r4,r2); 
r1 = veorq_u32(r1,r0); 

而我只是想知道是否GCC實際上轉化r4 = r1vmov指令。看着反彙編的代碼,我並不感到驚訝,它沒有。 (而且我想不出什麼生成的彙編代碼實際上做)

通過ARM的NEON內在略讀引用我無法找到任何簡單的載體 - >矢量分配的內在。

什麼是實現這一目標的最簡單的方法?我不知道一個內聯彙編代碼會是什麼樣子,因爲我不知道在哪個寄存器是r1vld1q_u32分配r4。我不需要實際交換,只需分配。

+0

大會如何看起來像?你用-O2編譯過嗎? – auselen 2013-03-13 13:47:17

+0

是的,只有一堆邏輯指令,但沒有我期望的'vmov'。 – NumberFour 2013-03-13 14:13:36

+0

如果您認爲缺少NEON指令'vmov'的變體的內在函數,請隨時在http://gcc.gnu.org/上發佈一個包含操作碼,參數,文檔鏈接等的錯誤。 – ydroneaud 2013-03-13 14:35:05

回答

3

C具有一個抽象機的概念。根據這個抽象機器來描述分配和其他操作。賦值r4 = r1;表示爲r4分配抽象機中的r1 的值。

當編譯器爲一個程序生成的指令,它通常不完全模仿發生在抽象機的一切。它將抽象機器中發生的操作轉換爲獲得相同結果的處理器指令。如果編譯器能夠發現它沒有它們就可以得到相同的結果,那麼編譯器會跳過這樣的指令。

特別是,編譯器可能不會每次都將r1保存在同一個地方。它可能會在您第一次需要它時將它從內存加載到某個寄存器R7中。但是,它可能會通過將結果放在R8中,同時將原始值r1保留在R7中來實現您的語句r1 = vandq_u32(r1,r3);。然後,當你以後有r4 = veorq_u32(r4,r2);,編譯器可以使用R7的價值,因爲它仍包含在抽象機器值r4將有(從r4 = r1;語句)。

即使您明確編寫了vmov內部函數,編譯器也可能不會爲它發出指令,只要它發出的指令在最後得到相同的結果即可。

+0

你暗示上面的代碼將按預期工作,但在彙編中沒有'vmov'指令? – NumberFour 2013-03-13 14:08:39

+0

@NumberFour:是的。 – 2013-03-13 14:26:47