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_WIN16_RECT) && \
00051 defined(TARGET_SPECIFIC_WIN16_RECT)
00052
00053 #if __GNUC__
00054 # define DSP16_RECT_END_KERNEL_X_FCT(x_num, data) __attribute__((__naked__)) DSP16_RECT_END_KERNEL_X_FCT__(x_num, data)
00055 #elif __ICCAVR32__
00056 # define DSP16_RECT_END_KERNEL_X_FCT(x_num, data) DSP16_RECT_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 #if __GNUC__
00070 # define CST_ONE "%[CST_ONE__]"
00071 #elif __ICCAVR32__
00072 # if DSP16_QB >= 15
00073 # define CST_ONE ASTRINGZ((1 << 15) - 1)
00074 # else
00075 # define CST_ONE ASTRINGZ(1 << DSP16_QB)
00076 # endif
00077 #endif
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 #define DSP16_RECTANGLE_0(r_vect1)
00092
00093 #define DSP16_RECTANGLE_1(r_vect1) \
00094 "mov r8, "CST_ONE"\n\t" \
00095 "st.h "ASTRINGZ(r_vect1)"[0], r8\n\t"
00096
00097 #define DSP16_RECTANGLE_2(r_vect1) \
00098 "mov r8, "CST_ONE"\n\t" \
00099 "or r8, r8, r8 << 16\n\t" \
00100 "st.w "ASTRINGZ(r_vect1)"[0], r8\n\t"
00101
00102 #define DSP16_RECTANGLE_3(r_vect1) \
00103 "mov r8, "CST_ONE"\n\t" \
00104 "or r8, r8, r8 << 16\n\t" \
00105 "st.w "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00106 "st.h "ASTRINGZ(r_vect1)"[4], r8\n\t"
00107
00108 #define DSP16_RECTANGLE_4(r_vect1) \
00109 "mov r8, "CST_ONE"\n\t" \
00110 "or r8, r8, r8 << 16\n\t" \
00111 "mov r9, r8\n\t" \
00112 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t"
00113
00114 #define DSP16_RECTANGLE_5(r_vect1) \
00115 "mov r8, "CST_ONE"\n\t" \
00116 "or r8, r8, r8 << 16\n\t" \
00117 "mov r9, r8\n\t" \
00118 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00119 "st.h "ASTRINGZ(r_vect1)"[8], r8\n\t"
00120
00121 #define DSP16_RECTANGLE_6(r_vect1) \
00122 "mov r8, "CST_ONE"\n\t" \
00123 "or r8, r8, r8 << 16\n\t" \
00124 "mov r9, r8\n\t" \
00125 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00126 "st.w "ASTRINGZ(r_vect1)"[8], r8\n\t"
00127
00128 #define DSP16_RECTANGLE_7(r_vect1) \
00129 "mov r8, "CST_ONE"\n\t" \
00130 "or r8, r8, r8 << 16\n\t" \
00131 "mov r9, r8\n\t" \
00132 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00133 "st.w "ASTRINGZ(r_vect1)"[8], r8\n\t" \
00134 "st.h "ASTRINGZ(r_vect1)"[12], r8\n\t"
00135
00136 #define DSP16_RECTANGLE_8(r_vect1) \
00137 "mov r8, "CST_ONE"\n\t" \
00138 "or r8, r8, r8 << 16\n\t" \
00139 "mov r9, r8\n\t" \
00140 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00141 "st.d "ASTRINGZ(r_vect1)"[8], r8\n\t"
00142
00143 #define DSP16_RECTANGLE_9(r_vect1) \
00144 "mov r8, "CST_ONE"\n\t" \
00145 "or r8, r8, r8 << 16\n\t" \
00146 "mov r9, r8\n\t" \
00147 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00148 "st.d "ASTRINGZ(r_vect1)"[8], r8\n\t" \
00149 "st.h "ASTRINGZ(r_vect1)"[16], r8\n\t"
00150
00151 #define DSP16_RECTANGLE_10(r_vect1) \
00152 "mov r8, "CST_ONE"\n\t" \
00153 "or r8, r8, r8 << 16\n\t" \
00154 "mov r9, r8\n\t" \
00155 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00156 "st.d "ASTRINGZ(r_vect1)"[8], r8\n\t" \
00157 "st.w "ASTRINGZ(r_vect1)"[16], r8\n\t"
00158
00159 #define DSP16_RECTANGLE_11(r_vect1) \
00160 "mov r8, "CST_ONE"\n\t" \
00161 "or r8, r8, r8 << 16\n\t" \
00162 "mov r9, r8\n\t" \
00163 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00164 "st.d "ASTRINGZ(r_vect1)"[8], r8\n\t" \
00165 "st.w "ASTRINGZ(r_vect1)"[16], r8\n\t" \
00166 "st.h "ASTRINGZ(r_vect1)"[20], r8\n\t"
00167
00168 #define DSP16_RECTANGLE_12(r_vect1) \
00169 "mov r8, "CST_ONE"\n\t" \
00170 "or r8, r8, r8 << 16\n\t" \
00171 "mov r9, r8\n\t" \
00172 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00173 "st.d "ASTRINGZ(r_vect1)"[8], r8\n\t" \
00174 "st.d "ASTRINGZ(r_vect1)"[16], r8\n\t"
00175
00176 #define DSP16_RECTANGLE_13(r_vect1) \
00177 "mov r8, "CST_ONE"\n\t" \
00178 "or r8, r8, r8 << 16\n\t" \
00179 "mov r9, r8\n\t" \
00180 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00181 "st.d "ASTRINGZ(r_vect1)"[8], r8\n\t" \
00182 "st.d "ASTRINGZ(r_vect1)"[16], r8\n\t" \
00183 "st.h "ASTRINGZ(r_vect1)"[24], r8\n\t"
00184
00185 #define DSP16_RECTANGLE_14(r_vect1) \
00186 "mov r8, "CST_ONE"\n\t" \
00187 "or r8, r8, r8 << 16\n\t" \
00188 "mov r9, r8\n\t" \
00189 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00190 "st.d "ASTRINGZ(r_vect1)"[8], r8\n\t" \
00191 "st.d "ASTRINGZ(r_vect1)"[16], r8\n\t" \
00192 "st.w "ASTRINGZ(r_vect1)"[24], r8\n\t"
00193
00194 #define DSP16_RECTANGLE_15(r_vect1) \
00195 "mov r8, "CST_ONE"\n\t" \
00196 "or r8, r8, r8 << 16\n\t" \
00197 "mov r9, r8\n\t" \
00198 "st.d "ASTRINGZ(r_vect1)"[0], r8\n\t" \
00199 "st.d "ASTRINGZ(r_vect1)"[8], r8\n\t" \
00200 "st.d "ASTRINGZ(r_vect1)"[16], r8\n\t" \
00201 "st.w "ASTRINGZ(r_vect1)"[24], r8\n\t" \
00202 "st.h "ASTRINGZ(r_vect1)"[28], r8\n\t"
00203
00204
00205
00206
00207
00208
00209
00210 #if __GNUC__
00211 # define DSP16_RECT_END_KERNEL_X_FCT__(x_num, data) \
00212 static void TPASTE2(dsp16_win_rect_end_kernel_x, x_num)(dsp16_t *vect1) \
00213 { \
00214 __asm__ __volatile__ ( \
00215 TPASTE2(DSP16_RECTANGLE_, x_num)(r12) \
00216 "mov pc, lr\n\t" \
00217 : \
00218 : \
00219 [CST_ONE__] "i" (DSP16_Q(1.)) \
00220 ); \
00221 }
00222 #elif __ICCAVR32__
00223 # define DSP16_RECT_END_KERNEL_X_FCT__(x_num, data) \
00224 static void TPASTE2(dsp16_win_rect_end_kernel_x, x_num)(dsp16_t *vect1) \
00225 { \
00226 __asm__ __volatile__ ( \
00227 TPASTE2(DSP16_RECTANGLE_, x_num)(r12) \
00228 "mov pc, lr\n\t" \
00229 ); \
00230 }
00231 #endif
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00257 #if __GNUC__
00258 __attribute__((__naked__))
00259 __attribute__((__noinline__))
00260 #elif __ICCAVR32__
00261 # pragma shadow_registers=full
00262 # pragma optimize=none no_inline
00263 #endif
00264 static dsp16_t *dsp16_win_rect_kernel_ext(dsp16_t *vect1, int size)
00265 {
00266 __asm__ __volatile__ (
00267 "sub r11, 15\n\t"
00268
00269 "add r11, r12, r11 << 1\n"
00270 "cp.w r12, r11\n\t"
00271 ASM_INSTRUCT_COMPACKED("brge __dsp16_rect_ext_end_loop")"\n\t"
00272
00273
00274 "mov r8, "CST_ONE"\n\t"
00275 "or r8, r8, r8 << 16\n\t"
00276 "mov r9, r8\n"
00277
00278 "__dsp16_rect_ext_loop:\n\t"
00279
00280 "st.d r12[0], r8\n\t"
00281 "st.d r12[8], r8\n\t"
00282 "st.d r12[16], r8\n\t"
00283 "st.d r12[24], r8\n\t"
00284
00285 "sub r12, -32\n\t"
00286
00287 "cp.w r12, r11\n\t"
00288 ASM_INSTRUCT_COMPACKED("brlt __dsp16_rect_ext_loop")"\n"
00289
00290 "__dsp16_rect_ext_end_loop:\n\t"
00291
00292 "retal r12\n\t"
00293 #if __GNUC__
00294 :
00295 :
00296 [CST_ONE__] "i" (DSP16_Q(1.))
00297 #endif
00298 );
00299
00300 return (dsp16_t *) 0;
00301 }
00302
00303
00304 DSP16_RECT_END_KERNEL_X_FCT(0, "")
00305 DSP16_RECT_END_KERNEL_X_FCT(1, "")
00306 DSP16_RECT_END_KERNEL_X_FCT(2, "")
00307 DSP16_RECT_END_KERNEL_X_FCT(3, "")
00308 DSP16_RECT_END_KERNEL_X_FCT(4, "")
00309 DSP16_RECT_END_KERNEL_X_FCT(5, "")
00310 DSP16_RECT_END_KERNEL_X_FCT(6, "")
00311 DSP16_RECT_END_KERNEL_X_FCT(7, "")
00312 DSP16_RECT_END_KERNEL_X_FCT(8, "")
00313 DSP16_RECT_END_KERNEL_X_FCT(9, "")
00314 DSP16_RECT_END_KERNEL_X_FCT(10, "")
00315 DSP16_RECT_END_KERNEL_X_FCT(11, "")
00316 DSP16_RECT_END_KERNEL_X_FCT(12, "")
00317 DSP16_RECT_END_KERNEL_X_FCT(13, "")
00318 DSP16_RECT_END_KERNEL_X_FCT(14, "")
00319 DSP16_RECT_END_KERNEL_X_FCT(15, "")
00320
00321 void dsp16_win_rect(dsp16_t *vect1, int size)
00322 {
00323 typedef void (*rect_end_kernel_opti_t)(dsp16_t *);
00324 static const rect_end_kernel_opti_t rect_end_kernel_opti[16] = {
00325 dsp16_win_rect_end_kernel_x0,
00326 dsp16_win_rect_end_kernel_x1,
00327 dsp16_win_rect_end_kernel_x2,
00328 dsp16_win_rect_end_kernel_x3,
00329 dsp16_win_rect_end_kernel_x4,
00330 dsp16_win_rect_end_kernel_x5,
00331 dsp16_win_rect_end_kernel_x6,
00332 dsp16_win_rect_end_kernel_x7,
00333 dsp16_win_rect_end_kernel_x8,
00334 dsp16_win_rect_end_kernel_x9,
00335 dsp16_win_rect_end_kernel_x10,
00336 dsp16_win_rect_end_kernel_x11,
00337 dsp16_win_rect_end_kernel_x12,
00338 dsp16_win_rect_end_kernel_x13,
00339 dsp16_win_rect_end_kernel_x14,
00340 dsp16_win_rect_end_kernel_x15
00341 };
00342
00343 vect1 = dsp16_win_rect_kernel_ext(vect1, size);
00344
00345
00346 rect_end_kernel_opti[size&0xF](vect1);
00347 }
00348
00349 #endif