00001
00019
00020
00021
00022
00023
00024 #ifndef _kz_dsp_h_
00025 #define _kz_dsp_h_
00026
00027
00028 #if TARGET_TOOL == TOOL_GCC
00029
00030 #elif TARGET_TOOL == TOOL_VDSP
00031 #include <fract.h>
00032 #elif TARGET_TOOL == TOOL_VS2008
00033
00034 #else
00035 #error Target no found
00036 #endif
00037
00038
00039
00040 #define KZQ_VAL (26)
00042
00043
00051
00052 inline int KzDspAdd( int a, int b)
00053 {
00054 #if TARGET_TOOL == TOOL_GCC
00055 #elif TARGET_TOOL == TOOL_VDSP
00056 return add_fr1x32(a,b);
00057 #else
00058 #endif
00059 }
00060
00069
00070 inline int KzDspSub( int a, int b)
00071 {
00072 #if TARGET_TOOL == TOOL_GCC
00073 #elif TARGET_TOOL == TOOL_VDSP
00074 return sub_fr1x32(a,b);
00075 #else
00076 #endif
00077 }
00078
00088
00089 inline int KzDspMpy( int a, int b)
00090 {
00091 #if TARGET_TOOL == TOOL_GCC
00092 #elif TARGET_TOOL == TOOL_VDSP
00093 {
00094 int y;
00095 asm volatile(" \
00096 a1 = %2.H * %1.L(M), a0 = %2.H * %1.H; \
00097 a1 += %1.H * %2.L(M); \
00098 a0 = a0 << (5); \
00099 a1 = a1 >>> (10); \
00100 %0 = (a0+=a1);" \
00101 : "=d"(y) : "d"(a),"d"(b) : "A0","A1" );
00102 return y;
00103 }
00104 #else
00105 #endif
00106 }
00107
00117
00118 inline int KzDspMac( int *a, int *b, int n )
00119 {
00120 #if TARGET_TOOL == TOOL_GCC
00121 #elif TARGET_TOOL == TOOL_VDSP
00122 {
00123 int y;
00124 asm volatile(" \
00125 i0 = %1; \
00126 i1 = %2; \
00127 p0 = %3; \
00128 a1 = a0 = 0 || r0 = [i0++] || r1 = [i1++]; \
00129 lsetup(4,8) lc0 = p0; \
00130 a1 += r0.H * r1.L(M), a0 += r0.H * r1.H; \
00131 a1 += r1.H * r0.L(M) || r0 = [i0++] || r1 = [i1++]; \
00132 a0 = a0 << (5); \
00133 a1 = a1 >>> (10); \
00134 %0 = (a0+=a1);" \
00135 : "=d"(y) : "i"(a),"i"(b),"p"(n) : "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
00154 #elif TARGET_TOOL == TOOL_VDSP
00155 return shr_fr1x32( shl_fr1x32( a, 31-KZQ_VAL), 31-KZQ_VAL );
00156 #else
00157 #endif
00158 }
00159
00167
00168 inline int KzDspAbs(int a)
00169 {
00170 #if TARGET_TOOL == TOOL_GCC
00171 #elif TARGET_TOOL == TOOL_VDSP
00172 return abs_fr1x32( a );
00173 #else
00174 #endif
00175 }
00176
00185
00186 inline int KzDspShl(int a, int s)
00187 {
00188 #if TARGET_TOOL == TOOL_GCC
00189 #elif TARGET_TOOL == TOOL_VDSP
00190 return shl_fr1x32( a , s);
00191 #else
00192 #endif
00193 }
00194
00203
00204 inline int KzDspShr(int a, int s)
00205 {
00206 #if TARGET_TOOL == TOOL_GCC
00207 #elif TARGET_TOOL == TOOL_VDSP
00208 return shr_fr1x32( a , s);
00209 #else
00210 #endif
00211 }
00212
00220
00221 inline int KzDspNeg(int a)
00222 {
00223 #if TARGET_TOOL == TOOL_GCC
00224 #elif TARGET_TOOL == TOOL_VDSP
00225 return negate_fr1x32( a );
00226 #else
00227 #endif
00228 }
00229
00237
00238 inline float KzDspTof(int a)
00239 {
00240 return (float)a / (1<<KZQ_VAL);
00241 }
00242
00250
00251 inline int KzDspToi(float a)
00252 {
00253 return (int)(a * (1<<KZQ_VAL));
00254 }
00255
00256 #endif