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

📄 idct_llm_mmx.asm

📁 由bmp生成mpeg2 的I_frame 数据
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 偍栺懇
.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 + -