| 2323 | |
| 2324 | template <class Tout> |
| 2325 | void GDALCopyWordsByteTo32Bit(const GByte *const CPL_RESTRICT pSrcData, |
| 2326 | int nSrcPixelStride, |
| 2327 | Tout *const CPL_RESTRICT pDstData, |
| 2328 | int nDstPixelStride, GPtrDiff_t nWordCount) |
| 2329 | { |
| 2330 | static_assert(std::is_integral<Tout>::value && |
| 2331 | sizeof(Tout) == sizeof(uint32_t), |
| 2332 | "Bad Tout"); |
| 2333 | if (nSrcPixelStride == static_cast<int>(sizeof(*pSrcData)) && |
| 2334 | nDstPixelStride == static_cast<int>(sizeof(*pDstData))) |
| 2335 | { |
| 2336 | decltype(nWordCount) n = 0; |
| 2337 | const __m128i xmm_zero = _mm_setzero_si128(); |
| 2338 | GByte *CPL_RESTRICT pabyDstDataPtr = |
| 2339 | reinterpret_cast<GByte *>(pDstData); |
| 2340 | for (; n < nWordCount - 15; n += 16) |
| 2341 | { |
| 2342 | __m128i xmm = _mm_loadu_si128( |
| 2343 | reinterpret_cast<const __m128i *>(pSrcData + n)); |
| 2344 | __m128i xmm_low = _mm_unpacklo_epi8(xmm, xmm_zero); |
| 2345 | __m128i xmm_high = _mm_unpackhi_epi8(xmm, xmm_zero); |
| 2346 | __m128i xmm0 = _mm_unpacklo_epi16(xmm_low, xmm_zero); |
| 2347 | __m128i xmm1 = _mm_unpackhi_epi16(xmm_low, xmm_zero); |
| 2348 | __m128i xmm2 = _mm_unpacklo_epi16(xmm_high, xmm_zero); |
| 2349 | __m128i xmm3 = _mm_unpackhi_epi16(xmm_high, xmm_zero); |
| 2350 | _mm_storeu_si128( |
| 2351 | reinterpret_cast<__m128i *>(pabyDstDataPtr + n * 4), xmm0); |
| 2352 | _mm_storeu_si128( |
| 2353 | reinterpret_cast<__m128i *>(pabyDstDataPtr + n * 4 + 16), xmm1); |
| 2354 | _mm_storeu_si128( |
| 2355 | reinterpret_cast<__m128i *>(pabyDstDataPtr + n * 4 + 32), xmm2); |
| 2356 | _mm_storeu_si128( |
| 2357 | reinterpret_cast<__m128i *>(pabyDstDataPtr + n * 4 + 48), xmm3); |
| 2358 | } |
| 2359 | #if defined(__clang__) |
| 2360 | #pragma clang loop vectorize(disable) |
| 2361 | #endif |
| 2362 | for (; n < nWordCount; n++) |
| 2363 | { |
| 2364 | pDstData[n] = pSrcData[n]; |
| 2365 | } |
| 2366 | } |
| 2367 | else |
| 2368 | { |
| 2369 | GDALCopyWordsGenericT(pSrcData, nSrcPixelStride, pDstData, |
| 2370 | nDstPixelStride, nWordCount); |
| 2371 | } |
| 2372 | } |
| 2373 | |
| 2374 | template <> |
| 2375 | CPL_NOINLINE void GDALCopyWordsT(const GByte *const CPL_RESTRICT pSrcData, |
no test coverage detected