📄 block_mmx.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 偍栺懇
.586
.mmx
.xmm
.model flat
_TEXT64 segment page public use32 'CODE'
align 16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; copy_i_block_to_frame_mmx - 僀儞僩儔僽儘僢僋偺僼儗乕儉捛壛
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 婎杮曽恓
; short block[64] 偐傜 unsigned char * 傊僐僺乕偡傞嵺丄僋儕僢僺儞僌
; 僥乕僽儖傪巊偆偺偱偼側偔丄MMX 偺朞榓墘嶼傪棙梡偡傞
;-------------------------------------------------------------------
; 僀儞僞乕僼僃乕僗
PUBLIC C _copy_i_block_to_frame_mmx@12
; void __stdcall copy_i_block_to_frame_mmx(
; [esp + 4] = unsigned short *in,
; [esp + 8] = unsigned char *out,
; [esp +12] = int step
; )
_copy_i_block_to_frame_mmx@12 PROC
;-------------------------------------------------------------------
; 巊梡偡傞儗僕僗僞
; edi - 弌椡
; esi - 擖椡
; ecx - 僗僥僢僾
; total 12 bytes
;-------------------------------------------------------------------
; 儗僕僗僞偺戅旔
push edi
push esi
push ecx
;-------------------------------------------------------------------
; 堷悢偐傜僨乕僞傪庴偗庢偭偰偍偔
mov esi, [esp+12+ 4]
mov edi, [esp+12+ 8]
mov ecx, [esp+12+12]
;-------------------------------------------------------------------
; 僐傾
movq mm0, [esi]
movq mm1, [esi+8]
movq mm2, [esi+16]
movq mm3, [esi+24]
movq mm4, [esi+32]
movq mm5, [esi+40]
movq mm6, [esi+48]
movq mm7, [esi+56]
packuswb mm0, mm1
packuswb mm2, mm3
packuswb mm4, mm5
packuswb mm6, mm7
movq [edi], mm0
lea edi, [edi+ecx]
movq [edi], mm2
lea edi, [edi+ecx]
movq [edi], mm4
lea edi, [edi+ecx]
movq [edi], mm6
lea edi, [edi+ecx]
; 忋敿暘僐僺乕廔椆
movq mm0, [esi+64]
movq mm1, [esi+72]
movq mm2, [esi+80]
movq mm3, [esi+88]
movq mm4, [esi+96]
movq mm5, [esi+104]
movq mm6, [esi+112]
movq mm7, [esi+120]
packuswb mm0, mm1
packuswb mm2, mm3
packuswb mm4, mm5
packuswb mm6, mm7
movq [edi], mm0
lea edi, [edi+ecx]
movq [edi], mm2
lea edi, [edi+ecx]
movq [edi], mm4
lea edi, [edi+ecx]
movq [edi], mm6
lea edi, [edi+ecx]
; 壓敿暘僐僺乕廔椆
;-------------------------------------------------------------------
; 儗僕僗僞暅尦摍屻巒枛
pop ecx
pop esi
pop edi
ret 12
_copy_i_block_to_frame_mmx@12 ENDP
;-------------------------------------------------------------------
; 廔椆
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; add_diff_to_frame_mmx - 嵎暘僽儘僢僋偺僼儗乕儉捛壛
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 婎杮曽恓
; 16 bit 惛搙偱 4 暲楍墘嶼丄僋儕僢僺儞僌僥乕僽儖偼巊傢偢丄
; MMX 偺朞榓墘嶼傪棙梡偡傞
;-------------------------------------------------------------------
; 僀儞僞乕僼僃乕僗
PUBLIC C _add_diff_to_frame_mmx@12
; void __stdcall add_diff_to_frame_mmx(
; [esp + 4] = unsigned short *in,
; [esp + 8] = unsigned char *out,
; [esp +12] = int step
; )
_add_diff_to_frame_mmx@12 PROC
;-------------------------------------------------------------------
; 巊梡偡傞儗僕僗僞
; edi - 弌椡
; esi - 擖椡
; ecx - 僗僥僢僾
; total 12 bytes
;-------------------------------------------------------------------
; 梡搑屌掕 MMX 儗僕僗僞
; mm7 - 0
;-------------------------------------------------------------------
; 儗僕僗僞偺戅旔
push edi
push esi
push ecx
;-------------------------------------------------------------------
; 堷悢偐傜僨乕僞傪庴偗庢偭偰偍偔
mov esi, [esp+12+ 4]
mov edi, [esp+12+ 8]
mov ecx, [esp+12+12]
;-------------------------------------------------------------------
; 曄姺學悢偺嶌惉
pxor mm7, mm7
;-------------------------------------------------------------------
; 僐傾乮儖乕僾偼巊傢側偄丄偙偺掱搙偺婯柾側傜揥奐偟偨曽偑椙偄偼偢乯
; 0-1 峴
movd mm0, [edi]
movd mm1, [edi+4]
movd mm2, [edi+ecx]
movd mm3, [edi+ecx+4]
punpcklbw mm0, mm7
punpcklbw mm1, mm7
punpcklbw mm2, mm7
punpcklbw mm3, mm7
; 僼儗乕儉俀峴撉傒庢傝
paddw mm0, [esi]
paddw mm1, [esi+8]
paddw mm2, [esi+16]
paddw mm3, [esi+24]
packuswb mm0, mm1
packuswb mm2, mm3
; 嵎暘僽儘僢僋傪懌偟偰
movq [edi], mm0
lea edi, [edi+ecx]
movq [edi], mm2
lea edi, [edi+ecx]
; 彂偒栠偡
; 2-3 峴
movd mm0, [edi]
movd mm1, [edi+4]
movd mm2, [edi+ecx]
movd mm3, [edi+ecx+4]
punpcklbw mm0, mm7
punpcklbw mm1, mm7
punpcklbw mm2, mm7
punpcklbw mm3, mm7
; 僼儗乕儉俀峴撉傒庢傝
paddw mm0, [esi+32]
paddw mm1, [esi+40]
paddw mm2, [esi+48]
paddw mm3, [esi+56]
packuswb mm0, mm1
packuswb mm2, mm3
; 嵎暘僽儘僢僋傪懌偟偰
movq [edi], mm0
lea edi, [edi+ecx]
movq [edi], mm2
lea edi, [edi+ecx]
; 彂偒栠偡
; 4-5 峴
movd mm0, [edi]
movd mm1, [edi+4]
movd mm2, [edi+ecx]
movd mm3, [edi+ecx+4]
punpcklbw mm0, mm7
punpcklbw mm1, mm7
punpcklbw mm2, mm7
punpcklbw mm3, mm7
; 僼儗乕儉俀峴撉傒庢傝
paddw mm0, [esi+64]
paddw mm1, [esi+72]
paddw mm2, [esi+80]
paddw mm3, [esi+88]
packuswb mm0, mm1
packuswb mm2, mm3
; 嵎暘僽儘僢僋傪懌偟偰
movq [edi], mm0
lea edi, [edi+ecx]
movq [edi], mm2
lea edi, [edi+ecx]
; 彂偒栠偡
; 6-7 峴
movd mm0, [edi]
movd mm1, [edi+4]
movd mm2, [edi+ecx]
movd mm3, [edi+ecx+4]
punpcklbw mm0, mm7
punpcklbw mm1, mm7
punpcklbw mm2, mm7
punpcklbw mm3, mm7
; 僼儗乕儉俀峴撉傒庢傝
paddw mm0, [esi+96]
paddw mm1, [esi+104]
paddw mm2, [esi+112]
paddw mm3, [esi+120]
packuswb mm0, mm1
packuswb mm2, mm3
; 嵎暘僽儘僢僋傪懌偟偰
movq [edi], mm0
lea edi, [edi+ecx]
movq [edi], mm2
lea edi, [edi+ecx]
; 彂偒栠偡
;-------------------------------------------------------------------
; 儗僕僗僞暅尦摍屻巒枛
pop ecx
pop esi
pop edi
ret 12
_add_diff_to_frame_mmx@12 ENDP
;-------------------------------------------------------------------
; 廔椆
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; setup_qw_mmx - 検巕壔峴楍偲検巕壔學悢偐傜廳傒僥乕僽儖傪嶌惉偡傞
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 僀儞僞乕僼僃乕僗
PUBLIC C _setup_qw_mmx@12
; void __stdcall setup_qw_mmx(
; [esp + 4] = unsigned short *qw,
; [esp + 8] = unsigned short *qm,
; [esp +12] = int q
; )
_setup_qw_mmx@12 PROC
;-------------------------------------------------------------------
; 巊梡偡傞儗僕僗僞
; edi - 弌椡
; esi - 擖椡
; total 8 bytes
;-------------------------------------------------------------------
; 儗僕僗僞偺戅旔
push edi
push esi
;-------------------------------------------------------------------
; 堷悢偐傜僨乕僞傪庴偗庢偭偰偍偔
mov edi, [esp+ 8+ 4]
mov esi, [esp+ 8+ 8]
;-------------------------------------------------------------------
; 曄姺學悢偺嶌惉
movd mm7, [esp+ 8+12]
punpcklwd mm7, mm7;
punpckldq mm7, mm7;
movq mm0, [esi];
movq mm1, [esi+8];
movq mm2, [esi+16];
movq mm3, [esi+24];
movq mm4, [esi+32];
movq mm5, [esi+40];
movq mm6, [esi+48];
lea esi, [esi+56]; 28
pmullw mm0, mm7;
pmullw mm1, mm7;
pmullw mm2, mm7;
pmullw mm3, mm7;
pmullw mm4, mm7;
pmullw mm5, mm7;
pmullw mm6, mm7;
movq [edi], mm0;
movq [edi+8], mm1;
movq [edi+16], mm2;
movq [edi+24], mm3;
movq [edi+32], mm4;
movq [edi+40], mm5;
movq [edi+48], mm6;
lea edi, [edi+56];
movq mm0, [esi];
movq mm1, [esi+8];
movq mm2, [esi+16];
movq mm3, [esi+24];
movq mm4, [esi+32];
movq mm5, [esi+40];
movq mm6, [esi+48];
lea esi, [esi+56]; 56
pmullw mm0, mm7;
pmullw mm1, mm7;
pmullw mm2, mm7;
pmullw mm3, mm7;
pmullw mm4, mm7;
pmullw mm5, mm7;
pmullw mm6, mm7;
movq [edi], mm0;
movq [edi+8], mm1;
movq [edi+16], mm2;
movq [edi+24], mm3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -