2016-10-28 117 views
3
int main(){ 
__asm volatile 
{ 
    // load data 
    vld1.16 {q0, q1}, [r0]! 

...器armcc抱怨`q0`沒有定義編譯霓虹燈裝配

使用命令

armcc --cpu=Cortex-A9 -O2 -Otime --vectorize --remarks -g --md --depend_format=unix_escaped --no_depend_system_headers -c -o test.o test.c 

它的主要錯誤表明

"test.c", line 7: Error: #20: identifier "q0" is undefined 
     vld1.16 {q0, q1}, [r0]! 
      ^
"test.c", line 8: Error: #20: identifier "q2" is undefined 
      vld1.16 {q2, q3}, [r0]! 
       ^

我錯過任何armcc命令中的標誌?

armcc版本

Product: ARM Compiler 5.05 
Component: ARM Compiler 5.05 (build 41) 
Tool: armcc [4d0eb9] 
For support see http://www.arm.com/support/ 
Software supplied by: ARM Limited 
+0

只是FYI,手動向量化的內在因素通常是比內聯asm更好的選擇,因爲編譯器最近對它們做了很好的工作。 (至少gcc和clang可以;不瞭解armcc)。請參閱https://gcc.gnu.org/wiki/DontUseInlineAsm,其原因包括:通過阻止編譯器傳播常量,實際上會導致代碼變慢;或者其他優化。 –

回答

3

雖然我不使用器armcc我不相信你的編譯器支持NEON內聯彙編。

https://static.docs.arm.com/dui0472/k/DUI0472K_armcc_user_guide.pdf

看看7.3節,其中規定:在編譯器內聯彙編器支持

7.3限制

編譯器中的內聯彙編器不支持多項 說明。具體而言,內聯彙編程序不支持:

•處理器中沒有Thumb-2技術的Thumb彙編語言。 • 添加到VFPv3或更高版本中的VFP指令。 •NEON 說明。 •ARMv6 SETEND指令和一些系統擴展。 •ARMv5 BX,BLX和BXJ指令。

它可能幾乎工作的原因是vld是VFPv2的一部分,它受到支持,直到遇到「q」時纔會被混淆。

如果您使用的是gcc/clang變體,那麼是的,我建議您需要隱式編譯目標NEON與-march=armv7-a -mfpu=neon,同時指定基本ISA和浮點單元擴展,但僅使用編譯器內在函數,不是內聯彙編。 (如評論中所述)。

+1

使用gcc,inline-asm從編譯器傳遞給彙編器(只是'%[name]'操作數被替換,等等),所以'-march'選項只會影響內聯asm,如果它們導致某種指示編譯器的asm輸出。關於ARM的IDK,但對於x86,'-msse4'或其他任何東西只是告訴編譯器它可以使用這些指令本身,而不需要你從inline asm中使用它們。 (這是使用相關內部函數所必需的) –

+0

謝謝,是的,我總是驚訝於gcc的基本/笨笨的彙編程序。 IIR,ARM的工具要好得多,並且可能會將體系結構標誌傳遞給彙編器以幫助檢查ISA兼容性(儘管自己使用它們已經8年了)。 –

+0

如果您是手寫asm,那麼可以使用NASM或YASM宏來檢查ISA兼容性,就像x264項目一樣。我還沒有研究過它們是如何實現的(無論是宏還是需要彙編程序支持),還是可以適應氣體。無論如何,'-march'的目的是告訴編譯器它可以發出什麼,而不是限制你可以用inline asm做什麼。如果避免使用'-march ='或'-msse4',則可以在使用SSE4指令之前手動檢查CPUID。 (當然,更好的方法是單獨的編譯單元,但gcc/gas設計是有道理的。) –