Aggiungere 64 bit superiori e inferiori di un registro xmm 128 bit
-
19-09-2019 - |
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?
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
.