모든 LLVM IR 'fcmp'명령어는 호환 가능한 X86cmpps 명령어를 가지고 있습니까? 그리고 그 반대의 경우는 어떨까요? 모든 X86 cmpps 명령어 (레지스터 피연산자 만 사용)는 단일 LLVM 'fcmp'명령어로 설명 할 수 있습니까? 문제의 까다로운 부분은 NaN, Inf 's, -0.0 및 기타 각 사례가 각 언어로 처리되는 방법입니다.X86 'cmpps'명령어와 LLVM IR 'fcmp'명령어는 서로 바꿔 쓸 수 있습니까?
답변
내가 LLVM IR에 대해 많이 알지 못하기 때문에 완전한 대답이 아니지만,이 말은 너무 길다.
모든 LLVM IR 'fcmp'명령어에는 호환 가능한 X86cmpps 명령어가 있습니까?
확실히 정확하게는 아닙니다. 벡터의 상위 요소에 높은 쓰레기가있는 경우 C 추상 기계가 수행하지 않은 MXCSR 상태 비트에서 유효하지 않거나 비정규 예외를 발생시킬 수 있습니다.
그러나 스칼라 피연산자에 대한 CMPSS를 사용하면 모든 작업을 수행 할 수 있습니다. 스칼라 비교를 수행하는 경우 대상 XMM 레지스터에 0 또는 -1을 생성하기 위해 CMPSS를 사용하는 대신 플래그를 설정하는 것이 종종 UCOMISS을 사용하는 것이 좋습니다.
x86 XMM CMPp/s 명령에 대한 가장 적합한 설명서는 CMPPD entry (영문자 순, 다른 표는 해당 표 참조) 아래에 나와 있습니다. 그 HTML 추출물은 완벽하지는 않습니다. 더 나은 형식의 표를 보려면 인텔의 PDF를 참조하십시오. 당신이 NaN을 할 수있다 피연산자를 비교했을 때 예외를 발생하지 않도록해야 할 경우합니다 (x86 태그 위키에 링크되어 있습니다.)
, 당신은 적어도 효율적으로, AVX없이 CMPSS을 사용하지 못할 수도 있습니다. SSE 버전은 처음 8 개의 술어 (imm8 = 0..7) 만 허용하며 그 중 대다수는 S (시그널링) 다양성을 가지므로 어느 한 피연산자가 QNAN이면 #IA
을 발생시킵니다. AVX는 신호가없는 모든 술어의 Q (Quiet) 버전을 UCOMISS과 같이 추가합니다.
물론 32 비트 CPU를 대상으로하고 SSE 지원을받을 수 없다면 x87을 사용해야합니다. (FCOMI, 또는 P6 이상을 가정하지 못하는 경우 FCOM).