resample_mmx.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:15k
源码类别:

Windows CE

开发平台:

C/C++

  1. // MMX optimizations from Michael Niedermayer (michaelni@gmx.at) (under GPL)
  2. /* optimization TODO / NOTES 
  3.     movntq is slightly faster (0.5% with the current test.c benchmark) 
  4. (but thats just test.c so that needs to be testd in reallity)
  5. and it would mean (C / MMX2 / MMX / 3DNOW) versions 
  6. */
  7. static uint64_t __attribute__((aligned(8))) magicF2W= 0x43c0000043c00000LL;
  8. static uint64_t __attribute__((aligned(8))) wm1010= 0xFFFF0000FFFF0000LL;
  9. static uint64_t __attribute__((aligned(8))) wm0101= 0x0000FFFF0000FFFFLL;
  10. static uint64_t __attribute__((aligned(8))) wm1100= 0xFFFFFFFF00000000LL;
  11. static int a52_resample_MONO_to_5_MMX(float * _f, int16_t * s16){
  12.     int32_t * f = (int32_t *) _f;
  13. asm volatile(
  14. "movl $-512, %%esi nt"
  15. "movq "MANGLE(magicF2W)", %%mm7 nt"
  16. "movq "MANGLE(wm1100)", %%mm3 nt"
  17. "movq "MANGLE(wm0101)", %%mm4 nt"
  18. "movq "MANGLE(wm1010)", %%mm5 nt"
  19. "pxor %%mm6, %%mm6 nt"
  20. "1: nt"
  21. "movq (%1, %%esi, 2), %%mm0 nt"
  22. "movq 8(%1, %%esi, 2), %%mm1 nt"
  23. "leal (%%esi, %%esi, 4), %%edi nt"
  24. "psubd %%mm7, %%mm0 nt"
  25. "psubd %%mm7, %%mm1 nt"
  26. "packssdw %%mm1, %%mm0 nt"
  27. "movq %%mm0, %%mm1 nt"
  28. "pand %%mm4, %%mm0 nt"
  29. "pand %%mm5, %%mm1 nt"
  30. "movq %%mm6, (%0, %%edi) nt" // 0 0 0 0
  31. "movd %%mm0, 8(%0, %%edi) nt" // A 0
  32. "pand %%mm3, %%mm0 nt"
  33. "movd %%mm6, 12(%0, %%edi) nt" // 0 0
  34. "movd %%mm1, 16(%0, %%edi) nt" // 0 B
  35. "pand %%mm3, %%mm1 nt"
  36. "movd %%mm6, 20(%0, %%edi) nt" // 0 0
  37. "movq %%mm0, 24(%0, %%edi) nt" // 0 0 C 0
  38. "movq %%mm1, 32(%0, %%edi) nt" // 0 0 0 B
  39. "addl $8, %%esi nt"
  40. " jnz 1b nt"
  41. "emms nt"
  42. :: "r" (s16+1280), "r" (f+256)
  43. :"%esi", "%edi", "memory"
  44. );
  45.     return 5*256;
  46. }
  47. static int a52_resample_STEREO_to_2_MMX(float * _f, int16_t * s16){
  48.     int32_t * f = (int32_t *) _f;
  49. /* benchmark scores are 0.3% better with SSE but we would need to set bias=0 and premultiply it
  50. #ifdef HAVE_SSE
  51. asm volatile(
  52. "movl $-1024, %%esi nt"
  53. "1: nt"
  54. "cvtps2pi (%1, %%esi), %%mm0 nt"
  55. "cvtps2pi 1024(%1, %%esi), %%mm2nt"
  56. "movq %%mm0, %%mm1 nt"
  57. "punpcklwd %%mm2, %%mm0 nt"
  58. "punpckhwd %%mm2, %%mm1 nt"
  59. "movq %%mm0, (%0, %%esi) nt"
  60. "movq %%mm1, 8(%0, %%esi) nt"
  61. "addl $16, %%esi nt"
  62. " jnz 1b nt"
  63. "emms nt"
  64. :: "r" (s16+512), "r" (f+256)
  65. :"%esi", "memory"
  66. );*/
  67. asm volatile(
  68. "movl $-1024, %%esi nt"
  69. "movq "MANGLE(magicF2W)", %%mm7 nt"
  70. "1: nt"
  71. "movq (%1, %%esi), %%mm0 nt"
  72. "movq 8(%1, %%esi), %%mm1 nt"
  73. "movq 1024(%1, %%esi), %%mm2 nt"
  74. "movq 1032(%1, %%esi), %%mm3 nt"
  75. "psubd %%mm7, %%mm0 nt"
  76. "psubd %%mm7, %%mm1 nt"
  77. "psubd %%mm7, %%mm2 nt"
  78. "psubd %%mm7, %%mm3 nt"
  79. "packssdw %%mm1, %%mm0 nt"
  80. "packssdw %%mm3, %%mm2 nt"
  81. "movq %%mm0, %%mm1 nt"
  82. "punpcklwd %%mm2, %%mm0 nt"
  83. "punpckhwd %%mm2, %%mm1 nt"
  84. "movq %%mm0, (%0, %%esi) nt"
  85. "movq %%mm1, 8(%0, %%esi) nt"
  86. "addl $16, %%esi nt"
  87. " jnz 1b nt"
  88. "emms nt"
  89. :: "r" (s16+512), "r" (f+256)
  90. :"%esi", "memory"
  91. );
  92.     return 2*256;
  93. }
  94. static int a52_resample_3F_to_5_MMX(float * _f, int16_t * s16){
  95.     int32_t * f = (int32_t *) _f;
  96. asm volatile(
  97. "movl $-1024, %%esi nt"
  98. "movq "MANGLE(magicF2W)", %%mm7 nt"
  99. "pxor %%mm6, %%mm6 nt"
  100. "movq %%mm7, %%mm5 nt"
  101. "punpckldq %%mm6, %%mm5 nt"
  102. "1: nt"
  103. "movd (%1, %%esi), %%mm0 nt"
  104. "punpckldq 2048(%1, %%esi), %%mm0nt"
  105. "movd 1024(%1, %%esi), %%mm1 nt"
  106. "punpckldq 4(%1, %%esi), %%mm1 nt"
  107. "movd 2052(%1, %%esi), %%mm2 nt"
  108. "movq %%mm7, %%mm3 nt"
  109. "punpckldq 1028(%1, %%esi), %%mm3nt"
  110. "movd 8(%1, %%esi), %%mm4 nt"
  111. "punpckldq 2056(%1, %%esi), %%mm4nt"
  112. "leal (%%esi, %%esi, 4), %%edi nt"
  113. "sarl $1, %%edi nt"
  114. "psubd %%mm7, %%mm0 nt"
  115. "psubd %%mm7, %%mm1 nt"
  116. "psubd %%mm5, %%mm2 nt"
  117. "psubd %%mm7, %%mm3 nt"
  118. "psubd %%mm7, %%mm4 nt"
  119. "packssdw %%mm6, %%mm0 nt"
  120. "packssdw %%mm2, %%mm1 nt"
  121. "packssdw %%mm4, %%mm3 nt"
  122. "movq %%mm0, (%0, %%edi) nt"
  123. "movq %%mm1, 8(%0, %%edi) nt"
  124. "movq %%mm3, 16(%0, %%edi) nt"
  125. "movd 1032(%1, %%esi), %%mm1 nt"
  126. "punpckldq 12(%1, %%esi), %%mm1nt"
  127. "movd 2060(%1, %%esi), %%mm2 nt"
  128. "movq %%mm7, %%mm3 nt"
  129. "punpckldq 1036(%1, %%esi), %%mm3nt"
  130. "pxor %%mm0, %%mm0 nt"
  131. "psubd %%mm7, %%mm1 nt"
  132. "psubd %%mm5, %%mm2 nt"
  133. "psubd %%mm7, %%mm3 nt"
  134. "packssdw %%mm1, %%mm0 nt"
  135. "packssdw %%mm3, %%mm2 nt"
  136. "movq %%mm0, 24(%0, %%edi) nt"
  137. "movq %%mm2, 32(%0, %%edi) nt"
  138. "addl $16, %%esi nt"
  139. " jnz 1b nt"
  140. "emms nt"
  141. :: "r" (s16+1280), "r" (f+256)
  142. :"%esi", "%edi", "memory"
  143. );
  144.     return 5*256;
  145. }
  146. static int a52_resample_2F_2R_to_4_MMX(float * _f, int16_t * s16){
  147.     int32_t * f = (int32_t *) _f;
  148. asm volatile(
  149. "movl $-1024, %%esi nt"
  150. "movq "MANGLE(magicF2W)", %%mm7 nt"
  151. "1: nt"
  152. "movq (%1, %%esi), %%mm0 nt"
  153. "movq 8(%1, %%esi), %%mm1 nt"
  154. "movq 1024(%1, %%esi), %%mm2 nt"
  155. "movq 1032(%1, %%esi), %%mm3 nt"
  156. "psubd %%mm7, %%mm0 nt"
  157. "psubd %%mm7, %%mm1 nt"
  158. "psubd %%mm7, %%mm2 nt"
  159. "psubd %%mm7, %%mm3 nt"
  160. "packssdw %%mm1, %%mm0 nt"
  161. "packssdw %%mm3, %%mm2 nt"
  162. "movq 2048(%1, %%esi), %%mm3 nt"
  163. "movq 2056(%1, %%esi), %%mm4 nt"
  164. "movq 3072(%1, %%esi), %%mm5 nt"
  165. "movq 3080(%1, %%esi), %%mm6 nt"
  166. "psubd %%mm7, %%mm3 nt"
  167. "psubd %%mm7, %%mm4 nt"
  168. "psubd %%mm7, %%mm5 nt"
  169. "psubd %%mm7, %%mm6 nt"
  170. "packssdw %%mm4, %%mm3 nt"
  171. "packssdw %%mm6, %%mm5 nt"
  172. "movq %%mm0, %%mm1 nt"
  173. "movq %%mm3, %%mm4 nt"
  174. "punpcklwd %%mm2, %%mm0 nt"
  175. "punpckhwd %%mm2, %%mm1 nt"
  176. "punpcklwd %%mm5, %%mm3 nt"
  177. "punpckhwd %%mm5, %%mm4 nt"
  178. "movq %%mm0, %%mm2 nt"
  179. "movq %%mm1, %%mm5 nt"
  180. "punpckldq %%mm3, %%mm0 nt"
  181. "punpckhdq %%mm3, %%mm2 nt"
  182. "punpckldq %%mm4, %%mm1 nt"
  183. "punpckhdq %%mm4, %%mm5 nt"
  184. "movq %%mm0, (%0, %%esi,2) nt"
  185. "movq %%mm2, 8(%0, %%esi,2) nt"
  186. "movq %%mm1, 16(%0, %%esi,2) nt"
  187. "movq %%mm5, 24(%0, %%esi,2) nt"
  188. "addl $16, %%esi nt"
  189. " jnz 1b nt"
  190. "emms nt"
  191. :: "r" (s16+1024), "r" (f+256)
  192. :"%esi", "memory"
  193. );
  194.     return 4*256;
  195. }
  196. static int a52_resample_3F_2R_to_5_MMX(float * _f, int16_t * s16){
  197.     int32_t * f = (int32_t *) _f;
  198. asm volatile(
  199. "movl $-1024, %%esi nt"
  200. "movq "MANGLE(magicF2W)", %%mm7 nt"
  201. "1: nt"
  202. "movd (%1, %%esi), %%mm0 nt"
  203. "punpckldq 2048(%1, %%esi), %%mm0nt"
  204. "movd 3072(%1, %%esi), %%mm1 nt"
  205. "punpckldq 4096(%1, %%esi), %%mm1nt"
  206. "movd 1024(%1, %%esi), %%mm2 nt"
  207. "punpckldq 4(%1, %%esi), %%mm2 nt"
  208. "movd 2052(%1, %%esi), %%mm3 nt"
  209. "punpckldq 3076(%1, %%esi), %%mm3nt"
  210. "movd 4100(%1, %%esi), %%mm4 nt"
  211. "punpckldq 1028(%1, %%esi), %%mm4nt"
  212. "movd 8(%1, %%esi), %%mm5 nt"
  213. "punpckldq 2056(%1, %%esi), %%mm5nt"
  214. "leal (%%esi, %%esi, 4), %%edi nt"
  215. "sarl $1, %%edi nt"
  216. "psubd %%mm7, %%mm0 nt"
  217. "psubd %%mm7, %%mm1 nt"
  218. "psubd %%mm7, %%mm2 nt"
  219. "psubd %%mm7, %%mm3 nt"
  220. "psubd %%mm7, %%mm4 nt"
  221. "psubd %%mm7, %%mm5 nt"
  222. "packssdw %%mm1, %%mm0 nt"
  223. "packssdw %%mm3, %%mm2 nt"
  224. "packssdw %%mm5, %%mm4 nt"
  225. "movq %%mm0, (%0, %%edi) nt"
  226. "movq %%mm2, 8(%0, %%edi) nt"
  227. "movq %%mm4, 16(%0, %%edi) nt"
  228. "movd 3080(%1, %%esi), %%mm0 nt"
  229. "punpckldq 4104(%1, %%esi), %%mm0nt"
  230. "movd 1032(%1, %%esi), %%mm1 nt"
  231. "punpckldq 12(%1, %%esi), %%mm1nt"
  232. "movd 2060(%1, %%esi), %%mm2 nt"
  233. "punpckldq 3084(%1, %%esi), %%mm2nt"
  234. "movd 4108(%1, %%esi), %%mm3 nt"
  235. "punpckldq 1036(%1, %%esi), %%mm3nt"
  236. "psubd %%mm7, %%mm0 nt"
  237. "psubd %%mm7, %%mm1 nt"
  238. "psubd %%mm7, %%mm2 nt"
  239. "psubd %%mm7, %%mm3 nt"
  240. "packssdw %%mm1, %%mm0 nt"
  241. "packssdw %%mm3, %%mm2 nt"
  242. "movq %%mm0, 24(%0, %%edi) nt"
  243. "movq %%mm2, 32(%0, %%edi) nt"
  244. "addl $16, %%esi nt"
  245. " jnz 1b nt"
  246. "emms nt"
  247. :: "r" (s16+1280), "r" (f+256)
  248. :"%esi", "%edi", "memory"
  249. );
  250.     return 5*256;
  251. }
  252. static int a52_resample_MONO_LFE_to_6_MMX(float * _f, int16_t * s16){
  253.     int32_t * f = (int32_t *) _f;
  254. asm volatile(
  255. "movl $-1024, %%esi nt"
  256. "movq "MANGLE(magicF2W)", %%mm7 nt"
  257. "pxor %%mm6, %%mm6 nt"
  258. "1: nt"
  259. "movq 1024(%1, %%esi), %%mm0 nt"
  260. "movq 1032(%1, %%esi), %%mm1 nt"
  261. "movq (%1, %%esi), %%mm2 nt"
  262. "movq 8(%1, %%esi), %%mm3 nt"
  263. "psubd %%mm7, %%mm0 nt"
  264. "psubd %%mm7, %%mm1 nt"
  265. "psubd %%mm7, %%mm2 nt"
  266. "psubd %%mm7, %%mm3 nt"
  267. "packssdw %%mm1, %%mm0 nt"
  268. "packssdw %%mm3, %%mm2 nt"
  269. "movq %%mm0, %%mm1 nt"
  270. "punpcklwd %%mm2, %%mm0 nt"
  271. "punpckhwd %%mm2, %%mm1 nt"
  272. "leal (%%esi, %%esi, 2), %%edi nt"
  273. "movq %%mm6, (%0, %%edi) nt"
  274. "movd %%mm0, 8(%0, %%edi) nt"
  275. "punpckhdq %%mm0, %%mm0 nt"
  276. "movq %%mm6, 12(%0, %%edi) nt"
  277. "movd %%mm0, 20(%0, %%edi) nt"
  278. "movq %%mm6, 24(%0, %%edi) nt"
  279. "movd %%mm1, 32(%0, %%edi) nt"
  280. "punpckhdq %%mm1, %%mm1 nt"
  281. "movq %%mm6, 36(%0, %%edi) nt"
  282. "movd %%mm1, 44(%0, %%edi) nt"
  283. "addl $16, %%esi nt"
  284. " jnz 1b nt"
  285. "emms nt"
  286. :: "r" (s16+1536), "r" (f+256)
  287. :"%esi", "%edi", "memory"
  288. );
  289.     return 6*256;
  290. }
  291. static int a52_resample_STEREO_LFE_to_6_MMX(float * _f, int16_t * s16){
  292.     int32_t * f = (int32_t *) _f;
  293. asm volatile(
  294. "movl $-1024, %%esi nt"
  295. "movq "MANGLE(magicF2W)", %%mm7 nt"
  296. "pxor %%mm6, %%mm6 nt"
  297. "1: nt"
  298. "movq 1024(%1, %%esi), %%mm0 nt"
  299. "movq 2048(%1, %%esi), %%mm1 nt"
  300. "movq (%1, %%esi), %%mm5 nt" 
  301. "psubd %%mm7, %%mm0 nt"
  302. "psubd %%mm7, %%mm1 nt"
  303. "psubd %%mm7, %%mm5 nt"
  304. "leal (%%esi, %%esi, 2), %%edi nt"
  305. "pxor %%mm4, %%mm4 nt"
  306. "packssdw %%mm5, %%mm0 nt" // FfAa
  307. "packssdw %%mm4, %%mm1 nt" // 00Bb
  308. "punpckhwd %%mm0, %%mm4 nt" // F0f0
  309. "punpcklwd %%mm1, %%mm0 nt" // BAba
  310. "movq %%mm0, %%mm1 nt" // BAba
  311. "punpckldq %%mm4, %%mm3 nt" // f0XX
  312. "punpckldq %%mm6, %%mm0 nt" // 00ba
  313. "punpckhdq %%mm1, %%mm3 nt" // BAf0
  314. "movq %%mm0, (%0, %%edi) nt" // 00ba
  315. "punpckhdq %%mm4, %%mm0 nt" // F000
  316. "movq %%mm3, 8(%0, %%edi) nt" // BAf0
  317. "movq %%mm0, 16(%0, %%edi) nt" // F000
  318. "addl $8, %%esi nt"
  319. " jnz 1b nt"
  320. "emms nt"
  321. :: "r" (s16+1536), "r" (f+256)
  322. :"%esi", "%edi", "memory"
  323. );
  324.     return 6*256;
  325. }
  326. static int a52_resample_3F_LFE_to_6_MMX(float * _f, int16_t * s16){
  327.     int32_t * f = (int32_t *) _f;
  328. asm volatile(
  329. "movl $-1024, %%esi nt"
  330. "movq "MANGLE(magicF2W)", %%mm7 nt"
  331. "pxor %%mm6, %%mm6 nt"
  332. "1: nt"
  333. "movq 1024(%1, %%esi), %%mm0 nt"
  334. "movq 3072(%1, %%esi), %%mm1 nt"
  335. "movq 2048(%1, %%esi), %%mm4 nt"
  336. "movq (%1, %%esi), %%mm5 nt" 
  337. "psubd %%mm7, %%mm0 nt"
  338. "psubd %%mm7, %%mm1 nt"
  339. "psubd %%mm7, %%mm4 nt"
  340. "psubd %%mm7, %%mm5 nt"
  341. "leal (%%esi, %%esi, 2), %%edi nt"
  342. "packssdw %%mm4, %%mm0 nt" // EeAa
  343. "packssdw %%mm5, %%mm1 nt" // FfBb
  344. "movq %%mm0, %%mm2 nt" // EeAa
  345. "punpcklwd %%mm1, %%mm0 nt" // BAba
  346. "punpckhwd %%mm1, %%mm2 nt" // FEfe
  347. "movq %%mm0, %%mm1 nt" // BAba
  348. "punpckldq %%mm6, %%mm0 nt" // 00ba
  349. "punpckhdq %%mm1, %%mm1 nt" // BABA
  350. "movq %%mm0, (%0, %%edi) nt"
  351. "punpckhdq %%mm2, %%mm0 nt" // FE00
  352. "punpckldq %%mm1, %%mm2 nt" // BAfe
  353. "movq %%mm2, 8(%0, %%edi) nt"
  354. "movq %%mm0, 16(%0, %%edi) nt"
  355. "addl $8, %%esi nt"
  356. " jnz 1b nt"
  357. "emms nt"
  358. :: "r" (s16+1536), "r" (f+256)
  359. :"%esi", "%edi", "memory"
  360. );
  361.     return 6*256;
  362. }
  363. static int a52_resample_2F_2R_LFE_to_6_MMX(float * _f, int16_t * s16){
  364.     int32_t * f = (int32_t *) _f;
  365. asm volatile(
  366. "movl $-1024, %%esi nt"
  367. "movq "MANGLE(magicF2W)", %%mm7 nt"
  368. // "pxor %%mm6, %%mm6 nt"
  369. "1: nt"
  370. "movq 1024(%1, %%esi), %%mm0 nt"
  371. "movq 2048(%1, %%esi), %%mm1 nt"
  372. "movq 3072(%1, %%esi), %%mm2 nt"
  373. "movq 4096(%1, %%esi), %%mm3 nt"
  374. "movq (%1, %%esi), %%mm5 nt" 
  375. "psubd %%mm7, %%mm0 nt"
  376. "psubd %%mm7, %%mm1 nt"
  377. "psubd %%mm7, %%mm2 nt"
  378. "psubd %%mm7, %%mm3 nt"
  379. "psubd %%mm7, %%mm5 nt"
  380. "leal (%%esi, %%esi, 2), %%edi nt"
  381. "packssdw %%mm2, %%mm0 nt" // CcAa
  382. "packssdw %%mm3, %%mm1 nt" // DdBb
  383. "packssdw %%mm5, %%mm5 nt" // FfFf
  384. "movq %%mm0, %%mm2 nt" // CcAa
  385. "punpcklwd %%mm1, %%mm0 nt" // BAba
  386. "punpckhwd %%mm1, %%mm2 nt" // DCdc
  387. "pxor %%mm4, %%mm4 nt" // 0000
  388. "punpcklwd %%mm5, %%mm4 nt" // F0f0
  389. "movq %%mm0, %%mm1 nt" // BAba
  390. "movq %%mm4, %%mm3 nt" // F0f0
  391. "punpckldq %%mm2, %%mm0 nt" // dcba
  392. "punpckhdq %%mm1, %%mm1 nt" // BABA
  393. "punpckldq %%mm1, %%mm4 nt" // BAf0
  394. "punpckhdq %%mm3, %%mm2 nt" // F0DC
  395. "movq %%mm0, (%0, %%edi) nt"
  396. "movq %%mm4, 8(%0, %%edi) nt"
  397. "movq %%mm2, 16(%0, %%edi) nt"
  398. "addl $8, %%esi nt"
  399. " jnz 1b nt"
  400. "emms nt"
  401. :: "r" (s16+1536), "r" (f+256)
  402. :"%esi", "%edi", "memory"
  403. );
  404.     return 6*256;
  405. }
  406. static int a52_resample_3F_2R_LFE_to_6_MMX(float * _f, int16_t * s16){
  407.     int32_t * f = (int32_t *) _f;
  408. asm volatile(
  409. "movl $-1024, %%esi nt"
  410. "movq "MANGLE(magicF2W)", %%mm7 nt"
  411. // "pxor %%mm6, %%mm6 nt"
  412. "1: nt"
  413. "movq 1024(%1, %%esi), %%mm0 nt"
  414. "movq 3072(%1, %%esi), %%mm1 nt"
  415. "movq 4096(%1, %%esi), %%mm2 nt"
  416. "movq 5120(%1, %%esi), %%mm3 nt"
  417. "movq 2048(%1, %%esi), %%mm4 nt"
  418. "movq (%1, %%esi), %%mm5 nt" 
  419. "psubd %%mm7, %%mm0 nt"
  420. "psubd %%mm7, %%mm1 nt"
  421. "psubd %%mm7, %%mm2 nt"
  422. "psubd %%mm7, %%mm3 nt"
  423. "psubd %%mm7, %%mm4 nt"
  424. "psubd %%mm7, %%mm5 nt"
  425. "leal (%%esi, %%esi, 2), %%edi nt"
  426. "packssdw %%mm2, %%mm0 nt" // CcAa
  427. "packssdw %%mm3, %%mm1 nt" // DdBb
  428. "packssdw %%mm4, %%mm4 nt" // EeEe
  429. "packssdw %%mm5, %%mm5 nt" // FfFf
  430. "movq %%mm0, %%mm2 nt" // CcAa
  431. "punpcklwd %%mm1, %%mm0 nt" // BAba
  432. "punpckhwd %%mm1, %%mm2 nt" // DCdc
  433. "punpcklwd %%mm5, %%mm4 nt" // FEfe
  434. "movq %%mm0, %%mm1 nt" // BAba
  435. "movq %%mm4, %%mm3 nt" // FEfe
  436. "punpckldq %%mm2, %%mm0 nt" // dcba
  437. "punpckhdq %%mm1, %%mm1 nt" // BABA
  438. "punpckldq %%mm1, %%mm4 nt" // BAfe
  439. "punpckhdq %%mm3, %%mm2 nt" // FEDC
  440. "movq %%mm0, (%0, %%edi) nt"
  441. "movq %%mm4, 8(%0, %%edi) nt"
  442. "movq %%mm2, 16(%0, %%edi) nt"
  443. "addl $8, %%esi nt"
  444. " jnz 1b nt"
  445. "emms nt"
  446. :: "r" (s16+1536), "r" (f+256)
  447. :"%esi", "%edi", "memory"
  448. );
  449.     return 6*256;
  450. }
  451. static void* a52_resample_MMX(int flags, int ch){
  452.     switch (flags) {
  453.     case A52_MONO:
  454. if(ch==5) return a52_resample_MONO_to_5_MMX;
  455. break;
  456.     case A52_CHANNEL:
  457.     case A52_STEREO:
  458.     case A52_DOLBY:
  459. if(ch==2) return a52_resample_STEREO_to_2_MMX;
  460. break;
  461.     case A52_3F:
  462. if(ch==5) return a52_resample_3F_to_5_MMX;
  463. break;
  464.     case A52_2F2R:
  465. if(ch==4) return a52_resample_2F_2R_to_4_MMX;
  466. break;
  467.     case A52_3F2R:
  468. if(ch==5) return a52_resample_3F_2R_to_5_MMX;
  469. break;
  470.     case A52_MONO | A52_LFE:
  471. if(ch==6) return a52_resample_MONO_LFE_to_6_MMX;
  472. break;
  473.     case A52_CHANNEL | A52_LFE:
  474.     case A52_STEREO | A52_LFE:
  475.     case A52_DOLBY | A52_LFE:
  476. if(ch==6) return a52_resample_STEREO_LFE_to_6_MMX;
  477. break;
  478.     case A52_3F | A52_LFE:
  479. if(ch==6) return a52_resample_3F_LFE_to_6_MMX;
  480. break;
  481.     case A52_2F2R | A52_LFE:
  482. if(ch==6) return a52_resample_2F_2R_LFE_to_6_MMX;
  483. break;
  484.     case A52_3F2R | A52_LFE:
  485. if(ch==6) return a52_resample_3F_2R_LFE_to_6_MMX;
  486. break;
  487.     }
  488.     return NULL;
  489. }