2016-08-05 3 views
2

두 개의 SSE 레지스터가 있는데 한쪽의 상위 절반을 다른 한쪽의 하위 절반으로 대체하려고합니다. 늘 그렇듯이 가장 빠른 방법입니다.두 개의 SSE 레지스터 중 하반부를 연결하는 방법은 무엇입니까?

레지스터 중 하나를 8 바이트 씩 이동하면 연결할 수 있습니다. alignr을 연결합니다.

단일 명령 솔루션이 있습니까?

+2

'movlhps', 우회 지연에 대해서는 확실하지 않지만 – harold

+0

@harold 감사합니다. 시도해 볼 수 있습니다. –

+0

@Harold : mh, intrisincs 구문을 사용 중이며 데이터가 정수이기 때문에 멈추었습니다. 출연진은 불가능합니다. –

답변

4

punpcklqdq을 사용하면 두 레지스터의 하위 절반을 단일 레지스터에 hi : lo로 결합 할 수 있습니다. 이는 movlhps FP 명령어가 수행하는 것과 동일하며 unpcklpd이지만 FP에 대한 CPU와 바이 패스 지연에 대한 정수 셔플을 신경 쓰는 CPU의 정수 도메인에서 작동합니다.


보너스 읽기 : lo:hi 생산 두 레지스터

palignr의 다른 부분과 함께 만, xxx:lo으로 hi:xxx 함께 좋은 것 (즉 역전). FP 셔플 (등록 레지스터 양식 movsd)을 사용하여 hi:lo (xxx:lo의 하위 절반을 이동하여 hi:xxx의 낮은 쓰레기를 대체 함)을 얻을 수 있습니다. 그렇지 않으면 punpckhqdq을 사용하여 한 레지스터의 상위 절반을 하위 절반에 가져온 다음 punpcklqdq을 사용하여 두 레지스터의 하위 절반을 결합하십시오.

Intel Nehalem 이외의 대부분의 CPU에서 정수 데이터의 부동 소수점 셔플은 일반적으로 좋습니다 (벡터 정수 ALU 명령어간에 사용하면 대기 시간이 거의 또는 전혀 없음). Nehalem에서는 부동 소수점 셔플에 대해 두 사이클의 추가 대기 시간 (총 4 회의 대기 시간)을 얻을 수 있지만, 이는 루프 전달 종속성 체인의 일부인 경우 처리량에 큰 문제가됩니다. 자세한 내용은 Agner Fog's guides을 참조하십시오.

Agner 's Optimizing Assembly Guide에는 SSE/AVX 명령어 표 전체 섹션이있어 레지스터 내에서 또는 레지스터 사이에서 다양한 종류의 데이터 이동에 유용합니다. 링크는 태그 위키를 참조하십시오.

FP 셔플을 내장 함수와 함께 사용하려면 코드를 _mm_castsi128_ps_mm_castps_si128으로 정리해야합니다.이 코드는 지침을 내 보내지 않는 재 해석 캐스트입니다.

+3

PUNPCKLQDQ 정확히 내가 원하는 것을 않습니다 : Destination [0..63] = Destination [0..63]; \t \t 대상 [64..127] = 출처 [0..63]; –

+1

@ YvesDaoust : 질문에 올바르게 대답하도록 수정되었습니다. P –

관련 문제