media/libvorbis/lib/os.h

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/media/libvorbis/lib/os.h	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,190 @@
     1.4 +#ifndef _OS_H
     1.5 +#define _OS_H
     1.6 +/********************************************************************
     1.7 + *                                                                  *
     1.8 + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
     1.9 + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
    1.10 + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
    1.11 + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
    1.12 + *                                                                  *
    1.13 + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009             *
    1.14 + * by the Xiph.Org Foundation http://www.xiph.org/                  *
    1.15 + *                                                                  *
    1.16 + ********************************************************************
    1.17 +
    1.18 + function: #ifdef jail to whip a few platforms into the UNIX ideal.
    1.19 + last mod: $Id: os.h 19031 2013-12-03 19:20:50Z tterribe $
    1.20 +
    1.21 + ********************************************************************/
    1.22 +
    1.23 +#ifdef HAVE_CONFIG_H
    1.24 +#include "config.h"
    1.25 +#endif
    1.26 +
    1.27 +#include <math.h>
    1.28 +#include <ogg/os_types.h>
    1.29 +
    1.30 +#include "misc.h"
    1.31 +
    1.32 +#ifndef _V_IFDEFJAIL_H_
    1.33 +#  define _V_IFDEFJAIL_H_
    1.34 +
    1.35 +#  ifdef __GNUC__
    1.36 +#    define STIN static __inline__
    1.37 +#  elif _WIN32
    1.38 +#    define STIN static __inline
    1.39 +#  else
    1.40 +#    define STIN static
    1.41 +#  endif
    1.42 +
    1.43 +#ifdef DJGPP
    1.44 +#  define rint(x)   (floor((x)+0.5f))
    1.45 +#endif
    1.46 +
    1.47 +#ifndef M_PI
    1.48 +#  define M_PI (3.1415926536f)
    1.49 +#endif
    1.50 +
    1.51 +#if defined(_WIN32) && !defined(__SYMBIAN32__)
    1.52 +#  include <malloc.h>
    1.53 +#  define rint(x)   (floor((x)+0.5f))
    1.54 +#  define NO_FLOAT_MATH_LIB
    1.55 +#  define FAST_HYPOT(a, b) sqrt((a)*(a) + (b)*(b))
    1.56 +#endif
    1.57 +
    1.58 +#if defined(__SYMBIAN32__) && defined(__WINS__)
    1.59 +void *_alloca(size_t size);
    1.60 +#  define alloca _alloca
    1.61 +#endif
    1.62 +
    1.63 +#ifndef FAST_HYPOT
    1.64 +#  define FAST_HYPOT hypot
    1.65 +#endif
    1.66 +
    1.67 +#endif
    1.68 +
    1.69 +#ifdef HAVE_ALLOCA_H
    1.70 +#  include <alloca.h>
    1.71 +#endif
    1.72 +
    1.73 +#ifdef USE_MEMORY_H
    1.74 +#  include <memory.h>
    1.75 +#endif
    1.76 +
    1.77 +#ifndef min
    1.78 +#  define min(x,y)  ((x)>(y)?(y):(x))
    1.79 +#endif
    1.80 +
    1.81 +#ifndef max
    1.82 +#  define max(x,y)  ((x)<(y)?(y):(x))
    1.83 +#endif
    1.84 +
    1.85 +
    1.86 +/* Special i386 GCC implementation */
    1.87 +#if defined(__i386__) && defined(__GNUC__) && !defined(__BEOS__)
    1.88 +#  define VORBIS_FPU_CONTROL
    1.89 +/* both GCC and MSVC are kinda stupid about rounding/casting to int.
    1.90 +   Because of encapsulation constraints (GCC can't see inside the asm
    1.91 +   block and so we end up doing stupid things like a store/load that
    1.92 +   is collectively a noop), we do it this way */
    1.93 +
    1.94 +/* we must set up the fpu before this works!! */
    1.95 +
    1.96 +typedef ogg_int16_t vorbis_fpu_control;
    1.97 +
    1.98 +static inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){
    1.99 +  ogg_int16_t ret;
   1.100 +  ogg_int16_t temp;
   1.101 +  __asm__ __volatile__("fnstcw %0\n\t"
   1.102 +          "movw %0,%%dx\n\t"
   1.103 +          "andw $62463,%%dx\n\t"
   1.104 +          "movw %%dx,%1\n\t"
   1.105 +          "fldcw %1\n\t":"=m"(ret):"m"(temp): "dx");
   1.106 +  *fpu=ret;
   1.107 +}
   1.108 +
   1.109 +static inline void vorbis_fpu_restore(vorbis_fpu_control fpu){
   1.110 +  __asm__ __volatile__("fldcw %0":: "m"(fpu));
   1.111 +}
   1.112 +
   1.113 +/* assumes the FPU is in round mode! */
   1.114 +static inline int vorbis_ftoi(double f){  /* yes, double!  Otherwise,
   1.115 +                                             we get extra fst/fld to
   1.116 +                                             truncate precision */
   1.117 +  int i;
   1.118 +  __asm__("fistl %0": "=m"(i) : "t"(f));
   1.119 +  return(i);
   1.120 +}
   1.121 +#endif /* Special i386 GCC implementation */
   1.122 +
   1.123 +
   1.124 +/* MSVC inline assembly. 32 bit only; inline ASM isn't implemented in the
   1.125 + * 64 bit compiler */
   1.126 +#if defined(_MSC_VER) && !defined(_WIN64) && !defined(_WIN32_WCE)
   1.127 +#  define VORBIS_FPU_CONTROL
   1.128 +
   1.129 +typedef ogg_int16_t vorbis_fpu_control;
   1.130 +
   1.131 +static __inline int vorbis_ftoi(double f){
   1.132 +        int i;
   1.133 +        __asm{
   1.134 +                fld f
   1.135 +                fistp i
   1.136 +        }
   1.137 +        return i;
   1.138 +}
   1.139 +
   1.140 +static __inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){
   1.141 +  (void)fpu;
   1.142 +}
   1.143 +
   1.144 +static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){
   1.145 +  (void)fpu;
   1.146 +}
   1.147 +
   1.148 +#endif /* Special MSVC 32 bit implementation */
   1.149 +
   1.150 +
   1.151 +/* Optimized code path for x86_64 builds. Uses SSE2 intrinsics. This can be
   1.152 +   done safely because all x86_64 CPUs supports SSE2. */
   1.153 +#if (defined(_MSC_VER) && defined(_WIN64)) || (defined(__GNUC__) && defined (__x86_64__))
   1.154 +#  define VORBIS_FPU_CONTROL
   1.155 +
   1.156 +typedef ogg_int16_t vorbis_fpu_control;
   1.157 +
   1.158 +#include <emmintrin.h>
   1.159 +static __inline int vorbis_ftoi(double f){
   1.160 +        return _mm_cvtsd_si32(_mm_load_sd(&f));
   1.161 +}
   1.162 +
   1.163 +static __inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){
   1.164 +  (void)fpu;
   1.165 +}
   1.166 +
   1.167 +static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){
   1.168 +  (void)fpu;
   1.169 +}
   1.170 +
   1.171 +#endif /* Special MSVC x64 implementation */
   1.172 +
   1.173 +
   1.174 +/* If no special implementation was found for the current compiler / platform,
   1.175 +   use the default implementation here: */
   1.176 +#ifndef VORBIS_FPU_CONTROL
   1.177 +
   1.178 +typedef int vorbis_fpu_control;
   1.179 +
   1.180 +static int vorbis_ftoi(double f){
   1.181 +        /* Note: MSVC and GCC (at least on some systems) round towards zero, thus,
   1.182 +           the floor() call is required to ensure correct roudning of
   1.183 +           negative numbers */
   1.184 +        return (int)floor(f+.5);
   1.185 +}
   1.186 +
   1.187 +/* We don't have special code for this compiler/arch, so do it the slow way */
   1.188 +#  define vorbis_fpu_setround(vorbis_fpu_control) {}
   1.189 +#  define vorbis_fpu_restore(vorbis_fpu_control) {}
   1.190 +
   1.191 +#endif /* default implementation */
   1.192 +
   1.193 +#endif /* _OS_H */

mercurial