SSE快速将像素uchar转换成float0~1
“`
void resample_norm(float* pfdst, unsigned char* pubysrc,
int src_len, float r) {
int i;
float fd;
if 1
const __m128i zero = _mm_setzero_si128();
const __m128i zero16_8 = _mm_set1_epi16(0);
__m128 pSrc1 = _mm_set1_ps(1.0/255.f);
for (i = 0; i < src_len; i += 16) {
//char a[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
//float *c = (float *)malloc(4*4);
const __m128i src8_16 = _mm_load_si128((__m128i*)(pubysrc+i));
const __m128i lower16_8 = _mm_unpacklo_epi8(src8_16, zero); // First 8 short values
__m128i xlo32_4 = _mm_unpacklo_epi16(lower16_8, zero16_8);
__m128i xhi32_4 = _mm_unpackhi_epi16(lower16_8, zero16_8);
__m128 ylo1 = _mm_cvtepi32_ps(xlo32_4);
__m128 str_ylo1 = _mm_mul_ps(ylo1, pSrc1);
__m128 yhi1 = _mm_cvtepi32_ps(xhi32_4);
__m128 str_ylo2 = _mm_mul_ps(yhi1, pSrc1);
const __m128i higher16_8 = _mm_unpackhi_epi8(src8_16, zero); // Last 8 short values
xlo32_4 = _mm_unpacklo_epi16(higher16_8, zero16_8);
xhi32_4 = _mm_unpackhi_epi16(higher16_8, zero16_8);
__m128 ylo2 = _mm_cvtepi32_ps(xlo32_4);
__m128 str_ylo3 = _mm_mul_ps(ylo2, pSrc1);
__m128 yhi2 = _mm_cvtepi32_ps(xhi32_4);
__m128 str_ylo4 = _mm_mul_ps(yhi2, pSrc1);
_mm_store_ps(pfdst + i, str_ylo1);
_mm_store_ps(pfdst + i + 4, str_ylo2);
_mm_store_ps(pfdst + i + 8, str_ylo3);
_mm_store_ps(pfdst + i + 12, str_ylo4);
}
else
for (i = 0; i < src_len; ++i) {
pfdst[i] = pubysrc[i] * r;
}
endif
}