Coverage Report

Created: 2023-06-07 06:31

/src/aom/aom_ports/bitops.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
3
 *
4
 * This source code is subject to the terms of the BSD 2 Clause License and
5
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6
 * was not distributed with this source code in the LICENSE file, you can
7
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8
 * Media Patent License 1.0 was not distributed with this source code in the
9
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10
 */
11
12
#ifndef AOM_AOM_PORTS_BITOPS_H_
13
#define AOM_AOM_PORTS_BITOPS_H_
14
15
#include <assert.h>
16
#include <stdint.h>
17
18
#include "aom_ports/msvc.h"
19
#include "config/aom_config.h"
20
21
#ifdef _MSC_VER
22
#if defined(_M_X64) || defined(_M_IX86)
23
#include <intrin.h>
24
#define USE_MSC_INTRINSICS
25
#endif
26
#endif
27
28
#ifdef __cplusplus
29
extern "C" {
30
#endif
31
32
// get_msb:
33
// Returns (int)floor(log2(n)). n must be > 0.
34
// These versions of get_msb() are only valid when n != 0 because all
35
// of the optimized versions are undefined when n == 0:
36
37
// get_byteswap64:
38
// Returns the number (uint64_t) with byte-positions reversed
39
// e.g. input 0x123456789ABCDEF0 returns 0xF0DEBC9A78563412
40
41
// GCC compiler: https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
42
// MSVC: https://learn.microsoft.com/en-us/cpp/c-runtime-library/
43
44
// use GNU builtins where available.
45
#if defined(__GNUC__) && \
46
    ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)
