00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #include "dsp.h"
00048 #include "preprocessor.h"
00049
00050 #if defined(FORCE_ALL_GENERICS) || \
00051 defined(FORCE_GENERIC_VECT16_CONVPART) || \
00052 !defined(TARGET_SPECIFIC_VECT16_CONVPART)
00053
00054 #define DSP16_SUM_ITEM(x, line) sum += pvect2[x]*pvect3[8 - x - 1];
00055
00056 #define DSP16_SUM_ITEM_INIT(x, line) sum += *pvect2++**--pvect3;
00057
00058 #define DSP16_CONVPART_KERNEL_X_FCT(x_num, data) \
00059 static void TPASTE2(dsp16_vect_convpart_kernel_x, x_num)(dsp16_t *vect1, dsp16_t *vect2, int vect1_size, dsp16_t *vect3, int vect3_size) \
00060 { \
00061 int i, j; \
00062 dsp32_t sum; \
00063 dsp16_t *pvect3, *pvect2; \
00064 \
00065 for(j=0; j<vect1_size; j++) \
00066 { \
00067 sum = 0; \
00068 pvect3 = &vect3[vect3_size]; \
00069 pvect2 = &vect2[j]; \
00070 \
00071 MREPEAT(x_num, DSP16_SUM_ITEM_INIT, ) \
00072 \
00073 for(i=x_num; i<vect3_size; i += 8) \
00074 { \
00075 pvect3 -= 8; \
00076 MREPEAT8(DSP16_SUM_ITEM, ) \
00077 pvect2 += 8; \
00078 } \
00079 \
00080 vect1[j] = sum >> DSP16_QB; \
00081 } \
00082 }
00083
00084 DSP16_CONVPART_KERNEL_X_FCT(0, )
00085 DSP16_CONVPART_KERNEL_X_FCT(1, )
00086 DSP16_CONVPART_KERNEL_X_FCT(2, )
00087 DSP16_CONVPART_KERNEL_X_FCT(3, )
00088 DSP16_CONVPART_KERNEL_X_FCT(4, )
00089 DSP16_CONVPART_KERNEL_X_FCT(5, )
00090 DSP16_CONVPART_KERNEL_X_FCT(6, )
00091 DSP16_CONVPART_KERNEL_X_FCT(7, )
00092
00093 void dsp16_vect_convpart(dsp16_t *vect1, dsp16_t *vect2, int vect2_size, dsp16_t *vect3, int vect3_size)
00094 {
00095 typedef void (*convpart_kernel_opti_t)(dsp16_t *, dsp16_t *, int, dsp16_t *, int);
00096 static const convpart_kernel_opti_t convpart_kernel_opti[8] = {
00097 dsp16_vect_convpart_kernel_x0,
00098 dsp16_vect_convpart_kernel_x1,
00099 dsp16_vect_convpart_kernel_x2,
00100 dsp16_vect_convpart_kernel_x3,
00101 dsp16_vect_convpart_kernel_x4,
00102 dsp16_vect_convpart_kernel_x5,
00103 dsp16_vect_convpart_kernel_x6,
00104 dsp16_vect_convpart_kernel_x7
00105 };
00106
00107
00108 convpart_kernel_opti[vect3_size&0x7](vect1, vect2, vect2_size - vect3_size + 1, vect3, vect3_size);
00109 }
00110
00111 #endif