2016-07-14 18 views
3

Ich versuche, die spezifische AVX512F Anweisung vcvtps2udq zu verstehen.Wie funktioniert der AVX512-Rundungsmodus (oder ist NDISASM einfach verwirrt)?

Die Signatur des Befehls lautet VCVTPS2UDQ zmm1 {k1}{z}, zmm2/m512/m32bcst{er}. Die manuelle Information ist unten.

In einem Versuch, die neuen Rundungsmoden zu verstehen, wird der folgende Code-Schnipsel mit NASM montiert (2.12.02)

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

Deassemblierung die Ergebnisse mit NDISASM (2.12.02) gibt eine Menge Verwirrung und die folgenden Codes:

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

Frage: die zweite Leitung mit XMM-Register anstelle eines ZMM-Register (die ich erwartet hätte) deassembled. Hat der Null-Rundungs-Modus (rz-sae) etwas damit zu tun. Oder ist nur NDISASM falsch und kann nicht zwischen Opcodes 62F17C7879C1 und 62F17C0879C1 unterscheiden.

Das Intel-Befehlssatz-Referenzhandbuch hat die folgende Beschreibung:

Wandelt sechzehn einfache Genauigkeit Gleitkommawerte im Quelloperand verpackenden unsignierten ganzen Zahlen in dem Doppelwort Zieloperand sechzehn.

Wenn eine Konvertierung ungenau ist, wird der zurückgegebene Wert gemäß zu den Rundungssteuerungsbits im MXCSR-Register oder den eingebetteten Rundungssteuerungsbits gerundet. Wenn ein konvertiertes Ergebnis nicht im Zielformat dargestellt werden kann, wird die ungültige Gleitkommaausnahme ausgelöst, und wenn diese Ausnahme maskiert ist, wird der Ganzzahlwert 2w-1 zurückgegeben, wobei w die Anzahl der Bits im Ziel darstellt Format.

Der Quelloperand ist ein ZMM/YMM/XMM-Register, ein 512/256/128-Bit-Speicher Lage oder eine von einem 32-Bit-Speicher übertragen 512/256/128-Bit-Vektor Lage. Der Zieloperand ist ein ZMM/YMM/XMM-Register , bedingt aktualisiert mit der Schreibmaske k1.

+1

Wenn Sie einen Prozessor haben, der AVX-512-Anweisungen unterstützt, bin ich massiv eifersüchtig. –

+1

Offensichtlich gibt NDISASM die gleiche Disassemblierung für verschiedene Opcodes, daher muss zumindest eine Einschränkung in NDISASM bestehen und ein Fehler, wenn er behauptet, AVX512 zu unterstützen. Ich bin bei @CodyGray dabei. –

+0

@CodyGray Keine Notwendigkeit, eifersüchtig zu sein; obwohl ich mehrere imaginäre habe ... – HJLebbink

Antwort

2

Die Opcodes sind als 0x62 P0 P1 P2 ... see here section 4.2 codiert. In diesem Fall sind die P2 Bytes

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

dass brechen weiter, das sind die folgenden Felder

     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 

So sind die verschiedenen Felder EVEX.b und EVEX.L'L sind. Wenn b nicht festgelegt ist, dann ist L'L die SIMD-Länge, also 0 = xmm und 2 = zmm. Wenn b eingestellt ist, wird L'L als statischer Rundungsmodus interpretiert und die Länge wird als zmm (512 Bit) angenommen.

NDISASM interpretiert das EVEX.B-Bit nicht korrekt und daher auch nicht das Feld EVEX.L'L.

+1

Danke für die Klärung und Erklärung. Soll ich einen Fehlerbericht einreichen? – HJLebbink