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

를 컴파일 정의되지 않은`불평 그것은 오류가의 armcc 명령을 사용하여</p> <p>... q0`는 네온 어셈블리

"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 --cpu=Cortex-A9 -O2 -Otime --vectorize --remarks -g --md --depend_format=unix_escaped --no_depend_system_headers -c -o test.o test.c 

armcc 명령의 플래그?

armcc 버전은 내가 armcc에서 사용하지 않지만, 당신의 컴파일러는 NEON에 대한 인라인 어셈블리를 지원 믿지 않는

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

컴파일러가 요즘과 잘 작동하기 때문에 수동 벡터화를위한 내장 함수가 일반적으로 인라인 asm보다 더 나은 선택입니다. (적어도 gcc와 clang은 armcc에 대해서는 모른다.) 컴파일러가 상수를 전파하지 못하게함으로써 실제로 느린 코드로 이어질 수 있다는 것을 포함하여 https://gcc.gnu.org/wiki/DontUseInlineAsm을 참조하십시오. 다른 최적화. –

답변

3

입니다.

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 변형을 사용하는 경우 기본 NE 및 부동 소수점 유닛 확장을 모두 지정하고 컴파일러 내장 함수를 사용하는 경우에만 -march=armv7-a -mfpu=neon으로 NEON 타겟팅을 암시 적으로 컴파일해야합니다. 인라인 어셈블리가 아닙니다. (코멘트에서 언급했듯이).

+1

gcc를 사용하면 inline-asm이 컴파일러에서 어셈블러로 전달됩니다 ('% [name]'피연산자로 대체 됨). 그래서'-march' 옵션은 결과적으로 인라인 asm에만 영향을 미칩니다 컴파일러의 asm 출력을 지시합니다. ARM에 관한 IDK, 그러나 x86,'-msse4' 또는 컴파일러에게 알려주는 것은 명령어 자체를 사용할 수 있으며 인라인 asm에서 사용할 필요는 없습니다. (해당 내장 함수를 사용하는 데 필요합니다.) –

+0

고마워, 네, 기본/바보 같은 gcc의 어셈블러가 얼마나 지속적인지 놀랍습니다. IIR, ARM의 도구가 훨씬 뛰어 났고 아마도 ISA 호환성을 확인하는 데 도움이되는 어셈블러에 아키텍처 플래그를 전달했을 것입니다. (필자가 직접 사용한 지 8 년이되었지만) –

+0

asm을 직접 작성한다면 x264 프로젝트처럼 ISA 호환을 확인하기 위해 NASM 또는 YASM 매크로를 사용할 수 있습니다. 나는 그것이 매크로인지 또는 어셈블러 지원이 필요한지 여부에 상관없이, 또는 그것이 가스에 적용될 수 있는지 여부를 조사하지 않았다.어쨌든,'-march'의 목적은 컴파일러에게 인라인 asm으로 할 수있는 것을 제한하는 것이 아니라, 출력 할 수있는 것을 컴파일러에게 알려주는 것입니다. '-march ='또는'-msse4'를 피하면 SSE4 명령을 사용하기 전에 수동으로 CPUID를 검사 할 수 있습니다. (물론 더 좋은 방법은 별도의 편집 단위이지만 gcc/gas 디자인은 이런 식으로 이해할 수 있습니다.) –