2016-04-23 13 views
5

La mia domanda riguarda Evex codificati istruzioni reg-reg confezionati senza arrotondamento semantica che consentono il controllo SAE (Elimina tutte le eccezioni), quali VMIN *, VCVTT *, VGETEXT *, VREDUCE *, VRANGE * ecc. Intel dichiara SAE-awareness solo con una lunghezza vettoriale di 512 bit, ad es.AVX512 lunghezza del vettore e il controllo SAE

VMINPD xmm1 {k1}{z}, xmm2, xmm3 
VMINPD ymm1 {k1}{z}, ymm2, ymm3 
VMINPD zmm1 {k1}{z}, zmm2, zmm3{sae} 

ma non vedo un motivo per cui SAE non poteva essere applicata alle istruzioni in cui si utilizzano XMM o YMM registri.

Nel capitolo 4.6.4 del Intel Instruction Set Extensions Programming Reference Tabella 4-7 dice che nelle istruzioni senza arrotondamento semantica po EVEX.b specifica che SAE è applicato, e bit EVEX.L'L specificare esplicitamente lunghezza del vettore:

00b: 128bit (XMM) 
01b: 256bit (YMM) 
10b: 512bit (ZMM) 
11b: reserved 

quindi la loro combinazione dovrebbe essere legale.

Tuttavia NASM assembla vminpd zmm1,zmm2,zmm3,{sae} come 62F1ED185DCB, cioè EVEX.L'L = 00b, EVEX.b = 1, che viene smontato indietro di NDISASM 2.12 come vminpd xmm1,xmm2,xmm3

NASM rifiuta di montare vminpd ymm1,ymm2,ymm3,{sae} e NDISASM smonta 62F1ED385DCB (EVEX.L'L = 01b, EVEX.b = 1) come vminpd xmm1,xmm2,xmm3

mi chiedo come fa Knights Landing CPU esegue VMINPD ymm1, ymm2, ymm3{sae} (assemblato come 62F1ED385DCB, EVEX.L'L = 01b, EVEX.b = 1):

  1. CPU genera un'eccezione. Intel doc Tabella 4-7 è fuorviante.
  2. SAE è in effetti, la CPU funziona solo con xmm, come nelle operazioni scalari . NASM e NDISASM funzionano correttamente, la documentazione Intel è errata.
  3. SAE viene ignorato, la CPU funziona con 256 bit in base alla specifica VMINPD in Intel doc. NASM & NDISASM sono errati.
  4. SAE è in effetti, la CPU funziona con 256 bit come specificato nel codice di istruzioni . NASM e NDISASM sono errati, Intel doc ha bisogno di istruzioni supplementari per decorare xmm/ymm con {sae}.
  5. SAE è in effetti, la CPU funziona con dimensione vettoriale piena implicita 512 bit, indipendentemente da EVEX.L'L, come se gli arrotondamenti statici {er} fossero consentiti. NDISASM e Intel doc Tabella 4-7 sono errati.

risposta

4

L'istruzione VMINPD ymm1, ymm2, ymm3{sae} non è valida. Secondo di riferimento set di istruzioni per MINPD nel Intel Architecture Instruction Set Extensions Programming Reference (February 2016) solo le seguenti codifiche sono consentiti:

66 0F 5D /r     MINPD xmm1, xmm2/m128 
VEX.NDS.128.66.0F.WIG 5D /r VMINPD xmm1, xmm2, xmm3/m128 
VEX.NDS.256.66.0F.WIG 5D /r VMINPD ymm1, ymm2, ymm3/m256 
EVEX.NDS.128.66.0F.W1 5D /r VMINPD xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst 
EVEX.NDS.256.66.0F.W1 5D /r VMINPD ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst 
EVEX.NDS.512.66.0F.W1 5D /r VMINPD zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst{sae} 

Avviso che solo viene mostrata l'ultima versione con il suffisso {sae}, significa che è l'unica forma di istruzione si Ti è consentito usarlo con. Solo perché i bit esistono per codificare una particolare istruzione non significa che sia valida.

Si noti inoltre che la sezione 4.6.3, SAE Supporto Evex, chiarisce che SAE non si applica ai vettori a 128 bit o 256 bit:

Il sistema di codifica Evex permette istruzioni aritmetica in virgola mobile senza arrotondamento semantica essere codificati con l'attributo SAE. Questa capacità si applica alle lunghezze dei vettori scalari e a 512 bit, solo registrazione-registro, per impostazione EVEX.b. Quando EVEX.b è impostato, "sopprimere tutte le eccezioni" è implicito. [...]

non sono sicuro però se la tua mano istruzioni artigianale genererebbe un'eccezione non valido Opcode, se il bit EVEX.b viene semplicemente ignorato, o se i bit EVEX.L'L saranno ignorato. Evex codificato istruzioni VMINPD appartengono al tipo E2 classe di eccezione, e secondo la tabella 4-17, Tipo E2 Classe Condizioni di eccezione, l'istruzione in grado di generare un'eccezione #UD in uno dei seguenti casi:

  • Stato requisito, tabella 4-8 non soddisfatta.
  • Condizione #UD indipendente dal codice nella tabella 4-9.
  • Operando per codificare le condizioni #UD nella Tabella 4-10.
  • Codifica opmask delle condizioni #UD della tabella 4-11.
  • Se EVEX.L'L! = 10b (VL = 512).

Solo che l'ultima ragione sembra applicarsi qui, ma ciò significherebbe che la vostra istruzione genererebbe un'eccezione #UD con o senza il modificatore {sae}. Poiché ciò sembra contraddire direttamente le codifiche consentite nel riepilogo dell'istruzione, non sono sicuro di cosa succederebbe.

+0

Buon punto che i documenti dicono che non è possibile farlo, indipendentemente dai dettagli di codifica. Tuttavia, la risposta di Mysticial sottolinea che EVEX.L'L si sovrappone a EVEX.RC e EVEX.b seleziona quale viene interpretato come. –

+0

@PeterCordes Tranne che, come spiegato nella domanda, la Tabella 4-7 contraddice tale interpretazione. Dice che per "Istruzioni FP senza arrotondamento semantico, può causare #XF" che EVEX.b seleziona "Controllo SAE" mentre EVEX.L'L determina la lunghezza del vettore e EVEX.RC non è applicabile. Secondo la tabella è il tipo di istruzione che determina l'interpretazione di 'P2 [6: 5]'. Quindi per esempio 'VMINPD ymm1, ymm2, [rax] {1to8}' ha EVEX.b impostato mentre EVEX.L'L è 01b e EVEX.RC è N/A. Il problema degli OP è che questo non funziona con '{sae}'. La codifica che vuole esiste, ma semplicemente non è consentita. –

+0

Inizialmente, ero fortemente in disaccordo con la tua risposta. Ma dopo aver esaminato dettagliatamente la tabella 4-7, ho determinato che il PDF è incompleto o contraddice se stesso. Le istruzioni del FP hanno il concetto di "arrotondare la semantica". Ma non c'è una lista nel documento che indica quali istruzioni mancano di questo. La Tabella 4-7 afferma che 'P2 [6: 5]' viene sempre interpretato come 'EVEX.L'L' per istruzioni FP che mancano di" arrotondamento semantico ". – Mysticial

Problemi correlati