📄 mc_mmx.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 偍栺懇
.586
.mmx
.model flat
_TEXT64 segment page public use32 'CODE'
align 16
adjust_1 dq 00001000100010001h
adjust_2 dq 00002000200020002h
adjust_3 dq 00003000300030003h
adjust_6 dq 00006000600060006h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 摦偒曗彏乮width 16, Half/Half, 1st乯
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 婎杮曽恓
; 16bit 惛搙偱係暲楍寁嶼
; 僉儍僢僔儏偵僸僢僩偡傞敜偩偐傜丄俀夞儊儌儕偐傜撉傫偱傕廩暘懍偄丠
;
;-------------------------------------------------------------------
PUBLIC C _prediction_w16_hh_1st_mmx@20
; void __stdcall prediction_w16_hh_1st_mmx(
; [esp+ 4] unsigned char *in,
; [esp+ 8] unsigned char *out,
; [esp+12] int in_step,
; [esp+16] int out_step,
; [esp+20] int height
; )
_prediction_w16_hh_1st_mmx@20 PROC
;-------------------------------------------------------------------
; 巊梡偡傞儗僕僗僞
; esi - 擖椡
; edi - 弌椡
; ecx - 儖乕僾僇僂儞僞
; eax - 擖椡僗僥僢僾
; ebx - 弌椡僗僥僢僾
;-------------------------------------------------------------------
; 巊梡偡傞儘乕僇儖曄悢
; 側偟
;-------------------------------------------------------------------
; 梡搑屌掕 MMX 儗僕僗僞
; mm7 - 0
;-------------------------------------------------------------------
; 儗僕僗僞偺戅旔
push esi
push edi
push ecx
push ebx
push eax
;-------------------------------------------------------------------
; 堷悢偐傜僨乕僞傪庴偗庢偭偰偍偔
mov esi, [esp+20+ 4]
mov edi, [esp+20+ 8]
mov eax, [esp+20+12]
mov ebx, [esp+20+16]
mov ecx, [esp+20+20]
;-------------------------------------------------------------------
; 學悢嶌惉
pxor mm7, mm7
movq mm6, adjust_2
;-------------------------------------------------------------------
; loop
prediction_w16_hh_1st_loop:
dec ecx
;-------------------------------------------------------------------
; core
movd mm0, [esi]
movd mm1, [esi+4]
movd mm2, [esi+eax]
movd mm3, [esi+eax+4]
movq mm4, mm0
movq mm5, mm2
punpckldq mm4, mm1
punpckldq mm5, mm3
psrlq mm4, 8
psrlq mm5, 8
punpcklbw mm0, mm7
punpcklbw mm2, mm7
punpcklbw mm4, mm7
punpcklbw mm5, mm7
paddw mm0, mm2
paddw mm0, mm4
paddw mm0, mm5
paddw mm0, mm6
psrlw mm0, 2
packuswb mm0, mm7
movd [edi], mm0
; 0 - 3 finish
movd mm0, [esi+8]
movd mm2, [esi+eax+8]
movq mm4, mm1
movq mm5, mm3
punpckldq mm4, mm0
punpckldq mm5, mm2
psrlq mm4, 8
psrlq mm5, 8
punpcklbw mm1, mm7
punpcklbw mm3, mm7
punpcklbw mm4, mm7
punpcklbw mm5, mm7
paddw mm1, mm3
paddw mm1, mm4
paddw mm1, mm5
paddw mm1, mm6
psrlw mm1, 2
packuswb mm1, mm7
movd [edi+4], mm1
; 4 - 7 finish
movd mm1, [esi+12]
movd mm3, [esi+eax+12]
movq mm4, mm0
movq mm5, mm2
punpckldq mm4, mm1
punpckldq mm5, mm3
psrlq mm4, 8
psrlq mm5, 8
punpcklbw mm0, mm7
punpcklbw mm2, mm7
punpcklbw mm4, mm7
punpcklbw mm5, mm7
paddw mm0, mm2
paddw mm0, mm4
paddw mm0, mm5
paddw mm0, mm6
psrlw mm0, 2
packuswb mm0, mm7
movd [edi+8], mm0
; 8 - 11 finish
movd mm0, [esi+16]
movd mm2, [esi+eax+16]
psllq mm0, 32
psllq mm2, 32
por mm0, mm1
por mm2, mm3
psrlq mm0, 8
psrlq mm2, 8
punpcklbw mm0, mm7
punpcklbw mm1, mm7
punpcklbw mm2, mm7
punpcklbw mm3, mm7
paddw mm0, mm1
paddw mm0, mm2
paddw mm0, mm3
paddw mm0, mm6
psrlw mm0, 2
packuswb mm0, mm7
movd [edi+12], mm0
; 12 - 15 finish
lea edi, [edi+ebx]
lea esi, [esi+eax]
;-------------------------------------------------------------------
; 儖乕僾廔抂僠僃僢僋
test ecx, ecx
jnz prediction_w16_hh_1st_loop
;-------------------------------------------------------------------
; 儗僕僗僞暅尦側偳屻巒枛
pop eax
pop ebx
pop ecx
pop edi
pop esi
ret 20
_prediction_w16_hh_1st_mmx@20 ENDP
;-------------------------------------------------------------------
; 廔椆
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 摦偒曗彏乮width 16, Half/Half, 2nd乯
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 婎杮曽恓
; 16bit 惛搙偱係暲楍寁嶼
; 僉儍僢僔儏偵僸僢僩偡傞敜偩偐傜丄俀夞儊儌儕偐傜撉傫偱傕廩暘懍偄丠
;
;-------------------------------------------------------------------
PUBLIC C _prediction_w16_hh_2nd_mmx@20
; void __stdcall prediction_w16_hh_2nd_mmx(
; [esp+ 4] unsigned char *in,
; [esp+ 8] unsigned char *out,
; [esp+12] int in_step,
; [esp+16] int out_step,
; [esp+20] int height
; )
_prediction_w16_hh_2nd_mmx@20 PROC
;-------------------------------------------------------------------
; 巊梡偡傞儗僕僗僞
; esi - 擖椡
; edi - 弌椡
; ecx - 儖乕僾僇僂儞僞
; eax - 擖椡僗僥僢僾
; ebx - 弌椡僗僥僢僾
;-------------------------------------------------------------------
; 巊梡偡傞儘乕僇儖曄悢
; 側偟
;-------------------------------------------------------------------
; 梡搑屌掕 MMX 儗僕僗僞
; mm7 - 0
;-------------------------------------------------------------------
; 儗僕僗僞偺戅旔
push esi
push edi
push ecx
push ebx
push eax
;-------------------------------------------------------------------
; 堷悢偐傜僨乕僞傪庴偗庢偭偰偍偔
mov esi, [esp+20+ 4]
mov edi, [esp+20+ 8]
mov eax, [esp+20+12]
mov ebx, [esp+20+16]
mov ecx, [esp+20+20]
;-------------------------------------------------------------------
; 學悢嶌惉
pxor mm7, mm7
;-------------------------------------------------------------------
; loop
prediction_w16_hh_2nd_loop:
dec ecx
;-------------------------------------------------------------------
; core
movd mm0, [esi]
movd mm1, [esi+4]
movd mm2, [esi+eax]
movd mm3, [esi+eax+4]
movd mm6, [edi]
movq mm4, mm1
movq mm5, mm3
psllq mm4, 32
psllq mm5, 32
por mm4, mm0
por mm5, mm2
psrlq mm4, 8
psrlq mm5, 8
punpcklbw mm0, mm7
punpcklbw mm2, mm7
punpcklbw mm4, mm7
punpcklbw mm5, mm7
punpcklbw mm6, mm7
paddw mm0, mm2
paddw mm0, mm4
paddw mm0, mm5
paddw mm0, adjust_6
psrlw mm0, 2
paddw mm0, mm6
psrlw mm0, 1
packuswb mm0, mm7
movd [edi], mm0
; 0 - 3 finish
movd mm0, [esi+8]
movd mm2, [esi+eax+8]
movd mm6, [edi+4]
movq mm4, mm0
movq mm5, mm2
psllq mm4, 32
psllq mm5, 32
por mm4, mm1
por mm5, mm3
psrlq mm4, 8
psrlq mm5, 8
punpcklbw mm1, mm7
punpcklbw mm3, mm7
punpcklbw mm4, mm7
punpcklbw mm5, mm7
punpcklbw mm6, mm7
paddw mm1, mm3
paddw mm1, mm4
paddw mm1, mm5
paddw mm1, adjust_6
psrlw mm1, 2
paddw mm1, mm6
psrlw mm1, 1
packuswb mm1, mm7
movd [edi+4], mm1
; 4 - 7 finish
movd mm1, [esi+12]
movd mm3, [esi+eax+12]
movd mm6, [edi+8]
movq mm4, mm1
movq mm5, mm3
psllq mm4, 32
psllq mm5, 32
por mm4, mm0
por mm5, mm2
psrlq mm4, 8
psrlq mm5, 8
punpcklbw mm0, mm7
punpcklbw mm2, mm7
punpcklbw mm4, mm7
punpcklbw mm5, mm7
punpcklbw mm6, mm7
paddw mm0, mm2
paddw mm0, mm4
paddw mm0, mm5
paddw mm0, adjust_6
psrlw mm0, 2
paddw mm0, mm6
psrlw mm0, 1
packuswb mm0, mm7
movd [edi+8], mm0
; 8 - 11 finish
movd mm0, [esi+16]
movd mm2, [esi+eax+16]
movd mm6, [edi+12]
psllq mm0, 32
psllq mm2, 32
por mm0, mm1
por mm2, mm3
psrlq mm0, 8
psrlq mm2, 8
punpcklbw mm0, mm7
punpcklbw mm1, mm7
punpcklbw mm2, mm7
punpcklbw mm3, mm7
punpcklbw mm6, mm7
paddw mm0, mm1
paddw mm0, mm2
paddw mm0, mm3
paddw mm0, adjust_6
psrlw mm0, 2
paddw mm0, mm6
psrlw mm0, 1
packuswb mm0, mm7
movd [edi+12], mm0
; 12 - 15 finish
lea edi, [edi+ebx]
lea esi, [esi+eax]
;-------------------------------------------------------------------
; 儖乕僾廔抂僠僃僢僋
test ecx, ecx
jnz prediction_w16_hh_2nd_loop
;-------------------------------------------------------------------
; 儗僕僗僞暅尦側偳屻巒枛
pop eax
pop ebx
pop ecx
pop edi
pop esi
ret 20
_prediction_w16_hh_2nd_mmx@20 ENDP
;-------------------------------------------------------------------
; 廔椆
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 摦偒曗彏乮width 16, Full/Half, 1st乯悈暯 Full, 悅捈 Half
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 婎杮曽恓
; 16bit 惛搙偱係暲楍寁嶼
;-------------------------------------------------------------------
PUBLIC C _prediction_w16_fh_1st_mmx@20
; void __stdcall prediction_w16_fh_1st_mmx(
; [esp+ 4] unsigned char *in,
; [esp+ 8] unsigned char *out,
; [esp+12] int in_step,
; [esp+16] int out_step,
; [esp+20] int height
; )
_prediction_w16_fh_1st_mmx@20 PROC
;-------------------------------------------------------------------
; 巊梡偡傞儗僕僗僞
; esi - 擖椡
; edi - 弌椡
; ecx - 儖乕僾僇僂儞僞
; eax - 擖椡僗僥僢僾
; ebx - 弌椡僗僥僢僾
;-------------------------------------------------------------------
; 儗僕僗僞偺戅旔
push esi
push edi
push ecx
push ebx
push eax
;-------------------------------------------------------------------
; 堷悢偐傜僨乕僞傪庴偗庢偭偰偍偔
mov esi, [esp+20+ 4]
mov edi, [esp+20+ 8]
mov eax, [esp+20+12]
mov ebx, [esp+20+16]
mov ecx, [esp+20+20]
;-------------------------------------------------------------------
; 學悢嶌惉
shr ecx, 1
pxor mm7, mm7
movd mm0, [esi]
movd mm1, [esi+4]
movd mm2, [esi+8]
movd mm3, [esi+12]
lea esi, [esi+eax]
punpcklbw mm0, mm7
punpcklbw mm1, mm7
punpcklbw mm2, mm7
punpcklbw mm3, mm7
;-------------------------------------------------------------------
; loop
prediction_w16_fh_1st_loop:
dec ecx
;-------------------------------------------------------------------
; core
movd mm4, [esi]
movd mm5, [esi+4]
punpcklbw mm4, mm7
punpcklbw mm5, mm7
paddw mm0, mm4
paddw mm1, mm5
paddw mm0, adjust_1
paddw mm1, adjust_1
psrlw mm0, 1
psrlw mm1, 1
packuswb mm0, mm1
movq [edi], mm0
pxor mm1, mm1
movd mm6, [esi+8]
movd mm7, [esi+12]
punpcklbw mm6, mm1
punpcklbw mm7, mm1
paddw mm2, mm6
paddw mm3, mm7
paddw mm2, adjust_1
paddw mm3, adjust_1
psrlw mm2, 1
psrlw mm3, 1
packuswb mm2, mm3
movq [edi+8], mm2
pxor mm3, mm3
lea esi, [esi+eax]
lea edi, [edi+ebx]
movd mm0, [esi]
movd mm1, [esi+4]
punpcklbw mm0, mm3
punpcklbw mm1, mm3
paddw mm4, mm0
paddw mm5, mm1
paddw mm4, adjust_1
paddw mm5, adjust_1
psrlw mm4, 1
psrlw mm5, 1
packuswb mm4, mm5
movq [edi], mm4
pxor mm5, mm5
movd mm2, [esi+8]
movd mm3, [esi+12]
punpcklbw mm2, mm5
punpcklbw mm3, mm5
paddw mm6, mm2
paddw mm7, mm3
paddw mm6, adjust_1
paddw mm7, adjust_1
psrlw mm6, 1
psrlw mm7, 1
packuswb mm6, mm7
movq [edi+8], mm6
pxor mm7, mm7
lea esi, [esi+eax]
lea edi, [edi+ebx]
;-------------------------------------------------------------------
; 儖乕僾廔抂僠僃僢僋
test ecx, ecx
jnz prediction_w16_fh_1st_loop
;-------------------------------------------------------------------
; 儗僕僗僞暅尦側偳屻巒枛
pop eax
pop ebx
pop ecx
pop edi
pop esi
ret 20
_prediction_w16_fh_1st_mmx@20 ENDP
;-------------------------------------------------------------------
; 廔椆
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 摦偒曗彏乮width 16, Full/Half, 2nd乯悈暯 Full, 悅捈 Half
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 婎杮曽恓
; 16bit 惛搙偱係暲楍寁嶼
;-------------------------------------------------------------------
PUBLIC C _prediction_w16_fh_2nd_mmx@20
; void __stdcall prediction_w16_fh_2nd_mmx(
; [esp+ 4] unsigned char *in,
; [esp+ 8] unsigned char *out,
; [esp+12] int in_step,
; [esp+16] int out_step,
; [esp+20] int height
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -