| 2261 | |
| 2262 | template <class Tout> |
| 2263 | void 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 | |
| 2304 | template <> |
| 2305 | CPL_NOINLINE void GDALCopyWordsT(const GByte *const CPL_RESTRICT pSrcData, |
no test coverage detected