Coverage Report

Created: 2022-08-24 06:04

/src/libjxl/lib/jxl/base/bits.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) the JPEG XL Project Authors. All rights reserved.
2
//
3
// Use of this source code is governed by a BSD-style
4
// license that can be found in the LICENSE file.
5
6
#ifndef LIB_JXL_BASE_BITS_H_
7
#define LIB_JXL_BASE_BITS_H_
8
9
// Specialized instructions for processing register-sized bit arrays.
10
11
#include "lib/jxl/base/compiler_specific.h"
12
#include "lib/jxl/base/status.h"
13
14
#if JXL_COMPILER_MSVC
15
#include <intrin.h>
16
#endif
17
18
#include <stddef.h>
19
#include <stdint.h>
20
21
namespace jxl {
22
23
// Empty struct used as a size tag type.
24
template <size_t N>
25
struct SizeTag {};
26
27
template <typename T>
28
0
constexpr bool IsSigned() {
29
0
  return T(0) > T(-1);
30
0
}
Unexecuted instantiation: bool jxl::IsSigned<unsigned long>()
Unexecuted instantiation: bool jxl::IsSigned<unsigned int>()
31
32
// Undefined results for x == 0.
33
static JXL_INLINE JXL_MAYBE_UNUSED size_t
34
0
Num0BitsAboveMS1Bit_Nonzero(SizeTag<4> /* tag */, const uint32_t x) {
35
0
  JXL_DASSERT(x != 0);
36
#if JXL_COMPILER_MSVC
37
  unsigned long index;
38
  _BitScanReverse(&index, x);
39
  return 31 - index;
40
#else
41
0
  return static_cast<size_t>(__builtin_clz(x));
42
0
#endif
43
0
}
Unexecuted instantiation: fields_fuzzer.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: color_encoding_internal.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: color_management.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: dec_ans.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: dec_context_map.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: dec_huffman.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: fields.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: frame_header.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: headers.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: image_metadata.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: jpeg_data.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: loop_filter.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: encoding.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: modular_image.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: transform.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: quantizer.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: aux_out.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: data_parallel.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: dec_ma.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: rct.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: squeeze.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
44
static JXL_INLINE JXL_MAYBE_UNUSED size_t
45
0
Num0BitsAboveMS1Bit_Nonzero(SizeTag<8> /* tag */, const uint64_t x) {
46
0
  JXL_DASSERT(x != 0);
47
#if JXL_COMPILER_MSVC
48
#if JXL_ARCH_X64
49
  unsigned long index;
50
  _BitScanReverse64(&index, x);
51
  return 63 - index;
52
#else   // JXL_ARCH_X64
53
  // _BitScanReverse64 not available
54
  uint32_t msb = static_cast<uint32_t>(x >> 32u);
55
  unsigned long index;
56
  if (msb == 0) {
57
    uint32_t lsb = static_cast<uint32_t>(x & 0xFFFFFFFF);
58
    _BitScanReverse(&index, lsb);
59
    return 63 - index;
60
  } else {
61
    _BitScanReverse(&index, msb);
62
    return 31 - index;
63
  }
64
#endif  // JXL_ARCH_X64
65
#else
66
0
  return static_cast<size_t>(__builtin_clzll(x));
67
0
#endif
68
0
}
Unexecuted instantiation: fields_fuzzer.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: color_encoding_internal.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: color_management.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: dec_ans.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: dec_context_map.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: dec_huffman.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: fields.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: frame_header.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: headers.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: image_metadata.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: jpeg_data.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: loop_filter.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: encoding.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: modular_image.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: transform.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: quantizer.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: aux_out.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: data_parallel.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: dec_ma.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: rct.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: squeeze.cc:jxl::Num0BitsAboveMS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
69
template <typename T>
70
static JXL_INLINE JXL_MAYBE_UNUSED size_t
71
0
Num0BitsAboveMS1Bit_Nonzero(const T x) {
72
0
  static_assert(!IsSigned<T>(), "Num0BitsAboveMS1Bit_Nonzero: use unsigned");
73
0
  return Num0BitsAboveMS1Bit_Nonzero(SizeTag<sizeof(T)>(), x);
74
0
}
Unexecuted instantiation: fields_fuzzer.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: fields_fuzzer.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: dec_ans.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: dec_ans.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: dec_context_map.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: dec_huffman.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: fields.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: encoding.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: encoding.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: modular_image.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: modular_image.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: transform.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: transform.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: dec_ma.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: rct.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: rct.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: squeeze.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: squeeze.cc:unsigned long jxl::Num0BitsAboveMS1Bit_Nonzero<unsigned int>(unsigned int)
75
76
// Undefined results for x == 0.
77
static JXL_INLINE JXL_MAYBE_UNUSED size_t
78
0
Num0BitsBelowLS1Bit_Nonzero(SizeTag<4> /* tag */, const uint32_t x) {
79
0
  JXL_DASSERT(x != 0);
80
0
#if JXL_COMPILER_MSVC
81
0
  unsigned long index;
82
0
  _BitScanForward(&index, x);
83
0
  return index;
84
0
#else
85
0
  return static_cast<size_t>(__builtin_ctz(x));
86
0
#endif
87
0
}
Unexecuted instantiation: fields_fuzzer.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: color_encoding_internal.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: color_management.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: dec_ans.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: dec_context_map.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: dec_huffman.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: fields.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: frame_header.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: headers.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: image_metadata.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: jpeg_data.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: loop_filter.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: encoding.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: modular_image.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: transform.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: quantizer.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: aux_out.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: data_parallel.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: dec_ma.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: rct.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
Unexecuted instantiation: squeeze.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<4ul>, unsigned int)
88
static JXL_INLINE JXL_MAYBE_UNUSED size_t
89
3.09k
Num0BitsBelowLS1Bit_Nonzero(SizeTag<8> /* tag */, const uint64_t x) {
90
3.09k
  JXL_DASSERT(x != 0);
91
#if JXL_COMPILER_MSVC
92
#if JXL_ARCH_X64
93
  unsigned long index;
94
  _BitScanForward64(&index, x);
95
  return index;
96
#else   // JXL_ARCH_64
97
  // _BitScanForward64 not available
98
  uint32_t lsb = static_cast<uint32_t>(x & 0xFFFFFFFF);
99
  unsigned long index;
100
  if (lsb == 0) {
101
    uint32_t msb = static_cast<uint32_t>(x >> 32u);
102
    _BitScanForward(&index, msb);
103
    return 32 + index;
104
  } else {
105
    _BitScanForward(&index, lsb);
106
    return index;
107
  }
108
#endif  // JXL_ARCH_X64
109
#else
110
3.09k
  return static_cast<size_t>(__builtin_ctzll(x));
111
3.09k
#endif
112
3.09k
}
Unexecuted instantiation: fields_fuzzer.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: color_encoding_internal.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: color_management.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: dec_ans.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: dec_context_map.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: dec_huffman.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
fields.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Line
Count
Source
89
3.09k
Num0BitsBelowLS1Bit_Nonzero(SizeTag<8> /* tag */, const uint64_t x) {
90
3.09k
  JXL_DASSERT(x != 0);
91
#if JXL_COMPILER_MSVC
92
#if JXL_ARCH_X64
93
  unsigned long index;
94
  _BitScanForward64(&index, x);
95
  return index;
96
#else   // JXL_ARCH_64
97
  // _BitScanForward64 not available
98
  uint32_t lsb = static_cast<uint32_t>(x & 0xFFFFFFFF);
99
  unsigned long index;
100
  if (lsb == 0) {
101
    uint32_t msb = static_cast<uint32_t>(x >> 32u);
102
    _BitScanForward(&index, msb);
103
    return 32 + index;
104
  } else {
105
    _BitScanForward(&index, lsb);
106
    return index;
107
  }
108
#endif  // JXL_ARCH_X64
109
#else
110
3.09k
  return static_cast<size_t>(__builtin_ctzll(x));
111
3.09k
#endif
112
3.09k
}
Unexecuted instantiation: frame_header.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: headers.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: image_metadata.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: jpeg_data.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: loop_filter.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: encoding.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: modular_image.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: transform.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: quantizer.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: aux_out.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: data_parallel.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: dec_ma.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: rct.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
Unexecuted instantiation: squeeze.cc:jxl::Num0BitsBelowLS1Bit_Nonzero(jxl::SizeTag<8ul>, unsigned long)
113
template <typename T>
114
3.09k
static JXL_INLINE JXL_MAYBE_UNUSED size_t Num0BitsBelowLS1Bit_Nonzero(T x) {
115
3.09k
  static_assert(!IsSigned<T>(), "Num0BitsBelowLS1Bit_Nonzero: use unsigned");
116
3.09k
  return Num0BitsBelowLS1Bit_Nonzero(SizeTag<sizeof(T)>(), x);
117
3.09k
}
118
119
// Returns bit width for x == 0.
120
template <typename T>
121
0
static JXL_INLINE JXL_MAYBE_UNUSED size_t Num0BitsAboveMS1Bit(const T x) {
122
0
  return (x == 0) ? sizeof(T) * 8 : Num0BitsAboveMS1Bit_Nonzero(x);
123
0
}
124
125
// Returns bit width for x == 0.
126
template <typename T>
127
static JXL_INLINE JXL_MAYBE_UNUSED size_t Num0BitsBelowLS1Bit(const T x) {
128
  return (x == 0) ? sizeof(T) * 8 : Num0BitsBelowLS1Bit_Nonzero(x);
129
}
130
131
// Returns base-2 logarithm, rounded down.
132
template <typename T>
133
0
static JXL_INLINE JXL_MAYBE_UNUSED size_t FloorLog2Nonzero(const T x) {
134
0
  return (sizeof(T) * 8 - 1) ^ Num0BitsAboveMS1Bit_Nonzero(x);
135
0
}
Unexecuted instantiation: fields_fuzzer.cc:unsigned long jxl::FloorLog2Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: fields_fuzzer.cc:unsigned long jxl::FloorLog2Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: dec_ans.cc:unsigned long jxl::FloorLog2Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: dec_ans.cc:unsigned long jxl::FloorLog2Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: dec_context_map.cc:unsigned long jxl::FloorLog2Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: dec_huffman.cc:unsigned long jxl::FloorLog2Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: encoding.cc:unsigned long jxl::FloorLog2Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: encoding.cc:unsigned long jxl::FloorLog2Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: modular_image.cc:unsigned long jxl::FloorLog2Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: modular_image.cc:unsigned long jxl::FloorLog2Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: transform.cc:unsigned long jxl::FloorLog2Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: transform.cc:unsigned long jxl::FloorLog2Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: dec_ma.cc:unsigned long jxl::FloorLog2Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: rct.cc:unsigned long jxl::FloorLog2Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: rct.cc:unsigned long jxl::FloorLog2Nonzero<unsigned int>(unsigned int)
Unexecuted instantiation: squeeze.cc:unsigned long jxl::FloorLog2Nonzero<unsigned long>(unsigned long)
Unexecuted instantiation: squeeze.cc:unsigned long jxl::FloorLog2Nonzero<unsigned int>(unsigned int)
136
137
// Returns base-2 logarithm, rounded up.
138
template <typename T>
139
0
static JXL_INLINE JXL_MAYBE_UNUSED size_t CeilLog2Nonzero(const T x) {
140
0
  const size_t floor_log2 = FloorLog2Nonzero(x);
141
0
  if ((x & (x - 1)) == 0) return floor_log2;  // power of two
142
0
  return floor_log2 + 1;
143
0
}
144
145
}  // namespace jxl
146
147
#endif  // LIB_JXL_BASE_BITS_H_