mmxidct.S
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:21k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * the input data is tranposed and each 16 bit element in the 8x8 matrix
  3.  * is left aligned:
  4.  * for example in 11...1110000 format
  5.  * If the iDCT is of I macroblock then 0.5 needs to be added to the;DC Component
  6.  * (element[0][0] of the matrix)
  7.  */
  8. /* extrn re_matrix */
  9. /* constants */
  10. .data
  11. .align 16
  12. .type  preSC, @object
  13. preSC:  .short  16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520
  14.         .short  22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270
  15.         .short  21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906
  16.         .short  19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315
  17.         .short  16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520
  18.         .short  12873, 17855, 16819, 15137, 25746, 20228, 13933, 7103
  19.         .short  17734, 24598, 23170, 20853, 17734, 13933, 9597, 4892
  20.         .short  18081, 25080, 23624, 21261, 18081, 14206, 9785, 4988
  21. .size preSC, 128
  22. .align  8
  23. .type x0005000200010001, @object
  24. .size x0005000200010001, 8
  25. x0005000200010001:
  26. .long 0x00010001, 0x00050002
  27. .align  8
  28. .type x0040000000000000, @object
  29. .size x0040000000000000, 8
  30. x0040000000000000:
  31. .long 0, 0x00400000
  32. .align  8
  33. .type x5a825a825a825a82, @object
  34. .size x5a825a825a825a82, 8
  35. x5a825a825a825a82:
  36. .long 0x5a825a82, 0x5a825a82
  37. .align  8
  38. .type x539f539f539f539f, @object
  39. .size x539f539f539f539f, 8
  40. x539f539f539f539f:
  41. .long 0x539f539f, 0x539f539f
  42. .align  8
  43. .type x4546454645464546, @object
  44. .size x4546454645464546, 8
  45. x4546454645464546:
  46. .long 0x45464546, 0x45464546
  47. .align  8
  48. .type x61f861f861f861f8, @object
  49. .size x61f861f861f861f8, 8
  50. x61f861f861f861f8:
  51. .long 0x61f861f8, 0x61f861f8
  52. /* Static variables */
  53. .align 8
  54. .type  x0, @object
  55. .size  x0, 8
  56. x0:
  57. .long 0, 0
  58. /* Procedure */
  59. .align 8
  60. .text
  61. .align 4
  62. .globl IDCT_mmx
  63. .type  IDCT_mmx, @function
  64. IDCT_mmx:
  65. pushl %ebp
  66. movl %esp, %ebp
  67. pushl %ebx
  68. pushl %ecx
  69. pushl %edx
  70. pushl %esi
  71. pushl %edi
  72. pushl $0    /* allocate the temp variables */
  73. pushl $0
  74. pushl $0
  75. pushl $0
  76. pushl $0
  77. pushl $0
  78. pushl $0
  79. pushl $0
  80. movl 8(%ebp), %esi /* source matrix */
  81. leal preSC, %ecx
  82. /* column 0: even part
  83.  * use V4, V12, V0, V8 to produce V22..V25
  84.  */
  85. movq 8*12(%ecx), %mm0 /* maybe the first mul can be done together */
  86. /* with the dequantization in iHuff module */
  87. pmulhw 8*12(%esi), %mm0 /* V12 */
  88. movq 8*4(%ecx), %mm1
  89. pmulhw 8*4(%esi), %mm1 /* V4 */
  90. movq (%ecx), %mm3
  91. psraw $1, %mm0 /* t64=t66 */
  92. pmulhw (%esi), %mm3 /* V0 */
  93. movq 8*8(%ecx), %mm5 /* duplicate V4 */
  94. movq %mm1, %mm2 /* added 11/1/96 */
  95. pmulhw 8*8(%esi),%mm5 /* V8 */
  96. psubsw %mm0, %mm1 /* V16 */
  97. pmulhw x5a825a825a825a82, %mm1 /* 23170 ->V18 */
  98. paddsw %mm0, %mm2 /* V17 */
  99. movq %mm2, %mm0 /* duplicate V17 */
  100. psraw $1, %mm2 /* t75=t82 */
  101. psraw $2, %mm0 /* t72 */
  102. movq %mm3, %mm4 /* duplicate V0 */
  103. paddsw %mm5, %mm3 /* V19 */
  104. psubsw %mm5, %mm4 /* V20 ;mm5 free */
  105. /* moved from the block below */
  106. movq 8*10(%ecx), %mm7
  107. psraw $1, %mm3 /* t74=t81 */
  108. movq %mm3, %mm6 /* duplicate t74=t81 */
  109. psraw $2, %mm4 /* t77=t79 */
  110. psubsw %mm0, %mm1 /* V21 ; mm0 free */
  111. paddsw %mm2, %mm3 /* V22 */
  112. movq %mm1, %mm5 /* duplicate V21 */
  113. paddsw %mm4, %mm1 /* V23 */
  114. movq %mm3, 8*4(%esi) /* V22 */
  115. psubsw %mm5, %mm4 /* V24; mm5 free */
  116. movq %mm1, 8*12(%esi) /* V23 */
  117. psubsw %mm2, %mm6 /* V25; mm2 free */
  118. movq %mm4, (%esi) /* V24 */
  119. /* keep mm6 alive all along the next block */
  120. /* movq %mm6, 8*8(%esi)  V25 */
  121. /* column 0: odd part
  122.  * use V2, V6, V10, V14 to produce V31, V39, V40, V41
  123.  */
  124. /* moved above: movq 8*10(%ecx), %mm7 */
  125. pmulhw 8*10(%esi), %mm7 /* V10 */
  126. movq 8*6(%ecx), %mm0
  127. pmulhw 8*6(%esi), %mm0 /* V6 */
  128. movq 8*2(%ecx), %mm5
  129. movq %mm7, %mm3 /* duplicate V10 */
  130. pmulhw 8*2(%esi), %mm5 /* V2 */
  131. movq 8*14(%ecx), %mm4
  132. psubsw %mm0, %mm7 /* V26 */
  133. pmulhw 8*14(%esi), %mm4 /* V14 */
  134. paddsw %mm0, %mm3 /* V29 ; free mm0 */
  135. movq %mm7, %mm1 /* duplicate V26 */
  136. psraw $1, %mm3 /* t91=t94 */
  137. pmulhw x539f539f539f539f,%mm7 /* V33 */
  138. psraw $1, %mm1 /* t96 */
  139. movq %mm5, %mm0 /* duplicate V2 */
  140. psraw $2, %mm4 /* t85=t87 */
  141. paddsw %mm4,%mm5 /* V27 */
  142. psubsw %mm4, %mm0 /* V28 ; free mm4 */
  143. movq %mm0, %mm2 /* duplicate V28 */
  144. psraw $1, %mm5 /* t90=t93 */
  145. pmulhw x4546454645464546,%mm0 /* V35 */
  146. psraw $1, %mm2 /* t97 */
  147. movq %mm5, %mm4 /* duplicate t90=t93 */
  148. psubsw %mm2, %mm1 /* V32 ; free mm2 */
  149. pmulhw x61f861f861f861f8,%mm1 /* V36 */
  150. psllw $1, %mm7 /* t107 */
  151. paddsw %mm3, %mm5 /* V31 */
  152. psubsw %mm3, %mm4 /* V30 ; free mm3 */
  153. pmulhw x5a825a825a825a82,%mm4 /* V34 */
  154. nop
  155. psubsw %mm1, %mm0 /* V38 */
  156. psubsw %mm7, %mm1 /* V37 ; free mm7 */
  157. psllw $1, %mm1 /* t114 */
  158. /* move from the next block */
  159. movq %mm6, %mm3 /* duplicate V25 */
  160. /* move from the next block */
  161. movq 8*4(%esi), %mm7 /* V22 */
  162. psllw $1, %mm0 /* t110 */
  163. psubsw %mm5, %mm0 /* V39 (mm5 needed for next block) */
  164. psllw $2, %mm4 /* t112 */
  165. /* moved from the next block */
  166. movq 8*12(%esi), %mm2 /* V23 */
  167. psubsw %mm0, %mm4 /* V40 */
  168. paddsw %mm4, %mm1 /* V41; free mm0 */
  169. /* moved from the next block */
  170. psllw $1, %mm2 /* t117=t125 */
  171. /* column 0: output butterfly */
  172. /* moved above:
  173.  * movq %mm6, %mm3 duplicate V25
  174.  * movq 8*4(%esi), %mm7 V22
  175.  * movq 8*12(%esi), %mm2 V23
  176.  * psllw $1, %mm2 t117=t125
  177.  */
  178. psubsw %mm1, %mm6 /* tm6 */
  179. paddsw %mm1, %mm3 /* tm8; free mm1 */
  180. movq %mm7, %mm1 /* duplicate V22 */
  181. paddsw %mm5, %mm7 /* tm0 */
  182. movq %mm3, 8*8(%esi) /* tm8; free mm3 */
  183. psubsw %mm5, %mm1 /* tm14; free mm5 */
  184. movq %mm6, 8*6(%esi) /* tm6; free mm6 */
  185. movq %mm2, %mm3 /* duplicate t117=t125 */
  186. movq (%esi), %mm6 /* V24 */
  187. paddsw %mm0, %mm2 /* tm2 */
  188. movq %mm7, (%esi) /* tm0; free mm7 */
  189. psubsw %mm0, %mm3 /* tm12; free mm0 */
  190. movq %mm1, 8*14(%esi) /* tm14; free mm1 */
  191. psllw $1, %mm6 /* t119=t123 */
  192. movq %mm2, 8*2(%esi) /* tm2; free mm2 */
  193. movq %mm6, %mm0 /* duplicate t119=t123 */
  194. movq %mm3, 8*12(%esi) /* tm12; free mm3 */
  195. paddsw %mm4, %mm6 /* tm4 */
  196. /* moved from next block */
  197. movq 8*5(%ecx), %mm1
  198. psubsw %mm4, %mm0 /* tm10; free mm4 */
  199. /* moved from next block */
  200. pmulhw 8*5(%esi), %mm1 /* V5 */
  201. movq %mm6, 8*4(%esi) /* tm4; free mm6 */
  202. movq %mm0, 8*10(%esi) /* tm10; free mm0 */
  203. /* column 1: even part
  204.  * use V5, V13, V1, V9 to produce V56..V59
  205.  */
  206. /* moved to prev block:
  207.  * movq 8*5(%ecx), %mm1
  208.  * pmulhw 8*5(%esi), %mm1  V5
  209.  */
  210. movq 8*13(%ecx), %mm7
  211. psllw $1, %mm1 /* t128=t130 */
  212. pmulhw 8*13(%esi), %mm7 /* V13 */
  213. movq %mm1, %mm2 /* duplicate t128=t130 */
  214. movq 8(%ecx), %mm3
  215. pmulhw 8(%esi), %mm3 /* V1 */
  216. movq 8*9(%ecx), %mm5
  217. psubsw %mm7, %mm1 /* V50 */
  218. pmulhw 8*9(%esi), %mm5 /* V9 */
  219. paddsw %mm7, %mm2 /* V51 */
  220. pmulhw x5a825a825a825a82, %mm1 /* 23170 ->V52 */
  221. movq %mm2, %mm6 /* duplicate V51 */
  222. psraw $1, %mm2 /* t138=t144 */
  223. movq %mm3, %mm4 /* duplicate V1 */
  224. psraw $2, %mm6 /* t136 */
  225. paddsw %mm5, %mm3 /* V53 */
  226. psubsw %mm5, %mm4 /* V54 ;mm5 free */
  227. movq %mm3, %mm7 /* duplicate V53 */
  228. /* moved from next block */
  229. movq 8*11(%ecx), %mm0
  230. psraw $1, %mm4 /* t140=t142 */
  231. psubsw %mm6, %mm1 /* V55 ; mm6 free */
  232. paddsw %mm2, %mm3 /* V56 */
  233. movq %mm4, %mm5 /* duplicate t140=t142 */
  234. paddsw %mm1, %mm4 /* V57 */
  235. movq %mm3, 8*5(%esi) /* V56 */
  236. psubsw %mm1, %mm5 /* V58; mm1 free */
  237. movq %mm4, 8*13(%esi) /* V57 */
  238. psubsw %mm2, %mm7 /* V59; mm2 free */
  239. movq %mm5, 8*9(%esi) /* V58 */
  240. /* keep mm7 alive all along the next block
  241.  * movq %mm7, 8(%esi) V59
  242.  * moved above
  243.  * movq 8*11(%ecx), %mm0
  244.  */
  245. pmulhw 8*11(%esi), %mm0 /* V11 */
  246. movq 8*7(%ecx), %mm6
  247. pmulhw 8*7(%esi), %mm6 /* V7 */
  248. movq 8*15(%ecx), %mm4
  249. movq %mm0, %mm3 /* duplicate V11 */
  250. pmulhw 8*15(%esi), %mm4 /* V15 */
  251. movq 8*3(%ecx), %mm5
  252. psllw $1, %mm6 /* t146=t152 */
  253. pmulhw 8*3(%esi), %mm5 /* V3 */
  254. paddsw %mm6, %mm0 /* V63 */
  255. /* note that V15 computation has a correction step: 
  256.  * this is a 'magic' constant that rebiases the results to be closer to the
  257.  * expected result.  this magic constant can be refined to reduce the error
  258.  * even more by doing the correction step in a later stage when the number
  259.  * is actually multiplied by 16
  260.  */
  261. paddw x0005000200010001, %mm4
  262. psubsw %mm6, %mm3 /* V60 ; free mm6 */
  263. psraw $1, %mm0 /* t154=t156 */
  264. movq %mm3, %mm1 /* duplicate V60 */
  265. pmulhw x539f539f539f539f, %mm1 /* V67 */
  266. movq %mm5, %mm6 /* duplicate V3 */
  267. psraw $2, %mm4 /* t148=t150 */
  268. paddsw %mm4, %mm5 /* V61 */
  269. psubsw %mm4, %mm6 /* V62 ; free mm4 */
  270. movq %mm5, %mm4 /* duplicate V61 */
  271. psllw $1, %mm1 /* t169 */
  272. paddsw %mm0, %mm5 /* V65 -> result */
  273. psubsw %mm0, %mm4 /* V64 ; free mm0 */
  274. pmulhw x5a825a825a825a82, %mm4 /* V68 */
  275. psraw $1, %mm3 /* t158 */
  276. psubsw %mm6, %mm3 /* V66 */
  277. movq %mm5, %mm2 /* duplicate V65 */
  278. pmulhw x61f861f861f861f8, %mm3 /* V70 */
  279. psllw $1, %mm6 /* t165 */
  280. pmulhw x4546454645464546, %mm6 /* V69 */
  281. psraw $1, %mm2 /* t172 */
  282. /* moved from next block */
  283. movq 8*5(%esi), %mm0 /* V56 */
  284. psllw $1, %mm4 /* t174 */
  285. /* moved from next block */
  286. psraw $1, %mm0 /* t177=t188 */
  287. nop
  288. psubsw %mm3, %mm6 /* V72 */
  289. psubsw %mm1, %mm3 /* V71 ; free mm1 */
  290. psubsw %mm2, %mm6 /* V73 ; free mm2 */
  291. /* moved from next block */
  292. psraw $1, %mm5 /* t178=t189 */
  293. psubsw %mm6, %mm4 /* V74 */
  294. /* moved from next block */
  295. movq %mm0, %mm1 /* duplicate t177=t188 */
  296. paddsw %mm4, %mm3 /* V75 */
  297. /* moved from next block */
  298. paddsw %mm5, %mm0 /* tm1 */
  299. /* location
  300.  *  5 - V56
  301.  * 13 - V57
  302.  *  9 - V58
  303.  *  X - V59, mm7
  304.  *  X - V65, mm5
  305.  *  X - V73, mm6
  306.  *  X - V74, mm4
  307.  *  X - V75, mm3
  308.  * free mm0, mm1 & mm2
  309.  * moved above
  310.  * movq 8*5(%esi), %mm0 V56
  311.  * psllw $1, %mm0 t177=t188 ! new !!
  312.  * psllw $1, %mm5 t178=t189 ! new !!
  313.  * movq %mm0, %mm1 duplicate t177=t188
  314.  * paddsw %mm5, %mm0 tm1
  315.  */
  316. movq 8*13(%esi), %mm2 /* V57 */
  317. psubsw %mm5, %mm1 /* tm15; free mm5 */
  318. movq %mm0, 8(%esi) /* tm1; free mm0 */
  319. psraw $1, %mm7 /* t182=t184 ! new !! */
  320. /* save the store as used directly in the transpose
  321.  * movq %mm1, 120(%esi) tm15; free mm1
  322.  */
  323. movq %mm7, %mm5 /* duplicate t182=t184 */
  324. psubsw %mm3, %mm7 /* tm7 */
  325. paddsw %mm3, %mm5 /* tm9; free mm3 */
  326. movq 8*9(%esi), %mm0 /* V58 */
  327. movq %mm2, %mm3 /* duplicate V57 */
  328. movq %mm7, 8*7(%esi) /* tm7; free mm7 */
  329. psubsw %mm6, %mm3 /* tm13 */
  330. paddsw %mm6, %mm2 /* tm3 ; free mm6 */
  331. /* moved up from the transpose */
  332. movq %mm3, %mm7
  333. /* moved up from the transpose */
  334. punpcklwd %mm1, %mm3
  335. movq %mm0, %mm6 /* duplicate V58 */
  336. movq %mm2, 8*3(%esi) /* tm3; free mm2 */
  337. paddsw %mm4, %mm0 /* tm5 */
  338. psubsw %mm4, %mm6 /* tm11; free mm4 */
  339. /* moved up from the transpose */
  340. punpckhwd %mm1, %mm7
  341. movq %mm0, 8*5(%esi) /* tm5; free mm0 */
  342. /* moved up from the transpose */
  343. movq %mm5, %mm2
  344. /* transpose - M4 part
  345.  *  ---------       ---------
  346.  * | M1 | M2 |     | M1'| M3'|
  347.  *  ---------  -->  ---------
  348.  * | M3 | M4 |     | M2'| M4'|
  349.  *  ---------       ---------
  350.  * Two alternatives: use full mmword approach so the following code can be
  351.  * scheduled before the transpose is done without stores, or use the faster
  352.  * half mmword stores (when possible)
  353.  */
  354. movd %mm3, 8*9+4(%esi) /* MS part of tmt9 */
  355. punpcklwd %mm6, %mm5
  356. movd %mm7, 8*13+4(%esi) /* MS part of tmt13 */
  357. punpckhwd %mm6, %mm2
  358. movd %mm5, 8*9(%esi) /* LS part of tmt9 */
  359. punpckhdq %mm3, %mm5 /* free mm3 */
  360. movd %mm2, 8*13(%esi) /* LS part of tmt13 */
  361. punpckhdq %mm7, %mm2 /* free mm7 */
  362. /* moved up from the M3 transpose */
  363. movq 8*8(%esi), %mm0
  364. /* moved up from the M3 transpose */
  365. movq 8*10(%esi), %mm1
  366. /* moved up from the M3 transpose */
  367. movq %mm0, %mm3
  368. /* shuffle the rest of the data, and write it with 2 mmword writes */
  369. movq %mm5, 8*11(%esi) /* tmt11 */
  370. /* moved up from the M3 transpose */
  371. punpcklwd %mm1, %mm0
  372. movq %mm2, 8*15(%esi) /* tmt15 */
  373. /* moved up from the M3 transpose */
  374. punpckhwd %mm1, %mm3
  375. /* transpose - M3 part
  376.  * moved up to previous code section
  377.  * movq 8*8(%esi), %mm0
  378.  * movq 8*10(%esi), %mm1
  379.  * movq %mm0, %mm3
  380.  * punpcklwd %mm1, %mm0
  381.  * punpckhwd %mm1, %mm3
  382.  */
  383. movq 8*12(%esi), %mm6
  384. movq 8*14(%esi), %mm4
  385. movq %mm6, %mm2
  386. /* shuffle the data and write the lower parts of the transposed in 4 dwords */
  387. punpcklwd %mm4, %mm6
  388. movq %mm0, %mm1
  389. punpckhdq %mm6, %mm1
  390. movq %mm3, %mm7
  391. punpckhwd %mm4, %mm2 /* free mm4 */
  392. punpckldq %mm6, %mm0 /* free mm6 */
  393. /* moved from next block */
  394. movq 8*13(%esi), %mm4 /* tmt13 */
  395. punpckldq %mm2, %mm3
  396. punpckhdq %mm2, %mm7 /* free mm2 */
  397. /* moved from next block */
  398. movq %mm3, %mm5 /* duplicate tmt5 */
  399. /* column 1: even part (after transpose)
  400. * moved above
  401. * movq %mm3, %mm5 duplicate tmt5
  402. * movq 8*13(%esi), %mm4 tmt13
  403. */
  404. psubsw %mm4, %mm3 /* V134 */
  405. pmulhw x5a825a825a825a82, %mm3 /* 23170 ->V136 */
  406. movq 8*9(%esi), %mm6 /* tmt9 */
  407. paddsw %mm4, %mm5 /* V135 ; mm4 free */
  408. movq %mm0, %mm4 /* duplicate tmt1 */
  409. paddsw %mm6, %mm0 /* V137 */
  410. psubsw %mm6, %mm4 /* V138 ; mm6 free */
  411. psllw $2, %mm3 /* t290 */
  412. psubsw %mm5, %mm3 /* V139 */
  413. movq %mm0, %mm6 /* duplicate V137 */
  414. paddsw %mm5, %mm0 /* V140 */
  415. movq %mm4, %mm2 /* duplicate V138 */
  416. paddsw %mm3, %mm2 /* V141 */
  417. psubsw %mm3, %mm4 /* V142 ; mm3 free */
  418. movq %mm0, 8*9(%esi) /* V140 */
  419. psubsw %mm5, %mm6 /* V143 ; mm5 free */
  420. /* moved from next block */
  421. movq 8*11(%esi), %mm0 /* tmt11 */
  422. movq %mm2, 8*13(%esi) /* V141 */
  423. /* moved from next block */
  424. movq %mm0, %mm2 /* duplicate tmt11 */
  425. /* column 1: odd part (after transpose) */
  426. /* moved up to the prev block
  427.  * movq 8*11(%esi), %mm0 tmt11
  428.  * movq %mm0, %mm2 duplicate tmt11
  429.  */
  430. movq 8*15(%esi), %mm5 /* tmt15 */
  431. psubsw %mm7, %mm0 /* V144 */
  432. movq %mm0, %mm3 /* duplicate V144 */
  433. paddsw %mm7, %mm2 /* V147 ; free mm7 */
  434. pmulhw x539f539f539f539f, %mm0 /* 21407-> V151 */
  435. movq %mm1, %mm7 /* duplicate tmt3 */
  436. paddsw %mm5, %mm7 /* V145 */
  437. psubsw %mm5, %mm1 /* V146 ; free mm5 */
  438. psubsw %mm1, %mm3 /* V150 */
  439. movq %mm7, %mm5 /* duplicate V145 */
  440. pmulhw x4546454645464546, %mm1 /* 17734-> V153 */
  441. psubsw %mm2, %mm5 /* V148 */
  442. pmulhw x61f861f861f861f8, %mm3 /* 25080-> V154 */
  443. psllw $2, %mm0 /* t311 */
  444. pmulhw x5a825a825a825a82, %mm5 /* 23170-> V152 */
  445. paddsw %mm2, %mm7 /* V149 ; free mm2 */
  446. psllw $1, %mm1 /* t313 */
  447. nop /* without the nop - freeze here for one clock */
  448. movq %mm3, %mm2 /* duplicate V154 */
  449. psubsw %mm0, %mm3 /* V155 ; free mm0 */
  450. psubsw %mm2, %mm1 /* V156 ; free mm2 */
  451. /* moved from the next block */
  452. movq %mm6, %mm2 /* duplicate V143 */
  453. /* moved from the next block */
  454. movq 8*13(%esi), %mm0 /* V141 */
  455. psllw $1, %mm1 /* t315 */
  456. psubsw %mm7, %mm1 /* V157 (keep V149) */
  457. psllw $2, %mm5 /* t317 */
  458. psubsw %mm1, %mm5 /* V158 */
  459. psllw $1, %mm3 /* t319 */
  460. paddsw %mm5, %mm3 /* V159 */
  461. /* column 1: output butterfly (after transform)
  462.  * moved to the prev block
  463.  * movq %mm6, %mm2 duplicate V143
  464.  * movq 8*13(%esi), %mm0 V141
  465.  */
  466. psubsw %mm3, %mm2 /* V163 */
  467. paddsw %mm3, %mm6 /* V164 ; free mm3 */
  468. movq %mm4, %mm3 /* duplicate V142 */
  469. psubsw %mm5, %mm4 /* V165 ; free mm5 */
  470. movq %mm2, (%esp) /* out7 */
  471. psraw $4, %mm6
  472. psraw $4, %mm4
  473. paddsw %mm5, %mm3 /* V162 */
  474. movq 8*9(%esi), %mm2 /* V140 */
  475. movq %mm0, %mm5 /* duplicate V141 */
  476. /* in order not to perculate this line up,
  477.  * we read 72(%esi) very near to this location
  478.  */
  479. movq %mm6, 8*9(%esi) /* out9 */
  480. paddsw %mm1, %mm0 /* V161 */
  481. movq %mm3, 8(%esp) /* out5 */
  482. psubsw %mm1, %mm5 /* V166 ; free mm1 */
  483. movq %mm4, 8*11(%esi) /* out11 */
  484. psraw $4, %mm5
  485. movq %mm0, 16(%esp) /* out3 */
  486. movq %mm2, %mm4 /* duplicate V140 */
  487. movq %mm5, 8*13(%esi) /* out13 */
  488. paddsw %mm7, %mm2 /* V160 */
  489. /* moved from the next block */
  490. movq 8(%esi), %mm0
  491. psubsw %mm7, %mm4 /* V167 ; free mm7 */
  492. /* moved from the next block */
  493. movq 8*3(%esi), %mm7
  494. psraw $4, %mm4
  495. movq %mm2, 24(%esp) /* out1 */
  496. /* moved from the next block */
  497. movq %mm0, %mm1
  498. movq %mm4, 8*15(%esi) /* out15 */
  499. /* moved from the next block */
  500. punpcklwd %mm7, %mm0
  501. /* transpose - M2 parts
  502.  * moved up to the prev block
  503.  * movq 8(%esi), %mm0
  504.  * movq 8*3(%esi), %mm7
  505.  * movq %mm0, %mm1
  506.  * punpcklwd %mm7, %mm0
  507.  */
  508. movq 8*5(%esi), %mm5
  509. punpckhwd %mm7, %mm1
  510. movq 8*7(%esi), %mm4
  511. movq %mm5, %mm3
  512. /* shuffle the data and write the lower parts of the trasposed in 4 dwords */
  513. movd %mm0, 8*8(%esi) /* LS part of tmt8 */
  514. punpcklwd %mm4, %mm5
  515. movd %mm1, 8*12(%esi) /* LS part of tmt12 */
  516. punpckhwd %mm4, %mm3
  517. movd %mm5, 8*8+4(%esi) /* MS part of tmt8 */
  518. punpckhdq %mm5, %mm0 /* tmt10 */
  519. movd %mm3, 8*12+4(%esi) /* MS part of tmt12 */
  520. punpckhdq %mm3, %mm1 /* tmt14 */
  521. /* transpose - M1 parts */
  522. movq (%esi), %mm7
  523. movq 8*2(%esi), %mm2
  524. movq %mm7, %mm6
  525. movq 8*4(%esi), %mm5
  526. punpcklwd %mm2, %mm7
  527. movq 8*6(%esi), %mm4
  528. punpckhwd %mm2, %mm6 /* free mm2 */
  529. movq %mm5, %mm3
  530. punpcklwd %mm4, %mm5
  531. punpckhwd %mm4, %mm3 /* free mm4 */
  532. movq %mm7, %mm2
  533. movq %mm6, %mm4
  534. punpckldq %mm5, %mm7 /* tmt0 */
  535. punpckhdq %mm5, %mm2 /* tmt2 ; free mm5 */
  536. /* shuffle the rest of the data, and write it with 2 mmword writes */
  537. punpckldq %mm3, %mm6 /* tmt4 */
  538. /* moved from next block */
  539. movq %mm2, %mm5 /* duplicate tmt2 */
  540. punpckhdq %mm3, %mm4 /* tmt6 ; free mm3 */
  541. /* moved from next block */
  542. movq %mm0, %mm3 /* duplicate tmt10 */
  543. /* column 0: odd part (after transpose)
  544.  *moved up to prev block
  545.  * movq %mm0, %mm3 duplicate tmt10
  546.  * movq %mm2, %mm5 duplicate tmt2
  547.  */
  548. psubsw %mm4, %mm0 /* V110 */
  549. paddsw %mm4, %mm3 /* V113 ; free mm4 */
  550. movq %mm0, %mm4 /* duplicate V110 */
  551. paddsw %mm1, %mm2 /* V111 */
  552. pmulhw x539f539f539f539f, %mm0 /* 21407-> V117 */
  553. psubsw %mm1, %mm5 /* V112 ; free mm1 */
  554. psubsw %mm5, %mm4 /* V116 */
  555. movq %mm2, %mm1 /* duplicate V111 */
  556. pmulhw x4546454645464546, %mm5 /* 17734-> V119 */
  557. psubsw %mm3, %mm2 /* V114 */
  558. pmulhw x61f861f861f861f8, %mm4 /* 25080-> V120 */
  559. paddsw %mm3, %mm1 /* V115 ; free mm3 */
  560. pmulhw x5a825a825a825a82, %mm2 /* 23170-> V118 */
  561. psllw $2, %mm0 /* t266 */
  562. movq %mm1, (%esi) /* save V115 */
  563. psllw $1, %mm5 /* t268 */
  564. psubsw %mm4, %mm5 /* V122 */
  565. psubsw %mm0, %mm4 /* V121 ; free mm0 */
  566. psllw $1, %mm5 /* t270 */
  567. psubsw %mm1, %mm5 /* V123 ; free mm1 */
  568. psllw $2, %mm2 /* t272 */
  569. psubsw %mm5, %mm2 /* V124 (keep V123) */
  570. psllw $1, %mm4 /* t274 */
  571. movq %mm5, 8*2(%esi) /* save V123 ; free mm5 */
  572. paddsw %mm2, %mm4 /* V125 (keep V124) */
  573. /* column 0: even part (after transpose) */
  574. movq 8*12(%esi), %mm0 /* tmt12 */
  575. movq %mm6, %mm3 /* duplicate tmt4 */
  576. psubsw %mm0, %mm6 /* V100 */
  577. paddsw %mm0, %mm3 /* V101 ; free mm0 */
  578. pmulhw x5a825a825a825a82, %mm6 /* 23170 ->V102 */
  579. movq %mm7, %mm5 /* duplicate tmt0 */
  580. movq 8*8(%esi), %mm1 /* tmt8 */
  581. paddsw %mm1, %mm7 /* V103 */
  582. psubsw %mm1, %mm5 /* V104 ; free mm1 */
  583. movq %mm7, %mm0 /* duplicate V103 */
  584. psllw $2, %mm6 /* t245 */
  585. paddsw %mm3, %mm7 /* V106 */
  586. movq %mm5, %mm1 /* duplicate V104 */
  587. psubsw %mm3, %mm6 /* V105 */
  588. psubsw %mm3, %mm0 /* V109; free mm3 */
  589. paddsw %mm6, %mm5 /* V107 */
  590. psubsw %mm6, %mm1 /* V108 ; free mm6 */
  591. /* column 0: output butterfly (after transform) */
  592. movq %mm1, %mm3 /* duplicate V108 */
  593. paddsw %mm2, %mm1 /* out4 */
  594. psraw $4, %mm1
  595. psubsw %mm2, %mm3 /* out10 ; free mm2 */
  596. psraw $4, %mm3
  597. movq %mm0, %mm6 /* duplicate V109 */
  598. movq %mm1, 8*4(%esi) /* out4 ; free mm1 */
  599. psubsw %mm4, %mm0 /* out6 */
  600. movq %mm3, 8*10(%esi) /* out10 ; free mm3 */
  601. psraw $4, %mm0
  602. paddsw %mm4, %mm6 /* out8 ; free mm4 */
  603. movq %mm7, %mm1 /* duplicate V106 */
  604. movq %mm0, 8*6(%esi) /* out6 ; free mm0 */
  605. psraw $4, %mm6
  606. movq (%esi), %mm4 /* V115 */
  607. movq %mm6, 8*8(%esi) /* out8 ; free mm6 */
  608. movq %mm5, %mm2 /* duplicate V107 */
  609. movq 8*2(%esi), %mm3 /* V123 */
  610. paddsw %mm4, %mm7 /* out0 */
  611. /* moved up from next block */
  612. movq 16(%esp), %mm0
  613. psraw $4, %mm7
  614. /* moved up from next block */
  615. movq 8(%esp), %mm6 
  616. psubsw %mm4, %mm1 /* out14 ; free mm4 */
  617. paddsw %mm3, %mm5 /* out2 */
  618. psraw $4, %mm1
  619. movq %mm7, (%esi) /* out0 ; free mm7 */
  620. psraw $4, %mm5
  621. movq %mm1, 8*14(%esi) /* out14 ; free mm1 */
  622. psubsw %mm3, %mm2 /* out12 ; free mm3 */
  623. movq %mm5, 8*2(%esi) /* out2 ; free mm5 */
  624. psraw $4, %mm2
  625. /* moved up to the prev block */
  626. movq (%esp), %mm4
  627. /* moved up to the prev block */
  628. psraw $4, %mm0
  629. movq %mm2, 8*12(%esi) /* out12 ; free mm2 */
  630. /* moved up to the prev block */
  631. psraw $4, %mm6
  632. /* move back the data to its correct place
  633. * moved up to the prev block
  634.  * movq 16(%esp), %mm0
  635.  * movq 8(%esp), %mm6
  636.  * movq (%esp), %mm4
  637.  * psraw $4, %mm0
  638.  * psraw $4, %mm6
  639. */
  640. movq 24(%esp), %mm1
  641. psraw $4, %mm4
  642. movq %mm0, 8*3(%esi) /* out3 */
  643. psraw $4, %mm1
  644. movq %mm6, 8*5(%esi) /* out5 */
  645. movq %mm4, 8*7(%esi) /* out7 */
  646. movq %mm1, 8(%esi) /* out1 */
  647. popl %edi    /* Pop off the temp variables */
  648. popl %edi
  649. popl %edi
  650. popl %edi
  651. popl %edi
  652. popl %edi
  653. popl %edi
  654. popl %edi
  655. popl %edi    /* Pop off the old variables */
  656. popl %esi
  657. popl %edx
  658. popl %ecx
  659. popl %ebx
  660. movl %ebp, %esp
  661. popl %ebp
  662. ret
  663. .Lfe1:
  664. .size  IDCT_mmx,.Lfe1-IDCT_mmx