📄 idct_llm_mmx.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 偍栺懇
.586
.mmx
.model flat
_TEXT64 segment page public use32 'CODE'
align 8
;-------------------------------------------------------------------
;IEEE test conditions: -L = -256, +H = 256, sign = 1, #iters = 10000
;Peak absolute values of errors:
; 1 1 1 1 1 1 1 1
; 1 1 1 1 1 1 1 1
; 1 1 1 1 1 1 1 1
; 1 1 1 1 1 1 1 1
; 1 1 1 1 1 1 1 1
; 1 1 1 1 1 1 1 1
; 1 1 1 1 1 1 1 1
; 1 1 1 1 1 1 1 1
;Worst peak error = 1 (meets spec limit 1)
;
;Mean square errors:
; 0.0095 0.0121 0.0110 0.0105 0.0129 0.0088 0.0093 0.0082
; 0.0080 0.0103 0.0073 0.0115 0.0108 0.0080 0.0113 0.0091
; 0.0096 0.0113 0.0075 0.0133 0.0098 0.0093 0.0122 0.0097
; 0.0073 0.0133 0.0087 0.0131 0.0113 0.0113 0.0140 0.0105
; 0.0089 0.0122 0.0115 0.0110 0.0139 0.0092 0.0149 0.0089
; 0.0086 0.0121 0.0076 0.0119 0.0105 0.0085 0.0100 0.0095
; 0.0084 0.0132 0.0066 0.0113 0.0105 0.0100 0.0098 0.0074
; 0.0099 0.0107 0.0108 0.0105 0.0115 0.0074 0.0143 0.0078
;Worst pmse = 0.014900 (meets spec limit 0.06)
;Overall mse = 0.010314 (meets spec limit 0.02)
;
;Mean errors:
; -0.0007 -0.0009 0.0000 -0.0017 0.0003 -0.0002 0.0003 -0.0002
; -0.0008 0.0017 -0.0013 0.0009 0.0010 0.0004 -0.0001 0.0001
; -0.0006 -0.0013 -0.0019 -0.0005 0.0006 -0.0005 0.0012 -0.0001
; 0.0001 0.0003 -0.0003 -0.0017 0.0023 0.0011 -0.0010 -0.0017
; -0.0007 0.0010 0.0009 0.0016 -0.0009 0.0008 0.0001 0.0009
; 0.0002 0.0005 0.0012 -0.0015 0.0001 -0.0013 0.0000 -0.0015
; -0.0006 0.0002 0.0008 0.0001 0.0011 0.0004 -0.0008 0.0000
; 0.0013 -0.0003 0.0004 0.0021 -0.0013 0.0010 -0.0005 0.0000
;Worst mean error = 0.002300 (meets spec limit 0.015)
;Overall mean error = 0.000002 (meets spec limit 0.0015)
;
;0 elements of IDCT(0) were not zero
;-------------------------------------------------------------------
;-------------------------------------------------------------------
; idct_llm_mmx - 曽恓
;
; 32 bit 惛搙偱 2 暲楍寁嶼乮16bit 偱偼惛搙偑偲傟側偄偺偱乯
; RAW -> COL 娫偱偺捠夁價僢僩偼 +3
; 屌掕彫悢揰掕悢偼 13 價僢僩惛搙
; AP-922 偼 madd 8 夞丄add 8 夞丄傕偆彮偟壗偲偐偟偨偄
; idct 拞偵傾僋僙僗偡傞儊儌儕椞堟偼
; 2 * 64 - block
; 4 * 64 - work
; + 兛
; 偩偗側偺偱丄儊儌儕 IO 偱僉儍僢僔儏僸僢僩傪婜懸偱偒傞乧乧偼偢
;-------------------------------------------------------------------
; 掕悢
e_coeff1 dq 0d6311151115129cfh ;
o_coeff1 dq 025a108d408d41924h ; (o1_o2 & s[5]_s[1])
o_coeff2 dq 0d39ee6de25a1d39eh ; (o1_o2 & s[7]_s[3])
o_coeff3 dq 0d39e25a119242c62h ; (o3_o4 & s[5]_s[1])
o_coeff4 dq 0e6def72c08d425a1h ; (o3_o4 & s[7]_s[3])
half_10bit dq 00000020000000200h
half_19bit dq 00004000000040000h
p0_298631336 dq 00000098e0000098eh
p2_053119869 dq 0000041b3000041b3h
m0_899976223 dq 00000e3340000e334h
m2_562915447 dq 00000adfd0000adfdh
p3_072711026 dq 00000625300006253h
p1_501321110 dq 00000300a0000300ah
p1_175875602 dq 0000025a1000025a1h
m1_961570560 dq 00000c13b0000c13bh
m0_390180644 dq 00000f3840000f384h
p0_765366865 dq 00000187d0000187dh
m1_847759065 dq 00000c4e00000c4e0h
p0_541196100 dq 00000115100001151h
;-------------------------------------------------------------------
PUBLIC C _idct_llm_mmx@4
; void __stdcall idct_llm_mmx(
; [esp + 4] = short *block,
; )
_idct_llm_mmx@4 PROC
;-------------------------------------------------------------------
; 巊梡儗僕僗僞
; esi - 擖椡
; edi - 弌椡
; ecx - 儖乕僾僇僂儞僞
; eax - 僗僞僢僋挷惍
; ebx - 嶌嬈椞堟
; total 20 bytes
;-------------------------------------------------------------------
; 儘乕僇儖曄悢
; tmp[4] 8 byte * 4 [esp+ 4] 乣
; work[64] 4 byte * 64 [esp+36] 乣
; total 288 bytes
;-------------------------------------------------------------------
; 儗僕僗僞戅旔
push esi
push edi
push ecx
push eax
push ebx
;-------------------------------------------------------------------
; 堷悢偐傜偺僨乕僞庴偗庢傝
mov esi, [esp+20+4]
;-------------------------------------------------------------------
; 儘乕僇儖曄悢椞堟妋曐
mov eax, esp
and eax, 7
sub esp, eax
sub esp, 292
; 64 bit 嫬奅偱 288 + 4 bytes 妋曐
;-------------------------------------------------------------------
; 擖弌椡僷儔儊乕僞愝掕
lea edi, [esp+36]
mov ecx, 8
;-------------------------------------------------------------------
; IDCT_RAW
idct_llm_mmx_raw_loop:
dec ecx
;-------------------------------------------------------------------
; idct_llm_mmx_raw - 寁嶼撪梕
;
; e1 = ( (s[0] + s[4]) << 13) + ( s[2] * 1.306562965 + s[6] * 0.541196100)
; e2 = ( (s[0] - s[4]) << 13) + ( s[2] * 0.541196100 - s[6] * 1.306562965)
; e3 = ( (s[0] - s[4]) << 13) - ( s[2] * 0.541196100 - s[6] * 1.306562965)
; e4 = ( (s[0] + s[4]) << 13) - ( s[2] * 1.306562965 + s[6] * 0.541196100)
;
; d631_1151_1151_29cf (-1.306562965)_( 0.541196100)_( 0.541196100)_( 1.306562965)
;
; o1 = s[7] * (-1.387039845) + s[3] * (-0.785694958) + s[5] * ( 1.175875602) + s[1] * ( 0.275899379)
; o2 = s[7] * ( 1.175875602) + s[3] * (-1.387039845) + s[5] * ( 0.275899379) + s[1] * ( 0.785694958)
; o3 = s[7] * (-0.785694958) + s[3] * (-0.275899379) + s[5] * (-1.387039845) + s[1] * ( 1.175875602)
; o4 = s[7] * ( 0.275899379) + s[3] * ( 1.175875602) + s[5] * ( 0.785694958) + s[1] * ( 1.387039845)
;
; 25a1_08d4_08d4_1924 ( 1.175875602)_( 0.275899379)_( 0.275899379)_( 0.785694958) : (o1_o2 & s[5]_s[1])
; d39e_e6de_25a1_d39e (-1.387039845)_(-0.785694958)_( 1.175875602)_(-1.387039845) : (o1_o2 & s[7]_s[3])
; d39e_25a1_1924_2c62 (-1.387039845)_( 1.175875602)_( 0.785694958)_( 1.387039845) : (o3_o4 & s[5]_s[1])
; e6de_f72c_08d4_25a1 (-0.785694958)_(-0.275899379)_( 0.275899379)_( 1.175875602) : (o3_o4 & s[7]_s[3])
;
; w[0] = e1 + o4
; w[1] = e2 + o3
; w[2] = e3 + o2
; w[3] = e4 + o1
; w[4] = e4 - o1
; w[5] = e3 - o2
; w[6] = e2 - o3
; w[7] = e1 - o4
;-------------------------------------------------------------------
; AC 學悢傪僠僃僢僋偟偰丄慡偰 0 側傜僗僉僢僾偡傞乮DC 學悢傪僐僺乕乯
; 検巕壔偺塭嬁偱丄崅廃攇惉暘偱偼 AC 學悢偑 0 偵側傞偙偲偑懡偄偨傔
; 懡彮崅懍壔偱偒傞乮僠僃僢僋偑憹偊偰傕乯
;
movq mm6, [esi] ; s3_s2_s1_s0
movq mm7, [esi+8] ; s7_s6_s5_s4
movq mm4, mm6
psrlq mm4, 16
por mm4, mm7
movq mm5, mm4
psrlq mm5, 32
por mm4, mm5
movd ebx, mm4
test ebx, ebx
jnz idct_llm_mmx_raw_calc
pslld mm6, 16
psrad mm6, 13
punpckldq mm6, mm6
movq [edi ], mm6
movq [edi+ 8], mm6
movq [edi+16], mm6
movq [edi+24], mm6
jmp idct_llm_mmx_raw_last
idct_llm_mmx_raw_calc:
;-------------------------------------------------------------------
; 戞侾抜 e1_e2, e3_e4 宍幃傪嶌傞
; madd 1 屄 偱寁嶼偡傞乮偨偩偟丄僔僼僩墘嶼摍偼憹偊傞乯
;
; 昁梫側傕偺
; s[6]_s[2]_s[6]_s[2]
; s[0]-s[4]_s[0]+s[4]
;
movq mm0, mm6
movq mm1, mm7
movq mm2, mm6
movq mm3, mm7
paddw mm1, mm6 ; s[0] + s[4]
psubw mm0, mm7 ; s[0] - s[4]
punpckhwd mm2, mm3 ; s[7]_s[3]_s[6]_s[2]
punpckldq mm1, mm0 ;
movq mm4, mm2 ; 屻偱婏悢崁偺寁嶼偵巊梡
punpckldq mm2, mm2 ; s[6]_s[2]_s[6]_s[2]
pslld mm1, 16 ;
psrad mm1, 3 ; s[0]-s[4]_s[0]+s[4]
; 巊梡儗僕僗僞 mm1, mm2
; 寁嶼偟偰丄e3_e1, e4_e2 傪嶌傝 e2_e1, e4_e3 宍幃偵曄姺偡傞
pmaddwd mm2, e_coeff1 ; (-1.306562965)_( 0.541196100)_( 0.541196100)_( 1.306562965) 傪偐偗傞
movq mm0, mm2 ;
paddd mm0, mm1 ; e2_e1
psubd mm1, mm2 ; e3_e4
movq mm2, mm1
psrlq mm2, 32 ; ___e3
punpckldq mm2, mm1 ; e4_e3
; 巊梡儗僕僗僞 mm0, mm2
; madd 1 夞 add 2 夞 sub 2 夞 unpck 4.5 夞
;-------------------------------------------------------------------
; 戞俀抜 o3_o4, o1_o2 宍幃傪嶌傞
; muladd 4 屄偱寁嶼偡傞
;
; 昁梫側傕偺
; s[5]_s[1]_s[5]_s[1]
; s[7]_s[3]_s[7]_s[3]
;
punpcklwd mm6, mm7 ; s[5]_s[1]_s[4]_s[0]
punpckhdq mm4, mm4 ; s[7]_s[3]_s[7]_s[3]
punpckhdq mm6, mm6 ; s[5]_s[1]_s[5]_s[1]
movq mm7, mm4 ; s[7]_s[3]_s[7]_s[3]
movq mm5, mm6 ; s[5]_s[1]_s[5]_s[1]
pmaddwd mm6, o_coeff3 ;
pmaddwd mm7, o_coeff4 ;
pmaddwd mm4, o_coeff2 ;
pmaddwd mm5, o_coeff1 ;
paddd mm6, mm7 ; o3_o4
paddd mm4, mm5 ; o1_o2
; madd 4 夞 add 2 夞 unpck 3.5 夞
;-------------------------------------------------------------------
; 戞俁抜 o1_o2, o3_o4, e2_e1, e4_e3 傪寢崌偟偰弌椡偡傞
;
; 尰嵼偺儗僕僗僞巊梡忬嫷
; mm0 - e2_e1
; mm2 - e4_e3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -