47#include <sphinxbase/sphinxbase_export.h>
59#define DEFAULT_RADIX 12
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))
139int32 fixlog(uint32 x);
144int32 fixlog2(uint32 x);
Basic type definitions used in Sphinx.