2015-01-23 7 views
4

코드 : VS2012가 컴파일 기본 설정에MSVC가 왜 그런 사소한 일에 SSE2 명령을 사용합니까?

double Ret_Value=0; 

가 :

101102AC fldz 
101102AE lea   eax,[Ret_Value] 
101102B1 push  eax 
101102B2 fstp  qword ptr [Ret_Value] 

편집 : SSE2 프로젝트 설정에서 비활성화 된 경우

10112128 xorps  xmm0,xmm0 
1011212E movsd  mmword ptr [Ret_Value],xmm0 

이가로 컴파일 내가 아니다 pushlea이이 초기화와 관련되어 있는지 확인하십시오. 그 이후에 완료된 내용 일 수도 있습니다. 단지 해체하면이 C++ 용으로 표시됩니다. 코드 네.

SSE2가 상당히 좋습니까? 그것을 제외하고 2 명령 짧은 무엇입니까? 어떤 종류의 최적화가 여기에서 수행됩니까?

발견 방법 : SSE2를 지원하지 않는 이전 프로세서에서 앱이 실패하기 시작했습니다.

+1

간단한 코드 크기 최적화라고 생각합니다. 더 짧은 코드는보다 캐시 친화적이며 더 빠릅니다. 또한 스택을 사용하지 않으면 몇 가지 메모리 액세스가 저장됩니다. – rodrigo

+0

가운데 2 개의 명령어가 수행해야하는 작업을 잘 모릅니다. 'Ret_Value' 만 0으로 설정하면'fldz; fstp [Ret_Value]'. – Jester

+0

@Jester : 아마도 스택의 'eax'가 필요할 것이므로 아마도 파이프 라인 재배치 (intermix floating 및 non-floating 명령어) 일 것입니다. 함수 호출이나 그와 비슷한 것으로 추측합니다. – rodrigo

답변

3

인텔 최적화 참조 설명서 섹션 3.8.1 (부동 소수점 코드 최적화를위한 가이드 라인) 말한다 -

적절한와 SSE, SSE2 및 고급 SIMD 명령어 세트 (예 : AVX)의 컴파일러의 사용 활성화 스위치. x87 코드 생성을 대체 할 스칼라 SIMD 코드 생성을 선호합니다.

제 3.8.5 설명에갑니다 :

사용 스트리밍 SIMD 확장 2 스트리밍 SIMD 확장 당신은 x87 기능이 필요하지 않는 한. 대부분의 SSE2 산술 연산은 X87 카운터 파트보다 짧은 대기 시간을 가지며 X87 레지스터 스택의 관리와 관련된 오버 헤드를 제거합니다.