#ifndef _SH_DOWN_INL_ #define _SH_DOWN_INL_ #include #include "fronttyp.h" #include "setting.h" #define SHIFT_DOWN(X,S) ((S) > 0 ? shift_down_inline ((X), (S)) : (X)) #define SHIFT_UP(X,S) ((S) > 0 ? shift_up_inline ((X), (S)) : (X)) #if FIXEDPOINT #define COND_SHIFT_DOWN(X,S) (SHIFT_DOWN(X,S)) #define COND_SHIFT_UP(X,S) (SHIFT_UP(X,S)) #else #define COND_SHIFT_DOWN(X,S) (X) #define COND_SHIFT_UP(X,S) (X) #endif /* #define SHIFT_DOWN shift_down_inline #define SHIFT_UP shift_up_inline */ static inline int fixed_point_convert (float xx, int shift); static inline int shift_up_inline (int value, unsigned int shift); static inline int shift_down_inline (int value, unsigned int shift); static inline int fixed_round (float value); #define TRUNCATE_ON_SHIFT 1 static inline int shift_up_inline (int value, unsigned int shift) { /* Shift up using bit operations with max limit */ int temp, retval; ASSERT (shift > 0); if (value>0) temp=value; else temp=-value; #if FIXED_POINT_FRONTEND || FIXEDPOINT #if EMULATED_FIXED_POINT_FRONTEND #if TRUNCATE_ON_SHIFT retval = (int) (long)(temp*(0x01< (int)LONG_MAX) || (retval0) return retval; else return (-retval); } static inline int shift_down_inline (int value, unsigned int shift) /* Shift down using bit operations with rounding */ { #if FIXED_POINT_FRONTEND || FIXEDPOINT #if EMULATED_FIXED_POINT_FRONTEND ASSERT (shift > 0); #if TRUNCATE_ON_SHIFT return ((int) (long)(value/(float)(0x01 << shift) + 0.5)); #else return ((int) (long)(value/pow(2,shift) + 0.5)); #endif #else if (shift-- == 0) return (value); if (value >= 0) return (((value >> shift) + 1) >> 1); else return (-((((-value) >> shift) + 1) >> 1)); #endif #else return ((int) (value/pow((double) 2.0, (int)shift))); #endif } static inline int fixed_point_convert (float xx, int shift) { float scaled_val; ASSERT (shift >= 0); scaled_val= xx * (0x01 << shift); if (scaled_val >= 0) if (scaled_val > LONG_MAX) return (LONG_MAX); else return ((int)(scaled_val + 0.5)); else if (scaled_val < -LONG_MAX) return (-LONG_MAX); else return ((int)(scaled_val - 0.5)); } static inline int fixed_round (float value) { if (value > 0) return ((int)(value + 0.5)); else return ((int)(value - 0.5)); } #endif