2012-01-27 3 views
1

NEON 레지스터에 char 값 배열을로드하고 16 비트 또는 32 비트 정수 값으로 처리하려고합니다. 이렇게 뭔가가 ...NEON/ARM을 사용하여 8 비트 값로드

void SubVector(short* c, const unsigned char* a, const unsigned char* b, int n) 
{ 
    for(int i = 0; i < n; i++) 
    { 
     c[i] = (short)a[i] - (short)b[i]; 
    } 
} 

데이터를로드하는 방법을 모르겠습니다. 8 비트 데이터를 차선에로드 한 다음 레지스터를 반바지로 재 해석해야합니까? 또는로드 및 변환? 가장 빠른 방법은 무엇입니까?

누구나 NEON 내장 함수를 사용하여 이러한 작업을 수행하는 방법에 대한 예제가 있습니까?

감사합니다.

답변

6

NEON에는 8-> 16, 16-> 32 또는 32-> 64 비트의 값을 확장 할 수있는 더하기 및 빼기 명령어가 있습니다. 다음과 같이 한 번에 8을 할 수 있습니다.

uint8x8_t u88_a, u88_b; 
uint16x8_t u168_diff; 

u88_a = vld1_u8(a); // load 8 unsigned chars from a[] 
u88_b = vld1_u8(b); // load 8 unsigned chars from b[] 
u168_diff = vsubl_u8(u88_a, u88_b); // calculate the difference and widen to 16-bits 
+0

우수 답변. –

+0

감사합니다. 완전한. – paul

+0

나는 똑같은 일을하려하고있다. 그러나 두 uint8의 차이를 계산할 때 결과는 uint16이 아닌 int16이어야합니다 ...이 내장 함수의 사용법은 무엇입니까? 내 부정적인 결과를 얻기 위해 재 해석 등을해야합니다. –

관련 문제