/* * Copyright (C) 2014, 2021, 2024, D. R. Commander. * Copyright (C) 2014, Olle Liljenzin. * Copyright (C) 2020, Arm Limited. * * For conditions of distribution and use, see the accompanying README.ijg * file. */ /* * NOTE: If USE_CLZ_INTRINSIC is defined, then clz/bsr instructions will be * used for bit counting rather than the lookup table. This will reduce the * memory footprint by 64k, which is important for some mobile applications * that create many isolated instances of libjpeg-turbo (web browsers, for * instance.) This may improve performance on some mobile platforms as well. * This feature is enabled by default only on Arm processors, because some x86 * chips have a slow implementation of bsr, and the use of clz/bsr cannot be * shown to have a significant performance impact even on the x86 chips that * have a fast implementation of it. When building for Armv6, you can * explicitly disable the use of clz/bsr by adding -mthumb to the compiler * flags (this defines __thumb__). */ /* NOTE: Both GCC and Clang define __GNUC__ */ #if (defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))) || \ defined(_M_ARM) || defined(_M_ARM64) #if !defined(__thumb__) || defined(__thumb2__) #define USE_CLZ_INTRINSIC #endif #endif #ifdef USE_CLZ_INTRINSIC #if defined(_MSC_VER) && !defined(__clang__) #define JPEG_NBITS_NONZERO(x) (32 - _CountLeadingZeros(x)) #else #define JPEG_NBITS_NONZERO(x) (32 - __builtin_clz(x)) #endif #define JPEG_NBITS(x) (x ? JPEG_NBITS_NONZERO(x) : 0) #else extern const unsigned char jpeg_nbits_table[65536]; #define JPEG_NBITS(x) (jpeg_nbits_table[x]) #define JPEG_NBITS_NONZERO(x) JPEG_NBITS(x) #endif