XMM 레지스터간에 값을 교환하기위한 x86 명령어가 있습니까? XCHG 명령어와 비슷합니까? 메모리, 스크래치 레지스터 또는 XOR 복사본을 사용할 수 없습니다.XMM 레지스터간에 값을 교환하는 방법은 무엇입니까?
답변
가 여기에 arithmetic swap에 대한 완전히 테스트되지 않은 코드입니다 : XOR 달리
vpsubd xmm0, xmm1
vpaddd xmm1, xmm0
vpsubd xmm0, xmm1, xmm0
이, 뺄셈은 교환 법칙이 성립하지, 그래서 당신은 당신이 정말 잘 (AVX없이 할 수없는 불행한 마지막 줄에 결국, 당신은 할 수 있지만, 스크래치 레지스터를 사용하면 움직이는 것이 더 낫습니다.)
스크래치 레지스터를 사용하는 것이 대부분의 프로세서에서 더 빠를 것입니다. (P4를 제외하고는 아무도 P4를 신경 쓰지 않습니다.) 구형 프로세서에서는 레지스터 이름 바꾸기를 사용하여 프런트 엔드에서 xmm reg-reg 동작을 처리하기 때문에 처음 두 동작을 병렬로 실행할 수 있으므로 최신 프로세서에서 실행할 수 있습니다. 이름 바꾸기를 사용하여 레지스터 이름 바꾸기 또는 핸들링 명령을 사용하는 것은 새로운 트릭이 아니며 일반적으로 펜티엄 프로와 fxch
은 이름 바꾸기를 사용하여 구현되므로 이름 변경이 사용되었습니다. 레지스터 이름 바꾸기로 xmm reg-reg 동작을 구현하는 것은 새로운 트릭이지만 Ivy Bridge, Haswell, Bulldozer 및 Piledriver에 있습니다.
종종 루프에서 Exchange를 없애 버릴 수 있습니다. 루프에없는 교환은 거의 필요하지 않으며 병목 현상도 거의 없습니다.
xchg
연산의 실제 값은 동기화 프리미티브, 스핀 록 (spinlocks) 등에 사용됩니다. 접두사가 lock
이므로 내재적으로 과한 벌금이 부과 될 수 있습니다. 확실히 SSE를 사용하는 싱크 프리미티브를 구현하는 사람은 없지만 교환은 어떤 장점이 있습니까? 경우에 따라 유용 할 수 있지만 32 비트 모드의 SSE 레지스터 8 개와 64 비트 모드의 16 개의 SSE 레지스터를 사용하면 이 아닌 이유는은 SSE 스크래치 레지스터를 사용하기 만합니까? 어떤 x86-64 프로세서가 (잘못된 의존성을 제거하기 위해) SIMD 단위로 레지스터 이름 바꾸기 등을 사용하는지는 알 수 없습니다.
xorps
(또는 _mm_xor_ps
내장)을 배제한 적이 있습니다. 이는 일반적으로 최신 프로세서의 쓸모없는 트릭입니다. 분명히 범용 레지스터를 사용하면 메모리 사용이 배제됩니다. 그게 네 모든 가능성을 다 써 버렸어, 나 두렵다. 요약하려면 :
암시 적 잠금은 피연산자 중 하나가 메모리 위치 인 경우에만 발생합니다. – tgiphil
PXOR
명령을 사용하면 XMM 레지스터간에 내용을 가장 짧고 빠르게 교환 할 수 있습니다. 이 코드는 xmm0과 xmm1 사이의 내용을 교환합니다.
pxor xmm0, xmm1
pxor xmm1, xmm0
pxor xmm0, xmm1
어디서 문제가 발생합니까?
그런 다음 XOR 스왑의 산술 버전은 무엇입니까? 그런데 왜 아무것도 사용할 수 없습니까? – harold
가능한 [XMM 레지스터간에 128 비트 값을 어떻게 이동합니까?] (http://stackoverflow.com/questions/8671438/how-do-you-move-128-bit-values-between-xmm-registers)) –
@BrettHale 그는 스크래치 레지스터를 사용해야합니다. – harold