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)
88 #if defined(__arm__) && !defined(__thumb__)
89 #define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX)
90 #define FIXMUL_ANY(a,b,r) ({ \
91 int cl, ch, _a = a, _b = b; \
92 __asm__ ("smull %0, %1, %2, %3\n" \
93 "mov %0, %0, lsr %4\n" \
94 "orr %0, %0, %1, lsl %5\n" \
95 : "=&r" (cl), "=&r" (ch) \
96 : "r" (_a), "r" (_b), "i" (r), "i" (32-(r)));\
98 #elif defined(BFIN) && DEFAULT_RADIX == 16
102 #define FIXMUL(a,b) ({ \
103 int c, _a = a, _b = b; \
104 __asm__("%0.L = %1.l * %2.l (FU);\n\t" \
105 "%0.H = %1.h * %2.h (IS);\n\t" \
107 "A1 += %1.h * %2.l (IS, M);\n\t" \
108 "%0 = (A1 += %2.h * %1.l) (IS, M);\n\t" \
110 : "d" (_a), "d" (_b) \
113 #define FIXMUL_ANY(a,b,radix) ((fixed32)(((int64)(a)*(b))>>(radix)))
114 #elif defined(_MSC_VER) || (defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == 8)
115 #define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX)
116 #define FIXMUL_ANY(a,b,radix) ((fixed32)(((int64)(a)*(b))>>(radix)))
118 #define FIXMUL(a,b) FIXMUL_ANY(a,b,DEFAULT_RADIX)
119 #define FIXMUL_ANY(a,b,radix) \
120 (fixed32)(((((uint32)(a))&((1<<(radix))-1)) \
121 * (((uint32)(b))&((1<<(radix))-1)) >> (radix)) \
122 + (((((int32)(a))>>(radix)) * (((int32)(b))>>(radix))) << (radix)) \
123 + ((((uint32)(a))&((1<<(radix))-1)) * (((int32)(b))>>(radix))) \
124 + ((((uint32)(b))&((1<<(radix))-1)) * (((int32)(a))>>(radix))))
129 #define MIN_FIXLOG -2829416
130 #define MIN_FIXLOG2 -4081985
132 #define FIXLN_2 ((fixed32)(0.693147180559945 * (1<<DEFAULT_RADIX)))
134 #define FIXLN(x) (fixlog(x) - (FIXLN_2 * DEFAULT_RADIX))
139 int32 fixlog(uint32 x);
144 int32 fixlog2(uint32 x);
Basic type definitions used in Sphinx.