/*
* Copyright ( c ) 2016 , Alliance for Open Media . All rights reserved .
*
* This source code is subject to the terms of the BSD 2 Clause License and
* the Alliance for Open Media Patent License 1 . 0 . If the BSD 2 Clause License
* was not distributed with this source code in the LICENSE file , you can
* obtain it at www . aomedia . org / license / software . If the Alliance for Open
* Media Patent License 1 . 0 was not distributed with this source code in the
* PATENTS file , you can obtain it at www . aomedia . org / license / patent .
*/
#ifndef AOM_AOM_PORTS_BITOPS_H_
#define AOM_AOM_PORTS_BITOPS_H_
#include <assert.h>
#include <stdint.h>
#include "config/aom_config.h"
#ifdef _MSC_VER
#if defined (_M_X64) ||
defined (_M_IX86) ||
defined (_M_ARM64) ||
defined (_M_ARM)
#include <intrin.h>
#define USE_MSC_INTRINSICS
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
// get_msb:
// Returns (int)floor(log2(n)). n must be > 0.
// These versions of get_msb() are only valid when n != 0 because all
// of the optimized versions are undefined when n == 0:
// GCC compiler: https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
// MSVC: https://learn.microsoft.com/en-us/cpp/intrinsics/compiler-intrinsics
// use GNU builtins where available.
#if defined (__GNUC__) && \
((__GNUC__ ==
3 && __GNUC_MINOR__ >=
4 ) || __GNUC__ >=
4 )
static inline int get_msb(
unsigned int n) {
assert(n !=
0 );
return 31 ^ __builtin_clz(n);
}
#elif defined (USE_MSC_INTRINSICS)
#pragma intrinsic(_BitScanReverse)
static inline int get_msb(
unsigned int n) {
unsigned long first_set_bit;
assert(n !=
0 );
_BitScanReverse(&first_set_bit, n);
return first_set_bit;
}
#else
static inline int get_msb(
unsigned int n) {
int log =
0 ;
unsigned int value = n;
assert(n !=
0 );
for (
int shift =
16 ; shift !=
0 ; shift >>=
1 ) {
const unsigned int x = value >> shift;
if (x !=
0 ) {
value = x;
log += shift;
}
}
return log;
}
#endif
// Returns (int)ceil(log2(n)).
static inline int aom_ceil_log2(
int n) {
if (n <
2 )
return 0 ;
return get_msb(n -
1 ) +
1 ;
}
#if defined (__GNUC__) && \
((__GNUC__ ==
3 && __GNUC_MINOR__ >=
4 ) || __GNUC__ >=
4 )
static inline int aom_clzll(uint64_t n) {
return __builtin_clzll(n); }
#elif defined (USE_MSC_INTRINSICS)
#if defined (_M_X64) ||
defined (_M_ARM64)
#pragma intrinsic(_BitScanReverse64)
#endif
static inline int aom_clzll(uint64_t n) {
assert(n !=
0 );
unsigned long first_set_bit;
// NOLINT(runtime/int)
#if defined (_M_X64) ||
defined (_M_ARM64)
const unsigned char bit_set =
_BitScanReverse64(&first_set_bit, (
unsigned __int64)n);
#else // !(defined(_M_X64) || defined(_M_ARM64))
const unsigned long n_hi = (
unsigned long )(n >>
32 );
// NOLINT(runtime/int)
if (n_hi !=
0 ) {
const unsigned char bit_set = _BitScanReverse(&first_set_bit, n_hi);
assert(bit_set !=
0 );
(
void )bit_set;
return 31 ^ (
int )first_set_bit;
}
const unsigned char bit_set =
_BitScanReverse(&first_set_bit, (
unsigned long )n);
// NOLINT(runtime/int)
#endif
assert(bit_set !=
0 );
(
void )bit_set;
return 63 ^ (
int )first_set_bit;
}
#undef USE_MSC_INTRINSICS
#else
static inline int aom_clzll(uint64_t n) {
assert(n !=
0 );
int res =
0 ;
uint64_t high_bit =
1 ULL <<
63 ;
while (!(n & high_bit)) {
res++;
n <<=
1 ;
}
return res;
}
#endif
#ifdef __cplusplus
}
// extern "C"
#endif
#endif // AOM_AOM_PORTS_BITOPS_H_
Messung V0.5 in Prozent C=89 H=96 G=92
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-08-23)
¤
*© Formatika GbR, Deutschland