00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 static uint64_t __attribute__((aligned(8))) attribute_used magicF2W= 0x43c0000043c00000LL;
00011 static uint64_t __attribute__((aligned(8))) attribute_used wm1010= 0xFFFF0000FFFF0000LL;
00012 static uint64_t __attribute__((aligned(8))) attribute_used wm0101= 0x0000FFFF0000FFFFLL;
00013 static uint64_t __attribute__((aligned(8))) attribute_used wm1100= 0xFFFFFFFF00000000LL;
00014
00015 static int a52_resample_MONO_to_5_MMX(float * _f, int16_t * s16){
00016 int32_t * f = (int32_t *) _f;
00017 asm volatile(
00018 "movl $-512, %%esi \n\t"
00019 "movq "MANGLE(magicF2W)", %%mm7 \n\t"
00020 "movq "MANGLE(wm1100)", %%mm3 \n\t"
00021 "movq "MANGLE(wm0101)", %%mm4 \n\t"
00022 "movq "MANGLE(wm1010)", %%mm5 \n\t"
00023 "pxor %%mm6, %%mm6 \n\t"
00024 "1: \n\t"
00025 "movq (%1, %%esi, 2), %%mm0 \n\t"
00026 "movq 8(%1, %%esi, 2), %%mm1 \n\t"
00027 "leal (%%esi, %%esi, 4), %%edi \n\t"
00028 "psubd %%mm7, %%mm0 \n\t"
00029 "psubd %%mm7, %%mm1 \n\t"
00030 "packssdw %%mm1, %%mm0 \n\t"
00031 "movq %%mm0, %%mm1 \n\t"
00032 "pand %%mm4, %%mm0 \n\t"
00033 "pand %%mm5, %%mm1 \n\t"
00034 "movq %%mm6, (%0, %%edi) \n\t"
00035 "movd %%mm0, 8(%0, %%edi) \n\t"
00036 "pand %%mm3, %%mm0 \n\t"
00037 "movd %%mm6, 12(%0, %%edi) \n\t"
00038 "movd %%mm1, 16(%0, %%edi) \n\t"
00039 "pand %%mm3, %%mm1 \n\t"
00040 "movd %%mm6, 20(%0, %%edi) \n\t"
00041 "movq %%mm0, 24(%0, %%edi) \n\t"
00042 "movq %%mm1, 32(%0, %%edi) \n\t"
00043 "addl $8, %%esi \n\t"
00044 " jnz 1b \n\t"
00045 "emms \n\t"
00046 :: "r" (s16+1280), "r" (f+256)
00047 :"%esi", "%edi", "memory"
00048 );
00049 return 5*256;
00050 }
00051
00052 static int a52_resample_STEREO_to_2_MMX(float * _f, int16_t * s16){
00053 int32_t * f = (int32_t *) _f;
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 asm volatile(
00073 "movl $-1024, %%esi \n\t"
00074 "movq "MANGLE(magicF2W)", %%mm7 \n\t"
00075 "1: \n\t"
00076 "movq (%1, %%esi), %%mm0 \n\t"
00077 "movq 8(%1, %%esi), %%mm1 \n\t"
00078 "movq 1024(%1, %%esi), %%mm2 \n\t"
00079 "movq 1032(%1, %%esi), %%mm3 \n\t"
00080 "psubd %%mm7, %%mm0 \n\t"
00081 "psubd %%mm7, %%mm1 \n\t"
00082 "psubd %%mm7, %%mm2 \n\t"
00083 "psubd %%mm7, %%mm3 \n\t"
00084 "packssdw %%mm1, %%mm0 \n\t"
00085 "packssdw %%mm3, %%mm2 \n\t"
00086 "movq %%mm0, %%mm1 \n\t"
00087 "punpcklwd %%mm2, %%mm0 \n\t"
00088 "punpckhwd %%mm2, %%mm1 \n\t"
00089 "movq %%mm0, (%0, %%esi) \n\t"
00090 "movq %%mm1, 8(%0, %%esi) \n\t"
00091 "addl $16, %%esi \n\t"
00092 " jnz 1b \n\t"
00093 "emms \n\t"
00094 :: "r" (s16+512), "r" (f+256)
00095 :"%esi", "memory"
00096 );
00097 return 2*256;
00098 }
00099
00100 static int a52_resample_3F_to_5_MMX(float * _f, int16_t * s16){
00101 int32_t * f = (int32_t *) _f;
00102 asm volatile(
00103 "movl $-1024, %%esi \n\t"
00104 "movq "MANGLE(magicF2W)", %%mm7 \n\t"
00105 "pxor %%mm6, %%mm6 \n\t"
00106 "movq %%mm7, %%mm5 \n\t"
00107 "punpckldq %%mm6, %%mm5 \n\t"
00108 "1: \n\t"
00109 "movd (%1, %%esi), %%mm0 \n\t"
00110 "punpckldq 2048(%1, %%esi), %%mm0\n\t"
00111 "movd 1024(%1, %%esi), %%mm1 \n\t"
00112 "punpckldq 4(%1, %%esi), %%mm1 \n\t"
00113 "movd 2052(%1, %%esi), %%mm2 \n\t"
00114 "movq %%mm7, %%mm3 \n\t"
00115 "punpckldq 1028(%1, %%esi), %%mm3\n\t"
00116 "movd 8(%1, %%esi), %%mm4 \n\t"
00117 "punpckldq 2056(%1, %%esi), %%mm4\n\t"
00118 "leal (%%esi, %%esi, 4), %%edi \n\t"
00119 "sarl $1, %%edi \n\t"
00120 "psubd %%mm7, %%mm0 \n\t"
00121 "psubd %%mm7, %%mm1 \n\t"
00122 "psubd %%mm5, %%mm2 \n\t"
00123 "psubd %%mm7, %%mm3 \n\t"
00124 "psubd %%mm7, %%mm4 \n\t"
00125 "packssdw %%mm6, %%mm0 \n\t"
00126 "packssdw %%mm2, %%mm1 \n\t"
00127 "packssdw %%mm4, %%mm3 \n\t"
00128 "movq %%mm0, (%0, %%edi) \n\t"
00129 "movq %%mm1, 8(%0, %%edi) \n\t"
00130 "movq %%mm3, 16(%0, %%edi) \n\t"
00131
00132 "movd 1032(%1, %%esi), %%mm1 \n\t"
00133 "punpckldq 12(%1, %%esi), %%mm1\n\t"
00134 "movd 2060(%1, %%esi), %%mm2 \n\t"
00135 "movq %%mm7, %%mm3 \n\t"
00136 "punpckldq 1036(%1, %%esi), %%mm3\n\t"
00137 "pxor %%mm0, %%mm0 \n\t"
00138 "psubd %%mm7, %%mm1 \n\t"
00139 "psubd %%mm5, %%mm2 \n\t"
00140 "psubd %%mm7, %%mm3 \n\t"
00141 "packssdw %%mm1, %%mm0 \n\t"
00142 "packssdw %%mm3, %%mm2 \n\t"
00143 "movq %%mm0, 24(%0, %%edi) \n\t"
00144 "movq %%mm2, 32(%0, %%edi) \n\t"
00145
00146 "addl $16, %%esi \n\t"
00147 " jnz 1b \n\t"
00148 "emms \n\t"
00149 :: "r" (s16+1280), "r" (f+256)
00150 :"%esi", "%edi", "memory"
00151 );
00152 return 5*256;
00153 }
00154
00155 static int a52_resample_2F_2R_to_4_MMX(float * _f, int16_t * s16){
00156 int32_t * f = (int32_t *) _f;
00157 asm volatile(
00158 "movl $-1024, %%esi \n\t"
00159 "movq "MANGLE(magicF2W)", %%mm7 \n\t"
00160 "1: \n\t"
00161 "movq (%1, %%esi), %%mm0 \n\t"
00162 "movq 8(%1, %%esi), %%mm1 \n\t"
00163 "movq 1024(%1, %%esi), %%mm2 \n\t"
00164 "movq 1032(%1, %%esi), %%mm3 \n\t"
00165 "psubd %%mm7, %%mm0 \n\t"
00166 "psubd %%mm7, %%mm1 \n\t"
00167 "psubd %%mm7, %%mm2 \n\t"
00168 "psubd %%mm7, %%mm3 \n\t"
00169 "packssdw %%mm1, %%mm0 \n\t"
00170 "packssdw %%mm3, %%mm2 \n\t"
00171 "movq 2048(%1, %%esi), %%mm3 \n\t"
00172 "movq 2056(%1, %%esi), %%mm4 \n\t"
00173 "movq 3072(%1, %%esi), %%mm5 \n\t"
00174 "movq 3080(%1, %%esi), %%mm6 \n\t"
00175 "psubd %%mm7, %%mm3 \n\t"
00176 "psubd %%mm7, %%mm4 \n\t"
00177 "psubd %%mm7, %%mm5 \n\t"
00178 "psubd %%mm7, %%mm6 \n\t"
00179 "packssdw %%mm4, %%mm3 \n\t"
00180 "packssdw %%mm6, %%mm5 \n\t"
00181 "movq %%mm0, %%mm1 \n\t"
00182 "movq %%mm3, %%mm4 \n\t"
00183 "punpcklwd %%mm2, %%mm0 \n\t"
00184 "punpckhwd %%mm2, %%mm1 \n\t"
00185 "punpcklwd %%mm5, %%mm3 \n\t"
00186 "punpckhwd %%mm5, %%mm4 \n\t"
00187 "movq %%mm0, %%mm2 \n\t"
00188 "movq %%mm1, %%mm5 \n\t"
00189 "punpckldq %%mm3, %%mm0 \n\t"
00190 "punpckhdq %%mm3, %%mm2 \n\t"
00191 "punpckldq %%mm4, %%mm1 \n\t"
00192 "punpckhdq %%mm4, %%mm5 \n\t"
00193 "movq %%mm0, (%0, %%esi,2) \n\t"
00194 "movq %%mm2, 8(%0, %%esi,2) \n\t"
00195 "movq %%mm1, 16(%0, %%esi,2) \n\t"
00196 "movq %%mm5, 24(%0, %%esi,2) \n\t"
00197 "addl $16, %%esi \n\t"
00198 " jnz 1b \n\t"
00199 "emms \n\t"
00200 :: "r" (s16+1024), "r" (f+256)
00201 :"%esi", "memory"
00202 );
00203 return 4*256;
00204 }
00205
00206 static int a52_resample_3F_2R_to_5_MMX(float * _f, int16_t * s16){
00207 int32_t * f = (int32_t *) _f;
00208 asm volatile(
00209 "movl $-1024, %%esi \n\t"
00210 "movq "MANGLE(magicF2W)", %%mm7 \n\t"
00211 "1: \n\t"
00212 "movd (%1, %%esi), %%mm0 \n\t"
00213 "punpckldq 2048(%1, %%esi), %%mm0\n\t"
00214 "movd 3072(%1, %%esi), %%mm1 \n\t"
00215 "punpckldq 4096(%1, %%esi), %%mm1\n\t"
00216 "movd 1024(%1, %%esi), %%mm2 \n\t"
00217 "punpckldq 4(%1, %%esi), %%mm2 \n\t"
00218 "movd 2052(%1, %%esi), %%mm3 \n\t"
00219 "punpckldq 3076(%1, %%esi), %%mm3\n\t"
00220 "movd 4100(%1, %%esi), %%mm4 \n\t"
00221 "punpckldq 1028(%1, %%esi), %%mm4\n\t"
00222 "movd 8(%1, %%esi), %%mm5 \n\t"
00223 "punpckldq 2056(%1, %%esi), %%mm5\n\t"
00224 "leal (%%esi, %%esi, 4), %%edi \n\t"
00225 "sarl $1, %%edi \n\t"
00226 "psubd %%mm7, %%mm0 \n\t"
00227 "psubd %%mm7, %%mm1 \n\t"
00228 "psubd %%mm7, %%mm2 \n\t"
00229 "psubd %%mm7, %%mm3 \n\t"
00230 "psubd %%mm7, %%mm4 \n\t"
00231 "psubd %%mm7, %%mm5 \n\t"
00232 "packssdw %%mm1, %%mm0 \n\t"
00233 "packssdw %%mm3, %%mm2 \n\t"
00234 "packssdw %%mm5, %%mm4 \n\t"
00235 "movq %%mm0, (%0, %%edi) \n\t"
00236 "movq %%mm2, 8(%0, %%edi) \n\t"
00237 "movq %%mm4, 16(%0, %%edi) \n\t"
00238
00239 "movd 3080(%1, %%esi), %%mm0 \n\t"
00240 "punpckldq 4104(%1, %%esi), %%mm0\n\t"
00241 "movd 1032(%1, %%esi), %%mm1 \n\t"
00242 "punpckldq 12(%1, %%esi), %%mm1\n\t"
00243 "movd 2060(%1, %%esi), %%mm2 \n\t"
00244 "punpckldq 3084(%1, %%esi), %%mm2\n\t"
00245 "movd 4108(%1, %%esi), %%mm3 \n\t"
00246 "punpckldq 1036(%1, %%esi), %%mm3\n\t"
00247 "psubd %%mm7, %%mm0 \n\t"
00248 "psubd %%mm7, %%mm1 \n\t"
00249 "psubd %%mm7, %%mm2 \n\t"
00250 "psubd %%mm7, %%mm3 \n\t"
00251 "packssdw %%mm1, %%mm0 \n\t"
00252 "packssdw %%mm3, %%mm2 \n\t"
00253 "movq %%mm0, 24(%0, %%edi) \n\t"
00254 "movq %%mm2, 32(%0, %%edi) \n\t"
00255
00256 "addl $16, %%esi \n\t"
00257 " jnz 1b \n\t"
00258 "emms \n\t"
00259 :: "r" (s16+1280), "r" (f+256)
00260 :"%esi", "%edi", "memory"
00261 );
00262 return 5*256;
00263 }
00264
00265 static int a52_resample_MONO_LFE_to_6_MMX(float * _f, int16_t * s16){
00266 int32_t * f = (int32_t *) _f;
00267 asm volatile(
00268 "movl $-1024, %%esi \n\t"
00269 "movq "MANGLE(magicF2W)", %%mm7 \n\t"
00270 "pxor %%mm6, %%mm6 \n\t"
00271 "1: \n\t"
00272 "movq 1024(%1, %%esi), %%mm0 \n\t"
00273 "movq 1032(%1, %%esi), %%mm1 \n\t"
00274 "movq (%1, %%esi), %%mm2 \n\t"
00275 "movq 8(%1, %%esi), %%mm3 \n\t"
00276 "psubd %%mm7, %%mm0 \n\t"
00277 "psubd %%mm7, %%mm1 \n\t"
00278 "psubd %%mm7, %%mm2 \n\t"
00279 "psubd %%mm7, %%mm3 \n\t"
00280 "packssdw %%mm1, %%mm0 \n\t"
00281 "packssdw %%mm3, %%mm2 \n\t"
00282 "movq %%mm0, %%mm1 \n\t"
00283 "punpcklwd %%mm2, %%mm0 \n\t"
00284 "punpckhwd %%mm2, %%mm1 \n\t"
00285 "leal (%%esi, %%esi, 2), %%edi \n\t"
00286 "movq %%mm6, (%0, %%edi) \n\t"
00287 "movd %%mm0, 8(%0, %%edi) \n\t"
00288 "punpckhdq %%mm0, %%mm0 \n\t"
00289 "movq %%mm6, 12(%0, %%edi) \n\t"
00290 "movd %%mm0, 20(%0, %%edi) \n\t"
00291 "movq %%mm6, 24(%0, %%edi) \n\t"
00292 "movd %%mm1, 32(%0, %%edi) \n\t"
00293 "punpckhdq %%mm1, %%mm1 \n\t"
00294 "movq %%mm6, 36(%0, %%edi) \n\t"
00295 "movd %%mm1, 44(%0, %%edi) \n\t"
00296 "addl $16, %%esi \n\t"
00297 " jnz 1b \n\t"
00298 "emms \n\t"
00299 :: "r" (s16+1536), "r" (f+256)
00300 :"%esi", "%edi", "memory"
00301 );
00302 return 6*256;
00303 }
00304
00305 static int a52_resample_STEREO_LFE_to_6_MMX(float * _f, int16_t * s16){
00306 int32_t * f = (int32_t *) _f;
00307 asm volatile(
00308 "movl $-1024, %%esi \n\t"
00309 "movq "MANGLE(magicF2W)", %%mm7 \n\t"
00310 "pxor %%mm6, %%mm6 \n\t"
00311 "1: \n\t"
00312 "movq 1024(%1, %%esi), %%mm0 \n\t"
00313 "movq 2048(%1, %%esi), %%mm1 \n\t"
00314 "movq (%1, %%esi), %%mm5 \n\t"
00315 "psubd %%mm7, %%mm0 \n\t"
00316 "psubd %%mm7, %%mm1 \n\t"
00317 "psubd %%mm7, %%mm5 \n\t"
00318 "leal (%%esi, %%esi, 2), %%edi \n\t"
00319
00320 "pxor %%mm4, %%mm4 \n\t"
00321 "packssdw %%mm5, %%mm0 \n\t"
00322 "packssdw %%mm4, %%mm1 \n\t"
00323 "punpckhwd %%mm0, %%mm4 \n\t"
00324 "punpcklwd %%mm1, %%mm0 \n\t"
00325 "movq %%mm0, %%mm1 \n\t"
00326 "punpckldq %%mm4, %%mm3 \n\t"
00327 "punpckldq %%mm6, %%mm0 \n\t"
00328 "punpckhdq %%mm1, %%mm3 \n\t"
00329
00330 "movq %%mm0, (%0, %%edi) \n\t"
00331 "punpckhdq %%mm4, %%mm0 \n\t"
00332 "movq %%mm3, 8(%0, %%edi) \n\t"
00333 "movq %%mm0, 16(%0, %%edi) \n\t"
00334 "addl $8, %%esi \n\t"
00335 " jnz 1b \n\t"
00336 "emms \n\t"
00337 :: "r" (s16+1536), "r" (f+256)
00338 :"%esi", "%edi", "memory"
00339 );
00340 return 6*256;
00341 }
00342
00343 static int a52_resample_3F_LFE_to_6_MMX(float * _f, int16_t * s16){
00344 int32_t * f = (int32_t *) _f;
00345 asm volatile(
00346 "movl $-1024, %%esi \n\t"
00347 "movq "MANGLE(magicF2W)", %%mm7 \n\t"
00348 "pxor %%mm6, %%mm6 \n\t"
00349 "1: \n\t"
00350 "movq 1024(%1, %%esi), %%mm0 \n\t"
00351 "movq 3072(%1, %%esi), %%mm1 \n\t"
00352 "movq 2048(%1, %%esi), %%mm4 \n\t"
00353 "movq (%1, %%esi), %%mm5 \n\t"
00354 "psubd %%mm7, %%mm0 \n\t"
00355 "psubd %%mm7, %%mm1 \n\t"
00356 "psubd %%mm7, %%mm4 \n\t"
00357 "psubd %%mm7, %%mm5 \n\t"
00358 "leal (%%esi, %%esi, 2), %%edi \n\t"
00359
00360 "packssdw %%mm4, %%mm0 \n\t"
00361 "packssdw %%mm5, %%mm1 \n\t"
00362 "movq %%mm0, %%mm2 \n\t"
00363 "punpcklwd %%mm1, %%mm0 \n\t"
00364 "punpckhwd %%mm1, %%mm2 \n\t"
00365 "movq %%mm0, %%mm1 \n\t"
00366 "punpckldq %%mm6, %%mm0 \n\t"
00367 "punpckhdq %%mm1, %%mm1 \n\t"
00368
00369 "movq %%mm0, (%0, %%edi) \n\t"
00370 "punpckhdq %%mm2, %%mm0 \n\t"
00371 "punpckldq %%mm1, %%mm2 \n\t"
00372 "movq %%mm2, 8(%0, %%edi) \n\t"
00373 "movq %%mm0, 16(%0, %%edi) \n\t"
00374 "addl $8, %%esi \n\t"
00375 " jnz 1b \n\t"
00376 "emms \n\t"
00377 :: "r" (s16+1536), "r" (f+256)
00378 :"%esi", "%edi", "memory"
00379 );
00380 return 6*256;
00381 }
00382
00383 static int a52_resample_2F_2R_LFE_to_6_MMX(float * _f, int16_t * s16){
00384 int32_t * f = (int32_t *) _f;
00385 asm volatile(
00386 "movl $-1024, %%esi \n\t"
00387 "movq "MANGLE(magicF2W)", %%mm7 \n\t"
00388
00389 "1: \n\t"
00390 "movq 1024(%1, %%esi), %%mm0 \n\t"
00391 "movq 2048(%1, %%esi), %%mm1 \n\t"
00392 "movq 3072(%1, %%esi), %%mm2 \n\t"
00393 "movq 4096(%1, %%esi), %%mm3 \n\t"
00394 "movq (%1, %%esi), %%mm5 \n\t"
00395 "psubd %%mm7, %%mm0 \n\t"
00396 "psubd %%mm7, %%mm1 \n\t"
00397 "psubd %%mm7, %%mm2 \n\t"
00398 "psubd %%mm7, %%mm3 \n\t"
00399 "psubd %%mm7, %%mm5 \n\t"
00400 "leal (%%esi, %%esi, 2), %%edi \n\t"
00401
00402 "packssdw %%mm2, %%mm0 \n\t"
00403 "packssdw %%mm3, %%mm1 \n\t"
00404 "packssdw %%mm5, %%mm5 \n\t"
00405 "movq %%mm0, %%mm2 \n\t"
00406 "punpcklwd %%mm1, %%mm0 \n\t"
00407 "punpckhwd %%mm1, %%mm2 \n\t"
00408 "pxor %%mm4, %%mm4 \n\t"
00409 "punpcklwd %%mm5, %%mm4 \n\t"
00410 "movq %%mm0, %%mm1 \n\t"
00411 "movq %%mm4, %%mm3 \n\t"
00412 "punpckldq %%mm2, %%mm0 \n\t"
00413 "punpckhdq %%mm1, %%mm1 \n\t"
00414 "punpckldq %%mm1, %%mm4 \n\t"
00415 "punpckhdq %%mm3, %%mm2 \n\t"
00416
00417 "movq %%mm0, (%0, %%edi) \n\t"
00418 "movq %%mm4, 8(%0, %%edi) \n\t"
00419 "movq %%mm2, 16(%0, %%edi) \n\t"
00420 "addl $8, %%esi \n\t"
00421 " jnz 1b \n\t"
00422 "emms \n\t"
00423 :: "r" (s16+1536), "r" (f+256)
00424 :"%esi", "%edi", "memory"
00425 );
00426 return 6*256;
00427 }
00428
00429 static int a52_resample_3F_2R_LFE_to_6_MMX(float * _f, int16_t * s16){
00430 int32_t * f = (int32_t *) _f;
00431 asm volatile(
00432 "movl $-1024, %%esi \n\t"
00433 "movq "MANGLE(magicF2W)", %%mm7 \n\t"
00434
00435 "1: \n\t"
00436 "movq 1024(%1, %%esi), %%mm0 \n\t"
00437 "movq 3072(%1, %%esi), %%mm1 \n\t"
00438 "movq 4096(%1, %%esi), %%mm2 \n\t"
00439 "movq 5120(%1, %%esi), %%mm3 \n\t"
00440 "movq 2048(%1, %%esi), %%mm4 \n\t"
00441 "movq (%1, %%esi), %%mm5 \n\t"
00442 "psubd %%mm7, %%mm0 \n\t"
00443 "psubd %%mm7, %%mm1 \n\t"
00444 "psubd %%mm7, %%mm2 \n\t"
00445 "psubd %%mm7, %%mm3 \n\t"
00446 "psubd %%mm7, %%mm4 \n\t"
00447 "psubd %%mm7, %%mm5 \n\t"
00448 "leal (%%esi, %%esi, 2), %%edi \n\t"
00449
00450 "packssdw %%mm2, %%mm0 \n\t"
00451 "packssdw %%mm3, %%mm1 \n\t"
00452 "packssdw %%mm4, %%mm4 \n\t"
00453 "packssdw %%mm5, %%mm5 \n\t"
00454 "movq %%mm0, %%mm2 \n\t"
00455 "punpcklwd %%mm1, %%mm0 \n\t"
00456 "punpckhwd %%mm1, %%mm2 \n\t"
00457 "punpcklwd %%mm5, %%mm4 \n\t"
00458 "movq %%mm0, %%mm1 \n\t"
00459 "movq %%mm4, %%mm3 \n\t"
00460 "punpckldq %%mm2, %%mm0 \n\t"
00461 "punpckhdq %%mm1, %%mm1 \n\t"
00462 "punpckldq %%mm1, %%mm4 \n\t"
00463 "punpckhdq %%mm3, %%mm2 \n\t"
00464
00465 "movq %%mm0, (%0, %%edi) \n\t"
00466 "movq %%mm4, 8(%0, %%edi) \n\t"
00467 "movq %%mm2, 16(%0, %%edi) \n\t"
00468 "addl $8, %%esi \n\t"
00469 " jnz 1b \n\t"
00470 "emms \n\t"
00471 :: "r" (s16+1536), "r" (f+256)
00472 :"%esi", "%edi", "memory"
00473 );
00474 return 6*256;
00475 }
00476
00477
00478 static void* a52_resample_MMX(int flags, int ch){
00479 switch (flags) {
00480 case A52_MONO:
00481 if(ch==5) return a52_resample_MONO_to_5_MMX;
00482 break;
00483 case A52_CHANNEL:
00484 case A52_STEREO:
00485 case A52_DOLBY:
00486 if(ch==2) return a52_resample_STEREO_to_2_MMX;
00487 break;
00488 case A52_3F:
00489 if(ch==5) return a52_resample_3F_to_5_MMX;
00490 break;
00491 case A52_2F2R:
00492 if(ch==4) return a52_resample_2F_2R_to_4_MMX;
00493 break;
00494 case A52_3F2R:
00495 if(ch==5) return a52_resample_3F_2R_to_5_MMX;
00496 break;
00497 case A52_MONO | A52_LFE:
00498 if(ch==6) return a52_resample_MONO_LFE_to_6_MMX;
00499 break;
00500 case A52_CHANNEL | A52_LFE:
00501 case A52_STEREO | A52_LFE:
00502 case A52_DOLBY | A52_LFE:
00503 if(ch==6) return a52_resample_STEREO_LFE_to_6_MMX;
00504 break;
00505 case A52_3F | A52_LFE:
00506 if(ch==6) return a52_resample_3F_LFE_to_6_MMX;
00507 break;
00508 case A52_2F2R | A52_LFE:
00509 if(ch==6) return a52_resample_2F_2R_LFE_to_6_MMX;
00510 break;
00511 case A52_3F2R | A52_LFE:
00512 if(ch==6) return a52_resample_3F_2R_LFE_to_6_MMX;
00513 break;
00514 }
00515 return NULL;
00516 }
00517
00518