2016-07-14 8 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 

Deassembling результаты с NDISASM (2.12.02) дает много путаницы и следующие коды:

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

вопрос: вторая линия deassembled с XMM регистров вместо регистра ZMM (что я бы ожидать). Имеет нулевой режим округления (rz-sae), что-то делать с ним. Или это просто NDISASM неправильно и не может различать коды операций 62F17C7879C1 и 62F17C0879C1.

набор инструкций справочного руководство Intel имеет следующее описание:

Преобразует шестнадцать упакованные значения с плавающей точкой с одинарной точностью в исходного операнда до шестнадцати беззнаковых целых чисел в двойном слове операнда назначения.

Если преобразование неточно, возвращаемое значение округляется в соответствии с битами управления округлением в регистре MXCSR или встроенными битами управления округлением . Если преобразованный результат не может быть представлен в формате назначения, то недопустимое исключение с плавающей запятой составляет , и если это исключение маскируется, целочисленное значение 2w-1 возвращается , где w представляет количество бит в целевом формат.

Исходный операнд является ЗММ/регистр YMM/ХММ, 512/256/128-бит памяти местоположение, или 512/256/128-битовый вектор транслируется из 32-битной памяти местоположения. Операндом-получателем является регистр ZMM/YMM/XMM , условно обновленный с помощью writemask k1.

+1

Если у вас есть процессор, поддерживающий инструкции AVX-512, я очень ревнив. –

+1

, очевидно, NDISASM дает такую ​​же разборку для разных кодов операций, поэтому, по крайней мере, должно быть ограничение в NDISASM и ошибка, если он утверждает, что поддерживает AVX512. Я с @CodyGray на этом. –

+0

@CodyGray Не нужно ревновать; хотя у меня есть несколько мнимых ... – HJLebbink

ответ

2

Коды операций кодируются как 0x62 P0 P1 P2 ... see here section 4.2. В этом случае байты Р2

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

нарушение, что дальше вниз те следующие поля

     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. Согласно документам, если b не установлен, то L'L является длиной SIMD, поэтому 0 = xmm и 2 = zmm. Если установлено b, то значение L'L интерпретируется как статический режим округления, а длина считается равной zmm (512 бит).

NDISASM не интерпретирует бит EVEX.B правильно и, следовательно, поле EVEX.L'L.

+1

Спасибо за разъяснение и объяснение этого. Должен ли я записывать отчет об ошибке? – HJLebbink