2013-02-07 5 views
0

NEON 확장 레지스터는 16 개의 쿼드 워드 또는 32 개의 더블 워드로 볼 수 있습니다. 대부분의 프로그래밍에서 사용되는 특정 레지스터는 고정되어 있습니다. 예를 들어,NEON에서 레지스터 이름에 변수를 사용 하시겠습니까?

vmov.i8 d0, 0xff 
vmov.i8 d1, 0xee 
vmov.i8 d2, 0xdd 

내 문제는 필요한 더블 워드 레지스터의 수는 함수 호출의 인수에 따라 다릅니다. 인수가 2 인 경우 인수가 4 인 경우 예를 들어, 내가

vmov.i8 d0, 0xff 
vmov.i8 d1, 0xee 

을 할 필요가, 내가 그의 이름을 기반으로하는 레지스터를 선택

vmov.i8 d0, 0xff 
vmov.i8 d1, 0xee 
vmov.i8 d2, 0xdd 
vmov.i8 d3, 0xcc 

을 할 수 어쨌든 있나요 필요 변하기 쉬운? 이 라인을 따라, 즉 뭔가 (다음은 유효한 ARM 어셈블리 코드가 아닙니다) :

mov r0, #1 
vmov.i8 d{r0}, 0xff 
+0

여기에서 수행하려는 작업에 대한 자세한 내용을 제공 할 수 있습니까? 일반적으로 NEON의 조건은 비트 논리로 변환되므로 비교를 수행하고 AND (예 :)를 수행하여 다른 값을 기반으로 레지스터의 일부를 마스크 처리 할 수 ​​있습니다. –

+0

드문 경우지만 ARM 명령어는 정적으로 대상 지정되며 피연산자를 조건부로 변환 할 수있는 방법은 없습니다. –

+0

바이트 행렬 곱셈을 시도하고 있습니다. 왼쪽 행렬은 8 by 8 바이트이고 오른쪽은 8 by n이고 n은 1에서 7까지의 변수가 될 것입니다. 가능한 모든 n에 대해 일반적인 코드를 작성할 수 있는지보고 싶습니다. n은 특정 값을 구체적으로 처리하는 레이블로 점프합니다). 서로 다른 n이 올바른 수의 레지스터를 저장하는 데 필요한 레지스터 수가 다르므로 매개 변수 n을 기반으로 사용할 레지스터를 결정할 수 있는지 확인하고 싶습니다. – windchime

답변

3

명령어에는 대상 레지스터가 하드 코딩되어 있고 최신 CPU로 자체 수정 코드를 작성하는 것이 불가능하므로 명령어 수준에서 대상 레지스터를 선택할 수 없습니다. 명령어 인코딩은 ARM ARM을 참조하십시오.

많은 경우 구조/조건부 실행 인 경우 으로 높은 레벨에서 수행 할 수 있습니다.

0

당신은 인수가 인 상태에서 마지막 두 개의 명령어를

vmov.i8 d2, 0xdd 
vmov.i8 d3, 0xcc 

를 실행할 수 있습니다 4.

또한 가능한 모든 인수 값에 대한 코드를 작성하거나 생성 할 수 있습니다.

인수가 항상 상수이고 계산되지 않은 매크로 인 경우에도 매크로를 사용할 수 있습니다.