fdct_mmx.asm
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:40k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. ;/******************************************************************************
  2. ; *                                                                            *
  3. ; *  This file is part of XviD, a free MPEG-4 video encoder/decoder            *
  4. ; *                                                                            *
  5. ; *  XviD is an implementation of a part of one or more MPEG-4 Video tools     *
  6. ; *  as specified in ISO/IEC 14496-2 standard.  Those intending to use this    *
  7. ; *  software module in hardware or software products are advised that its     *
  8. ; *  use may infringe existing patents or copyrights, and any such use         *
  9. ; *  would be at such party's own risk.  The original developer of this        *
  10. ; *  software module and his/her company, and subsequent editors and their     *
  11. ; *  companies, will have no liability for use of this software or             *
  12. ; *  modifications or derivatives thereof.                                     *
  13. ; *                                                                            *
  14. ; *  XviD is free software; you can redistribute it and/or modify it           *
  15. ; *  under the terms of the GNU General Public License as published by         *
  16. ; *  the Free Software Foundation; either version 2 of the License, or         *
  17. ; *  (at your option) any later version.                                       *
  18. ; *                                                                            *
  19. ; *  XviD is distributed in the hope that it will be useful, but               *
  20. ; *  WITHOUT ANY WARRANTY; without even the implied warranty of                *
  21. ; *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
  22. ; *  GNU General Public License for more details.                              *
  23. ; *                                                                            *
  24. ; *  You should have received a copy of the GNU General Public License         *
  25. ; *  along with this program; if not, write to the Free Software               *
  26. ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  *
  27. ; *                                                                            *
  28. ; ******************************************************************************/
  29. ;
  30. ;/******************************************************************************
  31. ; *                                                                            *
  32. ; *  fdct_mmx.asm, MMX optimized forward DCT                                   *
  33. ; *                                                                            *
  34. ; *  Initial, but incomplete version provided by Intel at AppNote AP-922       *
  35. ; *  http://developer.intel.com/vtune/cbts/strmsimd/922down.htm                *
  36. ; *  Copyright (C) 1999 Intel Corporation,                                     *
  37. ; *                                                                            *
  38. ; *  completed and corrected in fdctmm32.c/fdctmm32.doc,                       *
  39. ; *  http://members.tripod.com/~liaor                                          *
  40. ; *  Copyright (C) 2000 - Royce Shih-Wea Liao <liaor@iname.com>,               *
  41. ; *                                                                            *
  42. ; *  ported to NASM and some minor changes                                     * 
  43. ; *  Copyright (C) 2001 - Michael Militzer <isibaar@xvid.org>                  *
  44. ; *                                                                            *
  45. ; *  For more information visit the XviD homepage: http://www.xvid.org         *
  46. ; *                                                                            *
  47. ; ******************************************************************************/
  48. ;
  49. ;/******************************************************************************
  50. ; *                                                                            *
  51. ; *  Revision history:                                                         *
  52. ; *                                                                            *
  53. ; *  04.11.2001 loop unrolled (Isibaar)     *
  54. ; *  02.11.2001 initial version  (Isibaar)                                     *
  55. ; *                                                                            *
  56. ; ******************************************************************************/
  57. BITS 32
  58. %macro cglobal 1 
  59. %ifdef PREFIX
  60. global _%1 
  61. %define %1 _%1
  62. %else
  63. global %1
  64. %endif
  65. %endmacro
  66. %define INP eax
  67. %define TABLE ebx
  68. %define TABLEF ebx
  69. %define OUT ecx
  70. %define round_frw_row edx
  71. %define INP_1 eax + 16
  72. %define INP_2 eax + 32
  73. %define INP_3 eax + 48
  74. %define INP_4 eax + 64
  75. %define INP_5 eax + 80
  76. %define INP_6 eax + 96
  77. %define INP_7 eax + 112
  78. %define OUT_1 ecx + 16
  79. %define OUT_2 ecx + 32
  80. %define OUT_3 ecx + 48
  81. %define OUT_4 ecx + 64
  82. %define OUT_5 ecx + 80
  83. %define OUT_6 ecx + 96
  84. %define OUT_7 ecx + 112
  85. %define OUT_8 ecx + 128
  86. %define TABLE_1 ebx + 64
  87. %define TABLE_2 ebx + 128
  88. %define TABLE_3 ebx + 192
  89. %define TABLE_4 ebx + 256
  90. %define TABLE_5 ebx + 320
  91. %define TABLE_6 ebx + 384
  92. %define TABLE_7 ebx + 448
  93. %define x0 INP + 0*16
  94. %define x1 INP + 1*16
  95. %define x2 INP + 2*16
  96. %define x3 INP + 3*16
  97. %define x4 INP + 4*16
  98. %define x5 INP + 5*16
  99. %define x6 INP + 6*16
  100. %define x7 INP + 7*16
  101. %define y0 OUT + 0*16
  102. %define y1 OUT + 1*16
  103. %define y2 OUT + 2*16
  104. %define y3 OUT + 3*16
  105. %define y4 OUT + 4*16
  106. %define y5 OUT + 5*16
  107. %define y6 OUT + 6*16
  108. %define y7 OUT + 7*16
  109. %define tg_1_16 (TABLEF + 0)
  110. %define tg_2_16 (TABLEF + 8)
  111. %define tg_3_16 (TABLEF + 16)
  112. %define cos_4_16 (TABLEF + 24)
  113. %define ocos_4_16 (TABLEF + 32)
  114. SECTION .data
  115. ALIGN 16
  116. BITS_FRW_ACC equ 3 ; 2 or 3 for accuracy
  117. SHIFT_FRW_COL equ BITS_FRW_ACC
  118. SHIFT_FRW_ROW equ (BITS_FRW_ACC + 17)
  119. RND_FRW_ROW equ (1 << (SHIFT_FRW_ROW-1))
  120. SHIFT_FRW_ROW_CLIP2 equ (4)
  121. SHIFT_FRW_ROW_CLIP1 equ (SHIFT_FRW_ROW - SHIFT_FRW_ROW_CLIP2)
  122. one_corr  dw 1, 1, 1, 1
  123. r_frw_row  dd RND_FRW_ROW, RND_FRW_ROW
  124. tg_all_16  dw 13036, 13036, 13036, 13036, ; tg * (2<<16) + 0.5
  125.  dw 27146, 27146, 27146, 27146, ; tg * (2<<16) + 0.5
  126.  dw -21746, -21746, -21746, -21746, ; tg * (2<<16) + 0.5
  127.  dw -19195, -19195, -19195, -19195, ; cos * (2<<16) + 0.5
  128.  dw 23170, 23170, 23170, 23170      ; cos * (2<<15) + 0.5
  129. tab_frw_01234567 
  130.  ; row0
  131.  dw 16384, 16384, 21407, -8867,     ; w09 w01 w08 w00
  132.  dw 16384, 16384, 8867, -21407,     ; w13 w05 w12 w04
  133.                  dw 16384, -16384, 8867, 21407,     ; w11 w03 w10 w02
  134.                  dw -16384, 16384, -21407, -8867,   ; w15 w07 w14 w06
  135.                  dw 22725, 12873, 19266, -22725,    ; w22 w20 w18 w16
  136.                  dw 19266, 4520, -4520, -12873,     ; w23 w21 w19 w17
  137.                  dw 12873, 4520, 4520, 19266,       ; w30 w28 w26 w24
  138.                  dw -22725, 19266, -12873, -22725,  ; w31 w29 w27 w25
  139.  ; row1
  140.                  dw 22725, 22725, 29692, -12299,    ; w09 w01 w08 w00
  141.                  dw 22725, 22725, 12299, -29692,    ; w13 w05 w12 w04
  142.                  dw 22725, -22725, 12299, 29692,    ; w11 w03 w10 w02
  143.                  dw -22725, 22725, -29692, -12299,  ; w15 w07 w14 w06
  144.                  dw 31521, 17855, 26722, -31521,    ; w22 w20 w18 w16
  145.                  dw 26722, 6270, -6270, -17855,     ; w23 w21 w19 w17
  146.                  dw 17855, 6270, 6270, 26722,       ; w30 w28 w26 w24
  147.                  dw -31521, 26722, -17855, -31521,  ; w31 w29 w27 w25
  148.  ; row2
  149.                  dw 21407, 21407, 27969, -11585,    ; w09 w01 w08 w00
  150.                  dw 21407, 21407, 11585, -27969,    ; w13 w05 w12 w04
  151.                  dw 21407, -21407, 11585, 27969,    ; w11 w03 w10 w02
  152.                  dw -21407, 21407, -27969, -11585, ; w15 w07 w14 w06
  153.                  dw 29692, 16819, 25172, -29692,    ; w22 w20 w18 w16
  154.                  dw 25172, 5906, -5906, -16819,     ; w23 w21 w19 w17
  155.                  dw 16819, 5906, 5906, 25172,       ; w30 w28 w26 w24
  156.                  dw -29692, 25172, -16819, -29692,  ; w31 w29 w27 w25
  157.  ; row3
  158.                  dw 19266, 19266, 25172, -10426,    ; w09 w01 w08 w00
  159.                  dw 19266, 19266, 10426, -25172,    ; w13 w05 w12 w04
  160.                  dw 19266, -19266, 10426, 25172,    ; w11 w03 w10 w02
  161.                  dw -19266, 19266, -25172, -10426,  ; w15 w07 w14 w06 
  162.                  dw 26722, 15137, 22654, -26722,    ; w22 w20 w18 w16
  163.                  dw 22654, 5315, -5315, -15137,     ; w23 w21 w19 w17
  164.                  dw 15137, 5315, 5315, 22654,       ; w30 w28 w26 w24
  165.                  dw -26722, 22654, -15137, -26722,  ; w31 w29 w27 w25
  166.  ; row4
  167.                  dw 16384, 16384, 21407, -8867,     ; w09 w01 w08 w00
  168.                  dw 16384, 16384, 8867, -21407,     ; w13 w05 w12 w04
  169.                  dw 16384, -16384, 8867, 21407,     ; w11 w03 w10 w02
  170.                  dw -16384, 16384, -21407, -8867,   ; w15 w07 w14 w06
  171.                  dw 22725, 12873, 19266, -22725,    ; w22 w20 w18 w16
  172.                  dw 19266, 4520, -4520, -12873,     ; w23 w21 w19 w17
  173.                  dw 12873, 4520, 4520, 19266,       ; w30 w28 w26 w24
  174.                  dw -22725, 19266, -12873, -22725,  ; w31 w29 w27 w25 
  175.  ; row5
  176.                  dw 19266, 19266, 25172, -10426,    ; w09 w01 w08 w00
  177.                  dw 19266, 19266, 10426, -25172,    ; w13 w05 w12 w04
  178.                  dw 19266, -19266, 10426, 25172,    ; w11 w03 w10 w02
  179.                  dw -19266, 19266, -25172, -10426,  ; w15 w07 w14 w06
  180.                  dw 26722, 15137, 22654, -26722,    ; w22 w20 w18 w16
  181.                  dw 22654, 5315, -5315, -15137,     ; w23 w21 w19 w17
  182.                  dw 15137, 5315, 5315, 22654,       ; w30 w28 w26 w24
  183.                  dw -26722, 22654, -15137, -26722,  ; w31 w29 w27 w25
  184.  ; row6
  185.                  dw 21407, 21407, 27969, -11585,    ; w09 w01 w08 w00
  186.                  dw 21407, 21407, 11585, -27969,    ; w13 w05 w12 w04
  187.                  dw 21407, -21407, 11585, 27969,    ; w11 w03 w10 w02
  188.                  dw -21407, 21407, -27969, -11585,  ; w15 w07 w14 w06
  189.                  dw 29692, 16819, 25172, -29692,    ; w22 w20 w18 w16
  190.                  dw 25172, 5906, -5906, -16819,     ; w23 w21 w19 w17
  191.                  dw 16819, 5906, 5906, 25172,       ; w30 w28 w26 w24
  192.                  dw -29692, 25172, -16819, -29692,  ; w31 w29 w27 w25
  193.  ; row7
  194.                  dw 22725, 22725, 29692, -12299,    ; w09 w01 w08 w00
  195.                  dw 22725, 22725, 12299, -29692,    ; w13 w05 w12 w04
  196.                  dw 22725, -22725, 12299, 29692,    ; w11 w03 w10 w02
  197.                  dw -22725, 22725, -29692, -12299,  ; w15 w07 w14 w06
  198.                  dw 31521, 17855, 26722, -31521,    ; w22 w20 w18 w16
  199.                  dw 26722, 6270, -6270, -17855,     ; w23 w21 w19 w17
  200.                  dw 17855, 6270, 6270, 26722,       ; w30 w28 w26 w24
  201.                  dw -31521, 26722, -17855, -31521   ; w31 w29 w27 w25
  202. SECTION .text
  203. ALIGN 16
  204. cglobal fdct_mmx
  205. ;;void fdct_mmx(short *block);
  206. fdct_mmx:
  207. push ebx
  208.     mov INP, dword [esp + 8] ; block
  209.     mov TABLEF, tg_all_16
  210.     mov OUT, INP
  211.     movq mm0, [x1] ; 0 ; x1
  212.     movq mm1, [x6] ; 1 ; x6
  213.     movq mm2, mm0 ; 2 ; x1
  214.     movq mm3, [x2] ; 3 ; x2
  215.     paddsw mm0, mm1 ; t1 = x[1] + x[6]
  216.     movq mm4, [x5] ; 4 ; x5
  217.     psllw mm0, SHIFT_FRW_COL ; t1
  218.     movq mm5, [x0] ; 5 ; x0
  219.     paddsw mm4, mm3 ; t2 = x[2] + x[5]
  220.     paddsw mm5, [x7] ; t0 = x[0] + x[7]
  221.     psllw mm4, SHIFT_FRW_COL ; t2
  222.     movq mm6, mm0 ; 6 ; t1
  223.     psubsw mm2, mm1 ; 1 ; t6 = x[1] - x[6]
  224.     movq mm1, [tg_2_16] ; 1 ; tg_2_16
  225.     psubsw mm0, mm4 ; tm12 = t1 - t2
  226.     movq mm7, [x3] ; 7 ; x3
  227.     pmulhw mm1, mm0 ; tm12*tg_2_16
  228.     paddsw mm7, [x4] ; t3 = x[3] + x[4]
  229.     psllw mm5, SHIFT_FRW_COL ; t0
  230.     paddsw mm6, mm4 ; 4 ; tp12 = t1 + t2
  231.     psllw mm7, SHIFT_FRW_COL ; t3
  232.     movq mm4, mm5 ; 4 ; t0
  233.     psubsw mm5, mm7 ; tm03 = t0 - t3
  234.     paddsw mm1, mm5 ; y2 = tm03 + tm12*tg_2_16
  235.     paddsw mm4, mm7 ; 7 ; tp03 = t0 + t3
  236.     por mm1, qword [one_corr] ; correction y2 +0.5
  237.     psllw mm2, SHIFT_FRW_COL+1 ; t6
  238.     pmulhw mm5, [tg_2_16] ; tm03*tg_2_16
  239.     movq mm7, mm4 ; 7 ; tp03
  240.     psubsw mm3, [x5] ; t5 = x[2] - x[5]
  241.     psubsw mm4, mm6 ; y4 = tp03 - tp12
  242.     movq [y2], mm1 ; 1 ; save y2
  243.     paddsw mm7, mm6 ; 6 ; y0 = tp03 + tp12
  244.      
  245.     movq mm1, [x3] ; 1 ; x3
  246.     psllw mm3, SHIFT_FRW_COL+1 ; t5
  247.     psubsw mm1, [x4] ; t4 = x[3] - x[4]
  248.     movq mm6, mm2 ; 6 ; t6
  249.     
  250.     movq [y4], mm4 ; 4 ; save y4
  251.     paddsw mm2, mm3 ; t6 + t5
  252.     pmulhw mm2, [ocos_4_16] ; tp65 = (t6 + t5)*cos_4_16
  253.     psubsw mm6, mm3 ; 3 ; t6 - t5
  254.     pmulhw mm6, [ocos_4_16] ; tm65 = (t6 - t5)*cos_4_16
  255.     psubsw mm5, mm0 ; 0 ; y6 = tm03*tg_2_16 - tm12
  256.     por mm5, qword [one_corr] ; correction y6 +0.5
  257.     psllw mm1, SHIFT_FRW_COL ; t4
  258.     por mm2, qword [one_corr] ; correction tp65 +0.5
  259.     movq mm4, mm1 ; 4 ; t4
  260.     movq mm3, [x0] ; 3 ; x0
  261.     paddsw mm1, mm6 ; tp465 = t4 + tm65
  262.     psubsw mm3, [x7] ; t7 = x[0] - x[7]
  263.     psubsw mm4, mm6 ; 6 ; tm465 = t4 - tm65
  264.     movq mm0, [tg_1_16] ; 0 ; tg_1_16
  265.     psllw mm3, SHIFT_FRW_COL ; t7
  266.     movq mm6, [tg_3_16] ; 6 ; tg_3_16
  267.     pmulhw mm0, mm1 ; tp465*tg_1_16
  268.     movq [y0], mm7 ; 7 ; save y0
  269.     pmulhw mm6, mm4 ; tm465*tg_3_16
  270.     movq [y6], mm5 ; 5 ; save y6
  271.     movq mm7, mm3 ; 7 ; t7
  272.     movq mm5, [tg_3_16] ; 5 ; tg_3_16
  273.     psubsw mm7, mm2 ; tm765 = t7 - tp65
  274.     paddsw mm3, mm2 ; 2 ; tp765 = t7 + tp65
  275.     pmulhw mm5, mm7 ; tm765*tg_3_16
  276.     paddsw mm0, mm3 ; y1 = tp765 + tp465*tg_1_16
  277.     paddsw mm6, mm4 ; tm465*tg_3_16
  278.     pmulhw mm3, [tg_1_16] ; tp765*tg_1_16
  279.  
  280.     por mm0, qword [one_corr] ; correction y1 +0.5
  281.     paddsw mm5, mm7 ; tm765*tg_3_16
  282.     psubsw mm7, mm6 ; 6 ; y3 = tm765 - tm465*tg_3_16
  283.     add INP, 0x08
  284.     movq [y1], mm0 ; 0 ; save y1
  285.     paddsw mm5, mm4 ; 4 ; y5 = tm765*tg_3_16 + tm465
  286.     movq [y3], mm7 ; 7 ; save y3
  287.     psubsw mm3, mm1 ; 1 ; y7 = tp765*tg_1_16 - tp465
  288.     movq [y5], mm5 ; 5 ; save y5
  289.     movq mm0, [x1] ; 0 ; x1
  290.     movq [y7], mm3 ; 3 ; save y7 (columns 0-4)
  291.     movq mm1, [x6] ; 1 ; x6
  292.     movq mm2, mm0 ; 2 ; x1
  293.     movq mm3, [x2] ; 3 ; x2
  294.     paddsw mm0, mm1 ; t1 = x[1] + x[6]
  295.     movq mm4, [x5] ; 4 ; x5
  296.     psllw mm0, SHIFT_FRW_COL ; t1
  297.     movq mm5, [x0] ; 5 ; x0
  298.     paddsw mm4, mm3 ; t2 = x[2] + x[5]
  299.     paddsw mm5, [x7] ; t0 = x[0] + x[7]
  300.     psllw mm4, SHIFT_FRW_COL ; t2
  301.     movq mm6, mm0 ; 6 ; t1
  302.     psubsw mm2, mm1 ; 1 ; t6 = x[1] - x[6]
  303.     movq mm1, [tg_2_16] ; 1 ; tg_2_16
  304.     psubsw mm0, mm4 ; tm12 = t1 - t2
  305.     movq mm7, [x3] ; 7 ; x3
  306.     pmulhw mm1, mm0 ; tm12*tg_2_16
  307.     paddsw mm7, [x4] ; t3 = x[3] + x[4]
  308.     psllw mm5, SHIFT_FRW_COL ; t0
  309.     paddsw mm6, mm4 ; 4 ; tp12 = t1 + t2
  310.     psllw mm7, SHIFT_FRW_COL ; t3
  311.     movq mm4, mm5 ; 4 ; t0
  312.     psubsw mm5, mm7 ; tm03 = t0 - t3
  313.     paddsw mm1, mm5 ; y2 = tm03 + tm12*tg_2_16
  314.     paddsw mm4, mm7 ; 7 ; tp03 = t0 + t3
  315.     por mm1, qword [one_corr] ; correction y2 +0.5
  316.     psllw mm2, SHIFT_FRW_COL+1 ; t6
  317.     pmulhw mm5, [tg_2_16] ; tm03*tg_2_16
  318.     movq mm7, mm4 ; 7 ; tp03
  319.     psubsw mm3, [x5] ; t5 = x[2] - x[5]
  320.     psubsw mm4, mm6 ; y4 = tp03 - tp12
  321.     movq [y2+8], mm1 ; 1 ; save y2
  322.     paddsw mm7, mm6 ; 6 ; y0 = tp03 + tp12
  323.      
  324.     movq mm1, [x3] ; 1 ; x3
  325.     psllw mm3, SHIFT_FRW_COL+1 ; t5
  326.     psubsw mm1, [x4] ; t4 = x[3] - x[4]
  327.     movq mm6, mm2 ; 6 ; t6
  328.     
  329.     movq [y4+8], mm4 ; 4 ; save y4
  330.     paddsw mm2, mm3 ; t6 + t5
  331.     pmulhw mm2, [ocos_4_16] ; tp65 = (t6 + t5)*cos_4_16
  332.     psubsw mm6, mm3 ; 3 ; t6 - t5
  333.     pmulhw mm6, [ocos_4_16] ; tm65 = (t6 - t5)*cos_4_16
  334.     psubsw mm5, mm0 ; 0 ; y6 = tm03*tg_2_16 - tm12
  335.     por mm5, qword [one_corr] ; correction y6 +0.5
  336.     psllw mm1, SHIFT_FRW_COL ; t4
  337.     por mm2, qword [one_corr] ; correction tp65 +0.5
  338.     movq mm4, mm1 ; 4 ; t4
  339.     movq mm3, [x0] ; 3 ; x0
  340.     paddsw mm1, mm6 ; tp465 = t4 + tm65
  341.     psubsw mm3, [x7] ; t7 = x[0] - x[7]
  342.     psubsw mm4, mm6 ; 6 ; tm465 = t4 - tm65
  343.     movq mm0, [tg_1_16] ; 0 ; tg_1_16
  344.     psllw mm3, SHIFT_FRW_COL ; t7
  345.     movq mm6, [tg_3_16] ; 6 ; tg_3_16
  346.     pmulhw mm0, mm1 ; tp465*tg_1_16
  347.     movq [y0+8], mm7 ; 7 ; save y0
  348.     pmulhw mm6, mm4 ; tm465*tg_3_16
  349.     movq [y6+8], mm5 ; 5 ; save y6
  350.     movq mm7, mm3 ; 7 ; t7
  351.     movq mm5, [tg_3_16] ; 5 ; tg_3_16
  352.     psubsw mm7, mm2 ; tm765 = t7 - tp65
  353.     paddsw mm3, mm2 ; 2 ; tp765 = t7 + tp65
  354.     pmulhw mm5, mm7 ; tm765*tg_3_16
  355.     paddsw mm0, mm3 ; y1 = tp765 + tp465*tg_1_16
  356.     paddsw mm6, mm4 ; tm465*tg_3_16
  357.     pmulhw mm3, [tg_1_16] ; tp765*tg_1_16
  358.     
  359. por mm0, qword [one_corr] ; correction y1 +0.5
  360.     paddsw mm5, mm7 ; tm765*tg_3_16
  361.     psubsw mm7, mm6 ; 6 ; y3 = tm765 - tm465*tg_3_16
  362.  
  363.     movq [y1+8], mm0 ; 0 ; save y1
  364.     paddsw mm5, mm4 ; 4 ; y5 = tm765*tg_3_16 + tm465
  365.     movq [y3+8], mm7 ; 7 ; save y3
  366.     psubsw mm3, mm1 ; 1 ; y7 = tp765*tg_1_16 - tp465
  367.     movq [y5+8], mm5 ; 5 ; save y5
  368.     movq [y7+8], mm3 ; 3 ; save y7
  369. mov INP, [esp + 8] ; row 0
  370. mov TABLEF, tab_frw_01234567 ; row 0
  371. mov OUT, INP
  372. mov round_frw_row, r_frw_row
  373.     movd mm5, [INP+12] ; mm5 = 7 6
  374.     punpcklwd mm5, [INP+8]
  375.     movq mm2, mm5 ; mm2 = 5 7 4 6
  376.     psrlq mm5, 32 ; mm5 = _ _ 5 7
  377.     movq mm0, [INP] ; mm0 = 3 2 1 0
  378.     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
  379.     movq mm1, mm0 ; mm1 = 3 2 1 0
  380.     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
  381.     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
  382.     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
  383.     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
  384.     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
  385.     movq mm1, mm2 ; mm1
  386.     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
  387.     movq mm3, [TABLE] ; 3 ; w06 w04 w02 w00
  388.     punpcklwd mm0, mm1 ; x5 x1 x4 x0
  389.     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
  390.     punpckldq mm0, mm0 ; x4 x0 x4 x0  [ xt2 xt0 xt2 xt0 ]
  391.     movq mm4, [TABLE+8] ; 4 ; w07 w05 w03 w01
  392.     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
  393.     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
  394.     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
  395.     movq mm1, [TABLE+32] ; 1 ; w22 w20 w18 w16
  396.     punpckldq mm2, mm2 ; x6 x2 x6 x2  [ xt3 xt1 xt3 xt1 ]
  397.     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
  398.     punpckhdq mm5, mm5 ; x5 x1 x5 x1  [ xt6 xt4 xt6 xt4 ]
  399.     pmaddwd mm0, [TABLE+16] ; x4*w14+x0*w12 x4*w10+x0*w08
  400.     punpckhdq mm6, mm6 ; x7 x3 x7 x3  [ xt7 xt5 xt7 xt5 ]
  401.     movq mm7, [TABLE+40] ; 7 ; w23 w21 w19 w17
  402.     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
  403.     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
  404.     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
  405.     pmaddwd mm2, [TABLE+24] ; x6*w15+x2*w13 x6*w11+x2*w09
  406.     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
  407.     pmaddwd mm5, [TABLE+48] ; x5*w30+x1*w28 x5*w26+x1*w24
  408.  
  409.     pmaddwd mm6, [TABLE+56] ; x7*w31+x3*w29 x7*w27+x3*w25
  410.     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
  411.     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
  412.     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0) 
  413.     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
  414.     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
  415.     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
  416.     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
  417.     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
  418.     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
  419.     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
  420. packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
  421.     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
  422.     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
  423.     punpcklwd mm3, mm1 ; y3 y2 y1 y0
  424.     
  425.     punpckhwd mm6, mm1 ; y7 y6 y5 y4
  426.     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
  427.     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
  428.     movq [OUT_1-16], mm3 ; 1 ; save y3 y2 y1 y0
  429.     movq [OUT_1-8], mm6 ; 7 ; save y7 y6 y5 y4
  430.     movd mm5, [INP_1+12] ; mm5 = 7 6
  431.     punpcklwd mm5, [INP_1+8]
  432.     movq mm2, mm5 ; mm2 = 5 7 4 6
  433.     psrlq mm5, 32 ; mm5 = _ _ 5 7
  434.     movq mm0, [INP_1] ; mm0 = 3 2 1 0
  435.     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
  436.     movq mm1, mm0 ; mm1 = 3 2 1 0
  437.     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
  438.     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
  439.     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
  440.     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
  441.     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
  442.     movq mm1, mm2 ; mm1
  443.     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
  444.     movq mm3, [TABLE_1] ; 3 ; w06 w04 w02 w00
  445.     punpcklwd mm0, mm1 ; x5 x1 x4 x0
  446.     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
  447.     punpckldq mm0, mm0 ; x4 x0 x4 x0  [ xt2 xt0 xt2 xt0 ]
  448.     movq mm4, [TABLE_1+8] ; 4 ; w07 w05 w03 w01
  449.     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
  450.     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
  451.     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
  452.     movq mm1, [TABLE_1+32] ; 1 ; w22 w20 w18 w16
  453.     punpckldq mm2, mm2 ; x6 x2 x6 x2  [ xt3 xt1 xt3 xt1 ]
  454.     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
  455.     punpckhdq mm5, mm5 ; x5 x1 x5 x1  [ xt6 xt4 xt6 xt4 ]
  456.     pmaddwd mm0, [TABLE_1+16] ; x4*w14+x0*w12 x4*w10+x0*w08
  457.     punpckhdq mm6, mm6 ; x7 x3 x7 x3  [ xt7 xt5 xt7 xt5 ]
  458.     movq mm7, [TABLE_1+40] ; 7 ; w23 w21 w19 w17
  459.     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
  460.     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
  461.     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
  462.     pmaddwd mm2, [TABLE_1+24] ; x6*w15+x2*w13 x6*w11+x2*w09
  463.     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
  464.     pmaddwd mm5, [TABLE_1+48] ; x5*w30+x1*w28 x5*w26+x1*w24
  465.  
  466.     pmaddwd mm6, [TABLE_1+56] ; x7*w31+x3*w29 x7*w27+x3*w25
  467.     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
  468.     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
  469.     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0) 
  470.     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
  471.     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
  472.     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
  473.     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
  474.     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
  475.     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
  476.     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
  477. packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
  478.     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
  479.     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
  480.     punpcklwd mm3, mm1 ; y3 y2 y1 y0
  481.     
  482.     punpckhwd mm6, mm1 ; y7 y6 y5 y4
  483.     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
  484.     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
  485.     movq [OUT_2-16], mm3 ; 1 ; save y3 y2 y1 y0
  486.     movq [OUT_2-8], mm6 ; 7 ; save y7 y6 y5 y4
  487.     movd mm5, [INP_2+12] ; mm5 = 7 6
  488.     punpcklwd mm5, [INP_2+8]
  489.     movq mm2, mm5 ; mm2 = 5 7 4 6
  490.     psrlq mm5, 32 ; mm5 = _ _ 5 7
  491.     movq mm0, [INP_2] ; mm0 = 3 2 1 0
  492.     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
  493.     movq mm1, mm0 ; mm1 = 3 2 1 0
  494.     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
  495.     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
  496.     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
  497.     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
  498.     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
  499.     movq mm1, mm2 ; mm1
  500.     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
  501.     movq mm3, [TABLE_2] ; 3 ; w06 w04 w02 w00
  502.     punpcklwd mm0, mm1 ; x5 x1 x4 x0
  503.     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
  504.     punpckldq mm0, mm0 ; x4 x0 x4 x0  [ xt2 xt0 xt2 xt0 ]
  505.     movq mm4, [TABLE_2+8] ; 4 ; w07 w05 w03 w01
  506.     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
  507.     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
  508.     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
  509.     movq mm1, [TABLE_2+32] ; 1 ; w22 w20 w18 w16
  510.     punpckldq mm2, mm2 ; x6 x2 x6 x2  [ xt3 xt1 xt3 xt1 ]
  511.     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
  512.     punpckhdq mm5, mm5 ; x5 x1 x5 x1  [ xt6 xt4 xt6 xt4 ]
  513.     pmaddwd mm0, [TABLE_2+16] ; x4*w14+x0*w12 x4*w10+x0*w08
  514.     punpckhdq mm6, mm6 ; x7 x3 x7 x3  [ xt7 xt5 xt7 xt5 ]
  515.     movq mm7, [TABLE_2+40] ; 7 ; w23 w21 w19 w17
  516.     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
  517.     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
  518.     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
  519.     pmaddwd mm2, [TABLE_2+24] ; x6*w15+x2*w13 x6*w11+x2*w09
  520.     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
  521.     pmaddwd mm5, [TABLE_2+48] ; x5*w30+x1*w28 x5*w26+x1*w24
  522.  
  523.     pmaddwd mm6, [TABLE_2+56] ; x7*w31+x3*w29 x7*w27+x3*w25
  524.     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
  525.     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
  526.     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0) 
  527.     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
  528.     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
  529.     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
  530.     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
  531.     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
  532.     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
  533.     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
  534. packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
  535.     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
  536.     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
  537.     punpcklwd mm3, mm1 ; y3 y2 y1 y0
  538.     
  539.     punpckhwd mm6, mm1 ; y7 y6 y5 y4
  540.     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
  541.     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
  542.     movq [OUT_3-16], mm3 ; 1 ; save y3 y2 y1 y0
  543.     movq [OUT_3-8], mm6 ; 7 ; save y7 y6 y5 y4
  544.     movd mm5, [INP_3+12] ; mm5 = 7 6
  545.     punpcklwd mm5, [INP_3+8]
  546.     movq mm2, mm5 ; mm2 = 5 7 4 6
  547.     psrlq mm5, 32 ; mm5 = _ _ 5 7
  548.     movq mm0, [INP_3] ; mm0 = 3 2 1 0
  549.     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
  550.     movq mm1, mm0 ; mm1 = 3 2 1 0
  551.     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
  552.     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
  553.     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
  554.     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
  555.     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
  556.     movq mm1, mm2 ; mm1
  557.     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
  558.     movq mm3, [TABLE_3] ; 3 ; w06 w04 w02 w00
  559.     punpcklwd mm0, mm1 ; x5 x1 x4 x0
  560.     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
  561.     punpckldq mm0, mm0 ; x4 x0 x4 x0  [ xt2 xt0 xt2 xt0 ]
  562.     movq mm4, [TABLE_3+8] ; 4 ; w07 w05 w03 w01
  563.     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
  564.     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
  565.     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
  566.     movq mm1, [TABLE_3+32] ; 1 ; w22 w20 w18 w16
  567.     punpckldq mm2, mm2 ; x6 x2 x6 x2  [ xt3 xt1 xt3 xt1 ]
  568.     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
  569.     punpckhdq mm5, mm5 ; x5 x1 x5 x1  [ xt6 xt4 xt6 xt4 ]
  570.     pmaddwd mm0, [TABLE_3+16] ; x4*w14+x0*w12 x4*w10+x0*w08
  571.     punpckhdq mm6, mm6 ; x7 x3 x7 x3  [ xt7 xt5 xt7 xt5 ]
  572.     movq mm7, [TABLE_3+40] ; 7 ; w23 w21 w19 w17
  573.     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
  574.     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
  575.     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
  576.     pmaddwd mm2, [TABLE_3+24] ; x6*w15+x2*w13 x6*w11+x2*w09
  577.     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
  578.     pmaddwd mm5, [TABLE_3+48] ; x5*w30+x1*w28 x5*w26+x1*w24
  579.  
  580.     pmaddwd mm6, [TABLE_3+56] ; x7*w31+x3*w29 x7*w27+x3*w25
  581.     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
  582.     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
  583.     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0) 
  584.     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
  585.     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
  586.     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
  587.     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
  588.     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
  589.     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
  590.     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
  591. packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
  592.     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
  593.     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
  594.     punpcklwd mm3, mm1 ; y3 y2 y1 y0
  595.     
  596.     punpckhwd mm6, mm1 ; y7 y6 y5 y4
  597.     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
  598.     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
  599.     movq [OUT_4-16], mm3 ; 1 ; save y3 y2 y1 y0
  600.     movq [OUT_4-8], mm6 ; 7 ; save y7 y6 y5 y4
  601.     movd mm5, [INP_4+12] ; mm5 = 7 6
  602.     punpcklwd mm5, [INP_4+8]
  603.     movq mm2, mm5 ; mm2 = 5 7 4 6
  604.     psrlq mm5, 32 ; mm5 = _ _ 5 7
  605.     movq mm0, [INP_4] ; mm0 = 3 2 1 0
  606.     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
  607.     movq mm1, mm0 ; mm1 = 3 2 1 0
  608.     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
  609.     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
  610.     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
  611.     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
  612.     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
  613.     movq mm1, mm2 ; mm1
  614.     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
  615.     movq mm3, [TABLE_4] ; 3 ; w06 w04 w02 w00
  616.     punpcklwd mm0, mm1 ; x5 x1 x4 x0
  617.     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
  618.     punpckldq mm0, mm0 ; x4 x0 x4 x0  [ xt2 xt0 xt2 xt0 ]
  619.     movq mm4, [TABLE_4+8] ; 4 ; w07 w05 w03 w01
  620.     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
  621.     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
  622.     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
  623.     movq mm1, [TABLE_4+32] ; 1 ; w22 w20 w18 w16
  624.     punpckldq mm2, mm2 ; x6 x2 x6 x2  [ xt3 xt1 xt3 xt1 ]
  625.     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
  626.     punpckhdq mm5, mm5 ; x5 x1 x5 x1  [ xt6 xt4 xt6 xt4 ]
  627.     pmaddwd mm0, [TABLE_4+16] ; x4*w14+x0*w12 x4*w10+x0*w08
  628.     punpckhdq mm6, mm6 ; x7 x3 x7 x3  [ xt7 xt5 xt7 xt5 ]
  629.     movq mm7, [TABLE_4+40] ; 7 ; w23 w21 w19 w17
  630.     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
  631.     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
  632.     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
  633.     pmaddwd mm2, [TABLE_4+24] ; x6*w15+x2*w13 x6*w11+x2*w09
  634.     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
  635.     pmaddwd mm5, [TABLE_4+48] ; x5*w30+x1*w28 x5*w26+x1*w24
  636.  
  637.     pmaddwd mm6, [TABLE_4+56] ; x7*w31+x3*w29 x7*w27+x3*w25
  638.     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
  639.     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
  640.     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0) 
  641.     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
  642.     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
  643.     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
  644.     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
  645.     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
  646.     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
  647.     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
  648. packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
  649.     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
  650.     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
  651.     punpcklwd mm3, mm1 ; y3 y2 y1 y0
  652.     
  653.     punpckhwd mm6, mm1 ; y7 y6 y5 y4
  654.     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
  655.     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
  656.     movq [OUT_5-16], mm3 ; 1 ; save y3 y2 y1 y0
  657.     movq [OUT_5-8], mm6 ; 7 ; save y7 y6 y5 y4
  658.     movd mm5, [INP_5+12] ; mm5 = 7 6
  659.     punpcklwd mm5, [INP_5+8]
  660.     movq mm2, mm5 ; mm2 = 5 7 4 6
  661.     psrlq mm5, 32 ; mm5 = _ _ 5 7
  662.     movq mm0, [INP_5] ; mm0 = 3 2 1 0
  663.     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
  664.     movq mm1, mm0 ; mm1 = 3 2 1 0
  665.     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
  666.     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
  667.     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
  668.     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
  669.     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
  670.     movq mm1, mm2 ; mm1
  671.     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
  672.     movq mm3, [TABLE_5] ; 3 ; w06 w04 w02 w00
  673.     punpcklwd mm0, mm1 ; x5 x1 x4 x0
  674.     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
  675.     punpckldq mm0, mm0 ; x4 x0 x4 x0  [ xt2 xt0 xt2 xt0 ]
  676.     movq mm4, [TABLE_5+8] ; 4 ; w07 w05 w03 w01
  677.     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
  678.     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
  679.     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
  680.     movq mm1, [TABLE_5+32] ; 1 ; w22 w20 w18 w16
  681.     punpckldq mm2, mm2 ; x6 x2 x6 x2  [ xt3 xt1 xt3 xt1 ]
  682.     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
  683.     punpckhdq mm5, mm5 ; x5 x1 x5 x1  [ xt6 xt4 xt6 xt4 ]
  684.     pmaddwd mm0, [TABLE_5+16] ; x4*w14+x0*w12 x4*w10+x0*w08
  685.     punpckhdq mm6, mm6 ; x7 x3 x7 x3  [ xt7 xt5 xt7 xt5 ]
  686.     movq mm7, [TABLE_5+40] ; 7 ; w23 w21 w19 w17
  687.     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
  688.     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
  689.     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
  690.     pmaddwd mm2, [TABLE_5+24] ; x6*w15+x2*w13 x6*w11+x2*w09
  691.     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
  692.     pmaddwd mm5, [TABLE_5+48] ; x5*w30+x1*w28 x5*w26+x1*w24
  693.  
  694.     pmaddwd mm6, [TABLE_5+56] ; x7*w31+x3*w29 x7*w27+x3*w25
  695.     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
  696.     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
  697.     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0) 
  698.     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
  699.     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
  700.     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
  701.     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
  702.     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
  703.     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
  704.     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
  705. packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
  706.     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
  707.     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
  708.     punpcklwd mm3, mm1 ; y3 y2 y1 y0
  709.     
  710.     punpckhwd mm6, mm1 ; y7 y6 y5 y4
  711.     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
  712.     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
  713.     movq [OUT_6-16], mm3 ; 1 ; save y3 y2 y1 y0
  714.     movq [OUT_6-8], mm6 ; 7 ; save y7 y6 y5 y4
  715.     movd mm5, [INP_6+12] ; mm5 = 7 6
  716.     punpcklwd mm5, [INP_6+8]
  717.     movq mm2, mm5 ; mm2 = 5 7 4 6
  718.     psrlq mm5, 32 ; mm5 = _ _ 5 7
  719.     movq mm0, [INP_6] ; mm0 = 3 2 1 0
  720.     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
  721.     movq mm1, mm0 ; mm1 = 3 2 1 0
  722.     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
  723.     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
  724.     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
  725.     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
  726.     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
  727.     movq mm1, mm2 ; mm1
  728.     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
  729.     movq mm3, [TABLE_6] ; 3 ; w06 w04 w02 w00
  730.     punpcklwd mm0, mm1 ; x5 x1 x4 x0
  731.     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
  732.     punpckldq mm0, mm0 ; x4 x0 x4 x0  [ xt2 xt0 xt2 xt0 ]
  733.     movq mm4, [TABLE_6+8] ; 4 ; w07 w05 w03 w01
  734.     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
  735.     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
  736.     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
  737.     movq mm1, [TABLE_6+32] ; 1 ; w22 w20 w18 w16
  738.     punpckldq mm2, mm2 ; x6 x2 x6 x2  [ xt3 xt1 xt3 xt1 ]
  739.     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
  740.     punpckhdq mm5, mm5 ; x5 x1 x5 x1  [ xt6 xt4 xt6 xt4 ]
  741.     pmaddwd mm0, [TABLE_6+16] ; x4*w14+x0*w12 x4*w10+x0*w08
  742.     punpckhdq mm6, mm6 ; x7 x3 x7 x3  [ xt7 xt5 xt7 xt5 ]
  743.     movq mm7, [TABLE_6+40] ; 7 ; w23 w21 w19 w17
  744.     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
  745.     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
  746.     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
  747.     pmaddwd mm2, [TABLE_6+24] ; x6*w15+x2*w13 x6*w11+x2*w09
  748.     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
  749.     pmaddwd mm5, [TABLE_6+48] ; x5*w30+x1*w28 x5*w26+x1*w24
  750.  
  751.     pmaddwd mm6, [TABLE_6+56] ; x7*w31+x3*w29 x7*w27+x3*w25
  752.     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
  753.     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
  754.     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0) 
  755.     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
  756.     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
  757.     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
  758.     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
  759.     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
  760.     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
  761.     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
  762. packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
  763.     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
  764.     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
  765.     punpcklwd mm3, mm1 ; y3 y2 y1 y0
  766.     
  767.     punpckhwd mm6, mm1 ; y7 y6 y5 y4
  768.     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
  769.     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
  770.     movq [OUT_7-16], mm3 ; 1 ; save y3 y2 y1 y0
  771.     movq [OUT_7-8], mm6 ; 7 ; save y7 y6 y5 y4
  772.     movd mm5, [INP_7+12] ; mm5 = 7 6
  773.     punpcklwd mm5, [INP_7+8]
  774.     movq mm2, mm5 ; mm2 = 5 7 4 6
  775.     psrlq mm5, 32 ; mm5 = _ _ 5 7
  776.     movq mm0, [INP_7] ; mm0 = 3 2 1 0
  777.     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
  778.     movq mm1, mm0 ; mm1 = 3 2 1 0
  779.     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
  780.     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
  781.     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
  782.     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
  783.     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
  784.     movq mm1, mm2 ; mm1
  785.     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
  786.     movq mm3, [TABLE_7] ; 3 ; w06 w04 w02 w00
  787.     punpcklwd mm0, mm1 ; x5 x1 x4 x0
  788.     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
  789.     punpckldq mm0, mm0 ; x4 x0 x4 x0  [ xt2 xt0 xt2 xt0 ]
  790.     movq mm4, [TABLE_7+8] ; 4 ; w07 w05 w03 w01
  791.     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
  792.     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
  793.     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
  794.     movq mm1, [TABLE_7+32] ; 1 ; w22 w20 w18 w16
  795.     punpckldq mm2, mm2 ; x6 x2 x6 x2  [ xt3 xt1 xt3 xt1 ]
  796.     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
  797.     punpckhdq mm5, mm5 ; x5 x1 x5 x1  [ xt6 xt4 xt6 xt4 ]
  798.     pmaddwd mm0, [TABLE_7+16] ; x4*w14+x0*w12 x4*w10+x0*w08
  799.     punpckhdq mm6, mm6 ; x7 x3 x7 x3  [ xt7 xt5 xt7 xt5 ]
  800.     movq mm7, [TABLE_7+40] ; 7 ; w23 w21 w19 w17
  801.     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
  802.     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
  803.     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
  804.     pmaddwd mm2, [TABLE_7+24] ; x6*w15+x2*w13 x6*w11+x2*w09
  805.     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
  806.     pmaddwd mm5, [TABLE_7+48] ; x5*w30+x1*w28 x5*w26+x1*w24
  807.  
  808.     pmaddwd mm6, [TABLE_7+56] ; x7*w31+x3*w29 x7*w27+x3*w25
  809.     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
  810.     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
  811.     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0) 
  812.     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
  813.     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
  814.     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
  815.     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
  816.     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
  817.     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
  818.     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
  819. packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
  820.     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
  821.     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
  822.     punpcklwd mm3, mm1 ; y3 y2 y1 y0
  823.     
  824.     punpckhwd mm6, mm1 ; y7 y6 y5 y4
  825.     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
  826.     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
  827.     movq [OUT_8-16], mm3 ; 1 ; save y3 y2 y1 y0
  828.     movq [OUT_8-8], mm6 ; 7 ; save y7 y6 y5 y4
  829. pop ebx
  830. emms
  831. ret