fixed.h
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:10k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.  * libmad - MPEG audio decoder library
  3.  */
  4. # ifndef LIBMAD_FIXED_H
  5. # define LIBMAD_FIXED_H
  6. # if SIZEOF_INT >= 4
  7. typedef   signed int mad_fixed_t;
  8. typedef   signed int mad_fixed64hi_t;
  9. typedef unsigned int mad_fixed64lo_t;
  10. # else
  11. typedef   signed long mad_fixed_t;
  12. typedef   signed long mad_fixed64hi_t;
  13. typedef unsigned long mad_fixed64lo_t;
  14. # endif
  15. # if defined(_MSC_VER)
  16. #  define mad_fixed64_t  signed __int64
  17. # elif 1 || defined(__GNUC__)
  18. #  define mad_fixed64_t  signed long long
  19. # endif
  20. # if defined(FPM_FLOAT)
  21. typedef double mad_sample_t;
  22. # else
  23. typedef mad_fixed_t mad_sample_t;
  24. # endif
  25. # define MAD_F_FRACBITS 28
  26. # if MAD_F_FRACBITS == 28
  27. #  define MAD_F(x) ((mad_fixed_t) (x##L))
  28. # else
  29. #  if MAD_F_FRACBITS < 28
  30. #   warning "MAD_F_FRACBITS < 28"
  31. #   define MAD_F(x) ((mad_fixed_t)  
  32.  (((x##L) +  
  33.    (1L << (28 - MAD_F_FRACBITS - 1))) >>  
  34.   (28 - MAD_F_FRACBITS)))
  35. #  elif MAD_F_FRACBITS > 28
  36. #   error "MAD_F_FRACBITS > 28 not currently supported"
  37. #   define MAD_F(x) ((mad_fixed_t)  
  38.  ((x##L) << (MAD_F_FRACBITS - 28)))
  39. #  endif
  40. # endif
  41. # define MAD_F_MIN ((mad_fixed_t) -0x80000000L)
  42. # define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL)
  43. # define MAD_F_ONE MAD_F(0x10000000)
  44. # define mad_f_tofixed(x) ((mad_fixed_t)  
  45.  ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5))
  46. # define mad_f_todouble(x) ((double)  
  47.  ((x) / (double) (1L << MAD_F_FRACBITS)))
  48. # define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS)
  49. # define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1))
  50. # define mad_f_fromint(x) ((x) << MAD_F_FRACBITS)
  51. # define mad_f_add(x, y) ((x) + (y))
  52. # define mad_f_sub(x, y) ((x) - (y))
  53. # if defined(FPM_FLOAT)
  54. #  error "FPM_FLOAT not yet supported"
  55. #  undef MAD_F
  56. #  define MAD_F(x) mad_f_todouble(x)
  57. #  define mad_f_mul(x, y) ((x) * (y))
  58. #  define mad_f_scale64
  59. #  undef ASO_ZEROCHECK
  60. # elif defined(FPM_64BIT)
  61. #  if defined(OPT_ACCURACY)
  62. #   define mad_f_mul(x, y)  
  63.     ((mad_fixed_t)  
  64.      ((((mad_fixed64_t) (x) * (y)) +  
  65.        (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS))
  66. #  else
  67. #   define mad_f_mul(x, y)  
  68.     ((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS))
  69. #  endif
  70. #  define MAD_F_SCALEBITS  MAD_F_FRACBITS
  71. /* --- Intel --------------------------------------------------------------- */
  72. # elif defined(FPM_INTEL)
  73. #  if defined(_MSC_VER)
  74. #   pragma warning(push)
  75. #   pragma warning(disable: 4035)  
  76. static __forceinline 
  77. mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y)
  78. {
  79.   enum {
  80.     fracbits = MAD_F_FRACBITS
  81.   };
  82.   __asm {
  83.     mov eax, x
  84.     imul y
  85.     shrd eax, edx, fracbits
  86.   }
  87. }
  88. #   pragma warning(pop)
  89. #   define mad_f_mul mad_f_mul_inline
  90. #   define mad_f_scale64
  91. #  else
  92. #   define MAD_F_MLX(hi, lo, x, y)  
  93.     asm ("imull %3"  
  94.  : "=a" (lo), "=d" (hi)  
  95.  : "%a" (x), "rm" (y)  
  96.  : "cc")
  97. #   if defined(OPT_ACCURACY)
  98. #    define MAD_F_MLA(hi, lo, x, y)  
  99.     ({ mad_fixed64hi_t __hi;  
  100.        mad_fixed64lo_t __lo;  
  101.        MAD_F_MLX(__hi, __lo, (x), (y));  
  102.        asm ("addl %2,%0nt"  
  103.     "adcl %3,%1"  
  104.     : "=rm" (lo), "=rm" (hi)  
  105.     : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi)  
  106.     : "cc");  
  107.     })
  108. #   endif  
  109. #   if defined(OPT_ACCURACY)
  110. #    define mad_f_scale64(hi, lo)  
  111.     ({ mad_fixed64hi_t __hi_;  
  112.        mad_fixed64lo_t __lo_;  
  113.        mad_fixed_t __result;  
  114.        asm ("addl %4,%2nt"  
  115.     "adcl %5,%3"  
  116.     : "=rm" (__lo_), "=rm" (__hi_)  
  117.     : "0" (lo), "1" (hi),  
  118.       "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0)  
  119.     : "cc");  
  120.        asm ("shrdl %3,%2,%1"  
  121.     : "=rm" (__result)  
  122.     : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS)  
  123.     : "cc");  
  124.        __result;  
  125.     })
  126. #   else
  127. #    define mad_f_scale64(hi, lo)  
  128.     ({ mad_fixed_t __result;  
  129.        asm ("shrdl %3,%2,%1"  
  130.     : "=rm" (__result)  
  131.     : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS)  
  132.     : "cc");  
  133.        __result;  
  134.     })
  135. #   endif  
  136. #   define MAD_F_SCALEBITS  MAD_F_FRACBITS
  137. #  endif
  138. /* --- ARM ----------------------------------------------------------------- */
  139. # elif defined(FPM_ARM)
  140. # if 1
  141. #  define mad_f_mul(x, y)  
  142.     ({ mad_fixed64hi_t __hi;  
  143.        mad_fixed64lo_t __lo;  
  144.        mad_fixed_t __result;  
  145.        asm ("smull %0, %1, %3, %4nt"  
  146.     "movs %0, %0, lsr %5nt"  
  147.     "adc %2, %0, %1, lsl %6"  
  148.     : "=&r" (__lo), "=&r" (__hi), "=r" (__result)  
  149.     : "%r" (x), "r" (y),  
  150.       "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS)  
  151.     : "cc");  
  152.        __result;  
  153.     })
  154. # endif
  155. #  define MAD_F_MLX(hi, lo, x, y)  
  156.     asm ("smull %0, %1, %2, %3"  
  157.  : "=&r" (lo), "=&r" (hi)  
  158.  : "%r" (x), "r" (y))
  159. #  define MAD_F_MLA(hi, lo, x, y)  
  160.     asm ("smlal %0, %1, %2, %3"  
  161.  : "+r" (lo), "+r" (hi)  
  162.  : "%r" (x), "r" (y))
  163. #  define MAD_F_MLN(hi, lo)  
  164.     asm ("rsbs %0, %2, #0nt"  
  165.  "rsc %1, %3, #0"  
  166.  : "=r" (lo), "=r" (hi)  
  167.  : "0" (lo), "1" (hi)  
  168.  : "cc")
  169. #  define mad_f_scale64(hi, lo)  
  170.     ({ mad_fixed_t __result;  
  171.        asm ("movs %0, %1, lsr %3nt"  
  172.     "adc %0, %0, %2, lsl %4"  
  173.     : "=r" (__result)  
  174.     : "r" (lo), "r" (hi),  
  175.       "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS)  
  176.     : "cc");  
  177.        __result;  
  178.     })
  179. #  define MAD_F_SCALEBITS  MAD_F_FRACBITS
  180. /* --- MIPS ---------------------------------------------------------------- */
  181. # elif defined(FPM_MIPS)
  182. #  define MAD_F_MLX(hi, lo, x, y)  
  183.     asm ("mult %2,%3"  
  184.  : "=l" (lo), "=h" (hi)  
  185.  : "%r" (x), "r" (y))
  186. # if defined(HAVE_MADD_ASM)
  187. #  define MAD_F_MLA(hi, lo, x, y)  
  188.     asm ("madd %2,%3"  
  189.  : "+l" (lo), "+h" (hi)  
  190.  : "%r" (x), "r" (y))
  191. # elif defined(HAVE_MADD16_ASM)
  192. #  define MAD_F_ML0(hi, lo, x, y)  
  193.     asm ("mult %2,%3"  
  194.  : "=l" (lo), "=h" (hi)  
  195.  : "%r" ((x) >> 12), "r" ((y) >> 16))
  196. #  define MAD_F_MLA(hi, lo, x, y)  
  197.     asm ("madd16 %2,%3"  
  198.  : "+l" (lo), "+h" (hi)  
  199.  : "%r" ((x) >> 12), "r" ((y) >> 16))
  200. #  define MAD_F_MLZ(hi, lo)  ((mad_fixed_t) (lo))
  201. # endif
  202. # if defined(OPT_SPEED)
  203. #  define mad_f_scale64(hi, lo)  
  204.     ((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS)))
  205. #  define MAD_F_SCALEBITS  MAD_F_FRACBITS
  206. # endif
  207. /* --- SPARC --------------------------------------------------------------- */
  208. # elif defined(FPM_SPARC)
  209. #  define MAD_F_MLX(hi, lo, x, y)  
  210.     asm ("smul %2, %3, %0nt"  
  211.  "rd %%y, %1"  
  212.  : "=r" (lo), "=r" (hi)  
  213.  : "%r" (x), "rI" (y))
  214. /* --- PowerPC ------------------------------------------------------------- */
  215. # elif defined(FPM_PPC)
  216. #  define MAD_F_MLX(hi, lo, x, y)  
  217.     asm ("mulhw %1, %2, %3nt"  
  218.  "mullw %0, %2, %3"  
  219.  : "=&r" (lo), "=&r" (hi)  
  220.  : "%r" (x), "r" (y))
  221. #  define MAD_F_MLA(hi, lo, x, y)  
  222.     ({ mad_fixed64hi_t __hi;  
  223.        mad_fixed64lo_t __lo;  
  224.        MAD_F_MLX(__hi, __lo, (x), (y));  
  225.        asm ("addc %0, %2, %3nt"  
  226.     "adde %1, %4, %5"  
  227.     : "=r" (lo), "=r" (hi)  
  228.     : "%r" (__lo), "0" (lo), "%r" (__hi), "1" (hi));  
  229.     })
  230. #  if defined(OPT_ACCURACY)
  231. #   define mad_f_scale64(hi, lo)  
  232.     ({ mad_fixed_t __result;  
  233.        mad_fixed64hi_t __hi_;  
  234.        mad_fixed64lo_t __lo_;  
  235.        asm __volatile__ ("addc %0, %2, %4nt"  
  236.  "addze %1, %3"  
  237.     : "=r" (__lo_), "=r" (__hi_)  
  238.     : "r" (lo), "r" (hi), "r" (1 << (MAD_F_SCALEBITS - 1)));  
  239.        asm __volatile__ ("rlwinm %0, %2,32-%3,0,%3-1nt"  
  240.  "rlwimi %0, %1,32-%3,%3,31"  
  241.     : "=&r" (__result)  
  242.     : "r" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS));  
  243.     __result;  
  244.     })
  245. #  else
  246. #   define mad_f_scale64(hi, lo)  
  247.     ({ mad_fixed_t __result;  
  248.        asm ("rlwinm %0, %2,32-%3,0,%3-1nt"  
  249.     "rlwimi %0, %1,32-%3,%3,31"  
  250.     : "=r" (__result)  
  251.     : "r" (lo), "r" (hi), "I" (MAD_F_SCALEBITS));  
  252.     __result;  
  253.     })
  254. #  endif  
  255. #  define MAD_F_SCALEBITS  MAD_F_FRACBITS
  256. /* --- Default ------------------------------------------------------------- */
  257. # elif defined(FPM_DEFAULT)
  258. #  if defined(OPT_SPEED)
  259. #   define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16))
  260. #  else
  261. #   define mad_f_mul(x, y) ((((x) + (1L << 11)) >> 12) *  
  262.  (((y) + (1L << 15)) >> 16))
  263. #  endif
  264. /* ------------------------------------------------------------------------- */
  265. # else
  266. #  error "no FPM selected"
  267. # endif
  268. # if !defined(mad_f_mul)
  269. #  define mad_f_mul(x, y)  
  270.     ({ mad_fixed64hi_t __hi;  
  271.        mad_fixed64lo_t __lo;  
  272.        MAD_F_MLX(__hi, __lo, (x), (y));  
  273.        mad_f_scale64(__hi, __lo);  
  274.     })
  275. # endif
  276. # if !defined(MAD_F_MLA)
  277. #  define MAD_F_ML0(hi, lo, x, y) ((lo)  = mad_f_mul((x), (y)))
  278. #  define MAD_F_MLA(hi, lo, x, y) ((lo) += mad_f_mul((x), (y)))
  279. #  define MAD_F_MLN(hi, lo) ((lo)  = -(lo))
  280. #  define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo))
  281. # endif
  282. # if !defined(MAD_F_ML0)
  283. #  define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y))
  284. # endif
  285. # if !defined(MAD_F_MLN)
  286. #  define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi))
  287. # endif
  288. # if !defined(MAD_F_MLZ)
  289. #  define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo))
  290. # endif
  291. # if !defined(mad_f_scale64)
  292. #  if defined(OPT_ACCURACY)
  293. #   define mad_f_scale64(hi, lo)  
  294.     ((((mad_fixed_t)  
  295.        (((hi) << (32 - (MAD_F_SCALEBITS - 1))) |  
  296. ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1)
  297. #  else
  298. #   define mad_f_scale64(hi, lo)  
  299.     ((mad_fixed_t)  
  300.      (((hi) << (32 - MAD_F_SCALEBITS)) |  
  301.       ((lo) >> MAD_F_SCALEBITS)))
  302. #  endif
  303. #  define MAD_F_SCALEBITS  MAD_F_FRACBITS
  304. # endif
  305. mad_fixed_t mad_f_abs(mad_fixed_t);
  306. # endif