2016-07-14 10 views
3

특정 AVX512F 명령을 이해하려고합니다. vcvtps2udq.AVX512 반올림 모드는 어떻게 작동합니까 (또는 NDISASM은 혼동됩니까?)?

지침의 서명은 VCVTPS2UDQ zmm1 {k1}{z}, zmm2/m512/m32bcst{er}입니다. 매뉴얼 정보는 아래와 같습니다. 새로운 반올림 모드를 이해하기위한 시도

는, 다음과 같은 코드가 NASM (2.12.02)

vcvtps2udq zmm0,zmm1 
vcvtps2udq zmm0,zmm1,{rz-sae} 
vcvtps2udq xmm0,xmm1 

NDISASM과 결과를 Deassembling (2.12.02)로 조립 많은 혼란을주고 다음과 같은 코드 :

62F17C4879C1  vcvtps2udq zmm0,zmm1 
62F17C7879C1  vcvtps2udq xmm0,xmm1 
62F17C0879C1  vcvtps2udq xmm0,xmm1 

질문는 : 두 번째 줄은 XMM 레지스터 대신에 (내가 기대 한 것)를 ZMM 레지스터와 deassembled된다. 제로 라운딩 모드 (rz-sae)가 있습니다. 아니면 그냥 NDISASM 잘못된 및 opcode 62F17C7879C1 및 62F17C0879C1 구별 할 수 없습니다.

인텔 명령어 세트 메뉴얼은 다음의 설명을 가지고

는 소스 피연산자에서 단 정밀도 부동 소수점 값을 충전 여섯이 대상 피연산자의 부호 더블 워드 정수 16 개의 변환.

변환이 정확하지 않은 경우, 반환되는 값은 에 따라 반올림되어 MXCSR 레지스터의 반올림 제어 비트 또는 반올림 제어 비트가 포함됩니다. 변환 된 결과를 대상 형식 인 으로 표현할 수없는 경우 부동 소수점 유효하지 않은 예외는 이고이 예외가 마스크되면 정수 값 2w - 1은 이 반환됩니다. 여기서 w는 대상의 비트 수를 나타냅니다. 형식

소스 피연산자는 256분의 512/128 비트 메모리 위치, 또는 32 비트의 메모리 위치에서 중계 512/128분의 256 비트이 벡터 ZMM/YMM/XMM 레지스터이다. 대상 피연산자는 조건부로 쓰기 마스크 k1로 업데이트 된 ZMM/YMM/XMM 레지스터 입니다.

+1

AVX-512 명령어를 지원하는 프로세서를 사용하는 경우 매우 질투합니다. –

+1

분명히 NDISASM은 다른 opcode에 대해 동일한 디스 어셈블리를 제공하기 때문에 최소한 NDISASM에는 제한이 있어야하고 AVX512를 지원한다고 주장하면 버그가 있어야합니다. 나는 이것에 @CodyGray와 함께있다. –

+0

@CodyGray 질투 할 필요가 없습니다. 비록 내가 몇 가지 상상의 것들을 소유하고 있지만 ... – HJLebbink

답변

2

opcode는 0x62 P0 P1 P2 ... see here section 4.2으로 인코딩됩니다. 이 경우, P2 바이트는 그

     zmm zmm+sae xmm 
EVEX.aaa = P2[2:0]  0  0  0 
EVEXV' = P2[3]  1  1  1 
EVEX.b = P2[4]  0  1  0 "Broadcast/RC/SAE Context" 
EVEX.L'L = P2[6:5]  2  3  0 "Vector length/RC" 
EVEX.z = P2[7]  0  0  0 

그래서 다른 필드와 EVEX.b EVEX.L'L있는 다음 필드이다 나아가을 부셔

P2 
48 <- vcvtps2udq zmm0,zmm1 
78 <- vcvtps2udq zmm0,zmm1,{rz-sae} 
08 <- vcvtps2udq xmm0,xmm1 

이다. 문서에 따르면 b이 설정되지 않은 경우 L'L은 SIMD 길이이므로 0 = xmm2 = zmm입니다. b이 설정되면 L'L은 정적 반올림 모드로 다시 해석되며 길이는 zmm (512 비트)로 간주됩니다.

NDISASM은 EVEX.B 비트를 올바르게 해석하지 않으며 따라서 EVEX.L'L 필드도 해석합니다.

+1

설명해 주셔서 감사합니다. 버그 신고서를 제출해야합니까? – HJLebbink