Domanda

In SSE la prefissi 066h (operando dimensioni override) 0F2H (REPNE) e 0F3h (REPE) sono parte di codice.

In interruttori 066h non SSE tra 32 bit (o 64-bit) e funzionamento a 16 bit. 0F2h e 0F3h sono utilizzati per operazioni di stringa. Essi possono essere combinati in modo che 066h e 0F2h (o 0F3h) possono essere utilizzati nella stessa istruzione, perché questo è significativo. Qual è il comportamento in un'istruzione SSE? Per esempio, abbiamo (ignorando mod / rm per ora):

0f 58 -> addps

66 0f 58 -> addpd

f2 0f 58 -> addsd

f3 0f 58 -> addss

Ma che cosa è questo?

66 f2 0f 58

E per quanto riguarda?

f2 66 0f 58

Per non parlare del seguito che ha due prefissi contrastanti REP:

f2 f3 0f 58

Qual è la specifica per queste?

È stato utile?

Soluzione

Non ricordo di aver visto alcuna specifica su ciò che si dovrebbe aspettare nel caso di selvaggiamente combinando prefissi casuali, quindi credo che il comportamento della CPU potrebbe essere "indefinito" e possibilmente specifico della CPU. (Chiaramente, alcune cose sono specificati nei documenti di esempio Intel, ma molti casi non sono coperti). E alcune combinazioni possono essere riservati per uso futuro.

Le mie ipotesi ingenue sarebbero in generale sono stati che i prefissi aggiuntivi sarebbero no-ops ma non c'è alcuna garanzia. Sembra che con congruo che ad esempio alcuni manuali ottimizzazione consiglia NOP multi-byte (canonicamente 90h) anteponendo con 66h, per esempio:.

db 66h, 90h; 2-byte NOP
db 66h, 66h, 90h; 3-byte NOP
db 66h, 66h, 66h, 90h; 4-byte NOP

Tuttavia, so anche che i prefissi CS e segmento DS di override hanno acquisito nuove funzioni come SSE2 prefissi filiale di suggerimento (prevedere filiale preso = 3Eh = DS ignorare; prevedere ramo non godute = 2Eh = CS override) se applicato a istruzioni di salto condizionato .

In ogni caso, ho guardato i tuoi esempi di cui sopra, l'impostazione sempre XMM1 a tutti 0 e XMM7 a tutti 0FFh da

pxor xmm1, xmm1    ; xmm1 <- 0s
pcmpeqw xmm7, xmm7 ; xmm7 <- FFs 

e poi il codice in questione, con argomenti xmm1, xmm7. Quello che ho osservato (codice a 32 bit su sistemi Win64 e Intel T7300 Core 2 Duo) era:

1) nessuna variazione osservata per addsd con l'aggiunta del prefisso 66h

db 66h 
addsd xmm1, xmm7 ;total sequence = 66 F2 0F 58 CF     

2) nessuna variazione osservata per addss con l'aggiunta del prefisso 0F2h

db 0f2h     
addss xmm1,xmm7 ;total sequence = F2 F3 0F 58 CF

3) Tuttavia, ho osservato un cambiamento anteponendo addpd per 0F2h:

db 0f2h    
addpd xmm1, xmm7 ;total sequence = F2 66 0F 58 CF

In questo caso, il risultato in XMM1 stato 0000000000000000FFFFFFFFFFFFFFFFh invece di FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFh.

La mia conclusione è che non si dovrebbe fare alcuna ipotesi e si aspettano un comportamento "non definito" . Non sarei sorpreso, tuttavia, se si poteva trovare qualche indizio in Agner nebbia di manuali .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top