MCPcopy Create free account
hub / github.com/OSGeo/gdal / GDALCopyWordsByteTo32Bit

Function GDALCopyWordsByteTo32Bit

gcore/rasterio.cpp:2325–2372  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2323
2324template <class Tout>
2325void 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
2374template <>
2375CPL_NOINLINE void GDALCopyWordsT(const GByte *const CPL_RESTRICT pSrcData,

Callers 1

GDALCopyWordsTFunction · 0.85

Calls 8

_mm_setzero_si128Function · 0.85
_mm_loadu_si128Function · 0.85
_mm_unpacklo_epi8Function · 0.85
_mm_unpackhi_epi8Function · 0.85
_mm_unpacklo_epi16Function · 0.85
_mm_unpackhi_epi16Function · 0.85
_mm_storeu_si128Function · 0.85
GDALCopyWordsGenericTFunction · 0.85

Tested by

no test coverage detected