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.