2009-12-11 5 views
3

xmm0에 두 개의 묶음 쿼드 워드 정수가 있고이를 함께 추가하고 결과를 메모리 위치에 저장해야합니다. 각 정수의 값이 2^15보다 작음을 보장 할 수 있습니다. 지금 당장 다음과 같이하고 있습니다.128 비트 xmm 레지스터의 상위 64 비트 및 하위 64 비트 추가

int temp; 
.... 

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

더 좋은 방법이 있나요?

답변

3

먼저 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는 다른 명령어입니다. x87 부동 소수점 명령어를 사용하는 코드보다 먼저 MMX 레지스터를 다루는 코드가 있으면 emms이 필요합니다.

+0

@Stephen : 이전 작업에서는 128 바이트의 정보를 동시에 처리하려면 두 배의 쿼드 워드가 필요합니다. 그 후, 합산의 시퀀스는 전술 한 상한과의 최종 결과를 초래한다. – Jacob

+0

* shrug *, 공정한 정도로. 어쨌든, 내가 올린 모든 시퀀스는 당신을 위해 일해야하며 기존의 mmx 사용법을 피하십시오. –

+0

감사합니다. 실제로 모든 코드가 -1로 줄어들도록 코드의 나머지 부분을 엉망으로 만들었습니다. – Jacob