idct.cpp
上传用户:liulu_102
上传日期:2007-01-14
资源大小:193k
文件大小:38k
源码类别:

图片显示

开发平台:

Visual C++

  1. //********************************************************************************************
  2. //idctInt()和idctFloat()函数摘自“The Independent JPEG Group's JPEG software”文档,由下面
  3. //地址下载:ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/jpegsr6a.zip 并做了少量修改
  4. //domidct8x8llmW()函数摘自http://developer.intel.com/ 并做了少量修改
  5. //*******************************************************************************************
  6. #include "cjpeg.h"
  7. #define NO_ZERO_ROW_TEST
  8. #define BITS_IN_JSAMPLE 8
  9. #define MAXJSAMPLE 255
  10. #define CENTERJSAMPLE 128
  11. #define CONST_BITS  13
  12. #define PASS1_BITS  2
  13. #define FIX_0_298631336  ((INT32)  2446) /* FIX(0.298631336) */
  14. #define FIX_0_390180644  ((INT32)  3196) /* FIX(0.390180644) */
  15. #define FIX_0_541196100  ((INT32)  4433) /* FIX(0.541196100) */
  16. #define FIX_0_765366865  ((INT32)  6270) /* FIX(0.765366865) */
  17. #define FIX_0_899976223  ((INT32)  7373) /* FIX(0.899976223) */
  18. #define FIX_1_175875602  ((INT32)  9633) /* FIX(1.175875602) */
  19. #define FIX_1_501321110  ((INT32)  12299) /* FIX(1.501321110) */
  20. #define FIX_1_847759065  ((INT32)  15137) /* FIX(1.847759065) */
  21. #define FIX_1_961570560  ((INT32)  16069) /* FIX(1.961570560) */
  22. #define FIX_2_053119869  ((INT32)  16819) /* FIX(2.053119869) */
  23. #define FIX_2_562915447  ((INT32)  20995) /* FIX(2.562915447) */
  24. #define FIX_3_072711026  ((INT32)  25172) /* FIX(3.072711026) */
  25. #define ONE ((INT32) 1)
  26. #define RIGHT_SHIFT(x,shft)  
  27. ((shift_temp = (x)) < 0 ? 
  28.  (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : 
  29.  (shift_temp >> (shft)))
  30. #define DESCALE(x,n)  RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
  31. #define RANGE_MASK  (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */
  32. #define RANGE_LIMIT(i) 
  33. if((i) > MAXJSAMPLE)
  34. (i) = MAXJSAMPLE;
  35. else if((i) < 0)
  36. (i) = 0
  37. void CJpeg::idctInt(short* coef_block,BYTE *output_buf)
  38. { INT32 tmp0, tmp1, tmp2, tmp3;
  39. INT32 tmp10, tmp11, tmp12, tmp13;
  40. INT32 z1, z2, z3, z4, z5;
  41. int itp;
  42. short *inptr;
  43. int * wsptr;
  44. char *outptr;
  45. int ctr;
  46. int workspace[64];
  47. INT32 shift_temp;
  48. inptr = coef_block;
  49. wsptr = workspace;
  50. for (ctr = 8; ctr > 0; ctr--)
  51. { if ((inptr[8] | inptr[16] | inptr[24] | inptr[32] | inptr[40] | inptr[48] |
  52. inptr[56]) == 0) 
  53. { int dcval = inptr[0] << PASS1_BITS;
  54.     wsptr[0] = dcval;
  55.     wsptr[8] = dcval;
  56.     wsptr[16] = dcval;
  57.     wsptr[24] = dcval;
  58.     wsptr[32] = dcval;
  59.     wsptr[40] = dcval;
  60.     wsptr[48] = dcval;
  61.     wsptr[56] = dcval;
  62.     inptr++;
  63.     wsptr++;
  64.     continue;
  65.     }
  66.     z2 = inptr[16];
  67.     z3 = inptr[48];
  68.     z1 = (z2 + z3)*FIX_0_541196100;
  69.     tmp2 = z1 + z3*(- FIX_1_847759065);
  70.     tmp3 = z1 + z2*FIX_0_765366865;
  71.     z2 = inptr[0];
  72.     z3 = inptr[32];
  73.     tmp0 = (z2 + z3) << CONST_BITS;
  74.     tmp1 = (z2 - z3) << CONST_BITS;
  75.     tmp10 = tmp0 + tmp3;
  76.     tmp13 = tmp0 - tmp3;
  77.     tmp11 = tmp1 + tmp2;
  78.     tmp12 = tmp1 - tmp2;
  79.     tmp0 = inptr[56];
  80.     tmp1 = inptr[40];
  81.     tmp2 = inptr[24];
  82.     tmp3 = inptr[8];
  83.     z1 = tmp0 + tmp3;
  84.     z2 = tmp1 + tmp2;
  85.     z3 = tmp0 + tmp2;
  86.     z4 = tmp1 + tmp3;
  87.     z5 = (z3 + z4) * FIX_1_175875602; 
  88.     tmp0 = tmp0 * FIX_0_298631336; 
  89.     tmp1 = tmp1 * FIX_2_053119869;
  90.     tmp2 = tmp2 * FIX_3_072711026;
  91.     tmp3 = tmp3 * FIX_1_501321110;
  92.     z1 = z1 * (- FIX_0_899976223);
  93.     z2 = z2 * (- FIX_2_562915447);
  94.     z3 = z3 * (- FIX_1_961570560);
  95.     z4 = z4 * (- FIX_0_390180644);
  96.     z3 += z5;
  97.     z4 += z5;
  98.     tmp0 += z1 + z3;
  99.     tmp1 += z2 + z4;
  100.     tmp2 += z2 + z3;
  101.     tmp3 += z1 + z4;
  102.     wsptr[0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
  103.     wsptr[56] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
  104.     wsptr[8] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
  105.     wsptr[48] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
  106.     wsptr[16] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
  107.     wsptr[40] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
  108.     wsptr[24] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
  109.     wsptr[32] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
  110.     inptr++;
  111.     wsptr++;
  112. }
  113. wsptr = workspace;
  114. for (ctr = 0; ctr < 8; ctr++) {
  115.     outptr = (char*)(output_buf + ctr*8);
  116. #ifndef NO_ZERO_ROW_TEST
  117.     if ((wsptr[1] | wsptr[2] | wsptr[3] | wsptr[4] | wsptr[5] | wsptr[6] | wsptr[7]) == 0)
  118. { char dcval;
  119. itp = (int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)+128;
  120. if(itp > MAXJSAMPLE)
  121. itp = MAXJSAMPLE;
  122. else if(itp < 0)
  123. itp = 0;
  124. dcval = (char)itp;
  125.     outptr[0] = dcval;
  126. outptr[1] = dcval;
  127.     outptr[2] = dcval;
  128. outptr[3] = dcval;
  129.     outptr[4] = dcval;
  130. outptr[5] = dcval;
  131.     outptr[6] = dcval;
  132. outptr[7] = dcval;
  133.     wsptr += 8;
  134. continue;
  135. }
  136. #endif
  137.     z2 = (INT32) wsptr[2];
  138.     z3 = (INT32) wsptr[6];
  139.     z1 = (z2 + z3) * FIX_0_541196100;
  140.     tmp2 = z1 + z3 * (- FIX_1_847759065);
  141.     tmp3 = z1 + z2 * FIX_0_765366865;
  142.     tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;
  143.     tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;
  144.     tmp10 = tmp0 + tmp3;
  145.     tmp13 = tmp0 - tmp3;
  146.     tmp11 = tmp1 + tmp2;
  147.     tmp12 = tmp1 - tmp2;
  148.     tmp0 = (INT32) wsptr[7];
  149.     tmp1 = (INT32) wsptr[5];
  150.     tmp2 = (INT32) wsptr[3];
  151.     tmp3 = (INT32) wsptr[1];
  152.     z1 = tmp0 + tmp3;
  153.     z2 = tmp1 + tmp2;
  154.     z3 = tmp0 + tmp2;
  155.     z4 = tmp1 + tmp3;
  156.     z5 = (z3 + z4) * FIX_1_175875602;
  157.     tmp0 = tmp0 * FIX_0_298631336;
  158.     tmp1 = tmp1 * FIX_2_053119869;
  159.     tmp2 = tmp2 * FIX_3_072711026;
  160.     tmp3 = tmp3 * FIX_1_501321110;
  161.     z1 = z1 * (- FIX_0_899976223);
  162.     z2 = z2 * (- FIX_2_562915447);
  163.     z3 = z3 * (- FIX_1_961570560);
  164.     z4 = z4 * (- FIX_0_390180644);
  165.     z3 += z5;
  166.     z4 += z5;
  167.     tmp0 += z1 + z3;
  168.     tmp1 += z2 + z4;
  169.     tmp2 += z2 + z3;
  170.     tmp3 += z1 + z4;
  171.     itp = (int) DESCALE(tmp10 + tmp3,CONST_BITS+PASS1_BITS+3)+128;
  172. RANGE_LIMIT(itp);
  173. outptr[0] = (char)itp;
  174.     itp = (int) DESCALE(tmp10 - tmp3,CONST_BITS+PASS1_BITS+3)+128;
  175. RANGE_LIMIT(itp);
  176. outptr[7] = (char)itp;
  177.     itp = (int) DESCALE(tmp11 + tmp2,CONST_BITS+PASS1_BITS+3)+128;
  178. RANGE_LIMIT(itp);
  179. outptr[1] = (char)itp;
  180.     itp = (int) DESCALE(tmp11 - tmp2,CONST_BITS+PASS1_BITS+3)+128;
  181. RANGE_LIMIT(itp);
  182. outptr[6] = (char)itp;
  183.     itp = (int) DESCALE(tmp12 + tmp1,CONST_BITS+PASS1_BITS+3)+128;
  184. RANGE_LIMIT(itp);
  185. outptr[2] = (char)itp;
  186.     itp = (int) DESCALE(tmp12 - tmp1,CONST_BITS+PASS1_BITS+3)+128;
  187. RANGE_LIMIT(itp);
  188. outptr[5] = (char)itp;
  189.     itp = (int) DESCALE(tmp13 + tmp0,CONST_BITS+PASS1_BITS+3)+128;
  190. RANGE_LIMIT(itp);
  191. outptr[3] = (char)itp;
  192.     itp = (int) DESCALE(tmp13 - tmp0,CONST_BITS+PASS1_BITS+3)+128;
  193. RANGE_LIMIT(itp);
  194. outptr[4] = (char)itp;
  195.     wsptr += 8;
  196.   }
  197. }
  198. void CJpeg::idctFloat(short* coef_block,BYTE *output_buf)
  199. { float tmp0, tmp1, tmp2, tmp3;
  200. float tmp10, tmp11, tmp12, tmp13;
  201. float z1, z2, z3, z4, z5;
  202. int itp;
  203. short *inptr;
  204. float * wsptr;
  205. char *outptr;
  206. int ctr;
  207. float workspace[64];
  208. INT32 shift_temp;
  209. inptr = coef_block;
  210. wsptr = workspace;
  211. for (ctr = 8; ctr > 0; ctr--)
  212. { if ((inptr[8] | inptr[16] | inptr[24] | inptr[32] | inptr[40] | inptr[48] |
  213. inptr[56]) == 0) 
  214. { float dcval = inptr[0];
  215.     wsptr[0] = dcval;
  216.     wsptr[8] = dcval;
  217.     wsptr[16] = dcval;
  218.     wsptr[24] = dcval;
  219.     wsptr[32] = dcval;
  220.     wsptr[40] = dcval;
  221.     wsptr[48] = dcval;
  222.     wsptr[56] = dcval;
  223.     inptr++;
  224.     wsptr++;
  225.     continue;
  226.     }
  227.     z2 = inptr[16];
  228.     z3 = inptr[48];
  229.     z1 = (z2 + z3)*(float)0.541196100;
  230.     tmp2 = z1 + z3*(float)(-1.847759065);
  231.     tmp3 = z1 + z2*(float)0.765366865;
  232.     z2 = inptr[0];
  233.     z3 = inptr[32];
  234.     tmp0 = (z2 + z3);
  235.     tmp1 = (z2 - z3);
  236.     tmp10 = tmp0 + tmp3;
  237.     tmp13 = tmp0 - tmp3;
  238.     tmp11 = tmp1 + tmp2;
  239.     tmp12 = tmp1 - tmp2;
  240.     tmp0 = inptr[56];
  241.     tmp1 = inptr[40];
  242.     tmp2 = inptr[24];
  243.     tmp3 = inptr[8];
  244.     z1 = tmp0 + tmp3;
  245.     z2 = tmp1 + tmp2;
  246.     z3 = tmp0 + tmp2;
  247.     z4 = tmp1 + tmp3;
  248.     z5 = (z3 + z4) * (float)1.175875602; 
  249.     tmp0 = tmp0 * (float)0.298631336; 
  250.     tmp1 = tmp1 * (float)2.053119869;
  251.     tmp2 = tmp2 * (float)3.072711026;
  252.     tmp3 = tmp3 * (float)1.501321110;
  253.     z1 = z1 * (float)(-0.899976223);
  254.     z2 = z2 * (float)(-2.562915447);
  255.     z3 = z3 * (float)(-1.961570560);
  256.     z4 = z4 * (float)(-0.390180644);
  257.     z3 += z5;
  258.     z4 += z5;
  259.     tmp0 += z1 + z3;
  260.     tmp1 += z2 + z4;
  261.     tmp2 += z2 + z3;
  262.     tmp3 += z1 + z4;
  263.     wsptr[0] = tmp10 + tmp3;
  264.     wsptr[56] = tmp10 - tmp3;
  265.     wsptr[8] = tmp11 + tmp2;
  266.     wsptr[48] = tmp11 - tmp2;
  267.     wsptr[16] = tmp12 + tmp1;
  268.     wsptr[40] = tmp12 - tmp1;
  269.     wsptr[24] = tmp13 + tmp0;
  270.     wsptr[32] = tmp13 - tmp0;
  271.     inptr++;
  272.     wsptr++;
  273. }
  274. wsptr = workspace;
  275. for (ctr = 0; ctr < 8; ctr++) {
  276.     outptr = (char*)(output_buf + ctr*8);
  277.     z2 = wsptr[2];
  278.     z3 = wsptr[6];
  279.     z1 = (z2 + z3) * (float)0.541196100;
  280.     tmp2 = z1 + z3 * (float)(-1.847759065);
  281.     tmp3 = z1 + z2 * (float)0.765366865;
  282.     tmp0 = wsptr[0] + wsptr[4];
  283.     tmp1 = wsptr[0] - wsptr[4];
  284.     tmp10 = tmp0 + tmp3;
  285.     tmp13 = tmp0 - tmp3;
  286.     tmp11 = tmp1 + tmp2;
  287.     tmp12 = tmp1 - tmp2;
  288.     tmp0 = wsptr[7];
  289.     tmp1 = wsptr[5];
  290.     tmp2 = wsptr[3];
  291.     tmp3 = wsptr[1];
  292.     z1 = tmp0 + tmp3;
  293.     z2 = tmp1 + tmp2;
  294.     z3 = tmp0 + tmp2;
  295.     z4 = tmp1 + tmp3;
  296.     z5 = (z3 + z4) * (float)1.175875602;
  297.     tmp0 = tmp0 * (float)0.298631336;
  298.     tmp1 = tmp1 * (float)2.053119869;
  299.     tmp2 = tmp2 * (float)3.072711026;
  300.     tmp3 = tmp3 * (float)1.501321110;
  301.     z1 = z1 * (float)(-0.899976223);
  302.     z2 = z2 * (float)(-2.562915447);
  303.     z3 = z3 * (float)(-1.961570560);
  304.     z4 = z4 * (float)(-0.390180644);
  305.     z3 += z5;
  306.     z4 += z5;
  307.     tmp0 += z1 + z3;
  308.     tmp1 += z2 + z4;
  309.     tmp2 += z2 + z3;
  310.     tmp3 += z1 + z4;
  311.     itp = (int) DESCALE((INT32)(tmp10 + tmp3),3)+128;
  312. RANGE_LIMIT(itp);
  313. outptr[0] = (char)itp;
  314.     itp = (int) DESCALE((INT32)(tmp10 - tmp3),3)+128;
  315. RANGE_LIMIT(itp);
  316. outptr[7] = (char)itp;
  317.     itp = (int) DESCALE((INT32)(tmp11 + tmp2),3)+128;
  318. RANGE_LIMIT(itp);
  319. outptr[1] = (char)itp;
  320.     itp = (int) DESCALE((INT32)(tmp11 - tmp2),3)+128;
  321. RANGE_LIMIT(itp);
  322. outptr[6] = (char)itp;
  323.     itp = (int) DESCALE((INT32)(tmp12 + tmp1),3)+128;
  324. RANGE_LIMIT(itp);
  325. outptr[2] = (char)itp;
  326.     itp = (int) DESCALE((INT32)(tmp12 - tmp1),3)+128;
  327. RANGE_LIMIT(itp);
  328. outptr[5] = (char)itp;
  329.     itp = (int) DESCALE((INT32)(tmp13 + tmp0),3)+128;
  330. RANGE_LIMIT(itp);
  331. outptr[3] = (char)itp;
  332.     itp = (int) DESCALE((INT32)(tmp13 - tmp0),3)+128;
  333. RANGE_LIMIT(itp);
  334. outptr[4] = (char)itp;
  335.     wsptr += 8;
  336.   }
  337. }
  338. void CJpeg::idctMMX(short* coef_block,BYTE *output_buf)
  339. { int workspace[64+4];
  340. domidct8x8llmW(coef_block, workspace, output_buf);
  341. }
  342. static __int64 fix_029_n089n196 = 0x098ea46e098ea46e;
  343. static __int64 fix_n196_n089 = 0xc13be333c13be333;
  344. static __int64 fix_205_n256n039 = 0x41b3a18141b3a181;
  345. static __int64 fix_n039_n256 = 0xf384adfdf384adfd;
  346. static __int64 fix_307n256_n196 = 0x1051c13b1051c13b;
  347. static __int64 fix_n256_n196 = 0xadfdc13badfdc13b;
  348. static __int64 fix_150_n089n039 = 0x300bd6b7300bd6b7;
  349. static __int64 fix_n039_n089 = 0xf384e333f384e333;
  350. static __int64 fix_117_117 = 0x25a125a125a125a1;
  351. static __int64 fix_054_054p076 = 0x115129cf115129cf;
  352. static __int64 fix_054n184_054 = 0xd6301151d6301151;
  353. static __int64 fix_054n184  = 0xd630d630d630d630;
  354. static __int64 fix_054 = 0x1151115111511151;
  355. static __int64 fix_054p076 = 0x29cf29cf29cf29cf;
  356. static __int64 fix_n196p307n256 = 0xd18cd18cd18cd18c;
  357. static __int64 fix_n089n039p150 = 0x06c206c206c206c2;
  358. static __int64 fix_n256 = 0xadfdadfdadfdadfd;
  359. static __int64 fix_n039 = 0xf384f384f384f384;
  360. static __int64 fix_n256n039p205 = 0xe334e334e334e334;
  361. static __int64 fix_n196 = 0xc13bc13bc13bc13b;
  362. static __int64 fix_n089 = 0xe333e333e333e333;
  363. static __int64 fixn089n196p029 = 0xadfcadfcadfcadfc;
  364. static  __int64 const_0x2xx8 = 0x0000010000000100;
  365. static  __int64 const_0x0808 = 0x0808080808080808;
  366. void CJpeg::domidct8x8llmW(short *inptr,int *wsptr,BYTE* outptr)
  367. {
  368. __asm{
  369. mov ebx, inptr
  370. mov esi, wsptr
  371. add esi, 0x07 ;align wsptr to qword
  372. and esi, 0xfffffff8 ;align wsptr to qword
  373. mov eax, esi
  374. /* Pass 1. */
  375. movq mm0, [ebx + 8*4] ;p1(1,0)
  376.     movq mm1, [ebx + 8*12] ;p1(2,0)
  377. movq mm6, [ebx + 8*0] ;p1(5,0)
  378. movq mm2, mm0 ;p1(3,0)
  379. movq mm7, [ebx + 8*8] ;p1(6,0)
  380. punpcklwd mm0, mm1 ;p1(3,1)
  381. movq mm4, mm0 ;p1(3,2)
  382. punpckhwd mm2, mm1 ;p1(3,4)
  383. pmaddwd mm0, fix_054n184_054;p1(3,3)
  384. movq mm5, mm2 ;p1(3,5)
  385. pmaddwd mm2, fix_054n184_054;p1(3,6)
  386. pxor mm1, mm1 ;p1(7,0)
  387. pmaddwd mm4, fix_054_054p076;p1(4,0)
  388. punpcklwd   mm1, mm6 ;p1(7,1)
  389. pmaddwd mm5, fix_054_054p076;p1(4,1)
  390. psrad mm1, 3 ;p1(7,2)
  391. pxor mm3, mm3 ;p1(7,3)
  392. punpcklwd mm3, mm7 ;p1(7,4)
  393. psrad mm3, 3 ;p1(7,5)
  394. paddd mm1, mm3 ;p1(7,6)
  395. movq mm3, mm1 ;p1(7,7)
  396. paddd mm1, mm4 ;p1(7,8)
  397. psubd mm3, mm4 ;p1(7,9)
  398. movq [esi + 8*16], mm1 ;p1(7,10)
  399. pxor mm4, mm4 ;p1(7,12)
  400. movq [esi + 8*22], mm3 ;p1(7,11)
  401. punpckhwd mm4, mm6 ;p1(7,13)
  402. psrad mm4, 3 ;p1(7,14)
  403. pxor mm1, mm1 ;p1(7,15)
  404. punpckhwd mm1, mm7 ;p1(7,16)
  405. psrad mm1, 3 ;p1(7,17)
  406. paddd mm4, mm1 ;p1(7,18)
  407. movq mm3, mm4 ;p1(7,19)
  408. pxor mm1, mm1 ;p1(8,0)
  409. paddd mm3, mm5 ;p1(7,20)
  410. punpcklwd mm1, mm6 ;p1(8,1)
  411. psubd mm4, mm5 ;p1(7,21)
  412. psrad mm1, 3 ;p1(8,2)
  413. movq [esi + 8*17], mm3 ;p1(7,22)
  414. pxor mm5, mm5 ;p1(8,3)
  415. movq [esi + 8*23], mm4 ;p1(7,23)
  416. punpcklwd mm5, mm7 ;p1(8,4)
  417. psrad mm5, 3 ;p1(8,5)
  418. pxor mm4, mm4 ;p1(8,12)
  419. psubd mm1, mm5 ;p1(8,6)
  420. punpckhwd mm4, mm6 ;p1(8,13)
  421. movq mm3, mm1 ;p1(8,7)
  422. psrad mm4, 3 ;p1(8,14)
  423. paddd mm1, mm0 ;p1(8,8)
  424. pxor mm5, mm5 ;p1(8,15)
  425. psubd mm3, mm0 ;p1(8,9)
  426. movq mm0, [ebx + 8*14] ;p1(9,0)
  427. punpckhwd mm5, mm7 ;p1(8,16)
  428. movq [esi + 8*18], mm1 ;p1(8,10)
  429. psrad mm5, 3 ;p1(8,17)
  430. movq [esi + 8*20], mm3 ;p1(8,11)
  431. psubd mm4, mm5 ;p1(8,18)
  432. movq mm3, mm4 ;p1(8,19)
  433. movq mm1, [ebx + 8*6] ;p1(10,0)
  434. paddd mm3, mm2 ;p1(8,20)
  435. psubd mm4, mm2 ;p1(8,21)
  436. movq mm5, mm0 ;p1(11,1)
  437. movq [esi + 8*21], mm4 ;p1(8,23)
  438. movq [esi + 8*19], mm3 ;p1(8,22)
  439. movq mm4, mm0 ;p1(11,0)
  440. punpcklwd mm4, mm1 ;p1(11,2)
  441. movq mm2, [ebx + 8*10] ;p1(12,0)
  442. punpckhwd mm5, mm1 ;p1(11,4)
  443. movq mm3, [ebx + 8*2] ;p1(13,0)
  444. movq mm6, mm2 ;p1(14,0)
  445. pmaddwd mm4, fix_117_117 ;p1(11,3)
  446. movq mm7, mm2 ;p1(14,1)
  447. pmaddwd mm5, fix_117_117 ;p1(11,5)
  448. punpcklwd mm6, mm3 ;p1(14,2)
  449. pmaddwd mm6, fix_117_117 ;p1(14,3)
  450. punpckhwd mm7, mm3 ;p1(14,4)
  451. pmaddwd mm7, fix_117_117 ;p1(14,5)
  452. paddd mm4, mm6 ;p1(15,0)
  453. paddd mm5, mm7 ;p1(15,1)
  454.     movq [esi+8*24], mm4 ;p1(15,2)
  455. movq [esi+8*25], mm5 ;p1(15,3)
  456. movq mm6, mm0 ;p1(16,0)
  457. movq mm7, mm3 ;p1(16,3)
  458. punpcklwd mm6, mm2 ;p1(16,1)
  459. punpcklwd mm7, mm3 ;p1(16,4)
  460. pmaddwd mm6, fix_n039_n089 ;p1(16,2)
  461. pmaddwd mm7, fix_150_n089n039 ;p1(16,5)
  462. movq mm4, mm0 ;p1(16,12)
  463. paddd mm6, [esi+8*24] ;p1(16,6)
  464. punpckhwd mm4, mm2 ;p1(16,13)
  465. paddd mm6, mm7 ;p1(16,7)
  466. pmaddwd mm4, fix_n039_n089 ;p1(16,14)
  467. movq mm7, mm6 ;p1(16,8)
  468. paddd mm4, [esi+8*25] ;p1(16,18)
  469. movq mm5, mm3 ;p1(16,15)
  470. paddd mm6, [esi + 8*16] ;p1(16,9)
  471. punpckhwd mm5, mm3 ;p1(16,16)
  472. paddd mm6, const_0x2xx8 ;p1(16,10)
  473. psrad mm6, 9 ;p1(16,11)
  474. pmaddwd mm5, fix_150_n089n039 ;p1(16,17)
  475. paddd mm4, mm5 ;p1(16,19)
  476. movq mm5, mm4 ;p1(16,20)
  477. paddd mm4, [esi + 8*17] ;p1(16,21)
  478. paddd mm4, const_0x2xx8 ;p1(16,22)
  479. psrad mm4, 9 ;p1(16,23)
  480. packssdw mm6, mm4 ;p1(16,24)
  481. movq [esi + 8*0], mm6 ;p1(16,25)
  482. movq mm4, [esi + 8*16] ;p1(16,26)
  483. psubd mm4, mm7 ;p1(16,27)
  484. movq mm6, [esi + 8*17] ;p1(16,30)
  485. paddd mm4, const_0x2xx8 ;p1(16,28)
  486. movq mm7, mm1 ;p1(17,3)
  487. psrad mm4, 9 ;p1(16,29)
  488. psubd mm6, mm5 ;p1(16,31)
  489. paddd mm6, const_0x2xx8 ;p1(16,32)
  490. punpcklwd mm7, mm1 ;p1(17,4)
  491. pmaddwd mm7, fix_307n256_n196 ;p1(17,5)
  492. psrad mm6, 9 ;p1(16,33)
  493. packssdw mm4, mm6 ;p1(16,34)
  494. movq [esi + 8*14], mm4 ;p1(16,35)
  495. movq mm6, mm0 ;p1(17,0)
  496. movq mm4, mm0 ;p1(17,12)
  497. punpcklwd mm6, mm2 ;p1(17,1)
  498. punpckhwd mm4, mm2 ;p1(17,13)
  499. pmaddwd mm6, fix_n256_n196 ;p1(17,2)
  500. movq mm5, mm1 ;p1(17,15)
  501. paddd mm6, [esi+8*24] ;p1(17,6)
  502. punpckhwd mm5, mm1 ;p1(17,16)
  503. paddd mm6, mm7 ;p1(17,7)
  504. pmaddwd mm4, fix_n256_n196 ;p1(17,14)
  505. movq mm7, mm6 ;p1(17,8)
  506. pmaddwd mm5, fix_307n256_n196 ;p1(17,17)
  507. paddd mm6, [esi + 8*18] ;p1(17,9)
  508. paddd mm6, const_0x2xx8 ;p1(17,10)
  509. psrad mm6, 9 ;p1(17,11)
  510. paddd mm4, [esi+8*25] ;p1(17,18)
  511. paddd mm4, mm5 ;p1(17,19)
  512. movq mm5, mm4 ;p1(17,20)
  513. paddd mm4, [esi + 8*19] ;p1(17,21)
  514. paddd mm4, const_0x2xx8 ;p1(17,22)
  515. psrad mm4, 9 ;p1(17,23)
  516. packssdw mm6, mm4 ;p1(17,24)
  517. movq [esi + 8*2], mm6 ;p1(17,25)
  518. movq mm4, [esi + 8*18] ;p1(17,26)
  519. movq mm6, [esi + 8*19] ;p1(17,30)
  520. psubd mm4, mm7 ;p1(17,27)
  521. paddd mm4, const_0x2xx8 ;p1(17,28)
  522. psubd mm6, mm5 ;p1(17,31)
  523. psrad mm4, 9 ;p1(17,29)
  524. paddd mm6, const_0x2xx8 ;p1(17,32)
  525. psrad mm6, 9 ;p1(17,33)
  526. movq mm7, mm2 ;p1(18,3)
  527. packssdw mm4, mm6 ;p1(17,34)
  528. movq [esi + 8*12], mm4 ;p1(17,35)
  529. movq mm6, mm1 ;p1(18,0)
  530. punpcklwd mm7, mm2 ;p1(18,4)
  531. punpcklwd mm6, mm3 ;p1(18,1)
  532. pmaddwd mm7, fix_205_n256n039 ;p1(18,5)
  533. pmaddwd mm6, fix_n039_n256 ;p1(18,2)
  534. movq mm4, mm1 ;p1(18,12)
  535. paddd mm6, [esi+8*24] ;p1(18,6)
  536. punpckhwd mm4, mm3 ;p1(18,13)
  537. paddd mm6, mm7 ;p1(18,7)
  538. pmaddwd mm4, fix_n039_n256 ;p1(18,14)
  539. movq mm7, mm6 ;p1(18,8)
  540. movq mm5, mm2 ;p1(18,15)
  541. paddd mm6, [esi + 8*20] ;p1(18,9)
  542. punpckhwd mm5, mm2 ;p1(18,16)
  543. paddd mm6, const_0x2xx8 ;p1(18,10)
  544. psrad mm6, 9 ;p1(18,11)
  545. pmaddwd mm5, fix_205_n256n039 ;p1(18,17)
  546. paddd mm4, [esi+8*25] ;p1(18,18)
  547. paddd mm4, mm5 ;p1(18,19)
  548. movq mm5, mm4 ;p1(18,20)
  549. paddd mm4, [esi + 8*21] ;p1(18,21)
  550. paddd mm4, const_0x2xx8 ;p1(18,22)
  551. psrad mm4, 9 ;p1(18,23)
  552. packssdw mm6, mm4 ;p1(18,24)
  553. movq [esi + 8*4], mm6 ;p1(18,25)
  554. movq mm4, [esi + 8*20] ;p1(18,26)
  555. psubd mm4, mm7 ;p1(18,27)
  556. paddd mm4, const_0x2xx8 ;p1(18,28)
  557. movq mm7, mm0 ;p1(19,3)
  558. psrad mm4, 9 ;p1(18,29)
  559. movq mm6, [esi + 8*21] ;p1(18,30)
  560. psubd mm6, mm5 ;p1(18,31)
  561. punpcklwd mm7, mm0 ;p1(19,4)
  562. paddd mm6, const_0x2xx8 ;p1(18,32)
  563. psrad mm6, 9 ;p1(18,33)
  564. pmaddwd mm7, fix_029_n089n196 ;p1(19,5)
  565. packssdw mm4, mm6 ;p1(18,34)
  566. movq [esi + 8*10], mm4 ;p1(18,35)
  567. movq mm6, mm3 ;p1(19,0)
  568. punpcklwd mm6, mm1 ;p1(19,1)
  569. movq mm5, mm0 ;p1(19,15)
  570. pmaddwd mm6, fix_n196_n089 ;p1(19,2)
  571. punpckhwd mm5, mm0 ;p1(19,16)
  572. paddd mm6, [esi+8*24] ;p1(19,6)
  573. movq mm4, mm3 ;p1(19,12)
  574. paddd mm6, mm7 ;p1(19,7)
  575. punpckhwd mm4, mm1 ;p1(19,13)
  576. movq mm7, mm6 ;p1(19,8)
  577. pmaddwd mm4, fix_n196_n089   ;p1(19,14)
  578. paddd mm6, [esi + 8*22] ;p1(19,9)
  579. pmaddwd mm5, fix_029_n089n196 ;p1(19,17)
  580. paddd mm6, const_0x2xx8 ;p1(19,10)
  581. psrad mm6, 9 ;p1(19,11)
  582. paddd mm4, [esi+8*25] ;p1(19,18)
  583. paddd mm4, mm5 ;p1(19,19)
  584. movq mm5, mm4 ;p1(19,20)
  585. paddd mm4, [esi + 8*23] ;p1(19,21)
  586. paddd mm4, const_0x2xx8 ;p1(19,22)
  587. psrad mm4, 9 ;p1(19,23)
  588. packssdw mm6, mm4 ;p1(19,24)
  589. movq [esi + 8*6], mm6 ;p1(19,25)
  590. movq mm4, [esi + 8*22] ;p1(19,26)
  591. psubd mm4, mm7 ;p1(19,27)
  592. movq mm6, [esi + 8*23] ;p1(19,30)
  593. paddd mm4, const_0x2xx8 ;p1(19,28)
  594. psubd mm6, mm5 ;p1(19,31)
  595. psrad mm4, 9 ;p1(19,29)
  596. paddd mm6, const_0x2xx8 ;p1(19,32)
  597. psrad mm6, 9 ;p1(19,33)
  598. packssdw mm4, mm6 ;p1(19,34)
  599. movq [esi + 8*8], mm4 ;p1(19,35)
  600. //************************************************************  
  601. // add edi, 8
  602. add ebx, 8
  603. add esi, 8
  604. //************************************************************  
  605. /* Pass 1. */
  606. movq mm0, [ebx + 8*4] ;p1(1,0)
  607.     movq mm1, [ebx + 8*12] ;p1(2,0)
  608. movq mm6, [ebx + 8*0] ;p1(5,0)
  609. movq mm2, mm0 ;p1(3,0)
  610. movq mm7, [ebx + 8*8] ;p1(6,0)
  611. punpcklwd mm0, mm1 ;p1(3,1)
  612. movq mm4, mm0 ;p1(3,2)
  613. punpckhwd mm2, mm1 ;p1(3,4)
  614. pmaddwd mm0, fix_054n184_054 ;p1(3,3)
  615. movq mm5, mm2 ;p1(3,5)
  616. pmaddwd mm2, fix_054n184_054 ;p1(3,6)
  617. pxor mm1, mm1 ;p1(7,0)
  618. pmaddwd mm4, fix_054_054p076 ;p1(4,0)
  619. punpcklwd   mm1, mm6 ;p1(7,1)
  620. pmaddwd mm5, fix_054_054p076 ;p1(4,1)
  621. psrad mm1, 3 ;p1(7,2)
  622. pxor mm3, mm3 ;p1(7,3)
  623. punpcklwd mm3, mm7 ;p1(7,4)
  624. psrad mm3, 3 ;p1(7,5)
  625. paddd mm1, mm3 ;p1(7,6)
  626. movq mm3, mm1 ;p1(7,7)
  627. paddd mm1, mm4 ;p1(7,8)
  628. psubd mm3, mm4 ;p1(7,9)
  629. movq [esi + 8*16], mm1 ;p1(7,10)
  630. pxor mm4, mm4 ;p1(7,12)
  631. movq [esi + 8*22], mm3 ;p1(7,11)
  632. punpckhwd mm4, mm6 ;p1(7,13)
  633. psrad mm4, 3 ;p1(7,14)
  634. pxor mm1, mm1 ;p1(7,15)
  635. punpckhwd mm1, mm7 ;p1(7,16)
  636. psrad mm1, 3 ;p1(7,17)
  637. paddd mm4, mm1 ;p1(7,18)
  638. movq mm3, mm4 ;p1(7,19)
  639. pxor mm1, mm1 ;p1(8,0)
  640. paddd mm3, mm5 ;p1(7,20)
  641. punpcklwd mm1, mm6 ;p1(8,1)
  642. psubd mm4, mm5 ;p1(7,21)
  643. psrad mm1, 3 ;p1(8,2)
  644. movq [esi + 8*17], mm3 ;p1(7,22)
  645. pxor mm5, mm5 ;p1(8,3)
  646. movq [esi + 8*23], mm4 ;p1(7,23)
  647. punpcklwd mm5, mm7 ;p1(8,4)
  648. psrad mm5, 3 ;p1(8,5)
  649. pxor mm4, mm4 ;p1(8,12)
  650. psubd mm1, mm5 ;p1(8,6)
  651. punpckhwd mm4, mm6 ;p1(8,13)
  652. movq mm3, mm1 ;p1(8,7)
  653. psrad mm4, 3 ;p1(8,14)
  654. paddd mm1, mm0 ;p1(8,8)
  655. pxor mm5, mm5 ;p1(8,15)
  656. psubd mm3, mm0 ;p1(8,9)
  657. movq mm0, [ebx + 8*14] ;p1(9,0)
  658. punpckhwd mm5, mm7 ;p1(8,16)
  659. movq [esi + 8*18], mm1 ;p1(8,10)
  660. psrad mm5, 3 ;p1(8,17)
  661. movq [esi + 8*20], mm3 ;p1(8,11)
  662. psubd mm4, mm5 ;p1(8,18)
  663. movq mm3, mm4 ;p1(8,19)
  664. movq mm1, [ebx + 8*6] ;p1(10,0)
  665. paddd mm3, mm2 ;p1(8,20)
  666. psubd mm4, mm2 ;p1(8,21)
  667. movq mm5, mm0 ;p1(11,1)
  668. movq [esi + 8*21], mm4 ;p1(8,23)
  669. movq [esi + 8*19], mm3 ;p1(8,22)
  670. movq mm4, mm0 ;p1(11,0)
  671. punpcklwd mm4, mm1 ;p1(11,2)
  672. movq mm2, [ebx + 8*10] ;p1(12,0)
  673. punpckhwd mm5, mm1 ;p1(11,4)
  674. movq mm3, [ebx + 8*2] ;p1(13,0)
  675. movq mm6, mm2 ;p1(14,0)
  676. pmaddwd mm4, fix_117_117 ;p1(11,3)
  677. movq mm7, mm2 ;p1(14,1)
  678. pmaddwd mm5, fix_117_117 ;p1(11,5)
  679. punpcklwd mm6, mm3 ;p1(14,2)
  680. pmaddwd mm6, fix_117_117 ;p1(14,3)
  681. punpckhwd mm7, mm3 ;p1(14,4)
  682. pmaddwd mm7, fix_117_117 ;p1(14,5)
  683. paddd mm4, mm6 ;p1(15,0)
  684. paddd mm5, mm7 ;p1(15,1)
  685.     movq [esi+8*24], mm4 ;p1(15,2)
  686. movq [esi+8*25], mm5 ;p1(15,3)
  687. movq mm6, mm0 ;p1(16,0)
  688. movq mm7, mm3 ;p1(16,3)
  689. punpcklwd mm6, mm2 ;p1(16,1)
  690. punpcklwd mm7, mm3 ;p1(16,4)
  691. pmaddwd mm6, fix_n039_n089 ;p1(16,2)
  692. pmaddwd mm7, fix_150_n089n039 ;p1(16,5)
  693. movq mm4, mm0 ;p1(16,12)
  694. paddd mm6, [esi+8*24] ;p1(16,6)
  695. punpckhwd mm4, mm2 ;p1(16,13)
  696. paddd mm6, mm7 ;p1(16,7)
  697. pmaddwd mm4, fix_n039_n089 ;p1(16,14)
  698. movq mm7, mm6 ;p1(16,8)
  699. paddd mm4, [esi+8*25] ;p1(16,18)
  700. movq mm5, mm3 ;p1(16,15)
  701. paddd mm6, [esi + 8*16] ;p1(16,9)
  702. punpckhwd mm5, mm3 ;p1(16,16)
  703. paddd mm6, const_0x2xx8 ;p1(16,10)
  704. psrad mm6, 9 ;p1(16,11)
  705. pmaddwd mm5, fix_150_n089n039 ;p1(16,17)
  706. paddd mm4, mm5 ;p1(16,19)
  707. movq mm5, mm4 ;p1(16,20)
  708. paddd mm4, [esi + 8*17] ;p1(16,21)
  709. paddd mm4, const_0x2xx8 ;p1(16,22)
  710. psrad mm4, 9 ;p1(16,23)
  711. packssdw mm6, mm4 ;p1(16,24)
  712. movq [esi + 8*0], mm6 ;p1(16,25)
  713. movq mm4, [esi + 8*16] ;p1(16,26)
  714. psubd mm4, mm7 ;p1(16,27)
  715. movq mm6, [esi + 8*17] ;p1(16,30)
  716. paddd mm4, const_0x2xx8 ;p1(16,28)
  717. movq mm7, mm1 ;p1(17,3)
  718. psrad mm4, 9 ;p1(16,29)
  719. psubd mm6, mm5 ;p1(16,31)
  720. paddd mm6, const_0x2xx8 ;p1(16,32)
  721. punpcklwd mm7, mm1 ;p1(17,4)
  722. pmaddwd mm7, fix_307n256_n196 ;p1(17,5)
  723. psrad mm6, 9 ;p1(16,33)
  724. packssdw mm4, mm6 ;p1(16,34)
  725. movq [esi + 8*14], mm4 ;p1(16,35)
  726. movq mm6, mm0 ;p1(17,0)
  727. movq mm4, mm0 ;p1(17,12)
  728. punpcklwd mm6, mm2 ;p1(17,1)
  729. punpckhwd mm4, mm2 ;p1(17,13)
  730. pmaddwd mm6, fix_n256_n196 ;p1(17,2)
  731. movq mm5, mm1 ;p1(17,15)
  732. paddd mm6, [esi+8*24] ;p1(17,6)
  733. punpckhwd mm5, mm1 ;p1(17,16)
  734. paddd mm6, mm7 ;p1(17,7)
  735. pmaddwd mm4, fix_n256_n196 ;p1(17,14)
  736. movq mm7, mm6 ;p1(17,8)
  737. pmaddwd mm5, fix_307n256_n196 ;p1(17,17)
  738. paddd mm6, [esi + 8*18] ;p1(17,9)
  739. paddd mm6, const_0x2xx8 ;p1(17,10)
  740. psrad mm6, 9 ;p1(17,11)
  741. paddd mm4, [esi+8*25] ;p1(17,18)
  742. paddd mm4, mm5 ;p1(17,19)
  743. movq mm5, mm4 ;p1(17,20)
  744. paddd mm4, [esi + 8*19] ;p1(17,21)
  745. paddd mm4, const_0x2xx8 ;p1(17,22)
  746. psrad mm4, 9 ;p1(17,23)
  747. packssdw mm6, mm4 ;p1(17,24)
  748. movq [esi + 8*2], mm6 ;p1(17,25)
  749. movq mm4, [esi + 8*18] ;p1(17,26)
  750. movq mm6, [esi + 8*19] ;p1(17,30)
  751. psubd mm4, mm7 ;p1(17,27)
  752. paddd mm4, const_0x2xx8 ;p1(17,28)
  753. psubd mm6, mm5 ;p1(17,31)
  754. psrad mm4, 9 ;p1(17,29)
  755. paddd mm6, const_0x2xx8 ;p1(17,32)
  756. psrad mm6, 9 ;p1(17,33)
  757. movq mm7, mm2 ;p1(18,3)
  758. packssdw mm4, mm6 ;p1(17,34)
  759. movq [esi + 8*12], mm4 ;p1(17,35)
  760. movq mm6, mm1 ;p1(18,0)
  761. punpcklwd mm7, mm2 ;p1(18,4)
  762. punpcklwd mm6, mm3 ;p1(18,1)
  763. pmaddwd mm7, fix_205_n256n039 ;p1(18,5)
  764. pmaddwd mm6, fix_n039_n256 ;p1(18,2)
  765. movq mm4, mm1 ;p1(18,12)
  766. paddd mm6, [esi+8*24] ;p1(18,6)
  767. punpckhwd mm4, mm3 ;p1(18,13)
  768. paddd mm6, mm7 ;p1(18,7)
  769. pmaddwd mm4, fix_n039_n256 ;p1(18,14)
  770. movq mm7, mm6 ;p1(18,8)
  771. movq mm5, mm2 ;p1(18,15)
  772. paddd mm6, [esi + 8*20] ;p1(18,9)
  773. punpckhwd mm5, mm2 ;p1(18,16)
  774. paddd mm6, const_0x2xx8 ;p1(18,10)
  775. psrad mm6, 9 ;p1(18,11)
  776. pmaddwd mm5, fix_205_n256n039 ;p1(18,17)
  777. paddd mm4, [esi+8*25] ;p1(18,18)
  778. paddd mm4, mm5 ;p1(18,19)
  779. movq mm5, mm4 ;p1(18,20)
  780. paddd mm4, [esi + 8*21] ;p1(18,21)
  781. paddd mm4, const_0x2xx8 ;p1(18,22)
  782. psrad mm4, 9 ;p1(18,23)
  783. packssdw mm6, mm4 ;p1(18,24)
  784. movq [esi + 8*4], mm6 ;p1(18,25)
  785. movq mm4, [esi + 8*20] ;p1(18,26)
  786. psubd mm4, mm7 ;p1(18,27)
  787. paddd mm4, const_0x2xx8 ;p1(18,28)
  788. movq mm7, mm0 ;p1(19,3)
  789. psrad mm4, 9 ;p1(18,29)
  790. movq mm6, [esi + 8*21] ;p1(18,30)
  791. psubd mm6, mm5 ;p1(18,31)
  792. punpcklwd mm7, mm0 ;p1(19,4)
  793. paddd mm6, const_0x2xx8 ;p1(18,32)
  794. psrad mm6, 9 ;p1(18,33)
  795. pmaddwd mm7, fix_029_n089n196 ;p1(19,5)
  796. packssdw mm4, mm6 ;p1(18,34)
  797. movq [esi + 8*10], mm4 ;p1(18,35)
  798. movq mm6, mm3 ;p1(19,0)
  799. punpcklwd mm6, mm1 ;p1(19,1)
  800. movq mm5, mm0 ;p1(19,15)
  801. pmaddwd mm6, fix_n196_n089 ;p1(19,2)
  802. punpckhwd mm5, mm0 ;p1(19,16)
  803. paddd mm6, [esi+8*24] ;p1(19,6)
  804. movq mm4, mm3 ;p1(19,12)
  805. paddd mm6, mm7 ;p1(19,7)
  806. punpckhwd mm4, mm1 ;p1(19,13)
  807. movq mm7, mm6 ;p1(19,8)
  808. pmaddwd mm4, fix_n196_n089   ;p1(19,14)
  809. paddd mm6, [esi + 8*22] ;p1(19,9)
  810. pmaddwd mm5, fix_029_n089n196 ;p1(19,17)
  811. paddd mm6, const_0x2xx8 ;p1(19,10)
  812. psrad mm6, 9 ;p1(19,11)
  813. paddd mm4, [esi+8*25] ;p1(19,18)
  814. paddd mm4, mm5 ;p1(19,19)
  815. movq mm5, mm4 ;p1(19,20)
  816. paddd mm4, [esi + 8*23] ;p1(19,21)
  817. paddd mm4, const_0x2xx8 ;p1(19,22)
  818. psrad mm4, 9 ;p1(19,23)
  819. packssdw mm6, mm4 ;p1(19,24)
  820. movq [esi + 8*6], mm6 ;p1(19,25)
  821. movq mm4, [esi + 8*22] ;p1(19,26)
  822. psubd mm4, mm7 ;p1(19,27)
  823. movq mm6, [esi + 8*23] ;p1(19,30)
  824. paddd mm4, const_0x2xx8 ;p1(19,28)
  825. psubd mm6, mm5 ;p1(19,31)
  826. psrad mm4, 9 ;p1(19,29)
  827. paddd mm6, const_0x2xx8 ;p1(19,32)
  828. psrad mm6, 9 ;p1(19,33)
  829. packssdw mm4, mm6 ;p1(19,34)
  830. movq [esi + 8*8], mm4 ;p1(19,35)
  831. //************************************************************  
  832. mov esi, eax
  833. mov edi, outptr
  834. //transpose 4 rows of wsptr
  835. movq mm0, [esi+8*0] ;tran(0)
  836. movq mm1, mm0 ;tran(1)
  837. movq mm2, [esi+8*2] ;tran(2)
  838. punpcklwd mm0, mm2 ;tran(3)
  839. movq mm3, [esi+8*4] ;tran(5)
  840. punpckhwd mm1, mm2 ;tran(4)
  841. movq mm5, [esi+8*6] ;tran(7)
  842. movq mm4, mm3 ;tran(6)
  843. movq mm6, mm0 ;tran(10)
  844. punpcklwd mm3, mm5 ;tran(8)
  845. movq mm7, mm1 ;tran(11)
  846. punpckldq mm0, mm3 ;tran(12)
  847. punpckhwd mm4, mm5 ;tran(9)
  848. movq [esi+8*0], mm0 ;tran(16)
  849. punpckhdq mm6, mm3 ;tran(13)
  850. movq mm0, [esi+8*1] ;tran(20)
  851. punpckldq mm1, mm4 ;tran(14)
  852. movq [esi+8*2], mm6 ;tran(17)
  853. punpckhdq mm7, mm4 ;tran(15)
  854. movq [esi+8*4], mm1 ;tran(18)
  855. movq mm1, mm0 ;tran(21)
  856. movq mm3, [esi+8*5] ;tran(25)
  857. movq mm2, [esi+8*3] ;tran(22)
  858. movq mm4, mm3 ;tran(26)
  859. punpcklwd mm0, mm2 ;tran(23)
  860. movq [esi+8*6], mm7 ;tran(19)
  861. punpckhwd mm1, mm2 ;tran(24)
  862. movq mm5, [esi+8*7] ;tran(27)
  863. punpcklwd mm3, mm5 ;tran(28)
  864. movq mm6, mm0 ;tran(30)
  865. movq mm7, mm1 ;tran(31)
  866. punpckhdq mm6, mm3 ;tran(33)
  867. punpckhwd mm4, mm5 ;tran(29)
  868. movq mm2, mm6 ;p2(1,0)
  869. punpckhdq mm7, mm4 ;tran(35)
  870. movq mm5, [esi + 8*2] ;p2(1,2)
  871. paddw mm2, mm7 ;p2(1,1)
  872. paddw mm5, [esi + 8*6] ;p2(1,3)
  873. punpckldq mm0, mm3 ;tran(32)
  874. paddw mm2, mm5 ;p2(1,4)
  875. punpckldq mm1, mm4 ;tran(34)
  876. movq mm5, [esi + 8*2] ;p2(3,0)
  877. pmulhw mm2, fix_117_117 ;p2(1,5)
  878. movq mm4, mm7 ;p2(2,0)
  879. pmulhw mm4, fixn089n196p029 ;p2(2,1)
  880. movq mm3, mm6 ;p2(6,0)
  881. pmulhw mm3, fix_n256n039p205 ;p2(6,1)
  882. pmulhw mm5, fix_n089 ;p2(3,1)
  883. movq [eax + 8*24], mm2 ;p2(1,6)
  884. movq mm2, [esi + 8*6] ;p2(4,0)
  885. pmulhw mm2, fix_n196 ;p2(4,1)
  886. paddw mm4, [eax + 8*24] ;p2(5,0)
  887. paddw mm3, [eax + 8*24] ;p2(9,0)
  888. paddw mm5, mm2 ;p2(5,1)
  889. movq mm2, [esi + 8*2] ;p2(7,0)
  890. paddw mm5, mm4 ;p2(5,2)
  891. pmulhw mm2, fix_n039 ;p2(7,1)
  892. movq [esi + 8*1], mm5 ;p2(5,3)
  893. movq mm4, [esi + 8*6] ;p2(8,0)
  894. movq mm5, mm6 ;p2(10,0)
  895. pmulhw mm4, fix_n256 ;p2(8,1)
  896. pmulhw mm5, fix_n039 ;p2(10,1)
  897. pmulhw mm6, fix_n256 ;p2(15,0)
  898. paddw mm2, mm4 ;p2(9,1)
  899. movq mm4, mm7 ;p2(11,0)
  900. pmulhw mm4, fix_n089 ;p2(11,1)
  901. paddw mm2, mm3 ;p2(9,2)
  902. movq [esi + 8*3], mm2 ;p2(9,3)
  903. movq mm3, [esi + 8*2] ;p2(13,0)
  904. pmulhw mm7, fix_n196 ;p2(16,0)
  905. pmulhw mm3, fix_n089n039p150 ;p2(13,1)
  906. paddw mm5, mm4 ;p2(12,0)
  907. paddw mm5, [eax + 8*24] ;p2(14,0)
  908. movq mm2, [esi + 8*6] ;p2(18,0)
  909. pmulhw mm2, fix_n196p307n256 ;p2(18,1)
  910. paddw mm5, mm3 ;p2(14,1)
  911. movq [esi + 8*5], mm5 ;p2(14,2)
  912. paddw mm6, mm7 ;p2(17,0)
  913. paddw mm6, [eax + 8*24] ;p2(19,0)
  914. movq mm3, mm1 ;p2(21,0)
  915. movq mm4, [esi + 8*4] ;p2(20,0)
  916. paddw mm6, mm2 ;p2(19,1)
  917. movq [esi + 8*7], mm6 ;p2(19,2)
  918. movq mm5, mm4 ;p2(20,1)
  919. movq mm7, [esi + 8*0] ;p2(26,0)
  920. pmulhw mm4, fix_054p076 ;p2(20,2)
  921. psubw mm7, mm0 ;p2(27,0)
  922. pmulhw mm3, fix_054 ;p2(21,1)
  923. movq mm2, mm0 ;p2(26,1)
  924. pmulhw mm5, fix_054 ;p2(23,0)
  925. psraw mm7, 3 ;p2(27,1)
  926. paddw mm2, [esi + 8*0] ;p2(26,2)
  927. movq mm6, mm7 ;p2(28,0)
  928. pmulhw mm1, fix_054n184 ;p2(24,0)
  929. psraw mm2, 3 ;p2(26,3)
  930. paddw mm4, mm3 ;p2(22,0)
  931. paddw mm5, mm1 ;p2(25,0)
  932. psubw mm6, mm5 ;p2(29,0)
  933. movq mm3, mm2 ;p2(30,0)
  934. paddw mm2, mm4 ;p2(30,1)
  935. paddw mm7, mm5 ;p2(28,1)
  936. movq mm1, mm2 ;p2(32,0)
  937. psubw mm3, mm4 ;p2(31,0)
  938. paddw mm1, [esi + 8*5] ;p2(32,1)
  939. movq mm0, mm7 ;p2(33,0)
  940. psubw mm2, [esi + 8*5] ;p2(32,2)
  941. movq mm4, mm6 ;p2(34,0)
  942. paddw mm1, const_0x0808 ;p2(32,3)
  943. paddw mm2, const_0x0808 ;p2(32,4)
  944. psraw mm1, 4 ;p2(32,5)
  945. psraw mm2, 4 ;p2(32,6)
  946. paddw mm7, [esi + 8*7] ;p2(33,1)
  947. packuswb mm1, mm2 ;p2(32,7)
  948. psubw mm0, [esi + 8*7] ;p2(33,2)
  949. paddw mm7, const_0x0808 ;p2(33,3)
  950. paddw mm0, const_0x0808 ;p2(33,4)
  951. psraw mm7, 4 ;p2(33,5)
  952. psraw mm0, 4 ;p2(33,6)
  953. paddw mm4, [esi + 8*3] ;p2(34,1)
  954. packuswb mm7, mm0 ;p2(33,7)
  955. psubw mm6, [esi + 8*3] ;p2(34,2)
  956. paddw mm4, const_0x0808 ;p2(34,3)
  957. movq mm5, mm3 ;p2(35,0)
  958. paddw mm6, const_0x0808 ;p2(34,4)
  959. psraw mm4, 4 ;p2(34,5)
  960. psraw mm6, 4 ;p2(34,6)
  961. paddw mm3, [esi + 8*1] ;p2(35,1)
  962. packuswb mm4, mm6 ;p2(34,7)
  963. psubw mm5, [esi + 8*1] ;p2(35,2)
  964. movq mm0, mm1 ;p2(36,0)
  965. paddw mm3, const_0x0808 ;p2(35,3)
  966. paddw mm5, const_0x0808 ;p2(35,4)
  967. punpcklbw mm0, mm7 ;p2(36,1)
  968. psraw mm3, 4 ;p2(35,5)
  969. movq mm2, mm4 ;p2(37,0)
  970. psraw mm5, 4 ;p2(35,6)
  971. movq mm6, mm0 ;p2(38,0)
  972. packuswb mm3, mm5 ;p2(35,7)
  973. lea ebx, [edi] ;p2(42,0)
  974. punpckhbw mm7, mm1 ;p2(36,2)
  975. lea ecx, [edi+8] ;p2(42,1)
  976. punpcklbw mm2, mm3 ;p2(37,1)
  977. lea edx, [edi+16] ;p2(42,2)
  978. punpckhbw mm3, mm4 ;p2(37,2)
  979. punpcklwd mm0, mm2 ;p2(38,1)
  980. movq mm5, mm3 ;p2(39,0)
  981. punpckhwd mm6, mm2 ;p2(38,2)
  982. movq mm1, mm0 ;p2(40,0)
  983. punpcklwd mm3, mm7 ;p2(39,1)
  984. punpckldq mm0, mm3 ;p2(40,1)
  985. punpckhdq mm1, mm3 ;p2(40,2)
  986. movq [ebx], mm0 ;p2(43,0)
  987. punpckhwd mm5, mm7 ;p2(39,2)
  988. movq [ecx], mm1 ;p2(43,1)
  989. movq mm4, mm6 ;p2(41,0)
  990. lea ebx, [edi+24] ;p2(43,3)
  991. punpckldq mm4, mm5 ;p2(41,1)
  992. punpckhdq mm6, mm5 ;p2(41,2)
  993. movq [edx], mm4 ;p2(43,2)
  994. movq [ebx], mm6 ;p2(43,5)
  995. //************************************************************
  996. // Process next 4 rows
  997. add esi, 64
  998. add edi, 32
  999. //transpose next 4 rows of wsptr
  1000. movq mm0, [esi+8*0] ;tran(0)
  1001. movq mm1, mm0 ;tran(1)
  1002. movq mm2, [esi+8*2] ;tran(2)
  1003. punpcklwd mm0, mm2 ;tran(3)
  1004. movq mm3, [esi+8*4] ;tran(5)
  1005. punpckhwd mm1, mm2 ;tran(4)
  1006. movq mm5, [esi+8*6] ;tran(7)
  1007. movq mm4, mm3 ;tran(6)
  1008. movq mm6, mm0 ;tran(10)
  1009. punpcklwd mm3, mm5 ;tran(8)
  1010. movq mm7, mm1 ;tran(11)
  1011. punpckldq mm0, mm3 ;tran(12)
  1012. punpckhwd mm4, mm5 ;tran(9)
  1013. movq [esi+8*0], mm0 ;tran(16)
  1014. punpckhdq mm6, mm3 ;tran(13)
  1015. movq mm0, [esi+8*1] ;tran(20)
  1016. punpckldq mm1, mm4 ;tran(14)
  1017. movq [esi+8*2], mm6 ;tran(17)
  1018. punpckhdq mm7, mm4 ;tran(15)
  1019. movq [esi+8*4], mm1 ;tran(18)
  1020. movq mm1, mm0 ;tran(21)
  1021. movq mm3, [esi+8*5] ;tran(25)
  1022. movq mm2, [esi+8*3] ;tran(22)
  1023. movq mm4, mm3 ;tran(26)
  1024. punpcklwd mm0, mm2 ;tran(23)
  1025. movq [esi+8*6], mm7 ;tran(19)
  1026. punpckhwd mm1, mm2 ;tran(24)
  1027. movq mm5, [esi+8*7] ;tran(27)
  1028. punpcklwd mm3, mm5 ;tran(28)
  1029. movq mm6, mm0 ;tran(30)
  1030. movq mm7, mm1 ;tran(31)
  1031. punpckhdq mm6, mm3 ;tran(33)
  1032. punpckhwd mm4, mm5 ;tran(29)
  1033. movq mm2, mm6 ;p2(1,0)
  1034. punpckhdq mm7, mm4 ;tran(35)
  1035. movq mm5, [esi + 8*2] ;p2(1,2)
  1036. paddw mm2, mm7 ;p2(1,1)
  1037. paddw mm5, [esi + 8*6] ;p2(1,3)
  1038. punpckldq mm0, mm3 ;tran(32)
  1039. paddw mm2, mm5 ;p2(1,4)
  1040. punpckldq mm1, mm4 ;tran(34)
  1041. movq mm5, [esi + 8*2] ;p2(3,0)
  1042. pmulhw mm2, fix_117_117 ;p2(1,5)
  1043. movq mm4, mm7 ;p2(2,0)
  1044. pmulhw mm4, fixn089n196p029 ;p2(2,1)
  1045. movq mm3, mm6 ;p2(6,0)
  1046. pmulhw mm3, fix_n256n039p205 ;p2(6,1)
  1047. pmulhw mm5, fix_n089 ;p2(3,1)
  1048. movq [eax + 8*24], mm2 ;p2(1,6)
  1049. movq mm2, [esi + 8*6] ;p2(4,0)
  1050. pmulhw mm2, fix_n196 ;p2(4,1)
  1051. paddw mm4, [eax + 8*24] ;p2(5,0)
  1052. paddw mm3, [eax + 8*24] ;p2(9,0)
  1053. paddw mm5, mm2 ;p2(5,1)
  1054. movq mm2, [esi + 8*2] ;p2(7,0)
  1055. paddw mm5, mm4 ;p2(5,2)
  1056. pmulhw mm2, fix_n039 ;p2(7,1)
  1057. movq [esi + 8*1], mm5 ;p2(5,3)
  1058. movq mm4, [esi + 8*6] ;p2(8,0)
  1059. movq mm5, mm6 ;p2(10,0)
  1060. pmulhw mm4, fix_n256 ;p2(8,1)
  1061. pmulhw mm5, fix_n039 ;p2(10,1)
  1062. pmulhw mm6, fix_n256 ;p2(15,0)
  1063. paddw mm2, mm4 ;p2(9,1)
  1064. movq mm4, mm7 ;p2(11,0)
  1065. pmulhw mm4, fix_n089 ;p2(11,1)
  1066. paddw mm2, mm3 ;p2(9,2)
  1067. movq [esi + 8*3], mm2 ;p2(9,3)
  1068. movq mm3, [esi + 8*2] ;p2(13,0)
  1069. pmulhw mm7, fix_n196 ;p2(16,0)
  1070. pmulhw mm3, fix_n089n039p150 ;p2(13,1)
  1071. paddw mm5, mm4 ;p2(12,0)
  1072. paddw mm5, [eax + 8*24] ;p2(14,0)
  1073. movq mm2, [esi + 8*6] ;p2(18,0)
  1074. pmulhw mm2, fix_n196p307n256 ;p2(18,1)
  1075. paddw mm5, mm3 ;p2(14,1)
  1076. movq [esi + 8*5], mm5 ;p2(14,2)
  1077. paddw mm6, mm7 ;p2(17,0)
  1078. paddw mm6, [eax + 8*24] ;p2(19,0)
  1079. movq mm3, mm1 ;p2(21,0)
  1080. movq mm4, [esi + 8*4] ;p2(20,0)
  1081. paddw mm6, mm2 ;p2(19,1)
  1082. movq [esi + 8*7], mm6 ;p2(19,2)
  1083. movq mm5, mm4 ;p2(20,1)
  1084. movq mm7, [esi + 8*0] ;p2(26,0)
  1085. pmulhw mm4, fix_054p076 ;p2(20,2)
  1086. psubw mm7, mm0 ;p2(27,0)
  1087. pmulhw mm3, fix_054 ;p2(21,1)
  1088. movq mm2, mm0 ;p2(26,1)
  1089. pmulhw mm5, fix_054 ;p2(23,0)
  1090. psraw mm7, 3 ;p2(27,1)
  1091. paddw mm2, [esi + 8*0] ;p2(26,2)
  1092. movq mm6, mm7 ;p2(28,0)
  1093. pmulhw mm1, fix_054n184 ;p2(24,0)
  1094. psraw mm2, 3 ;p2(26,3)
  1095. paddw mm4, mm3 ;p2(22,0)
  1096. paddw mm5, mm1 ;p2(25,0)
  1097. psubw mm6, mm5 ;p2(29,0)
  1098. movq mm3, mm2 ;p2(30,0)
  1099. paddw mm2, mm4 ;p2(30,1)
  1100. paddw mm7, mm5 ;p2(28,1)
  1101. movq mm1, mm2 ;p2(32,0)
  1102. psubw mm3, mm4 ;p2(31,0)
  1103. paddw mm1, [esi + 8*5] ;p2(32,1)
  1104. movq mm0, mm7 ;p2(33,0)
  1105. psubw mm2, [esi + 8*5] ;p2(32,2)
  1106. movq mm4, mm6 ;p2(34,0)
  1107. paddw mm1, const_0x0808 ;p2(32,3)
  1108. paddw mm2, const_0x0808 ;p2(32,4)
  1109. psraw mm1, 4 ;p2(32,5)
  1110. psraw mm2, 4 ;p2(32,6)
  1111. paddw mm7, [esi + 8*7] ;p2(33,1)
  1112. packuswb mm1, mm2 ;p2(32,7)
  1113. psubw mm0, [esi + 8*7] ;p2(33,2)
  1114. paddw mm7, const_0x0808 ;p2(33,3)
  1115. paddw mm0, const_0x0808 ;p2(33,4)
  1116. psraw mm7, 4 ;p2(33,5)
  1117. psraw mm0, 4 ;p2(33,6)
  1118. paddw mm4, [esi + 8*3] ;p2(34,1)
  1119. packuswb mm7, mm0 ;p2(33,7)
  1120. psubw mm6, [esi + 8*3] ;p2(34,2)
  1121. paddw mm4, const_0x0808 ;p2(34,3)
  1122. movq mm5, mm3 ;p2(35,0)
  1123. paddw mm6, const_0x0808 ;p2(34,4)
  1124. psraw mm4, 4 ;p2(34,5)
  1125. psraw mm6, 4 ;p2(34,6)
  1126. paddw mm3, [esi + 8*1] ;p2(35,1)
  1127. packuswb mm4, mm6 ;p2(34,7)
  1128. psubw mm5, [esi + 8*1] ;p2(35,2)
  1129. movq mm0, mm1 ;p2(36,0)
  1130. paddw mm3, const_0x0808 ;p2(35,3)
  1131. paddw mm5, const_0x0808 ;p2(35,4)
  1132. punpcklbw mm0, mm7 ;p2(36,1)
  1133. psraw mm3, 4 ;p2(35,5)
  1134. movq mm2, mm4 ;p2(37,0)
  1135. psraw mm5, 4 ;p2(35,6)
  1136. movq mm6, mm0 ;p2(38,0)
  1137. packuswb mm3, mm5 ;p2(35,7)
  1138. lea ebx, [edi] ;p2(42,0)
  1139. punpckhbw mm7, mm1 ;p2(36,2)
  1140. lea ecx, [edi+8] ;p2(42,1)
  1141. punpcklbw mm2, mm3 ;p2(37,1)
  1142. lea edx, [edi+16] ;p2(42,2)
  1143. punpckhbw mm3, mm4 ;p2(37,2)
  1144. punpcklwd mm0, mm2 ;p2(38,1)
  1145. movq mm5, mm3 ;p2(39,0)
  1146. punpckhwd mm6, mm2 ;p2(38,2)
  1147. movq mm1, mm0 ;p2(40,0)
  1148. punpcklwd mm3, mm7 ;p2(39,1)
  1149. punpckldq mm0, mm3 ;p2(40,1)
  1150. punpckhdq mm1, mm3 ;p2(40,2)
  1151. movq [ebx], mm0 ;p2(43,0)
  1152. punpckhwd mm5, mm7 ;p2(39,2)
  1153. movq [ecx], mm1 ;p2(43,1)
  1154. movq mm4, mm6 ;p2(41,0)
  1155. lea ebx, [edi+24] ;p2(43,3)
  1156. punpckldq mm4, mm5 ;p2(41,1)
  1157. punpckhdq mm6, mm5 ;p2(41,2)
  1158. movq [edx], mm4 ;p2(43,2)
  1159. movq [ebx], mm6 ;p2(43,5)
  1160. emms
  1161. }
  1162. }