인텔의 SSE 내장 함수를 사용하여 프로세서의 플래그 레지스터를 확인할 수 있는지 궁금합니다. 예를 들어SSE 내장 함수 제로 체크 플래그
: 컴파일러는 단일 명령 (pcmpistri
) 및 플래그가 점프 명령 (jz
)로 등록 확인에 두 내장 함수를 최적화 할 수있는 본 실시 예에서는
int idx = _mm_cmpistri(mmrange, mmstr, 0x14);
int zero = _mm_cmpistrz(mmrange, mmstr, 0x14);
.
그러나 다음 예에서 컴파일러는 적절하게 코드를 최적화하기 위해 관리하지 않습니다 : 여기에
__m128i mmmask = _mm_cmpistrm(mmoldchar, mmstr, 0x40);
int zero = _mm_cmpistrz(mmoldchar, mmstr, 0x40);
는, 컴파일러는 pcmpistrm
과 pcmpistri
명령어를 생성합니다. 그러나 제 생각에는 pcmpistrm
이 pcmistri
과 같은 방식으로 프로세서의 플래그 레지스터에 플래그를 설정하기 때문에 두 번째 명령어가 중복됩니다.
그래서 내 질문에 다시 와서 플래그 레지스터를 직접 읽거나 컴파일러에만 pcmpistrm
명령어를 생성하도록 지시하는 방법이 있습니까?
어떤 컴파일러가 어떤 옵션을 제공합니까? 이것은 컴파일러가 성공적으로 CSEing하는 것에 대한 질문 인 것처럼 보입니다. ISA 설명서에는 [PCMPISTRI] (http://www.felixcloutier.com/x86/PCMPISTRI.html)와 [PCMPISTRM] (http://www.felixcloutier.com/x86)의 내장 함수 중 하나 인 '_mm_cmpistrz' /PCMPISTRM.html), 인텔에 따르면 컴파일러는'_mm_cmpistrz'에 대한 명령어를 방출 할 수 있습니다. –
또한 이것을 컴파일하는 함수로 감쌀 수 있습니까? 사람들이 그것을 http://gcc.godbolt.org/에 복사 할 수 있습니까? 또는 Godbolt에서 직접 source + asm 출력에 연결하십시오. –
@Peter Cordes 모든 최적화가 활성화 된 상태에서 MSVC 컴파일러를 사용합니다 (/ O2) – Philinator