⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x86_asmidct_mmx.asm

📁 wince下的xvidcore开发库,可用于MP4等视频播放开发
💻 ASM
📖 第 1 页 / 共 2 页
字号:
 ;/****************************************************************************
 ; *
 ; *  XVID MPEG-4 VIDEO CODEC
 ; *  - MMX and XMM forward discrete cosine transform -
 ; *
 ; *  Copyright(C) 2001 Peter Ross <pross@xvid.org>
 ; *
 ; *  This program is free software; you can redistribute it and/or modify it
 ; *  under the terms of the GNU General Public License as published by
 ; *  the Free Software Foundation; either version 2 of the License, or
 ; *  (at your option) any later version.
 ; *
 ; *  This program is distributed in the hope that it will be useful,
 ; *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 ; *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ; *  GNU General Public License for more details.
 ; *
 ; *  You should have received a copy of the GNU General Public License
 ; *  along with this program; if not, write to the Free Software
 ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 ; *
 ; * $Id: idct_mmx.asm,v 1.1 2005/07/21 09:08:25 klschoef Exp $
 ; *
 ; ***************************************************************************/
 
 ; ****************************************************************************
 ;
 ; Originally provided by Intel at AP-922
 ; http://developer.intel.com/vtune/cbts/strmsimd/922down.htm
 ; (See more app notes at http://developer.intel.com/vtune/cbts/strmsimd/appnotes.htm)
 ; but in a limited edition.
 ; New macro implements a column part for precise iDCT
 ; The routine precision now satisfies IEEE standard 1180-1990.
 ;
 ; Copyright(C) 2000-2001 Peter Gubanov <peter@elecard.net.ru>
 ; Rounding trick Copyright(C) 2000 Michel Lespinasse <walken@zoy.org>
 ;
 ; http://www.elecard.com/peter/idct.html
 ; http://www.linuxvideo.org/mpeg2dec/
 ;
 ; ***************************************************************************/
 ;
 ; These examples contain code fragments for first stage iDCT 8x8
 ; (for rows) and first stage DCT 8x8 (for columns)
 ;
 
 BITS 32
 
 ;=============================================================================
 ; Macros and other preprocessor constants
 ;=============================================================================
 
 %macro cglobal 1
         %ifdef PREFIX
                 global _%1
                 %define %1 _%1
         %else
                 global %1
         %endif
 %endmacro
 
 %define BITS_INV_ACC    5                         ; 4 or 5 for IEEE
 %define SHIFT_INV_ROW   16 - BITS_INV_ACC
 %define SHIFT_INV_COL   1 + BITS_INV_ACC
 %define RND_INV_ROW     1024 * (6 - BITS_INV_ACC) ; 1 << (SHIFT_INV_ROW-1)
 %define RND_INV_COL     16 * (BITS_INV_ACC - 3)   ; 1 << (SHIFT_INV_COL-1)
 %define RND_INV_CORR    RND_INV_COL - 1           ; correction -1.0 and round
 
 %define BITS_FRW_ACC    3                         ; 2 or 3 for accuracy
 %define SHIFT_FRW_COL   BITS_FRW_ACC
 %define SHIFT_FRW_ROW   BITS_FRW_ACC + 17
 %define RND_FRW_ROW     262144*(BITS_FRW_ACC - 1) ; 1 << (SHIFT_FRW_ROW-1)
 
 ;=============================================================================
 ; Local Data (Read Only)
 ;=============================================================================
 
 %ifdef FORMAT_COFF
 SECTION .rodata data
 %else
 SECTION .rodata data align=16
 %endif
 
 ;-----------------------------------------------------------------------------
 ; Various memory constants (trigonometric values or rounding values)
 ;-----------------------------------------------------------------------------
 
 ALIGN 16
 one_corr:
   dw 1, 1, 1, 1
 round_inv_row:
   dd RND_INV_ROW,  RND_INV_ROW
 round_inv_col:
   dw RND_INV_COL,  RND_INV_COL,  RND_INV_COL, RND_INV_COL
 round_inv_corr:
   dw RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR
 round_frw_row:
   dd RND_FRW_ROW,  RND_FRW_ROW
 tg_1_16:
   dw 13036,  13036,  13036,  13036    ; tg * (2<<16) + 0.5
 tg_2_16:
   dw 27146,  27146,  27146,  27146    ; tg * (2<<16) + 0.5
 tg_3_16:
   dw -21746, -21746, -21746, -21746    ; tg * (2<<16) + 0.5
 cos_4_16:
   dw -19195, -19195, -19195, -19195    ; cos * (2<<16) + 0.5
 ocos_4_16:
   dw 23170,  23170,  23170,  23170    ; cos * (2<<15) + 0.5
 otg_3_16:
   dw 21895, 21895, 21895, 21895       ; tg * (2<<16) + 0.5
 
 %if SHIFT_INV_ROW == 12   ; assume SHIFT_INV_ROW == 12
 rounder_0:
   dd 65536, 65536
 rounder_4:
   dd 0, 0
 rounder_1:
   dd 7195, 7195
 rounder_7
   dd 1024, 1024
 rounder_2:
   dd 4520, 4520
 rounder_6:
   dd 1024, 1024
 rounder_3:
   dd 2407, 2407
 rounder_5:
   dd 240, 240
 
 %elif SHIFT_INV_ROW == 11   ; assume SHIFT_INV_ROW == 11
 rounder_0:
   dd 65536, 65536
 rounder_4:
   dd 0, 0
 rounder_1:
   dd 3597, 3597
 rounder_7:
   dd 512, 512
 rounder_2:
   dd 2260, 2260
 rounder_6:
   dd 512, 512
 rounder_3:
   dd 1203, 1203
 rounder_5:
   dd 120, 120
 %else
 
 %error invalid SHIFT_INV_ROW
 
 %endif
 
 ;-----------------------------------------------------------------------------
 ;
 ; The first stage iDCT 8x8 - inverse DCTs of rows
 ;
 ;-----------------------------------------------------------------------------
 ; The 8-point inverse DCT direct algorithm
 ;-----------------------------------------------------------------------------
 ;
 ; static const short w[32] = {
 ;       FIX(cos_4_16),  FIX(cos_2_16),  FIX(cos_4_16),  FIX(cos_6_16),
 ;       FIX(cos_4_16),  FIX(cos_6_16), -FIX(cos_4_16), -FIX(cos_2_16),
 ;       FIX(cos_4_16), -FIX(cos_6_16), -FIX(cos_4_16),  FIX(cos_2_16),
 ;       FIX(cos_4_16), -FIX(cos_2_16),  FIX(cos_4_16), -FIX(cos_6_16),
 ;       FIX(cos_1_16),  FIX(cos_3_16),  FIX(cos_5_16),  FIX(cos_7_16),
 ;       FIX(cos_3_16), -FIX(cos_7_16), -FIX(cos_1_16), -FIX(cos_5_16),
 ;       FIX(cos_5_16), -FIX(cos_1_16),  FIX(cos_7_16),  FIX(cos_3_16),
 ;       FIX(cos_7_16), -FIX(cos_5_16),  FIX(cos_3_16), -FIX(cos_1_16) };
 ;
 ; #define DCT_8_INV_ROW(x, y)
 ; {
 ;       int a0, a1, a2, a3, b0, b1, b2, b3;
 ;
 ;       a0 =x[0]*w[0]+x[2]*w[1]+x[4]*w[2]+x[6]*w[3];
 ;       a1 =x[0]*w[4]+x[2]*w[5]+x[4]*w[6]+x[6]*w[7];
 ;       a2 = x[0] * w[ 8] + x[2] * w[ 9] + x[4] * w[10] + x[6] * w[11];
 ;       a3 = x[0] * w[12] + x[2] * w[13] + x[4] * w[14] + x[6] * w[15];
 ;       b0 = x[1] * w[16] + x[3] * w[17] + x[5] * w[18] + x[7] * w[19];
 ;       b1 = x[1] * w[20] + x[3] * w[21] + x[5] * w[22] + x[7] * w[23];
 ;       b2 = x[1] * w[24] + x[3] * w[25] + x[5] * w[26] + x[7] * w[27];
 ;       b3 = x[1] * w[28] + x[3] * w[29] + x[5] * w[30] + x[7] * w[31];
 ;
 ;       y[0] = SHIFT_ROUND ( a0 + b0 );
 ;       y[1] = SHIFT_ROUND ( a1 + b1 );
 ;       y[2] = SHIFT_ROUND ( a2 + b2 );
 ;       y[3] = SHIFT_ROUND ( a3 + b3 );
 ;       y[4] = SHIFT_ROUND ( a3 - b3 );
 ;       y[5] = SHIFT_ROUND ( a2 - b2 );
 ;       y[6] = SHIFT_ROUND ( a1 - b1 );
 ;       y[7] = SHIFT_ROUND ( a0 - b0 );
 ; }
 ;
 ;-----------------------------------------------------------------------------
 ;
 ; In this implementation the outputs of the iDCT-1D are multiplied
 ;       for rows 0,4 - by cos_4_16,
 ;       for rows 1,7 - by cos_1_16,
 ;       for rows 2,6 - by cos_2_16,
 ;       for rows 3,5 - by cos_3_16
 ; and are shifted to the left for better accuracy
 ;
 ; For the constants used,
 ;       FIX(float_const) = (short) (float_const * (1<<15) + 0.5)
 ;
 ;-----------------------------------------------------------------------------
 
 ;-----------------------------------------------------------------------------
 ; Tables for mmx processors
 ;-----------------------------------------------------------------------------
 
 ; Table for rows 0,4 - constants are multiplied by cos_4_16
 tab_i_04_mmx:
   dw  16384,  16384,  16384, -16384    ; movq-> w06 w04 w02 w00
   dw  21407,   8867,   8867, -21407    ; w07 w05 w03 w01
   dw  16384, -16384,  16384,  16384    ; w14 w12 w10 w08
   dw  -8867,  21407, -21407,  -8867    ; w15 w13 w11 w09
   dw  22725,  12873,  19266, -22725    ; w22 w20 w18 w16
   dw  19266,   4520,  -4520, -12873    ; w23 w21 w19 w17
   dw  12873,   4520,   4520,  19266    ; w30 w28 w26 w24
   dw -22725,  19266, -12873, -22725    ; w31 w29 w27 w25
 
 ; Table for rows 1,7 - constants are multiplied by cos_1_16
 tab_i_17_mmx:
   dw  22725,  22725,  22725, -22725    ; movq-> w06 w04 w02 w00
   dw  29692,  12299,  12299, -29692    ; w07 w05 w03 w01
   dw  22725, -22725,  22725,  22725    ; w14 w12 w10 w08
   dw -12299,  29692, -29692, -12299    ; w15 w13 w11 w09
   dw  31521,  17855,  26722, -31521    ; w22 w20 w18 w16
   dw  26722,   6270,  -6270, -17855    ; w23 w21 w19 w17
   dw  17855,   6270,   6270,  26722    ; w30 w28 w26 w24
   dw -31521,  26722, -17855, -31521    ; w31 w29 w27 w25
 
 ; Table for rows 2,6 - constants are multiplied by cos_2_16
 tab_i_26_mmx:
   dw  21407,  21407,  21407, -21407    ; movq-> w06 w04 w02 w00
   dw  27969,  11585,  11585, -27969    ; w07 w05 w03 w01
   dw  21407, -21407,  21407,  21407    ; w14 w12 w10 w08
   dw -11585,  27969, -27969, -11585    ; w15 w13 w11 w09
   dw  29692,  16819,  25172, -29692    ; w22 w20 w18 w16
   dw  25172,   5906,  -5906, -16819    ; w23 w21 w19 w17
   dw  16819,   5906,   5906,  25172    ; w30 w28 w26 w24
   dw -29692,  25172, -16819, -29692    ; w31 w29 w27 w25
 
 ; Table for rows 3,5 - constants are multiplied by cos_3_16
 tab_i_35_mmx:
   dw  19266,  19266,  19266, -19266    ; movq-> w06 w04 w02 w00
   dw  25172,  10426,  10426, -25172    ; w07 w05 w03 w01
   dw  19266, -19266,  19266,  19266    ; w14 w12 w10 w08
   dw -10426,  25172, -25172, -10426    ; w15 w13 w11 w09
   dw  26722,  15137,  22654, -26722    ; w22 w20 w18 w16
   dw  22654,   5315,  -5315, -15137    ; w23 w21 w19 w17
   dw  15137,   5315,   5315,  22654    ; w30 w28 w26 w24
   dw -26722,  22654, -15137, -26722    ; w31 w29 w27 w25
 
 ;-----------------------------------------------------------------------------
 ; Tables for xmm processors
 ;-----------------------------------------------------------------------------
 
 ; %3 for rows 0,4 - constants are multiplied by cos_4_16
 tab_i_04_xmm:
   dw  16384,  21407,  16384,   8867 ; movq-> w05 w04 w01 w00
   dw  16384,   8867, -16384, -21407 ; w07 w06 w03 w02
   dw  16384,  -8867,  16384, -21407 ; w13 w12 w09 w08
   dw -16384,  21407,  16384,  -8867 ; w15 w14 w11 w10
   dw  22725,  19266,  19266,  -4520 ; w21 w20 w17 w16
   dw  12873,   4520, -22725, -12873 ; w23 w22 w19 w18
   dw  12873, -22725,   4520, -12873 ; w29 w28 w25 w24
   dw   4520,  19266,  19266, -22725 ; w31 w30 w27 w26
 
 ; %3 for rows 1,7 - constants are multiplied by cos_1_16
 tab_i_17_xmm:
   dw  22725,  29692,  22725,  12299 ; movq-> w05 w04 w01 w00
   dw  22725,  12299, -22725, -29692 ; w07 w06 w03 w02
   dw  22725, -12299,  22725, -29692 ; w13 w12 w09 w08
   dw -22725,  29692,  22725, -12299 ; w15 w14 w11 w10
   dw  31521,  26722,  26722,  -6270 ; w21 w20 w17 w16
   dw  17855,   6270, -31521, -17855 ; w23 w22 w19 w18
   dw  17855, -31521,   6270, -17855 ; w29 w28 w25 w24
   dw   6270,  26722,  26722, -31521 ; w31 w30 w27 w26
 
 ; %3 for rows 2,6 - constants are multiplied by cos_2_16
 tab_i_26_xmm:
   dw  21407,  27969,  21407,  11585 ; movq-> w05 w04 w01 w00
   dw  21407,  11585, -21407, -27969 ; w07 w06 w03 w02
   dw  21407, -11585,  21407, -27969 ; w13 w12 w09 w08
   dw -21407,  27969,  21407, -11585 ; w15 w14 w11 w10
   dw  29692,  25172,  25172,  -5906 ; w21 w20 w17 w16
   dw  16819,   5906, -29692, -16819 ; w23 w22 w19 w18
   dw  16819, -29692,   5906, -16819 ; w29 w28 w25 w24
   dw   5906,  25172,  25172, -29692 ; w31 w30 w27 w26
 
 ; %3 for rows 3,5 - constants are multiplied by cos_3_16
 tab_i_35_xmm:
   dw  19266,  25172,  19266,  10426 ; movq-> w05 w04 w01 w00
   dw  19266,  10426, -19266, -25172 ; w07 w06 w03 w02
   dw  19266, -10426,  19266, -25172 ; w13 w12 w09 w08
   dw -19266,  25172,  19266, -10426 ; w15 w14 w11 w10
   dw  26722,  22654,  22654,  -5315 ; w21 w20 w17 w16
   dw  15137,   5315, -26722, -15137 ; w23 w22 w19 w18
   dw  15137, -26722,   5315, -15137 ; w29 w28 w25 w24
   dw   5315,  22654,  22654, -26722 ; w31 w30 w27 w26
 
 ;=============================================================================
 ; Helper macros for the code
 ;=============================================================================
 
 ;-----------------------------------------------------------------------------
 ; DCT_8_INV_ROW_MMX  INP, OUT, TABLE, ROUNDER
 ;-----------------------------------------------------------------------------
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -