# define PIC
#endif
+#include "config.h"
#include "intreadwrite.h"
#include "bswap.h"
#endif
// Use rip-relative addressing if compiling PIC code on x86-64.
-#if defined(__MINGW32__) || defined(__CYGWIN__) || defined(__DJGPP__) || \
- defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__))
-# if defined(ARCH_X86_64) && defined(PIC)
-# define MANGLE(a) "_" #a"(%%rip)"
-# else
-# define MANGLE(a) "_" #a
-# endif
+#if defined(ARCH_X86_64) && defined(PIC)
+# define LOCAL_MANGLE(a) #a "(%%rip)"
#else
-# if defined(ARCH_X86_64) && defined(PIC)
-# define MANGLE(a) #a"(%%rip)"
-# elif defined(__APPLE__)
-# define MANGLE(a) "_" #a
-# else
-# define MANGLE(a) #a
-# endif
+# define LOCAL_MANGLE(a) #a
#endif
+#define MANGLE(a) EXTERN_PREFIX LOCAL_MANGLE(a)
+
/* debug stuff */
/* dprintf macros */
# define FASTDIV(a,b) ((a)/(b))
#endif
-extern const uint8_t ff_sqrt_tab[128];
+extern const uint8_t ff_sqrt_tab[256];
-static inline int ff_sqrt(int a)
+static inline int av_log2_16bit(unsigned int v);
+
+static inline av_const unsigned int ff_sqrt(unsigned int a)
{
- int ret=0;
- int s, b;
-
- if(a<128) return ff_sqrt_tab[a];
-
- for(s=30; s>=0; s-=2){
- ret+=ret;
- b= (1+2*ret)<<s;
- if(b<=a){
- a-=b;
- ret++;
- }
+ unsigned int b;
+
+ if(a<255) return (ff_sqrt_tab[a+1]-1)>>4;
+ else if(a<(1<<12)) b= ff_sqrt_tab[a>>4 ]>>2;
+#ifndef CONFIG_SMALL
+ else if(a<(1<<14)) b= ff_sqrt_tab[a>>6 ]>>1;
+ else if(a<(1<<16)) b= ff_sqrt_tab[a>>8 ] ;
+#endif
+ else{
+ int s= av_log2_16bit(a>>16)>>1;
+ unsigned int c= a>>(s+2);
+ b= ff_sqrt_tab[c>>(s+8)];
+ b= FASTDIV(c,b) + (b<<s);
}
- return ret;
+
+ return b - (a<b*b);
}
#if defined(ARCH_X86)
#define MASK_ABS(mask, level)\
asm volatile(\
- "cdq \n\t"\
+ "cltd \n\t"\
"xorl %1, %0 \n\t"\
"subl %1, %0 \n\t"\
: "+a" (level), "=&d" (mask)\
}
#ifndef HAVE_LLRINT
-static av_always_inline long long llrint(double x)
+static av_always_inline av_const long long llrint(double x)
{
return rint(x);
}
#endif /* HAVE_LLRINT */
#ifndef HAVE_LRINT
-static av_always_inline long int lrint(double x)
+static av_always_inline av_const long int lrint(double x)
{
return rint(x);
}
#endif /* HAVE_LRINT */
#ifndef HAVE_LRINTF
-static av_always_inline long int lrintf(float x)
+static av_always_inline av_const long int lrintf(float x)
{
return (int)(rint(x));
}
#endif /* HAVE_LRINTF */
#ifndef HAVE_ROUND
-static av_always_inline double round(double x)
+static av_always_inline av_const double round(double x)
{
return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
}
#endif /* HAVE_ROUND */
#ifndef HAVE_ROUNDF
-static av_always_inline float roundf(float x)
+static av_always_inline av_const float roundf(float x)
{
return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
}