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 "preprocessor.h"
00048
00049 #if !defined(FORCE_ALL_GENERICS) && \
00050 !defined(FORCE_GENERIC_VECT16_COMPLEXCONJ) && \
00051 defined(TARGET_SPECIFIC_VECT16_COMPLEXCONJ)
00052
00053 #if __GNUC__
00054 # define DSP16_CONJ_END_KERNEL_X_FCT(x_num, data) __attribute__((__naked__)) DSP16_CONJ_END_KERNEL_X_FCT__(x_num, data)
00055 #elif __ICCAVR32__
00056 # define DSP16_CONJ_END_KERNEL_X_FCT(x_num, data) DSP16_CONJ_END_KERNEL_X_FCT__(x_num, data)
00057 #endif
00058
00059
00060 #if __GNUC__
00061 # define ASM_INSTRUCT_COMPACKED(str) str
00062 # define ASM_INSTRUCT_EXTENDED(str) str
00063 #elif __ICCAVR32__
00064 # define ASM_INSTRUCT_COMPACKED(str) str":C"
00065 # define ASM_INSTRUCT_EXTENDED(str) str":E"
00066 #endif
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 #define DSP16_CONJUGATE_0(r_vect1, r_vect2)
00082
00083 #define DSP16_CONJUGATE_1(r_vect1, r_vect2) \
00084 "ld.w r0, "ASTRINGZ(r_vect2)"[0x0]\n\t" \
00085 "sthh.w "ASTRINGZ(r_vect1)"[0x0], r0:b, r0:t\n\t"
00086
00087 #define DSP16_CONJUGATE_2(r_vect1, r_vect2) \
00088 "ld.d r0, "ASTRINGZ(r_vect2)"[0x0]\n\t" \
00089 "swap.h r0\n\t" \
00090 "swap.h r1\n\t" \
00091 "st.d "ASTRINGZ(r_vect1)"[0x0], r0\n\t"
00092
00093 #define DSP16_CONJUGATE_3(r_vect1, r_vect2) \
00094 "ld.d r0, "ASTRINGZ(r_vect2)"[0x0]\n\t" \
00095 "swap.h r0\n\t" \
00096 "swap.h r1\n\t" \
00097 "st.d "ASTRINGZ(r_vect1)"[0x0], r0\n\t" \
00098 \
00099 "ld.w r0, "ASTRINGZ(r_vect2)"[0x8]\n\t" \
00100 "sthh.w "ASTRINGZ(r_vect1)"[0x8], r0:b, r0:t\n\t"
00101
00102
00103
00104
00105
00106
00107
00108 #define DSP16_CONJ_END_KERNEL_X_FCT__(x_num, data) \
00109 static void TPASTE2(dsp16_vect_conj_end_kernel_x, x_num)(dsp16_complex_t *vect1, dsp16_complex_t *vect2) \
00110 { \
00111 __asm__ __volatile__ ( \
00112 "pushm r0-r3, lr\n\t" \
00113 TPASTE2(DSP16_CONJUGATE_, x_num)(r12, r11) \
00114 "popm r0-r3, pc\n\t" \
00115 ); \
00116 }
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00132 #if __GNUC__
00133 __attribute__((__naked__))
00134 __attribute__((__noinline__))
00135 #elif __ICCAVR32__
00136 # pragma shadow_registers=full
00137 # pragma optimize=none no_inline
00138 #endif
00139 static int dsp16_vect_conj_kernel_ext(dsp16_complex_t *vect1, dsp16_complex_t *vect2, int size)
00140 {
00141 __asm__ __volatile__ (
00142 "pushm r0-r7, lr\n\t"
00143
00144 "mov lr, 0\n\t"
00145 "sub r10, 3\n\t"
00146 "mov r9, 0\n\t"
00147
00148 "cp.h lr, r10\n\t"
00149 ASM_INSTRUCT_COMPACKED("brge __dsp16_conj_ext_end_loop")"\n"
00150
00151 "__dsp16_conj_ext_loop:\n\t"
00152
00153 "ld.d r0, r11[lr << 2]\n\t"
00154 "swap.h r0\n\t"
00155 "swap.h r1\n\t"
00156 "st.d r12[lr << 2], r0\n\t"
00157
00158 "sub lr, -2\n\t"
00159
00160 "ld.d r0, r11[lr << 2]\n\t"
00161 "swap.h r0\n\t"
00162 "swap.h r1\n\t"
00163 "st.d r12[lr << 2], r0\n\t"
00164
00165 "sub lr, -2\n\t"
00166
00167 "cp.h lr, r10\n\t"
00168 ASM_INSTRUCT_COMPACKED("brlt __dsp16_conj_ext_loop")"\n"
00169
00170 "__dsp16_conj_ext_end_loop:\n\t"
00171
00172 "mov r12, lr\n\t"
00173 "popm r0-r7, pc\n\t"
00174 );
00175
00176 return 0;
00177 }
00178
00179
00180 DSP16_CONJ_END_KERNEL_X_FCT(0, "")
00181 DSP16_CONJ_END_KERNEL_X_FCT(1, "")
00182 DSP16_CONJ_END_KERNEL_X_FCT(2, "")
00183 DSP16_CONJ_END_KERNEL_X_FCT(3, "")
00184
00185 void dsp16_vect_complex_conj(dsp16_complex_t *vect1, dsp16_complex_t *vect2, int size)
00186 {
00187 typedef void (*conj_end_kernel_opti_t)(dsp16_complex_t *, dsp16_complex_t *);
00188 static const conj_end_kernel_opti_t conj_end_kernel_opti[4] = {
00189 dsp16_vect_conj_end_kernel_x0,
00190 dsp16_vect_conj_end_kernel_x1,
00191 dsp16_vect_conj_end_kernel_x2,
00192 dsp16_vect_conj_end_kernel_x3
00193 };
00194 int n;
00195
00196 n = dsp16_vect_conj_kernel_ext(vect1, vect2, size);
00197
00198
00199 conj_end_kernel_opti[size&0x3](&vect1[n], &vect2[n]);
00200 }
00201
00202 #endif