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
00048 #include "dsp.h"
00049 #include "preprocessor.h"
00050
00051 #if defined(FORCE_ALL_GENERICS) || \
00052 defined(FORCE_GENERIC_VECT32_CONVPART) || \
00053 !defined(TARGET_SPECIFIC_VECT32_CONVPART)
00054
00055 #define DSP32_SUM_ITEM(x, line) sum += ((long long) pvect2[x])*((long long) pvect3[8 - x - 1]);
00056
00057 #define DSP32_SUM_ITEM_INIT(x, line) sum += ((long long) *pvect2++)*((long long) *--pvect3);
00058
00059 #define DSP32_CONVPART_KERNEL_X_FCT(x_num, data) \
00060 static void TPASTE2(dsp32_vect_convpart_kernel_x, x_num)(dsp32_t *vect1, dsp32_t *vect2, int vect1_size, dsp32_t *vect3, int vect3_size) \
00061 { \
00062 int i, j; \
00063 long long sum; \
00064 dsp32_t *pvect3, *pvect2; \
00065 \
00066 for(j=0; j<vect1_size; j++) \
00067 { \
00068 sum = 0; \
00069 pvect3 = &vect3[vect3_size]; \
00070 pvect2 = &vect2[j]; \
00071 \
00072 MREPEAT(x_num, DSP32_SUM_ITEM_INIT, ) \
00073 \
00074 for(i=x_num; i<vect3_size; i += 8) \
00075 { \
00076 pvect3 -= 8; \
00077 MREPEAT8(DSP32_SUM_ITEM, ) \
00078 pvect2 += 8; \
00079 } \
00080 \
00081 vect1[j] = sum >> DSP32_QB; \
00082 } \
00083 }
00084
00085 DSP32_CONVPART_KERNEL_X_FCT(0, )
00086 DSP32_CONVPART_KERNEL_X_FCT(1, )
00087 DSP32_CONVPART_KERNEL_X_FCT(2, )
00088 DSP32_CONVPART_KERNEL_X_FCT(3, )
00089 DSP32_CONVPART_KERNEL_X_FCT(4, )
00090 DSP32_CONVPART_KERNEL_X_FCT(5, )
00091 DSP32_CONVPART_KERNEL_X_FCT(6, )
00092 DSP32_CONVPART_KERNEL_X_FCT(7, )
00093
00094 void dsp32_vect_convpart(dsp32_t *vect1, dsp32_t *vect2, int vect2_size, dsp32_t *vect3, int vect3_size)
00095 {
00096 typedef void (*convpart_kernel_opti_t)(dsp32_t *, dsp32_t *, int, dsp32_t *, int);
00097 static const convpart_kernel_opti_t convpart_kernel_opti[8] = {
00098 dsp32_vect_convpart_kernel_x0,
00099 dsp32_vect_convpart_kernel_x1,
00100 dsp32_vect_convpart_kernel_x2,
00101 dsp32_vect_convpart_kernel_x3,
00102 dsp32_vect_convpart_kernel_x4,
00103 dsp32_vect_convpart_kernel_x5,
00104 dsp32_vect_convpart_kernel_x6,
00105 dsp32_vect_convpart_kernel_x7
00106 };
00107
00108
00109 convpart_kernel_opti[vect3_size&0x7](vect1, vect2, vect2_size - vect3_size + 1, vect3, vect3_size);
00110 }
00111
00112 #endif
00113