2010-02-09 7 views
9

두 개의 x86 32 비트 레지스터를 하나의 128 비트 xmm 레지스터에 저장하는 더 빠른 방법이 있습니까? 두 개의 x86 32 비트 레지스터를 128 비트 xmm 레지스터에 저장

movd xmm0, edx 
    movd xmm1, eax 
    pshufd xmm0, xmm0, $1 
    por xmm0, xmm1 

그래서 EAX는 0x12345678이고 XMM0의 결과가 0x8765432112345678을해야 0x87654321 EDX 경우.

감사

+0

와우! 그건 멋진 어셈블러 였어 ... 내가 마지막으로 본 것은 32 비트 였어. 당신이 128 비트 PC를 살 수 있다는 것을 몰랐어 ... : P : – t0mm13b

+0

스트리밍 SIMD 확장 (SSE)은 x86 아키텍처의 SIMD 명령어 세트 확장이다. , 인텔에 의해 설계되고 1999 년에 도입되었습니다. –

+3

SSE 명령 세트 버전이 허용되는 것은 무엇입니까? – PhiS

답변

15

SSE 4.1을 사용하면 movd xmm0, eax/pinsrd xmm0, edx, 1을 사용할 수 있으며 2 가지 지침으로 수행 할 수 있습니다. 이전의 CPU에 대한

당신은 3 개 지침의 총 후 2 × movdpunpckldq를 사용할 수 있습니다

movd xmm0, edx 
movd xmm1, eax 
punpckldq xmm0, xmm1 
+0

고마워요. 그러나 이것은 2007 년 이래 상대적으로 새로운 확장 세트이며 속도와 코드 크기는 거의 동일합니다. –

+2

OK - 이제 SSE2/SSE3에 3 명령 시퀀스가 ​​추가되었습니다. –

+1

슈퍼 ... 그게 내가 필요한거야! 감사. –

1

나는 MMX에 대해 잘 모르겠지만, 아마도 당신은 PACKSSDW 명령을합니다.

PACKSSDW 명령은 대상 피연산자에 두 번 소스 피연산자 단어 개의 더블 워드를 취하고 포화 통해 이러한 네 부호 워드로 변환한다. 이 4 개의 단어 을 함께 압축하여 결과를 대상 MMX 레지스터에 저장합니다.

(http://webster.cs.ucr.edu/AoA/Windows/HTML/TheMMXInstructionSeta2.html에서) 편집 : 난 그냥 사람들은 SSE 레지스터라고 깨달았다. 오 잘.

편집 : 이제 종료하겠습니다.

+0

나는 그것을 사용한 후에 'emms'명령이 필요 없기 때문에 mmx (64 비트) 대신 xmm 레지스터를 좋아한다. –

+0

예, 전용 레지스터가 더 좋을 것 같습니다. –

+0

+1을 지금 종료하십시오 :-) – hirschhornsalz