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

Function GDALCopyWordsByteTo16Bit

gcore/rasterio.cpp:2263–2302  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2261
2262template <class Tout>
2263void GDALCopyWordsByteTo16Bit(const GByte *const CPL_RESTRICT pSrcData,
2264 int nSrcPixelStride,
2265 Tout *const CPL_RESTRICT pDstData,
2266 int nDstPixelStride, GPtrDiff_t nWordCount)
2267{
2268 static_assert(std::is_integral<Tout>::value &&
2269 sizeof(Tout) == sizeof(uint16_t),
2270 "Bad Tout");
2271 if (nSrcPixelStride == static_cast<int>(sizeof(*pSrcData)) &&
2272 nDstPixelStride == static_cast<int>(sizeof(*pDstData)))
2273 {
2274 decltype(nWordCount) n = 0;
2275 const __m128i xmm_zero = _mm_setzero_si128();
2276 GByte *CPL_RESTRICT pabyDstDataPtr =
2277 reinterpret_cast<GByte *>(pDstData);
2278 for (; n < nWordCount - 15; n += 16)
2279 {
2280 __m128i xmm = _mm_loadu_si128(
2281 reinterpret_cast<const __m128i *>(pSrcData + n));
2282 __m128i xmm0 = _mm_unpacklo_epi8(xmm, xmm_zero);
2283 __m128i xmm1 = _mm_unpackhi_epi8(xmm, xmm_zero);
2284 _mm_storeu_si128(
2285 reinterpret_cast<__m128i *>(pabyDstDataPtr + n * 2), xmm0);
2286 _mm_storeu_si128(
2287 reinterpret_cast<__m128i *>(pabyDstDataPtr + n * 2 + 16), xmm1);
2288 }
2289#if defined(__clang__)
2290#pragma clang loop vectorize(disable)
2291#endif
2292 for (; n < nWordCount; n++)
2293 {
2294 pDstData[n] = pSrcData[n];
2295 }
2296 }
2297 else
2298 {
2299 GDALCopyWordsGenericT(pSrcData, nSrcPixelStride, pDstData,
2300 nDstPixelStride, nWordCount);
2301 }
2302}
2303
2304template <>
2305CPL_NOINLINE void GDALCopyWordsT(const GByte *const CPL_RESTRICT pSrcData,

Callers 1

GDALCopyWordsTFunction · 0.85

Calls 6

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

Tested by

no test coverage detected