fixed.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:6k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************  *  * This program is free software ; you can redistribute it and/or modify  * it under the terms of the GNU General Public License as published by  * the Free Software Foundation; either version 2 of the License, or  * (at your option) any later version.  *  * This program is distributed in the hope that it will be useful,  * but WITHOUT ANY WARRANTY; without even the implied warranty of  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  * GNU General Public License for more details.  *  * You should have received a copy of the GNU General Public License  * along with this program; if not, write to the Free Software  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  *  * $Id: fixed.h 271 2005-08-09 08:31:35Z picard $  *  * The Core Pocket Media Player  * Copyright (c) 2004-2005 Gabor Kovacs  *  ****************************************************************************/ #ifndef __FIXED_H #define __FIXED_H // general fixed point range (-16..16)
  2. #define FIX_FRACBITS 27
  3. // additional fast acc output range limitation (-2..2) #define ACCFAST_ADJ 3
  4. // additional fast mul b range limitation (-16..16)
  5. #define FIXFAST_ADJ 0
  6. // very bad approx when there is no support for fix_mul (32x32=64)
  7. #define FIX_MUL_ADJ 3
  8. #ifdef FIXED_POINT // fixed point #define FIX_SHIFT_A (FIX_FRACBITS-FIX_FRACBITS/2)
  9. #define FIX_SHIFT_B (FIX_FRACBITS/2)
  10. typedef int32_t fix_t; typedef fix_t fixint_t; #define FIXC(v) ((fix_t)((v)*(1<<FIX_FRACBITS)+((v)>=0?0.5:-0.5))) #define FIXI(v) (v)
  11. #if FIX_FRACBITS<28
  12. #define FIX28(v) RSHIFT_ROUND(v,28-FIX_FRACBITS)
  13. #else #define FIX28(v) (v)
  14. #endif
  15. #define ACCFAST_ASHIFT(a,n) RSHIFT_ROUND(a,FIX_SHIFT_A-ACCFAST_ADJ+(n))
  16. #define ACCFAST_BSHIFT(b) RSHIFT_ROUND(b,FIX_SHIFT_B)
  17. #define accfast_var(name) int32_t name
  18. #define accfast_mul(name,a,b) (name) = (a)*(b) #define accfast_mla(name,a,b) (name) += (a)*(b) #define accfast_neg(name) (name) = -(name) #define accfast_get(name,n) ((fix_t)((name)>>(ACCFAST_ADJ-(n))))
  19. #if defined(_MSC_VER) && defined(MIPS)
  20. #define FIXFAST_BSHIFT(b) ((b)<<FIXFAST_ADJ)
  21. #define fixfast_mul(a,b) ((fix_t)(__emul(a,b)>>32) << (32-FIXFAST_ADJ-FIX_FRACBITS))
  22. #define fix_mul(a,b) ((fix_t)(__emul(a,b)>>FIX_FRACBITS))
  23. #define fix_mul64(a,b) ((fix_t)(__emul(a,b)>>FIX_FRACBITS))
  24. #endif
  25. #if defined(_MSC_VER) && defined(_M_IX86)
  26. #if 0
  27. // emulate ARM (just for testing)
  28. #define acc_var(name) int64_t name
  29. #define acc_mul(name,a,b) (name) = (int64_t)(a)*(int64_t)(b)
  30. #define acc_mla(name,a,b) (name) += (int64_t)(a)*(int64_t)(b)
  31. #define acc_neg(name) (name) = -(name);
  32. #define acc_get(name) ((fix_t)((name) >> FIX_FRACBITS))
  33. #define FIXFAST_BSHIFT(b) ((b)<<FIXFAST_ADJ)
  34. #define fixfast_mul(a,b) ((fix_t)((((int64_t)(a)*(int64_t)(b)) >> 32) << (32-FIXFAST_ADJ-FIX_FRACBITS)))
  35. #endif
  36. #define fix_mul(a,b) _fix_mul(a,b) #define fix_mul64(a,b) _fix_mul(a,b) static INLINE fix_t _fix_mul(fix_t a,fix_t b) { __asm  { mov eax,a imul b shrd eax, edx, FIX_FRACBITS } } #endif #if defined(__GNUC__) && defined(ARM)
  37. #define acc_lo(name) lo##name
  38. #define acc_hi(name) hi##name
  39. #define acc_var(name) int32_t acc_lo(name),acc_hi(name)
  40. #define acc_mul(name,a,b) asm( "smull %0, %1, %2, %3" : "=&r" (acc_lo(name)), "=&r" (acc_hi(name)) : "%r" (a), "r" (b)) #define acc_mla(name,a,b) asm( "smlal %0, %1, %2, %3" : "+r" (acc_lo(name)), "+r" (acc_hi(name)) : "%r" (a), "r" (b)) #define acc_neg(name) asm ("rsbs %0, %2, #0;n" 
  41.      "rsc %1, %3, #0" : "=r" (acc_lo(name)), "=r" (acc_hi(name)) : "r" (acc_lo(name)), "r" (acc_hi(name)) : "cc")
  42. #define acc_get(name) ((fix_t)(((uint32_t)(acc_lo(name)) >> FIX_FRACBITS)|((acc_hi(name)) << (32-FIX_FRACBITS))))
  43. #endif #if defined(acc_hi) #ifndef fixfast_mul
  44. #define FIXFAST_BSHIFT(b) ((b)<<FIXFAST_ADJ) #define fixfast_mul(a,b) ({ acc_var(_tmp); acc_mul(_tmp,(a),(b)); acc_hi(_tmp) << (32-FIXFAST_ADJ-FIX_FRACBITS); }) #endif #ifndef fix_mul #define fix_mul(a,b) ({ acc_var(_tmp); acc_mul(_tmp,(a),(b)); acc_get(_tmp); }) #endif #ifndef fix_mul64 #define fix_mul64(a,b) ({ acc_var(_tmp); acc_mul(_tmp,(a),(b)); acc_get(_tmp); }) #endif #else #ifndef fixfast_mul #ifdef fix_mul #define FIXFAST_BSHIFT(b) (b) #define fixfast_mul(a,b) fix_mul(a,b) #else #define FIXFAST_BSHIFT(b) RSHIFT_ROUND(b,FIX_SHIFT_B+FIX_MUL_ADJ) #define fixfast_mul(a,b) (((a)>>(FIX_SHIFT_A-FIX_MUL_ADJ))*(b)) #endif #endif
  45. #ifndef fix_mul #define fix_mul(a,b) (((a)>>(FIX_SHIFT_A-FIX_MUL_ADJ))*((b)>>(FIX_SHIFT_B+FIX_MUL_ADJ))) #endif #ifndef fix_mul64 #define fix_mul64(a,b) ((fix_t)(((int64_t)(a)*(int64_t)(b))>>FIX_FRACBITS)) #endif
  46. #endif
  47. #ifndef fix_1div
  48. #define fix_1div(a) ((fix_t)((((int64_t)1)<<(FIX_FRACBITS*2))/(a)))
  49. #endif
  50. #define checkfix(a) assert((a)>-0x60000000 && (a)<0x60000000); #else // floating point typedef float fix_t; typedef int32_t fixint_t; // have to be same size as fix_t typedef float acclo_t; typedef int acchi_t; #define FIXC(v) ((fix_t)(v)) #define FIXI(v) ((int32_t)((v)*(1<<FIX_FRACBITS)))
  51. #define FIX28(v) ((fix_t)(v)/(1<<28)) #define fix_mul(a,b) ((a)*(b)) #define fix_1div(a) (1.0f/(a)) #define ACCFAST_ASHIFT(a,n) (a) #define ACCFAST_BSHIFT(b) (b)
  52. #define accfast_var(name) acc_var(name) #define accfast_mul(name,a,b) acc_mul(name,a,b) #define accfast_mla(name,a,b) acc_mla(name,a,b) #define accfast_neg(name) acc_neg(name) #define accfast_get(name,n) acc_get(name) #define FIXFAST_BSHIFT(b) (b) #define fixfast_mul(a,b) fix_mul(a,b) #define checkfix(a) #endif
  53. #ifndef acc_mul
  54. #define acc_var(name) fix_t name
  55. #define acc_mul(name,a,b) name = fix_mul(a,b)
  56. #define acc_mla(name,a,b) name += fix_mul(a,b)
  57. #define acc_neg(name) name = -name
  58. #define acc_get(name) name
  59. #endif
  60. #endif