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#endif 32#if ARCH_X86 33# include "x86/intmath.h" 34#endif 35 36#if HAVE_FAST_CLZ 37#if AV_GCC_VERSION_AT_LEAST(3,4) 38#ifndef ff_log2 39# define ff_log2(x) (31 - __builtin_clz((x)|1)) 40# ifndef ff_log2_16bit 41# define ff_log2_16bit av_log2 42# endif 43#endif /* ff_log2 */ 44#endif /* AV_GCC_VERSION_AT_LEAST(3,4) */ 45#endif 46 47extern const uint8_t ff_log2_tab[256]; 48 49#ifndef ff_log2 50#define ff_log2 ff_log2_c 51static av_always_inline av_const int ff_log2_c(unsigned int v) 52{ 53 int n = 0; 54 if (v & 0xffff0000) { 55 v >>= 16; 56 n += 16; 57 } 58 if (v & 0xff00) { 59 v >>= 8; 60 n += 8; 61 } 62 n += ff_log2_tab[v]; 63 64 return n; 65} 66#endif 67 68#ifndef ff_log2_16bit 69#define ff_log2_16bit ff_log2_16bit_c 70static av_always_inline av_const int ff_log2_16bit_c(unsigned int v) 71{ 72 int n = 0; 73 if (v & 0xff00) { 74 v >>= 8; 75 n += 8; 76 } 77 n += ff_log2_tab[v]; 78 79 return n; 80} 81#endif 82 83#define av_log2 ff_log2 84#define av_log2_16bit ff_log2_16bit 85 86/** 87 * @addtogroup lavu_math 88 * @{ 89 */ 90 91#if HAVE_FAST_CLZ 92#if AV_GCC_VERSION_AT_LEAST(3,4) 93#ifndef ff_ctz 94#define ff_ctz(v) __builtin_ctz(v) 95#endif 96#ifndef ff_ctzll 97#define ff_ctzll(v) __builtin_ctzll(v) 98#endif 99#ifndef ff_clz 100#define ff_clz(v) __builtin_clz(v) 101#endif 102#endif 103#endif 104 105#ifndef ff_ctz 106#define ff_ctz ff_ctz_c 107/** 108 * Trailing zero bit count. 109 * 110 * @param v input value. If v is 0, the result is undefined. 111 * @return the number of trailing 0-bits 112 */ 113/* We use the De-Bruijn method outlined in: 114 * http://supertech.csail.mit.edu/papers/debruijn.pdf. */ 115static av_always_inline av_const int ff_ctz_c(int v) 116{ 117 static const uint8_t debruijn_ctz32[32] = { 118 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 119 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9 120 }; 121 return debruijn_ctz32[(uint32_t)((v & -v) * 0x077CB531U) >> 27]; 122} 123#endif 124 125#ifndef ff_ctzll 126#define ff_ctzll ff_ctzll_c 127/* We use the De-Bruijn method outlined in: 128 * http://supertech.csail.mit.edu/papers/debruijn.pdf. */ 129static av_always_inline av_const int ff_ctzll_c(long long v) 130{ 131 static const uint8_t debruijn_ctz64[64] = { 132 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28, 133 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11, 134 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10, 135 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12 136 }; 137 return debruijn_ctz64[(uint64_t)((v & -v) * 0x022FDD63CC95386DU) >> 58]; 138} 139#endif 140 141#ifndef ff_clz 142#define ff_clz ff_clz_c 143static av_always_inline av_const unsigned ff_clz_c(unsigned x) 144{ 145 unsigned i = sizeof(x) * 8; 146 147 while (x) { 148 x >>= 1; 149 i--; 150 } 151 152 return i; 153} 154#endif 155 156#if AV_GCC_VERSION_AT_LEAST(3,4) 157#ifndef av_parity 158#define av_parity __builtin_parity 159#endif 160#endif 161 162/** 163 * @} 164 */ 165#endif /* AVUTIL_INTMATH_H */ 166