/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_ |