00001
00019
00020
00021
00022
00023
00024 #ifndef _kz_dsp_h_
00025 #define _kz_dsp_h_
00026
00027
00028 #if TARGET_TOOL == TOOL_GCC || TARGET_TOOL == TOOL_VDSP
00029 #include <fract.h>
00030 #elif TARGET_TOOL == TOOL_VS2008
00031
00032 #else
00033 #error Target no found
00034 #endif
00035
00036
00037
00038 #define KZQ_VAL (26)
00040
00041
00049
00050 Inline int KzDspAdd( int a, int b)
00051 {
00052 #if TARGET_TOOL == TOOL_GCC || TARGET_TOOL == TOOL_VDSP
00053 return add_fr1x32(a,b);
00054 #else
00055 #endif
00056 }
00057
00066
00067 Inline int KzDspSub( int a, int b)
00068 {
00069 #if TARGET_TOOL == TOOL_GCC || TARGET_TOOL == TOOL_VDSP
00070 return sub_fr1x32(a,b);
00071 #else
00072 #endif
00073 }
00074
00084
00085 Inline int KzDspMpy( int a, int b)
00086 {
00087 #if TARGET_TOOL == TOOL_GCC || TARGET_TOOL == TOOL_VDSP
00088 {
00089 int y;
00090 asm volatile(" \
00091 a1 = %2.H * %1.L(M), a0 = %2.H * %1.H; \
00092 a1 += %1.H * %2.L(M); \
00093 a0 = a0 << (5); \
00094 a1 = a1 >>> (10); \
00095 %0 = (a0+=a1);" \
00096 : "=d"(y) : "d"(a),"d"(b) : "A0","A1" );
00097 return y;
00098 }
00099 #else
00100 #endif
00101 }
00102
00112
00113 Inline int KzDspMac( int *a, int *b, int n )
00114 {
00115 #if TARGET_TOOL == TOOL_GCC || TARGET_TOOL == TOOL_VDSP
00116 {
00117 int y;
00118 asm volatile(" \
00119 i0 = %1; \
00120 i1 = %2; \
00121 p0 = %3; \
00122 a1 = a0 = 0 || r0 = [i0++] || r1 = [i1++]; \
00123 lsetup(4,8) lc0 = p0; \
00124 a1 += r0.H * r1.L(M), a0 += r0.H * r1.H; \
00125 a1 += r1.H * r0.L(M) || r0 = [i0++] || r1 = [i1++]; \
00126 a0 = a0 << (5); \
00127 a1 = a1 >>> (10); \
00128 %0 = (a0+=a1);" \
00129 : "=d"(y)
00130 #if TARGET_TOOL == TOOL_GCC
00131 : "d"(a),"d"(b),"d"(n)
00132 #else
00133 : "i"(a),"i"(b),"p"(n)
00134 #endif
00135 : "R0","R1","I0","I1","P0","A0","A1","LC0" );
00136 return y;
00137 }
00138 #else
00139 #endif
00140 }
00141
00150
00151 Inline int KzDspSat(int a)
00152 {
00153 #if TARGET_TOOL == TOOL_GCC || TARGET_TOOL == TOOL_VDSP
00154 return shr_fr1x32( shl_fr1x32( a, 31-KZQ_VAL), 31-KZQ_VAL );
00155 #else
00156 #endif
00157 }
00158
00166
00167 Inline int KzDspAbs(int a)
00168 {
00169 #if TARGET_TOOL == TOOL_GCC || TARGET_TOOL == TOOL_VDSP
00170 return abs_fr1x32( a );
00171 #else
00172 #endif
00173 }
00174
00183
00184 Inline int KzDspShl(int a, int s)
00185 {
00186 #if TARGET_TOOL == TOOL_GCC || TARGET_TOOL == TOOL_VDSP
00187 return shl_fr1x32( a , s);
00188 #else
00189 #endif
00190 }
00191
00200
00201 Inline int KzDspShr(int a, int s)
00202 {
00203 #if TARGET_TOOL == TOOL_GCC || TARGET_TOOL == TOOL_VDSP
00204 return shr_fr1x32( a , s);
00205 #else
00206 #endif
00207 }
00208
00216
00217 Inline int KzDspNeg(int a)
00218 {
00219 #if TARGET_TOOL == TOOL_GCC || TARGET_TOOL == TOOL_VDSP
00220 return negate_fr1x32( a );
00221 #else
00222 #endif
00223 }
00224
00232
00233 Inline float KzDspTof(int a)
00234 {
00235 return (float)a / (1<<KZQ_VAL);
00236 }
00237
00245
00246 Inline int KzDspToi(float a)
00247 {
00248 return (int)(a * (1<<KZQ_VAL));
00249 }
00250
00251 #endif