문제

두 개의 쿼드 워드 정수가 있습니다 xmm0 그리고 함께 추가하고 결과를 메모리 위치에 저장해야합니다. 각 정수의 값이 2^15. 지금은 다음을 수행하고 있습니다.

int temp;
....   

   movdq2q mm0, xmm0
   psrldq xmm0, 8
   movdq2q mm1, xmm0
   paddq mm0,mm1
   movd temp, mm0

더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

우선, 왜 쿼드 워드를 사용하여 16 비트 형식에 맞는 값을 나타내는가? 그것을 제쳐두고 몇 가지 솔루션을 남겨두고 있습니다.

pshufd xmm1, xmm0, EEh
paddq  xmm0, xmm1
movd   temp, xmm0

또는

movdqa xmm1, xmm0
psrldq xmm1, 8
paddq  xmm0, xmm1
movd   temp, xmm0

또는

movhlps xmm1, xmm0
paddq   xmm0, xmm1
movd    temp, xmm0

실제로 사용할 필요가 없습니다 paddq, 원하는 경우 더 좁은 부가 중 하나로 도망 갈 수 있습니다.

편집하다 4 개의 이중 쿼드 워드를 합산 - 당신이 가진 것은 거의 괜찮습니다. 그들 중 모든 데이터가 각 슬롯의 낮은 더블 워드에 적합하다는 것을 감안할 때 다음과 같은 것을 시도 할 수 있습니다.

shufps  xmm0, xmm2, 88h
shufps  xmm4, xmm6, 88h
paddd   xmm0, xmm4
psrlq   xmm1, xmm0, 32
paddd   xmm0, xmm1
movhlps xmm1, xmm0
paddd   xmm0, xmm0
movd    temp, xmm0

더 빠를 수도 있고 그렇지 않을 수 있습니다.

EMMS는 또 다른 지시 일뿐입니다. MMX 레지스터를 터치하는 코드 후에는 X87 플로팅 포인트 지침을 사용하는 코드 앞에 있어야합니다. emms.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top