2013-06-13 2 views
3

팔 어셈블리 및 NEON SIMD 명령어를 사용합니다. 두 개의 Q 레지스터에있는 16 비트 부호없는 값의 최대 값을 얻고이를 임계 값과 비교하려고합니다. 모든 16 비트 값이 임계 값보다 작 으면 함수를 호출합니다. 하나 이상의 값이 임계 값보다 큰 경우 다른 함수를 호출합니다.플래그에 영향을 미치는 네온 어셈블리 벡터 명령어

다음 SIMD 명령어가 최대가됩니다.

// 임계 값은 r은

vdup.16  q15, threshold 
vmax.u16  q12, q14, q13 
vcgt.u16  q11, q12, q15 

가 FPSCR 플래그에 영향을 VCGT합니까

등록입니까? 나는 그렇게 생각하지 않는다. 그렇다면 q11이 0인지 아닌지를 확인해야합니다. 그것이 zeor 인 경우 function1을 호출하고, 그렇지 않으면 function2를 호출하십시오. 내가 4 개 R 레지스터에 Q11를 이동하지 않고 그것을 할 수있는 방법

if (q11 == 0) 
//call function1 
else 
//call function2 

같은 것?

감사합니다.

답변

2

적어도 사용자 모드에는 없습니다. 이러한 cmp 명령은 마스크 벡터를 작성하여이를 기반으로 두 결과 사이의 값을 선택합니다.

  1. 위 두 결과로부터 각 차선에 해당하는 요소를 넣어 1 마스크를 사용하여 적절한 VCMP 두 경우
  2. 위한
  3. 계산 결과를 마스크를 생성한다.

현재 기차에서 내 iPhone에이 글을 쓰고 있기 때문에 지침이 무엇인지 정확하게 말할 수는 없습니다. 그러나 레퍼런스 매뉴얼에서 문제를 찾지는 않습니다.

+0

두 경우 모두 결과를 계산하고 싶지 않습니다. 한 번에 하나의 사례 만 임계 값을 기준으로 선택하여 프로그램 속도를 높이고 싶습니다. 그래서 내가 질문을 올렸다. 나는 다른 길을 찾을 것이다. 어쨌든 고마워. – Ammar

+0

q13의 값을 좁히고 다른 방법으로 벡터를 0과 비교합니다. – Ammar

+1

NEON이 작동하는 동안에는 어떤 종류의 함수 호출도 피해야합니다. ARM 레지스터가 함수 호출에서 발생하는 메모리에 액세스하자 마자 파이프 라인이 정지되어 보통 약 12 ​​사이클을 낭비하게됩니다. –