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):
- CPU genera un'eccezione. Intel doc Tabella 4-7 è fuorviante.
- SAE è in effetti, la CPU funziona solo con xmm, come nelle operazioni scalari . NASM e NDISASM funzionano correttamente, la documentazione Intel è errata.
- SAE viene ignorato, la CPU funziona con 256 bit in base alla specifica VMINPD in Intel doc. NASM & NDISASM sono errati.
- 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}.
- 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.
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. –
@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. –
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