Domanda

Ho due interi quadword confezionati in xmm0 e ho bisogno di aggiungere insieme e memorizzare il risultato in una posizione di memoria. Posso garantire che il valore del ciascun intero è inferiore a 2 ^ 15 . In questo momento, sto facendo il seguente:

int temp;
....   

   movdq2q mm0, xmm0
   psrldq xmm0, 8
   movdq2q mm1, xmm0
   paddq mm0,mm1
   movd temp, mm0

C'è un modo migliore per fare questo?

È stato utile?

Soluzione

Prima di tutto, perché stai usando quadwords per rappresentare i valori che si adatterebbe in un formato a 16 bit? Lasciando a parte questo, un paio di soluzioni:

pshufd xmm1, xmm0, EEh
paddq  xmm0, xmm1
movd   temp, xmm0

o

movdqa xmm1, xmm0
psrldq xmm1, 8
paddq  xmm0, xmm1
movd   temp, xmm0

o

movhlps xmm1, xmm0
paddq   xmm0, xmm1
movd    temp, xmm0

Si noti che in realtà non c'è bisogno di usare paddq, è possibile ottenere via con una delle più stretto aggiunge, se si preferisce.

modifica sommando quattro doppie quadwords - quello che hai è più o meno bene. Dato che si sa che tutti i dati in essi si inserisce nel basso doppia parola di ogni slot, si potrebbe provare qualcosa di simile:

shufps  xmm0, xmm2, 88h
shufps  xmm4, xmm6, 88h
paddd   xmm0, xmm4
psrlq   xmm1, xmm0, 32
paddd   xmm0, xmm1
movhlps xmm1, xmm0
paddd   xmm0, xmm0
movd    temp, xmm0

, che può o non può dimostrare di essere più veloce.

Per quanto riguarda EMMS, è solo un'altra istruzione. Dopo qualsiasi codice che tocca i registri MMX, prima di qualsiasi codice che utilizza la x87 istruzioni a virgola mobile è necessario avere emms.

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