2013-03-13 2 views
1

NEON 레지스터로로드 유형 uint32x4_tr1, r3r4를 갖는 나는 다음과 같은 코드를 가지고 : 난 그냥 GCC 실제로 vmov 명령에 r4 = r1 변환 여부를 궁금NEON 간단한 벡터 지정 내장?

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

그리고있다. 해체 된 코드를 보면 나는 그렇게 놀랍지 않았다. (또한 생성 된 어셈블리 코드가 실제로 무엇을하는지 알 수 없습니다.)

ARM NEON 내장 함수 참조를 통해 스키밍 단순 벡터 -> 벡터 할당 내장 함수를 찾을 수 없습니다.

가장 쉬운 방법은 무엇입니까? 어떤 레지스터가 r1이고 r4vld1q_u32에 의해 할당되었는지 알지 못하기 때문에 인라인 어셈블리 코드가 어떻게 생겼는지 나는 잘 모르겠습니다. 나는 실제적인 스왑이 필요없고, 단지 임무를 부여 받는다.

+0

어셈블리는 어떻게 생겼습니까? -O2로 컴파일 했습니까? – auselen

+0

예, 단지 논리적 인 지시 사항이 있지만 예상했던 'vmov'는 없습니다. – NumberFour

+0

NEON 명령어'vmov'의 변형에 대한 내장 함수가 누락되었다고 생각되면 http://gcc.gnu.org/에서 opcode, 인수, 문서 링크 등으로 버그를 게시하십시오. – ydroneaud

답변

3

C에는 추상 기계의 개념이 있습니다. 과제 및 기타 작업은이 추상 기계의 관점에서 설명됩니다. 할당 r4 = r1;은 추상 기계에 r1 의 값을 r4로 지정합니다.

컴파일러가 프로그램에 대한 명령어를 생성 할 때 일반적으로 추상 머신에서 발생하는 모든 것을 정확히 모방하지 않습니다. 추상 기계에서 발생하는 연산을 동일한 결과를 얻는 프로세서 명령어로 변환합니다. 컴파일러는 이동 명령어와 같은 결과를 얻을 수있는 경우 이동 명령어와 같은 것을 건너 뜁니다.

특히 컴파일러는 항상 r1을 같은 위치에 두지 않을 수 있습니다. 처음으로 필요할 때 메모리에서 일부 레지스터 R7로로드 될 수 있습니다. 그런 다음 원래 값인 r1을 R7에 유지하면서 R8에 결과를 넣어 명세서 r1 = vandq_u32(r1,r3);을 구현할 수 있습니다. 그런 다음 나중에 r4 = veorq_u32(r4,r2);을 사용하면 컴파일러는 추상 기계에서 r4 (r4 = r1; 문)의 값을 계속 포함하므로 R7의 값을 사용할 수 있습니다.

명시 적으로 vmov 내장 함수를 작성한 경우에도 컴파일러는 끝에 동일한 결과를 얻는 명령어를 실행하는 한 명령을 실행하지 않을 수 있습니다.

+0

그렇습니다 위의 코드를 암시하는 것은 예상대로 작동하지만 분해에 'vmov'명령이 없습니까? – NumberFour

+0

@ NumberFour : 예. –