2013-04-26 21 views
6

Sadece Visual C++ 2012'yi kullanarak SSE intrinsics'i kullanmaya başladım ve bazı göstergelere ihtiyacım var (hiçbir amaç yok).Bir XMM kaydına iki takım 4 şort nasıl yüklenir?

Her biri 4 signed short s içeren iki dizim var (her dizi 64 bit, toplam 128'dir). Bir XMM kaydının üst bitlerine, diğeri ise alt bitlere yüklemek istiyorum. SSE intrinsiklerini kullanarak bunu verimli bir şekilde yapabilir miyim? Öyleyse nasıl?

+0

SSE4.1 izinli midir? – Mysticial

+0

Sanırım öyleyse, mümkünse talimatları doğrudan yazmak yerine mevcut iç öğeleri kullanmayı tercih ederim. – Asik

cevap

12

SSE2: A veya B için bir hizalama gereksinimleri vardır

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} 

Not: + 64

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. Ama her ikisi de zaten 8 bayt hizalı olmasını tavsiye ederim.

+0

Teşekkürler. İlk örneğinizde olduğu gibi iki loadl_epi64 yapmanın ne olduğunu düşünüyorsun, ama sonra bunu _mm_unpacklo_epi64 kullanarak genişletin mi? Bu da işe yarar mı? – Asik

+0

Evet, aslında daha iyi. Güncelleme yapacağım. Aklımdan bile geçmedi. :) – Mysticial

+2

Weee Ben bir şey öğretti (sadece şaka). Çok teşekkürler! – Asik