intmath.h (3897B)
1 /* 2 * Copyright (c) 2010 Mans Rullgard <mans@mansr.com> 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21 #ifndef AVUTIL_INTMATH_H 22 #define AVUTIL_INTMATH_H 23 24 #include <stdint.h> 25 26 #include "config.h" 27 #include "attributes.h" 28 29 #if ARCH_ARM 30 # include "arm/intmath.h" 31 #elif ARCH_RISCV 32 # include "riscv/intmath.h" 33 #elif ARCH_X86 34 # include "x86/intmath.h" 35 #endif 36 37 #if HAVE_FAST_CLZ 38 #if AV_GCC_VERSION_AT_LEAST(3,4) 39 #ifndef ff_log2 40 # define ff_log2(x) (31 - __builtin_clz((x)|1)) 41 # ifndef ff_log2_16bit 42 # define ff_log2_16bit av_log2 43 # endif 44 #endif /* ff_log2 */ 45 #endif /* AV_GCC_VERSION_AT_LEAST(3,4) */ 46 #endif 47 48 extern const uint8_t ff_log2_tab[256]; 49 50 #ifndef ff_log2 51 #define ff_log2 ff_log2_c 52 static av_always_inline av_const int ff_log2_c(unsigned int v) 53 { 54 int n = 0; 55 if (v & 0xffff0000) { 56 v >>= 16; 57 n += 16; 58 } 59 if (v & 0xff00) { 60 v >>= 8; 61 n += 8; 62 } 63 n += ff_log2_tab[v]; 64 65 return n; 66 } 67 #endif 68 69 #ifndef ff_log2_16bit 70 #define ff_log2_16bit ff_log2_16bit_c 71 static av_always_inline av_const int ff_log2_16bit_c(unsigned int v) 72 { 73 int n = 0; 74 if (v & 0xff00) { 75 v >>= 8; 76 n += 8; 77 } 78 n += ff_log2_tab[v]; 79 80 return n; 81 } 82 #endif 83 84 #define av_log2 ff_log2 85 #define av_log2_16bit ff_log2_16bit 86 87 /** 88 * @addtogroup lavu_math 89 * @{ 90 */ 91 92 #if HAVE_FAST_CLZ 93 #if AV_GCC_VERSION_AT_LEAST(3,4) 94 #ifndef ff_ctz 95 #define ff_ctz(v) __builtin_ctz(v) 96 #endif 97 #ifndef ff_ctzll 98 #define ff_ctzll(v) __builtin_ctzll(v) 99 #endif 100 #ifndef ff_clz 101 #define ff_clz(v) __builtin_clz(v) 102 #endif 103 #endif 104 #endif 105 106 #ifndef ff_ctz 107 #define ff_ctz ff_ctz_c 108 /** 109 * Trailing zero bit count. 110 * 111 * @param v input value. If v is 0, the result is undefined. 112 * @return the number of trailing 0-bits 113 */ 114 /* We use the De-Bruijn method outlined in: 115 * http://supertech.csail.mit.edu/papers/debruijn.pdf. */ 116 static av_always_inline av_const int ff_ctz_c(int v) 117 { 118 static const uint8_t debruijn_ctz32[32] = { 119 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 120 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9 121 }; 122 return debruijn_ctz32[(uint32_t)((v & -(uint32_t)v) * 0x077CB531U) >> 27]; 123 } 124 #endif 125 126 #ifndef ff_ctzll 127 #define ff_ctzll ff_ctzll_c 128 /* We use the De-Bruijn method outlined in: 129 * http://supertech.csail.mit.edu/papers/debruijn.pdf. */ 130 static av_always_inline av_const int ff_ctzll_c(long long v) 131 { 132 static const uint8_t debruijn_ctz64[64] = { 133 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28, 134 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11, 135 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10, 136 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12 137 }; 138 return debruijn_ctz64[(uint64_t)((v & -(uint64_t)v) * 0x022FDD63CC95386DU) >> 58]; 139 } 140 #endif 141 142 #ifndef ff_clz 143 #define ff_clz ff_clz_c 144 static av_always_inline av_const unsigned ff_clz_c(unsigned x) 145 { 146 unsigned i = sizeof(x) * 8; 147 148 while (x) { 149 x >>= 1; 150 i--; 151 } 152 153 return i; 154 } 155 #endif 156 157 #if AV_GCC_VERSION_AT_LEAST(3,4) 158 #ifndef av_parity 159 #define av_parity __builtin_parity 160 #endif 161 #endif 162 163 /** 164 * @} 165 */ 166 #endif /* AVUTIL_INTMATH_H */