2013-04-26 5 views
6

Sono appena iniziato con gli intrinseci SSE utilizzando Visual C++ 2012 e ho bisogno di alcuni puntatori (nessun gioco di parole previsto).Come caricare due serie di 4 cortocircuiti in un registro XMM?

Ho due array contenenti 4 signed short s ciascuno (ogni array è quindi 64 bit, per un totale di 128). Voglio caricarne uno nei bit superiori di un registro XMM e l'altro nei bit inferiori. Posso farlo in modo efficiente usando gli intrinseci SSE? Se é cosi, come?

+0

È consentito SSE4.1? – Mysticial

+0

Credo di sì, ma preferirei usare le intrinseche disponibili piuttosto che scrivere direttamente le istruzioni, se possibile. – Asik

risposta

12

SSE2:

short A[] = {0,1,2,3}; 
short B[] = {4,5,6,7}; 

__m128i a,b,v; 
a = _mm_loadl_epi64((const __m128i*)A); 
b = _mm_loadl_epi64((const __m128i*)B); 
v = _mm_unpacklo_epi64(a,b); 

// v = {0,1,2,3,4,5,6,7} 

SSE4.1 + x64:

short A[] = {0,1,2,3}; 
short B[] = {4,5,6,7}; 

__m128i v; 
v = _mm_loadl_epi64((const __m128i*)A); 
v = _mm_insert_epi64(v,*(const long long*)B,1); 

// v = {0,1,2,3,4,5,6,7} 

Si noti che non ci sono requisiti di allineamento per A o B. Ma raccomanderei che siano entrambi allineati a 8 byte comunque.

+0

Grazie. Cosa ne pensi di fare due loadl_epi64 come nel tuo primo esempio, ma poi espanderlo usando _mm_unpacklo_epi64? Funzionerebbe anche questo? – Asik

+0

Sì, è davvero meglio. Aggiornerò Non mi è nemmeno passato per la testa. :) – Mysticial

+2

Weee ho insegnato al maestro qualcosa (sto scherzando). Molte grazie! – Asik

Problemi correlati