ile packusdw işlevinin simüle edilmesi by Intel [pdf] numaralı algoritmaya göre pixman numaralı hızlı bir x888 -> 565 piksel dönüştürme işlevi gerçekleştiriyorum. Onların kodları x888 -> 555'i dönüştürürken, 565'e dönüştürmek istiyorum. Ne yazık ki, 565'e dönüştürmek yüksek bitin ayarlandığını gösteriyor, yani imzalanmış doygunluk paketi talimatlarını kullanamıyorum. İmzasız paket talimatı, packusdw SSE4.1'e kadar eklenmedi. SSE2 ile işlevselliğini uygulamak veya bunu yapmanın başka bir yolunu bulmak isterim.SSE2
Bu işlev, her biri 4 32 bit piksel içeren iki XMM kayıtlarını alır ve 8 dönüştürülmüş RGB565 pikselini içeren tek bir XMM kaydı verir. Ben düşündüm
static force_inline __m128i
pack_565_2packedx128_128 (__m128i lo, __m128i hi)
{
__m128i rb0 = _mm_and_si128 (lo, mask_565_rb);
__m128i rb1 = _mm_and_si128 (hi, mask_565_rb);
__m128i t0 = _mm_madd_epi16 (rb0, mask_565_pack_multiplier);
__m128i t1 = _mm_madd_epi16 (rb1, mask_565_pack_multiplier);
__m128i g0 = _mm_and_si128 (lo, mask_green);
__m128i g1 = _mm_and_si128 (hi, mask_green);
t0 = _mm_or_si128 (t0, g0);
t1 = _mm_or_si128 (t1, g1);
t0 = _mm_srli_epi32 (t0, 5);
t1 = _mm_srli_epi32 (t1, 5);
/* XXX: maybe there's a way to do this relatively efficiently with SSE2? */
return _mm_packus_epi32 (t0, t1);
}
Fikirler:
Çıkarma 0x8000, _mm_packs_epi32, yeniden eklenmesini her 565 piksele 0x8000. Bunu denedim ama bu işi yapamam. Paketlemek yerine verileri karıştırın. MMX için çalışır, ancak SSE 16 bit karmaşıkları yalnızca yüksek veya düşük 64 bit üzerinde çalıştığı için dağınık olur. Yüksek bitleri kaydedin, bunları sıfıra ayarlayın, paketi yapın, sonradan geri yükleyin.Oldukça dağınık görünüyor.
Bunu yapabileceğim başka (umarım daha verimli) bir yol var mı?
Mükemmel! Çok teşekkürler. Daha verimli bir şekilde yapılabileceğinden şüpheliyim. – mattst88