2017-10-04 23 views
2

다음과 같이 두 부동 소수점 피연산자를 비교 한 비교 결과가 있습니다. 즉 : 내가 비교 결과에 기초 할 필요하면 다음을 수행 할 필요가NEON 팩 벡터 비교 결과 비트 맵

neon_gt_res = vcgtq_f32(temp1, temp2); 
if(neon_gt_res[0]) array[0] |= (unsigned char)0x01; 
if(neon_gt_res[1]) array[0] |= (unsigned char)0x02; 
if(neon_gt_res[2]) array[0] |= (unsigned char)0x04; 
if(neon_gt_res[3]) array[0] |= (unsigned char)0x08; 

그러나 이런 식으로 쓰는 것은 다시 다중 비교하는 것과 같습니다. 네온 C 내장 함수에서이를 어떻게 최적으로 작성합니까? 86에

,이 array[0] |= _mm_movemask_ps(cmp_gt_res);

+0

'배열이 어떤 종류의 []'? 나는 그것이 바이트의 배열이라고 가정하고 있지만 C의 종류가 의미하는 것입니다. 비교 결과로 가면 '1 2 4 8' 벡터를 원할 것입니다. 그런 다음 NEON 레지스터의 하위 4 바이트에 그 결과를 저장하려면 셔플이 필요하다고 생각합니다. NEON은 잘 모릅니다.하지만 그렇게 할 수 있다면 아마도 배열의 32 비트로드를 수행하고 압축 된 OR을 수행하고 저장해야 할 것입니다. –

+0

array []는 unsigned char 유형입니다. 비교 결과는 int32x4_t 유형이므로 따라서 해당 마스크를 사용할 수 없습니다. 이 다른 방법으로 도울 수 있습니까? – Lakshmi

+0

NEON에는 비교 결과의 각 요소에서 1 바이트를 채우기 위해 사용할 수있는 바이트 셔플 (byte-shuffle) 지침이 없습니까? –

답변

3
vmov.i32 qmask, #1 
vand qres, qmask, qres 
vsra.u64 qres, qres, #30 
vsli.64 dres_bottom, dres_top, #2 

것입니다 그리고 당신은 당신이 qres의 네 최하위 비트에 필요한 비트 수 있습니다. 위의

//////////////////////// 편집

향상된 버전 :

vshr.u64 qres, qres, #31 
vsli.64 dres_bot, dres_top, #2 
// the four LSBs already contain the bitmap, the rest is optional: 
vbic.i16 dres_bot, #0xf0 
// you can now use byte 0 of dres_bot as the result.