64 비트 Aarch64 장치에서 ARM에서 GCC 인라인 어셈블러를 배우고 있습니다. 내가 이해하지 못하는 오류 메시지가 나타납니다. GCC의 인라인 어셈블러에서의 오류 메시지가 :Error : 피연산자 1에서 벡터 레지스터를 잘못 사용했습니다.
$ cat test.cc
#include <arm_neon.h>
int main(int argc, char* argv[])
{
uint64x2_t r = {0,0}, a = {2,4};
__asm__ __volatile__
(
"pmull %0, %1, %1;"
: "=w" (r)
: "w" (a), "w" (a)
: "cc"
);
return (int)r[0];
}
"w"
는 Aarch64 machine constraint입니다 :
$ gcc -DNDEBUG -g3 -O1 -march=armv8-a+crc+crypto test.cc -o test.exe
/tmp/ccCHOWrn.s: Assembler messages:
/tmp/ccCHOWrn.s:19: Error: invalid use of vector register at operand 1 -- `pmull v0,v0,v0'
샘플 프로그램은 단순히 다항식 곱셈을 행사하려고합니다. 이 경우 "부동 소수점 또는 SIMD 벡터 레지스터"라고 말하면인데, 이는 내가 원하는 것으로 보인다.
uint64x2_t
유형은 일반적으로 ARM 내장 함수와 함께 사용됩니다. 하지만 그 128 비트 타입과 SIMD 코 프로세서를 위해 정렬, 그래서 그것은 샘플을위한 좋은 선택 같았다.
장치는 Linaro 이미지 및 GCC 4.9.2 컴파일러가있는 LeMaker HiKey입니다. 이 버그는 몇 년 전에 고쳐졌지만, 관련이 있는지 확실하지 않습니다. fbb ftbfs on arm64.
나는 두 가지 질문이 있습니다
- 오류가 무엇을 의미합니까, 내가 그것을 어떻게 해결할 수 있습니까?
pmull
및pmull2
에 내장 함수가 있습니까?
나는 배치 지정자를 추가하는 시도,하지만 난 구문을 알고하지 않기 때문에 그것이 작동하지 않았다 놀랐 아니에요 :
$ gcc -DNDEBUG -g3 -O1 -march=armv8-a+crc+crypto test.cc -o test.exe
test.cc: In function ‘int main(int, char**)’:
test.cc:8:15: error: expected ‘)’ before numeric constant
: "=w" (r.1q)
^
test.cc:8:15: error: expected ‘)’ before numeric constant
test.cc:9:6: error: expected ‘;’ before ‘:’ token
: "w" (a.1d), "w" (a.1d)
^
test.cc:9:6: error: expected primary-expression before ‘:’ token
가 나는 또한 더블 추가하는 시도를 어셈블러에서
.att_stntax
및
.intel_syntax
:
(으)로 문제가 발생하여 백분율 기호 (예 :
%%0
및
%%1
) 10
$ gcc -DNDEBUG -g3 -O1 -march=armv8-a+crc+crypto test.cc -o test.exe
/tmp/ccPpnvUP.s: Assembler messages:
/tmp/ccPpnvUP.s:19: Error: operand 1 should be a SIMD vector register -- `pmull %0,%1,%1'
즉, 컴파일러에게 SIMD 레지스터를 요청하면 SIMD 레지스터가 제공됩니다. 명령어의 _rest_를 적절하게 지정해야합니다. 구문이 확실히 분명하지는 않습니다. 데이터 유형이 사용자가 아닌 모든 피연산자에 대해 지정해야하는 명령어의 고유 한 부분입니다. 당신이 상상할 수있는 니모닉 (나는 초기 애플 어셈블러가 후자의 형식을 사용하는 자신의 구문을 구현하여 많은 혼란을 겪었던 것을 기억한다). – Notlikethat