47
903M
static INLINE int get_msb(unsigned int n) {
48
903M
  assert(n != 0);
49
0
  return 31 ^ __builtin_clz(n);
50
903M
}
Unexecuted instantiation: av1_dx_iface.c:get_msb
decodeframe.c:get_msb
Line
Count
Source
47
426k
static INLINE int get_msb(unsigned int n) {
48
426k
  assert(n != 0);
49
0
  return 31 ^ __builtin_clz(n);
50
426k
}
Unexecuted instantiation: decodemv.c:get_msb
Unexecuted instantiation: decoder.c:get_msb
Unexecuted instantiation: decodetxb.c:get_msb
detokenize.c:get_msb
Line
Count
Source
47
121k
static INLINE int get_msb(unsigned int n) {
48
121k
  assert(n != 0);
49
0
  return 31 ^ __builtin_clz(n);
50
121k
}
Unexecuted instantiation: obu.c:get_msb
Unexecuted instantiation: aom_dsp_rtcd.c:get_msb
Unexecuted instantiation: av1_rtcd.c:get_msb
Unexecuted instantiation: aom_convolve.c:get_msb
bitreader_buffer.c:get_msb
Line
Count
Source
47
22.1k
static INLINE int get_msb(unsigned int n) {
48
22.1k
  assert(n != 0);
49
0
  return 31 ^ __builtin_clz(n);
50
22.1k
}
Unexecuted instantiation: blend_a64_hmask.c:get_msb
Unexecuted instantiation: blend_a64_mask.c:get_msb
Unexecuted instantiation: blend_a64_vmask.c:get_msb
Unexecuted instantiation: intrapred.c:get_msb
binary_codes_reader.c:get_msb
Line
Count
Source
47
104k
static INLINE int get_msb(unsigned int n) {
48
104k
  assert(n != 0);
49
0
  return 31 ^ __builtin_clz(n);
50
104k
}
Unexecuted instantiation: bitreader.c:get_msb
entdec.c:get_msb
Line
Count
Source
47
667M
static INLINE int get_msb(unsigned int n) {
48
667M
  assert(n != 0);
49
0
  return 31 ^ __builtin_clz(n);
50
667M
}
Unexecuted instantiation: aom_convolve_copy_sse2.c:get_msb
Unexecuted instantiation: aom_asm_stubs.c:get_msb
Unexecuted instantiation: intrapred_sse2.c:get_msb
Unexecuted instantiation: loopfilter_sse2.c:get_msb
Unexecuted instantiation: highbd_convolve_sse2.c:get_msb
Unexecuted instantiation: highbd_loopfilter_sse2.c:get_msb
Unexecuted instantiation: aom_subpixel_8t_intrin_ssse3.c:get_msb
Unexecuted instantiation: intrapred_ssse3.c:get_msb
Unexecuted instantiation: highbd_convolve_ssse3.c:get_msb
Unexecuted instantiation: blend_a64_hmask_sse4.c:get_msb
Unexecuted instantiation: blend_a64_mask_sse4.c:get_msb
Unexecuted instantiation: blend_a64_vmask_sse4.c:get_msb
Unexecuted instantiation: intrapred_sse4.c:get_msb
Unexecuted instantiation: aom_convolve_copy_avx2.c:get_msb
Unexecuted instantiation: aom_subpixel_8t_intrin_avx2.c:get_msb
Unexecuted instantiation: intrapred_avx2.c:get_msb
Unexecuted instantiation: loopfilter_avx2.c:get_msb
Unexecuted instantiation: blend_a64_mask_avx2.c:get_msb
Unexecuted instantiation: highbd_convolve_avx2.c:get_msb
Unexecuted instantiation: highbd_loopfilter_avx2.c:get_msb
Unexecuted instantiation: alloccommon.c:get_msb
Unexecuted instantiation: av1_inv_txfm2d.c:get_msb
Unexecuted instantiation: av1_loopfilter.c:get_msb
Unexecuted instantiation: av1_txfm.c:get_msb
Unexecuted instantiation: blockd.c:get_msb
Unexecuted instantiation: cdef.c:get_msb
cdef_block.c:get_msb
Line
Count
Source
47
28.2M
static INLINE int get_msb(unsigned int n) {
48
28.2M
  assert(n != 0);
49
0
  return 31 ^ __builtin_clz(n);
50
28.2M
}
Unexecuted instantiation: cfl.c:get_msb
Unexecuted instantiation: convolve.c:get_msb
Unexecuted instantiation: entropy.c:get_msb
Unexecuted instantiation: entropymode.c:get_msb
Unexecuted instantiation: entropymv.c:get_msb
Unexecuted instantiation: idct.c:get_msb
Unexecuted instantiation: mvref_common.c:get_msb
Unexecuted instantiation: pred_common.c:get_msb
Unexecuted instantiation: quant_common.c:get_msb
Unexecuted instantiation: reconinter.c:get_msb
Unexecuted instantiation: reconintra.c:get_msb
Unexecuted instantiation: resize.c:get_msb
Unexecuted instantiation: restoration.c:get_msb
Unexecuted instantiation: scale.c:get_msb
Unexecuted instantiation: scan.c:get_msb
Unexecuted instantiation: seg_common.c:get_msb
Unexecuted instantiation: thread_common.c:get_msb
Unexecuted instantiation: tile_common.c:get_msb
Unexecuted instantiation: txb_common.c:get_msb
warped_motion.c:get_msb
Line
Count
Source
47
1.05M
static INLINE int get_msb(unsigned int n) {
48
1.05M
  assert(n != 0);
49
0
  return 31 ^ __builtin_clz(n);
50
1.05M
}
Unexecuted instantiation: cdef_block_sse2.c:get_msb
Unexecuted instantiation: cfl_sse2.c:get_msb
Unexecuted instantiation: convolve_2d_sse2.c:get_msb
Unexecuted instantiation: convolve_sse2.c:get_msb
Unexecuted instantiation: jnt_convolve_sse2.c:get_msb
Unexecuted instantiation: warp_plane_sse2.c:get_msb
Unexecuted instantiation: wiener_convolve_sse2.c:get_msb
Unexecuted instantiation: av1_inv_txfm_ssse3.c:get_msb
Unexecuted instantiation: cdef_block_ssse3.c:get_msb
Unexecuted instantiation: cfl_ssse3.c:get_msb
Unexecuted instantiation: jnt_convolve_ssse3.c:get_msb
Unexecuted instantiation: resize_ssse3.c:get_msb
Unexecuted instantiation: highbd_convolve_2d_ssse3.c:get_msb
Unexecuted instantiation: highbd_wiener_convolve_ssse3.c:get_msb
Unexecuted instantiation: reconinter_ssse3.c:get_msb
Unexecuted instantiation: av1_convolve_horiz_rs_sse4.c:get_msb
Unexecuted instantiation: av1_convolve_scale_sse4.c:get_msb
Unexecuted instantiation: av1_txfm_sse4.c:get_msb
Unexecuted instantiation: cdef_block_sse4.c:get_msb
Unexecuted instantiation: filterintra_sse4.c:get_msb
Unexecuted instantiation: highbd_inv_txfm_sse4.c:get_msb
Unexecuted instantiation: intra_edge_sse4.c:get_msb
Unexecuted instantiation: reconinter_sse4.c:get_msb
Unexecuted instantiation: selfguided_sse4.c:get_msb
Unexecuted instantiation: warp_plane_sse4.c:get_msb
Unexecuted instantiation: highbd_convolve_2d_sse4.c:get_msb
Unexecuted instantiation: highbd_jnt_convolve_sse4.c:get_msb
Unexecuted instantiation: highbd_warp_plane_sse4.c:get_msb
Unexecuted instantiation: av1_inv_txfm_avx2.c:get_msb
cdef_block_avx2.c:get_msb
Line
Count
Source
47
205M
static INLINE int get_msb(unsigned int n) {
48
205M
  assert(n != 0);
49
0
  return 31 ^ __builtin_clz(n);
50
205M
}
Unexecuted instantiation: cfl_avx2.c:get_msb
Unexecuted instantiation: convolve_2d_avx2.c:get_msb
Unexecuted instantiation: convolve_avx2.c:get_msb
Unexecuted instantiation: highbd_inv_txfm_avx2.c:get_msb
Unexecuted instantiation: jnt_convolve_avx2.c:get_msb
Unexecuted instantiation: reconinter_avx2.c:get_msb
Unexecuted instantiation: selfguided_avx2.c:get_msb
Unexecuted instantiation: warp_plane_avx2.c:get_msb
Unexecuted instantiation: wiener_convolve_avx2.c:get_msb
Unexecuted instantiation: highbd_convolve_2d_avx2.c:get_msb
Unexecuted instantiation: highbd_jnt_convolve_avx2.c:get_msb
Unexecuted instantiation: highbd_wiener_convolve_avx2.c:get_msb
Unexecuted instantiation: highbd_warp_affine_avx2.c:get_msb
Unexecuted instantiation: entcode.c:get_msb
Unexecuted instantiation: aom_subpixel_8t_intrin_sse2.c:get_msb
Unexecuted instantiation: highbd_intrapred_sse2.c:get_msb
Unexecuted instantiation: av1_inv_txfm1d.c:get_msb
51
52
0
static INLINE uint64_t get_byteswap64(uint64_t num) {
53
0
  return __builtin_bswap64(num);
54
0
}
Unexecuted instantiation: av1_dx_iface.c:get_byteswap64
Unexecuted instantiation: decodeframe.c:get_byteswap64
Unexecuted instantiation: decodemv.c:get_byteswap64
Unexecuted instantiation: decoder.c:get_byteswap64
Unexecuted instantiation: decodetxb.c:get_byteswap64
Unexecuted instantiation: detokenize.c:get_byteswap64
Unexecuted instantiation: obu.c:get_byteswap64
Unexecuted instantiation: aom_dsp_rtcd.c:get_byteswap64
Unexecuted instantiation: av1_rtcd.c:get_byteswap64
Unexecuted instantiation: aom_convolve.c:get_byteswap64
Unexecuted instantiation: bitreader_buffer.c:get_byteswap64
Unexecuted instantiation: blend_a64_hmask.c:get_byteswap64
Unexecuted instantiation: blend_a64_mask.c:get_byteswap64
Unexecuted instantiation: blend_a64_vmask.c:get_byteswap64
Unexecuted instantiation: intrapred.c:get_byteswap64
Unexecuted instantiation: binary_codes_reader.c:get_byteswap64
Unexecuted instantiation: bitreader.c:get_byteswap64
Unexecuted instantiation: entdec.c:get_byteswap64
Unexecuted instantiation: aom_convolve_copy_sse2.c:get_byteswap64
Unexecuted instantiation: aom_asm_stubs.c:get_byteswap64
Unexecuted instantiation: intrapred_sse2.c:get_byteswap64
Unexecuted instantiation: loopfilter_sse2.c:get_byteswap64
Unexecuted instantiation: highbd_convolve_sse2.c:get_byteswap64
Unexecuted instantiation: highbd_loopfilter_sse2.c:get_byteswap64
Unexecuted instantiation: aom_subpixel_8t_intrin_ssse3.c:get_byteswap64
Unexecuted instantiation: intrapred_ssse3.c:get_byteswap64
Unexecuted instantiation: highbd_convolve_ssse3.c:get_byteswap64
Unexecuted instantiation: blend_a64_hmask_sse4.c:get_byteswap64
Unexecuted instantiation: blend_a64_mask_sse4.c:get_byteswap64
Unexecuted instantiation: blend_a64_vmask_sse4.c:get_byteswap64
Unexecuted instantiation: intrapred_sse4.c:get_byteswap64
Unexecuted instantiation: aom_convolve_copy_avx2.c:get_byteswap64
Unexecuted instantiation: aom_subpixel_8t_intrin_avx2.c:get_byteswap64
Unexecuted instantiation: intrapred_avx2.c:get_byteswap64
Unexecuted instantiation: loopfilter_avx2.c:get_byteswap64
Unexecuted instantiation: blend_a64_mask_avx2.c:get_byteswap64
Unexecuted instantiation: highbd_convolve_avx2.c:get_byteswap64
Unexecuted instantiation: highbd_loopfilter_avx2.c:get_byteswap64
Unexecuted instantiation: alloccommon.c:get_byteswap64
Unexecuted instantiation: av1_inv_txfm2d.c:get_byteswap64
Unexecuted instantiation: av1_loopfilter.c:get_byteswap64
Unexecuted instantiation: av1_txfm.c:get_byteswap64
Unexecuted instantiation: blockd.c:get_byteswap64
Unexecuted instantiation: cdef.c:get_byteswap64
Unexecuted instantiation: cdef_block.c:get_byteswap64
Unexecuted instantiation: cfl.c:get_byteswap64
Unexecuted instantiation: convolve.c:get_byteswap64
Unexecuted instantiation: entropy.c:get_byteswap64
Unexecuted instantiation: entropymode.c:get_byteswap64
Unexecuted instantiation: entropymv.c:get_byteswap64
Unexecuted instantiation: idct.c:get_byteswap64
Unexecuted instantiation: mvref_common.c:get_byteswap64
Unexecuted instantiation: pred_common.c:get_byteswap64
Unexecuted instantiation: quant_common.c:get_byteswap64
Unexecuted instantiation: reconinter.c:get_byteswap64
Unexecuted instantiation: reconintra.c:get_byteswap64
Unexecuted instantiation: resize.c:get_byteswap64
Unexecuted instantiation: restoration.c:get_byteswap64
Unexecuted instantiation: scale.c:get_byteswap64
Unexecuted instantiation: scan.c:get_byteswap64
Unexecuted instantiation: seg_common.c:get_byteswap64
Unexecuted instantiation: thread_common.c:get_byteswap64
Unexecuted instantiation: tile_common.c:get_byteswap64
Unexecuted instantiation: txb_common.c:get_byteswap64
Unexecuted instantiation: warped_motion.c:get_byteswap64
Unexecuted instantiation: cdef_block_sse2.c:get_byteswap64
Unexecuted instantiation: cfl_sse2.c:get_byteswap64
Unexecuted instantiation: convolve_2d_sse2.c:get_byteswap64
Unexecuted instantiation: convolve_sse2.c:get_byteswap64
Unexecuted instantiation: jnt_convolve_sse2.c:get_byteswap64
Unexecuted instantiation: warp_plane_sse2.c:get_byteswap64
Unexecuted instantiation: wiener_convolve_sse2.c:get_byteswap64
Unexecuted instantiation: av1_inv_txfm_ssse3.c:get_byteswap64
Unexecuted instantiation: cdef_block_ssse3.c:get_byteswap64
Unexecuted instantiation: cfl_ssse3.c:get_byteswap64
Unexecuted instantiation: jnt_convolve_ssse3.c:get_byteswap64
Unexecuted instantiation: resize_ssse3.c:get_byteswap64
Unexecuted instantiation: highbd_convolve_2d_ssse3.c:get_byteswap64
Unexecuted instantiation: highbd_wiener_convolve_ssse3.c:get_byteswap64
Unexecuted instantiation: reconinter_ssse3.c:get_byteswap64
Unexecuted instantiation: av1_convolve_horiz_rs_sse4.c:get_byteswap64
Unexecuted instantiation: av1_convolve_scale_sse4.c:get_byteswap64
Unexecuted instantiation: av1_txfm_sse4.c:get_byteswap64
Unexecuted instantiation: cdef_block_sse4.c:get_byteswap64
Unexecuted instantiation: filterintra_sse4.c:get_byteswap64
Unexecuted instantiation: highbd_inv_txfm_sse4.c:get_byteswap64
Unexecuted instantiation: intra_edge_sse4.c:get_byteswap64
Unexecuted instantiation: reconinter_sse4.c:get_byteswap64
Unexecuted instantiation: selfguided_sse4.c:get_byteswap64
Unexecuted instantiation: warp_plane_sse4.c:get_byteswap64
Unexecuted instantiation: highbd_convolve_2d_sse4.c:get_byteswap64
Unexecuted instantiation: highbd_jnt_convolve_sse4.c:get_byteswap64
Unexecuted instantiation: highbd_warp_plane_sse4.c:get_byteswap64
Unexecuted instantiation: av1_inv_txfm_avx2.c:get_byteswap64
Unexecuted instantiation: cdef_block_avx2.c:get_byteswap64
Unexecuted instantiation: cfl_avx2.c:get_byteswap64
Unexecuted instantiation: convolve_2d_avx2.c:get_byteswap64
Unexecuted instantiation: convolve_avx2.c:get_byteswap64
Unexecuted instantiation: highbd_inv_txfm_avx2.c:get_byteswap64
Unexecuted instantiation: jnt_convolve_avx2.c:get_byteswap64
Unexecuted instantiation: reconinter_avx2.c:get_byteswap64
Unexecuted instantiation: selfguided_avx2.c:get_byteswap64
Unexecuted instantiation: warp_plane_avx2.c:get_byteswap64
Unexecuted instantiation: wiener_convolve_avx2.c:get_byteswap64
Unexecuted instantiation: highbd_convolve_2d_avx2.c:get_byteswap64
Unexecuted instantiation: highbd_jnt_convolve_avx2.c:get_byteswap64
Unexecuted instantiation: highbd_wiener_convolve_avx2.c:get_byteswap64
Unexecuted instantiation: highbd_warp_affine_avx2.c:get_byteswap64
Unexecuted instantiation: entcode.c:get_byteswap64
Unexecuted instantiation: aom_subpixel_8t_intrin_sse2.c:get_byteswap64
Unexecuted instantiation: highbd_intrapred_sse2.c:get_byteswap64
Unexecuted instantiation: av1_inv_txfm1d.c:get_byteswap64
55
#elif defined(USE_MSC_INTRINSICS)
56
#pragma intrinsic(_BitScanReverse)
57
58
static INLINE int get_msb(unsigned int n) {
59
  unsigned long first_set_bit;
60
  assert(n != 0);
61
  _BitScanReverse(&first_set_bit, n);
62
  return first_set_bit;
63
}
64
65
static INLINE uint64_t get_byteswap64(uint64_t num) {
66
  return _byteswap_uint64(num);
67
}
68
#undef USE_MSC_INTRINSICS
69
#else
70
static INLINE int get_msb(unsigned int n) {
71
  int log = 0;
72
  unsigned int value = n;
73
74
  assert(n != 0);
75
76
  for (int shift = 16; shift != 0; shift >>= 1) {
77
    const unsigned int x = value >> shift;
78
    if (x != 0) {
79
      value = x;
80
      log += shift;
81
    }
82
  }
83
  return log;
84
}
85
86
static INLINE uint64_t get_byteswap64(uint64_t num) {
87
  uint64_t out = 0x00;
88
  uint64_t mask = 0xFF00000000000000;
89
  int bit_shift = 56;  // 7 bytes
90
  // 4 ms bytes
91
  do {
92
    out |= (num & mask) >> bit_shift;
93
    mask >>= 8;
94
    bit_shift -= 16;
95
  } while (bit_shift >= 0);
96
  // 4 ls bytes
97
  bit_shift = 8;  // 1 byte
98
  do {
99
    out |= (num & mask) << bit_shift;
100
    mask >>= 8;
101
    bit_shift += 16;
102
  } while (bit_shift <= 56);
103
  return out;
104
}
105
#endif
106
107
#ifdef __cplusplus
108
}  // extern "C"
109
#endif
110
111
#endif  // AOM_AOM_PORTS_BITOPS_H_