2013-08-19 5 views
1

ARM 네온에 조건부 스토어를 생성하는 방법을 알아 내려고하고 있습니다. 내가하고자하는 것은이 SSE 교육과 동등합니다 :ARM 네온 : 조건부 상점 제안

무효 _mm_maskmoveu_si128 (__m128i d, __m128i n, char * p);

조건부로 d의 바이트 요소를 주소 p에 저장합니다. 선택기 n의 각 바이트의 상위 비트는 d의 해당 바이트가 저장 될지 여부를 결정합니다.

NEON 내장 함수로 수행하는 방법에 대한 제안이 있으십니까? 16 × 1 바이트 요소의

int8x16_t store_mask = {0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; 

int8x16_t tmp_dest = vld1q_u8((int8_t*)p_dest); 
vbslq_u8(source,tmp_dest,store_mask); 
vst1q_u8((int8_t*)p_dest,tmp_dest); 
+0

세 단계로 수행해야합니다. 먼저 벡터를로드하고 마스크를 사용하여 필요한 요소를 수정 한 다음 수정 된 벡터를 다시 저장합니다. 그것의 원래 위치. –

+0

미안하지만 아직도 나에게 분명하지 않다. 내가 뭘하고 싶은 :이 같은 벡터를 사용 : 마스크 = {0000000x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80} ; _mm_maskmoveu_si128 (__ m128i d, __m128i n, char * p)의 "n"매개 변수입니다. 케이스. 당신이 말하는 가면은 어떻게 구조화되어야합니까? 어떤 작업을해야합니까? 고맙습니다 (전에는 네온을 사용한 적이 없기 때문에 조금 혼란 스럽습니다). – user2696208

+0

OK - 복잡 해짐에 따라 아래에 답변의 형태로 자세한 설명을했습니다. –

답변

0

가정 벡터, 각 요소 중 하나를 모두 0 (0x00) 또는 모두 1 (인 마스크 벡터를 설정합니다 : 이 내가 무슨 짓을했는지 당신

감사 0xff)를 사용하여 요소를 저장하지 않아야하는지 여부를 결정합니다. 그런 다음 다음 코드 (의사 코드)를 수행해야합니다.

init mask vector = 0x00/0xff in each element 
init source vector = data to be selectively stored 
load dest vector from dest location 
apply `vbslq_u8` (`vbit` instruction) with dest vector, source vector and mask vector 
store dest vector back to dest location 
+0

감사합니다! 나는 당신의 설명에 따라 그것을 실행하려고 노력할 것이다. – user2696208

+0

의사 코드에 따라 구현했습니다 (편집 된 질문 참조). 이 올바른지? 나는 의심의 여지가있다. 원래 코드의 마스크 (ARM Neon으로 변환하려고하는 일부 SSE 명령어 포함)는 다음과 같습니다. {0000000x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80}; 0xff 대신 0x80을 사용할 수있는 이유가 있습니까? 고맙습니다. – user2696208

+0

그것은 다른 명령어 세트 일 뿐이며 사용 가능한 명령어로 작업해야합니다. 필요하다면 마스크를 0x80과 0xff 사이에서 변환하는 것은 꽤 쉽습니다 (하나의 명령). 그렇지 않으면 마스크를 생성하는 코드를 변경하여 필요하지 않게 만들 수 있습니다. –