128 비트 XMM 레지스터의 상단 및 하단 64 비트 추가
-
19-09-2019 - |
문제
두 개의 쿼드 워드 정수가 있습니다 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
.
제휴하지 않습니다 StackOverflow