miint.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 16k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. /***************************************************************************
  2. *
  3. *                INTEL Corporation Proprietary Information  
  4. *
  5. *      
  6. *                  Copyright (c) 1996 Intel Corporation.
  7. *                         All rights reserved.
  8. *
  9. ***************************************************************************
  10. AUTHOR:  Kumar Balasubramanian 
  11. ***************************************************************************
  12. ** MMX version of the "integer LLM mode" within IJG decompressor code.
  13. ** The following is an MMX implementation of the integer slow mode
  14. ** IDCT within the IJG code.
  15. */
  16. #define JPEG_INTERNALS
  17. #include "jinclude.h"
  18. #include "jpeglib.h"
  19. #include "jdct.h" /* Private declarations for DCT subsystem */
  20. #ifdef DCT_ISLOW_SUPPORTED
  21. /*
  22.  * This module is specialized to the case DCTSIZE = 8.
  23.  */
  24. #if DCTSIZE != 8
  25.   Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
  26. #endif
  27. #if BITS_IN_JSAMPLE == 8
  28. #define CONST_BITS  13
  29. #define PASS1_BITS  2
  30. #else
  31. #define CONST_BITS  13
  32. #define PASS1_BITS  1 /* lose a little precision to avoid overflow */
  33. #endif
  34. /* Define the constants for the case BITS_IN_JSAMPLE = 8 */
  35. static const __int64 const_0_2986 = 0x0000098E0000098E ;
  36. static const __int64 const_0_3901 = 0x00000c7c00000c7c;
  37. static const __int64 const_0_54119 = 0x0000115100001151;
  38. static const __int64 const_0_7653 = 0x0000187E0000187E;
  39. static const __int64 const_0_899 = 0x00001ccd00001ccd;
  40. static const __int64 const_1_175 = 0x000025a1000025a1;
  41. static const __int64 const_1_501 = 0x0000300b0000300b;
  42. static const __int64 const_1_8477 = 0x00003b2100003b21;
  43. static const __int64 const_1_961 = 0x00003ec500003ec5 ;
  44. static const __int64 const_2_053 = 0x000041b3000041b3 ;
  45. static const __int64 const_2_562 = 0x0000520300005203 ;
  46. static const __int64 const_3_072 = 0x0000625400006254 ;
  47. static const __int64 const_all_ones = 0x0ffffffffffffffff;
  48. static const __int64 const_0_1_0_1 = 0x0000000100000001  ;
  49. static const __int64 const_zero = 0x0000000000000000;
  50. static const __int64 const_1_0 = 0x0000000100000001 ;
  51. static const __int64 const_round = 0x0000040000000400;
  52. static const __int64 const_round_two = 0x0002000000020000;
  53. static const __int64 const_mask =  0x000003ff000003ff;
  54. static const __int64 const_00_1_84_00_0_765 = 0x00003b210000187E;
  55. static const __int64 const_00_0_5411_00_00 = 0x0000115100000000;
  56. static const __int64 const_3_072_00_1_501_00 = 0x62540000300b0000;
  57. static const __int64 const_0_2986_00_2_053_00 = 0x098E000041b30000;
  58. static const __int64 const_0_899_00_2_562_00 =   0x1ccd000052030000;
  59. static const __int64 const_1_96_00_0_3901_00 =   0x3ec500000c7c0000;
  60. static const __int64 const_1_175_00_00_00 = 0x25a1000000000000;
  61. /*
  62.  * Perform dequantization and inverse DCT on one block of coefficients.
  63.  */
  64. GLOBAL(void)
  65. midct8x8llm (JCOEFPTR inptr, short *quantptr, short *wsptr,
  66.  JSAMPARRAY output_buf, JDIMENSION output_col, JSAMPLE *range_limit )
  67. {
  68. INT32 locdwinptr, locdwqptr, locdwwsptr, locdwcounter, locdwrowctr ;
  69. __int64 locqwtmp0e,locqwtmp0o, locqwtmp1e, locqwtmp1o, locqwtmp2e ;
  70. __int64 locqwtmp10e , locqwtmp10o ,locqwtmp11e ,
  71.  locqwtmp11o , locqwtmp12e , locqwtmp12o ,
  72.  locqwtmp13e , locqwtmp13o ,locqwtmp0 ,
  73. locqwtmp1 ,locqwtmp2 ,locqwtmp3 ,
  74. locqwz5e ,locqwz5o ,locqwz1e ,locqwz1o ,
  75. locqwz13e ,locqwz13o ,locqwz14e ,
  76. locqwz14o ,locqwz23e ,locqwz23o ,
  77. locqwz24e ,locqwz24o ;
  78. // Inline assembly to do the IDCT and store the result */
  79. __asm {
  80. mov esi, inptr ; load the input pointer
  81. mov edi, quantptr ; load the quant table pointer
  82. mov locdwinptr, esi ; to be used in the idct_column loop
  83. mov locdwqptr, edi ; to be used in the idct_column loop
  84. mov esi, wsptr
  85. mov locdwcounter, 2 ; idct_column loop counter
  86. mov locdwwsptr, esi
  87. ;; do the idct on all the columns. Do four columns per
  88. ;; iteration of the loop.
  89. idct_column:
  90. mov esi, locdwinptr ; get the source pointer
  91. mov edi, locdwqptr ; get the quantzn. pointer
  92. ;; fetch C2 and Q2
  93. movq mm0,  [esi+16*2] ; get C2
  94. movq mm1,  [edi+16*2] ; get Q2
  95. movq mm2,  [esi+16*6] ; get C6
  96. pmullw mm0, mm1 ; dequantized C2 = z2
  97. movq mm3, [edi+16*6] ; get Q6
  98. movq mm6,  const_0_7653
  99. pmullw mm2, mm3 ; dequant. C6 = z3
  100. movq mm7,  const_1_8477
  101. movq mm4, mm0 ; copy z2
  102. pmaddwd mm4, mm6 ; tmp3 - z1 for columns 0 & 2
  103. movq mm5, mm0 ; copy z2
  104. movq mm3, mm2 ; z3 copy
  105. psrlq mm5, 16 ; move z2 columns 1 & 3 to 0 & 2
  106. movq mm1,  const_0_54119
  107. pmaddwd mm5, mm6 ; tmp3 - z1 for columns 1 & 3
  108. psrlq mm3, 16 ; move z3 columns 1 & 3 to 0 & 2
  109. paddw mm0, mm2 ; z2 + z3
  110. pmaddwd mm2, mm7 ; tmp2 - z1 for columns 0 & 2
  111. movq mm6, mm0 ; z2 + z3 copy
  112. psrlq mm6, 16 ; z2 + z3 columns 1 & 3 in 0 & 2
  113. pmaddwd mm3, mm7 ; tmp2 - z1 for columns 1 & 3
  114. movq mm7,  const_all_ones
  115. pmaddwd mm0, mm1 ; z1 columns 0 & 2
  116. pmaddwd mm6, mm1 ; z1 columns 1 & 3
  117. pxor mm2, mm7 ; 1s complement of tmp2 - z1
  118. movq mm1,  const_0_1_0_1
  119. pxor mm3, mm7 ; 1s complement of tmp2 - z1 
  120. paddd mm2, mm1 ; 2s complement of tmp2 - z1(col 0 &2)
  121. paddd mm3, mm1 ; 2s complement of tmp2 - z1(col 1 & 3)
  122. paddd mm2, mm0 ; tmp2 (columns 0 & 2)
  123. paddd mm4, mm0 ; tmp2 (cols. 1 & 3)
  124. ;; get C0 and Q0
  125. movq mm0,  [esi+16*0] ; get C0
  126. paddd mm3, mm6 ; tmp3
  127. movq mm1,  [edi+16*0] ; getQ0
  128. paddd mm5, mm6 ; tmp3
  129. movq mm6,  [esi+16*4] ; get C4
  130. pmullw mm0, mm1 ; dequant C0 = z2
  131. movq mm7,  [edi+16*4] ; get Q4
  132. nop
  133. movq locqwtmp2e, mm2 ; store tmp2 even part
  134. pmullw mm6, mm7 ; dequant C4 = z3
  135. movq mm7,  const_1_0
  136. movq mm1, mm0 ; copy of z2
  137. paddw mm0, mm6 ; z2+z3
  138. nop
  139. psubw mm1, mm6 ; z2-z3
  140. movq mm6, mm0 ; z2+z3 copy
  141. pmaddwd mm0, mm7 ; get 0 & 2 cols
  142. psrlq mm6, 16 ; get the other two cols.
  143. pmaddwd mm6, mm7 ; 
  144. movq mm2, mm1 ; copy of z2-z3
  145. pmaddwd mm1, mm7
  146. psrlq mm2, 16
  147. pmaddwd mm2, mm7
  148. pslld mm0, 13 ; tmp0 cols 0&2
  149. movq mm7, mm4
  150. pslld mm6, 13 ; tmp0 cols 1 & 3
  151. paddd mm4, mm0 ; 
  152. psubd mm0, mm7 ; 
  153. movq mm7, mm5
  154. pslld mm2, 13
  155. movq locqwtmp13e, mm0 ; store tmp13 cols 0&2
  156. paddd mm5, mm6
  157. movq mm0, locqwtmp2e
  158. psubd mm6, mm7
  159. movq locqwtmp10o, mm5 ; store tmp10 cols 1&3
  160. movq mm7, mm3
  161. movq locqwtmp13o, mm6 ; store tmp13 cols 1&3
  162. paddd mm3, mm2
  163. movq locqwtmp10e, mm4 ; store tmp10 cols 0&2
  164. pslld mm1, 13
  165. movq locqwtmp11o, mm3 ; store tmp11 cols 1,3
  166. psubd mm2, mm7
  167. movq mm6,  [esi+16*1]
  168. movq mm3, mm0
  169. movq locqwtmp12o, mm2 ; store tmp12 cols. 1,3
  170. paddd mm0, mm1
  171. movq mm7,  [edi+16*1]
  172. movq locqwtmp11e, mm0 ; store tmp11 cols. 0,2
  173. psubd mm1, mm3
  174. movq mm0,  [esi+16*7]
  175. pmullw mm6, mm7 ; dequant. C1 = tmp3
  176. movq locqwtmp12e, mm1
  177. ;; completed the even part.
  178. ;; Now start the odd part
  179. movq mm1,  [edi+16*7] ; get C7
  180. movq mm2,  [esi+16*5] ; get C5
  181. pmullw mm0, mm1 ; dequant. C7 = tmp0
  182. movq mm3,  [edi+16*5]
  183. movq mm4,  [esi+16*3]
  184. pmullw mm2, mm3 ; dequant. C5 = tmp1
  185. movq mm5,  [edi+16*3]
  186. movq mm1, mm0
  187. movq locqwtmp3, mm6
  188. pmullw mm4, mm5 ; dequant. C3 = tmp2
  189. movq locqwtmp0, mm0
  190. paddw mm0, mm6 ; z1 
  191. movq locqwtmp1, mm2
  192. movq mm3, mm2
  193. movq locqwtmp2, mm4
  194. paddw mm2, mm4 ; z2
  195. paddw mm1, mm4 ; z3
  196. movq mm4,  const_1_175
  197. paddw mm3, mm6 ; z4
  198. movq mm5, mm1
  199. movq mm7, mm0
  200. psrlq mm7, 16 ; other two cols. of z1
  201. paddw mm5, mm3 ; z3 + z4
  202. movq mm6, mm5
  203. pmaddwd mm5, mm4 ; z5 cols 0 & 2
  204. pmaddwd mm0,  const_0_899 ; z1 even part
  205. psrlq mm6, 16
  206. pmaddwd mm6, mm4 ; z5 cols 1 & 3
  207. movq mm4, mm2 ; z2 copy
  208. movq locqwz5e, mm5
  209. psrlq mm4, 16 ; get z2 cols 1 & 3
  210. pxor mm0,  const_all_ones
  211. movq mm5, mm1
  212. movq locqwz5o, mm6
  213. psrlq mm5, 16
  214. movq mm6,  const_2_562
  215. nop
  216. paddd mm0,  const_0_1_0_1
  217. pmaddwd mm2, mm6 ; z2 cols 0 & 2
  218. movq locqwz1e, mm0
  219. pmaddwd mm4, mm6 ; z2 cols 1 & 3
  220. pmaddwd mm7,  const_0_899 ; z1
  221. movq mm0, mm3
  222. movq mm6,  const_1_961
  223. psrlq mm0, 16
  224. pxor mm2,  const_all_ones
  225. pmaddwd mm1, mm6 ; z3 cols 0 & 2
  226. paddd mm2,  const_0_1_0_1
  227. pmaddwd mm5, mm6 ; z3 cols 1 & 3
  228. movq mm6,  const_0_3901
  229. nop
  230. pxor mm4,  const_all_ones
  231. pmaddwd mm3, mm6 ; z4 cols 0 & 2
  232. paddd mm4,  const_0_1_0_1
  233. pmaddwd mm0, mm6 ; z4 cols 1 & 3
  234. movq mm6,  const_all_ones
  235. nop
  236. pxor mm1, mm6
  237. pxor mm7, mm6
  238. ;; twos complement of z1, z2, z3, z4
  239. paddd mm1,  const_0_1_0_1
  240. pxor mm5, mm6
  241. paddd mm7,  const_0_1_0_1
  242. pxor mm3, mm6
  243. paddd mm5,  const_0_1_0_1
  244. nop
  245. movq locqwz1o, mm7
  246. pxor mm0, mm6
  247. paddd mm1, locqwz5e ; z3+z5 cols 0 & 2
  248. nop
  249. movq mm6, locqwz1e
  250. nop
  251. paddd mm5, locqwz5o ; z3+z5 cols 1 & 3
  252. paddd mm6, mm1
  253. paddd mm3,  const_0_1_0_1
  254. paddd mm1, mm2
  255. paddd mm0,  const_0_1_0_1
  256. paddd mm7, mm5
  257. paddd mm3, locqwz5e ; z4+z5 cols 0 & 2
  258. paddd mm5, mm4
  259. paddd mm0, locqwz5o ; z4+z5 cols 0 & 2
  260. paddd mm2, mm3
  261. paddd mm3, locqwz1e
  262. paddd mm4, mm0
  263. paddd mm0, locqwz1o
  264. movq locqwz23e, mm1
  265. nop
  266. movq locqwz14o, mm0
  267. nop
  268. movq mm0, locqwtmp0
  269. nop
  270. movq locqwz24e, mm2
  271. movq mm1, mm0
  272. movq mm2,  const_0_2986
  273. psrlq mm1, 16
  274. movq locqwz14e, mm3
  275. pmaddwd mm0, mm2 ; tmp0 even
  276. movq mm3, locqwtmp1
  277. pmaddwd mm1, mm2 ; tmp0 odd
  278. movq locqwz24o, mm4
  279. movq mm2, mm3
  280. movq mm4,  const_2_053
  281. psrlq mm2, 16
  282. movq locqwz23o, mm5
  283. pmaddwd mm3, mm4 ; tmp1 even
  284. movq mm5, locqwtmp2
  285. pmaddwd mm2, mm4 ; tmp1 odd
  286. movq locqwz13e, mm6
  287. movq mm4, mm5
  288. movq mm6,  const_3_072
  289. psrlq mm4, 16
  290. movq locqwz13o, mm7
  291. pmaddwd mm5, mm6 ; tmp2 even
  292. ;;;;;;; now calculate tmp0..tmp3
  293. ;; then calculate the pre-descaled values
  294. ;; this includes the right shift with rounding
  295. movq mm7, locqwtmp3
  296. pmaddwd mm4, mm6 ; tmp2 odd
  297. paddd mm0, locqwz13e
  298. movq mm6, mm7
  299. paddd mm1, locqwz13o
  300. psrlq mm6, 16
  301. movq locqwtmp0e, mm0 ; tmp0 even
  302. nop
  303. movq mm0,  const_1_501
  304. nop
  305. movq locqwtmp0o, mm1
  306. pmaddwd mm7, mm0
  307. paddd mm3, locqwz24e
  308. pmaddwd mm6, mm0
  309. movq mm0, locqwtmp10e
  310. nop
  311. paddd mm7, locqwz14e
  312. nop
  313. paddd mm6, locqwz14o
  314. psubd mm0, mm7
  315. movq mm1, locqwtmp10o
  316. nop
  317. movq locqwtmp1e, mm3
  318. psubd mm1, mm6
  319. movq mm3,  const_round
  320. nop
  321. paddd mm2, locqwz24o
  322. paddd mm0, mm3
  323. paddd mm7, locqwtmp10e
  324. psrad mm0, 11
  325. movq locqwtmp1o, mm2
  326. paddd mm1, mm3
  327. paddd mm6, locqwtmp10o
  328. psrad mm1, 11
  329. paddd mm5, locqwz23e
  330. movq mm2, mm0
  331. paddd mm4, locqwz23o
  332. punpcklwd mm0, mm1
  333. paddd mm6, mm3
  334. punpckhwd mm2, mm1
  335. paddd mm7, mm3
  336. punpckldq mm0, mm2
  337. ;; now do all the stores of the 1D-iDCT of the four columns
  338. mov edi, locdwwsptr ; get pointer to scratch pad array
  339. movq  [edi+16*7], mm0 ; store wsptr[7]
  340. psrad mm6, 11
  341. movq mm2, locqwtmp11e
  342. psrad mm7, 11
  343. psubd mm2, mm5
  344. movq mm0, mm7
  345. movq mm1, locqwtmp11o
  346. punpcklwd mm7, mm6
  347. psubd mm1, mm4
  348. punpckhwd mm0, mm6
  349. paddd mm5, locqwtmp11e
  350. punpckldq mm7, mm0
  351. paddd mm4, locqwtmp11o
  352. paddd mm2, mm3
  353. paddd mm1, mm3
  354. paddd mm5, mm3
  355. paddd mm4, mm3
  356. psrad mm2, 11
  357. movq  [edi+16*0], mm7 ; store wsptr[0]
  358. psrad mm1, 11
  359. movq mm0, mm2
  360. psrad mm5, 11
  361. movq mm6, locqwtmp12e
  362. punpcklwd mm2, mm1
  363. punpckhwd mm0, mm1
  364. movq mm1, mm5
  365. movq mm7, locqwtmp12o
  366. punpckldq mm2, mm0
  367. movq  [edi+16*6], mm2 ; store wsptr[6]
  368. psrad mm4, 11
  369. movq mm2, mm6
  370. punpcklwd mm5, mm4
  371. paddd mm6, locqwtmp1e
  372. punpckhwd mm1, mm4
  373. psubd mm2, locqwtmp1e
  374. punpckldq mm5, mm1
  375. movq  [edi+16*1], mm5 ; store wsptr[1]
  376. movq mm0, mm7
  377. paddd mm7, locqwtmp1o
  378. paddd mm6, mm3
  379. psubd mm0, locqwtmp1o
  380. paddd mm7, mm3
  381. paddd mm2, mm3
  382. psrad mm7, 11
  383. paddd mm0, mm3
  384. psrad mm6, 11
  385. movq mm1, mm6
  386. psrad mm2, 11
  387. movq mm4, locqwtmp13e
  388. punpcklwd mm6, mm7
  389. movq mm5, mm4
  390. punpckhwd mm1, mm7
  391. paddd mm4, locqwtmp0e
  392. punpckldq mm6, mm1
  393. psubd mm5, locqwtmp0e
  394. psrad mm0, 11
  395. movq  [edi+16*2], mm6 ; store wsptr[2]
  396. movq mm6, mm2
  397. paddd mm4, mm3
  398. punpcklwd mm2, mm0
  399. paddd mm5, mm3
  400. punpckhwd mm6, mm0
  401. movq mm0, locqwtmp13o
  402. punpckldq mm2, mm6
  403. movq mm1, mm0
  404. psrad mm4, 11
  405. paddd mm0, locqwtmp0o
  406. psrad mm5, 11
  407. paddd mm0, mm3
  408. movq mm6, mm4
  409. psubd mm1, locqwtmp0o
  410. psrad mm0, 11
  411. paddd mm1, mm3
  412. punpcklwd mm4, mm0
  413. movq mm3, mm5
  414. punpckhwd mm6, mm0
  415. movq  [edi+16*5], mm2 ; store wsptr[5]
  416. punpckldq mm4, mm6
  417. psrad mm1, 11
  418. movq  [edi+16*3], mm4 ; store wsptr[3]
  419. punpcklwd mm5, mm1
  420. punpckhwd mm3, mm1
  421. punpckldq mm5, mm3
  422. add locdwinptr, 8 ; skip first four columns
  423. add locdwqptr,  8
  424. movq  [edi+16*4], mm5 ; store wsptr[4]
  425. ;;;;;;; done with 1D-idct of four columns ;;;;;;;
  426. ;; now update pointers for next four columns
  427. add locdwwsptr, 8
  428. mov eax, locdwcounter
  429. dec eax
  430. mov locdwcounter, eax
  431. jnz idct_column
  432. ;;;;;;;end of 1D-idct on the columns ;;;;;;;
  433. mov esi, wsptr ; get start addr of temp array
  434. mov locdwcounter, 8
  435. mov locdwwsptr, esi
  436. mov locdwrowctr, 0
  437. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  438. ;;;;;;; start of 1D-idct on the rows ;;;;;;;
  439. idct_row:
  440. mov esi, locdwwsptr ; get next row start addr of temp array
  441. mov edi, output_buf
  442. movq mm0,  [esi+0] ; get first 4 elements of row
  443. movq mm1,  [esi+2*4] ; get next 4 elem. of row
  444. movq mm2, mm0
  445. movq mm3, mm0 ; copy of e3|e2|e1|e0
  446. paddw mm2, mm1 ; (e3+e7)|(e2+e6)|(e1+e5)|(e0+e4)
  447. movq mm4, mm2 ; copy of (e3+e7)|(e2+e6)|(e1+e5)|(e0+e4)
  448. punpckhdq mm3, mm1 ; e7|e6|e3|e2
  449. pmaddwd mm3,  const_00_1_84_00_0_765 ; (tmp2 - z1)||(tmp3-z1)
  450. movq mm6, mm0 ; copy of e3|e2|e1|e0
  451. pmaddwd mm2,  const_00_0_5411_00_00 ; z1||xxx
  452. psubw mm6, mm1 ; (e3-e7)|(e2-e6)|(e1-e5)|(e0-e4)
  453. punpckldq mm4, mm6 ; (e1-e5)|(e0-e4)|(e1+e5)|(e0+e4)
  454. movq mm6, mm0 ; 
  455. movq mm5, mm3
  456. pslld mm4, 16 ; (e0-e4)|(e1+e5)||(e0+e4)|x0000
  457. pxor mm3,  const_all_ones
  458. punpckhdq mm2, mm2 ; z1||z1
  459. paddd mm3,  const_0_1_0_1
  460. psrad mm4, 3 ; (e0-e4)<<13||(e0+e4)<<13
  461. psrlq mm3, 32
  462. movq mm7, mm4 ; copy of tmp1||tmp0
  463. punpckldq mm5, mm3
  464. movq mm3, mm0 ; e3|e2|e1|e0
  465. paddd mm5, mm2 ; tmp2 || tmp3
  466. paddw mm3, mm1 ; (e7+e3)|(e2+e6)|(e1+e5)|(e0+e4)
  467. paddd mm4, mm5
  468. psubd mm7, mm5
  469. ;; end of even part calculation ;;
  470. ;; mm0 => e3|e2|e1|e0
  471. ;; mm1 => e7|e6|e5|e4
  472. ;; mm4 => tmp11||tmp10
  473. ;; mm7 => tmp12||tmp13
  474. movq mm5, mm3
  475. movq mm2, mm0
  476. pmaddwd mm0,  const_3_072_00_1_501_00 ; tmp2|tmp3
  477. punpckldq mm5, mm5
  478. paddw mm5, mm3
  479. punpckldq mm2, mm2
  480. pmaddwd mm5,  const_1_175_00_00_00 ; z5|0
  481. punpckhdq mm6, mm2
  482. pmaddwd mm3,  const_1_96_00_0_3901_00 ; z3|z4
  483. paddw mm6, mm1
  484. pmaddwd mm6,  const_0_899_00_2_562_00 ; z1|z2
  485. nop
  486. pmaddwd mm1,  const_0_2986_00_2_053_00 ; tmp0|tmp1
  487. punpckhdq mm5, mm5
  488. movq mm2,  const_0_1_0_1
  489. nop
  490. pxor mm3,  const_all_ones
  491. nop
  492. pxor mm6,  const_all_ones
  493. paddd mm3, mm2
  494. paddd mm6, mm2
  495. paddd mm3, mm5
  496. movq mm5, mm6
  497. paddd mm6, mm3
  498. movq mm2, mm5
  499. punpckldq mm5, mm5
  500. punpckhdq mm2, mm5
  501. paddd mm1, mm6
  502. paddd mm2, mm3
  503. movq mm5, mm1
  504. movq mm3, mm4
  505. paddd mm0, mm2
  506. movq mm2, mm7
  507. punpckldq mm5, mm5
  508. punpckhdq mm1, mm5
  509. psubd mm3, mm0
  510. movq mm5,  const_round_two
  511. paddd mm0, mm4
  512. movq mm6,  const_mask
  513. psubd mm2, mm1
  514. paddd mm0, mm5
  515. paddd mm1, mm7
  516. ;; descale the resulting coeff values
  517. paddd mm1, mm5
  518. psrad mm0, 18
  519. paddd mm3, mm5
  520. psrad mm1, 18
  521. paddd mm2, mm5
  522. psrad mm3, 18
  523. ;; mask the result with RANGE_MASK (least 10 bits)
  524. pand mm1, mm6 ; w2|w3
  525. psrad mm2, 18
  526. movd ebx, mm1 ; w3
  527. psrlq mm1, 32 ; 0|w2
  528. ;; using the results as index, get the corresponding
  529. ;; value from array range_limit and store the final result
  530. mov ecx, range_limit ; get start addr of range_limit array
  531. add edi, locdwrowctr
  532. movd edx, mm1 ; w2
  533. pand mm0, mm6 ; w1|w0
  534. mov ah, [ecx][ebx] ; w3
  535. mov edi, [edi]
  536. movd ebx, mm0 ; w0
  537. psrlq mm0, 32 ; 0|w1
  538. mov al, [ecx][edx] ; w2
  539. add locdwrowctr, 4
  540. movd edx, mm0 ; w1
  541. pand mm3, mm6 ; w6|w7
  542. add edi, output_col ; this is the dest start addr for this row
  543. shl eax, 16 ; w3|w2|0|0
  544. mov al, [ecx][ebx] ; w0
  545. mov ah, [ecx][edx] ; w1
  546. movd mm4, eax ; w3|w2|w1|w0
  547. pand mm2, mm6 ; w5|w4
  548. movd ebx, mm3 ; w7
  549. psrlq mm3, 32 ; 0|w6
  550. movd edx, mm3 ; w6
  551. mov ah, [ecx][ebx] ; w7
  552. mov al, [ecx][edx] ; w6
  553. movd ebx, mm2 ; w4
  554. psrlq mm2, 32 ; 0|w5
  555. shl eax, 16 ; w7|w6|0|0
  556. movd edx, mm2 ; w5
  557. mov al, [ecx][ebx] ; w4
  558. mov ah, [ecx][edx] ; w5
  559. movd mm5, eax ; w7|w6|w5|w4
  560. punpckldq mm4, mm5 ; w7|w6|w5|w4|w3|w2|w1|w0
  561. add locdwwsptr, 16
  562. mov eax, locdwcounter
  563. movq  [edi], mm4
  564. ;; update address pointer and loop counter
  565. dec eax
  566. mov locdwcounter, eax
  567. jnz idct_row
  568. ;;;;;;; end of 1D-idct on all the rows ;;;;;;;
  569.  
  570. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  571. emms
  572. } //end of __asm
  573. }
  574. #endif /* DCT_ISLOW_SUPPORTED */