idct_block_mmx.S
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:20k
源码类别:

DVD

开发平台:

Unix_Linux

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