47 #include <sphinxbase/sphinxbase_export.h>
59 #define DEFAULT_RADIX 12
63 typedef int32 fixed32;
66 #define FLOAT2FIX_ANY(x,radix) \
68 ((fixed32)((x)*(float32)(1<<(radix)) - 0.5)) \
69 : ((fixed32)((x)*(float32)(1<<(radix)) + 0.5)))
70 #define FLOAT2FIX(x) FLOAT2FIX_ANY(x,DEFAULT_RADIX)
72 #define FIX2FLOAT_ANY(x,radix) ((float32)(x)/(1<<(radix)))
73 #define FIX2FLOAT(x) FIX2FLOAT_ANY(x,DEFAULT_RADIX)
82 #if defined(__arm__) && !defined(__thumb__)
88 #define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX)
89 #define FIXMUL_ANY(a,b,r) ({ \
90 int cl, ch, _a = a, _b = b; \
91 __asm__ ("smull %0, %1, %2, %3\n" \
92 "mov %0, %0, lsr %4\n" \
93 "orr %0, %0, %1, lsl %5\n" \
94 : "=&r" (cl), "=&r" (ch) \
95 : "r" (_a), "r" (_b), "i" (r), "i" (32-(r)));\
98 #elif defined(_MSC_VER) || (defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == 8)
100 #define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX)
101 #define FIXMUL_ANY(a,b,radix) ((fixed32)(((int64)(a)*(b))>>(radix)))
105 #define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX)
106 #define FIXMUL_ANY(a,b,radix) ({ \
108 uint32 _al, _bl, _t, c; \
109 _ah = ((int32)(a)) >> 16; \
110 _bh = ((int32)(b)) >> 16; \
111 _al = ((uint32)(a)) & 0xffff; \
112 _bl = ((uint32)(b)) & 0xffff; \
113 _t = _ah * _bl + _al * _bh; \
114 c = (fixed32)(((_al * _bl) >> (radix)) \
115 + ((_ah * _bh) << (32 - (radix))) \
116 + ((radix) > 16 ? (_t >> (radix - 16)) : (_t << (16 - radix)))); \
122 #define MIN_FIXLOG -2829416
123 #define MIN_FIXLOG2 -4081985
125 #define FIXLN_2 ((fixed32)(0.693147180559945 * (1<<DEFAULT_RADIX)))
127 #define FIXLN(x) (fixlog(x) - (FIXLN_2 * DEFAULT_RADIX))
133 int32 fixlog(uint32 x);
138 int32 fixlog2(uint32 x);
Basic type definitions used in Sphinx.