📄 mmxmem.asm
字号:
.nolist
INCLUDE iammx.inc ; IAMMX Emulator Macros
.list
.586p
.model FLAT
.data
.const
.code
;Load data from interpolation image to a block or MB size buffer
COMMENT ^
void MMXLoadBlock(
BYTE *MBPtr,
BYTE *ImgPtr,
int pixel);
^
MMXLoadBlock PROC NEAR C USES EDI ESI EAX EBX,
MBPtr: PTR BYTE, ImgPtr: PTR BYTE,
pixel: DWORD
mov edi, MBPtr
mov esi, ImgPtr
mov eax, pixel
mov ebx, eax
add ebx, eax
add ebx, eax
movq mm0, [esi]
movq mm1, [esi+eax]
movq mm2, [esi+2*eax]
add esi, ebx
movq [edi], mm0
movq mm3, [esi]
movq [edi+8],mm1
movq mm4, [esi+eax]
movq [edi+16],mm2
movq mm0, [esi+2*eax]
add esi, ebx
movq [edi+24],mm3
movq mm1, [esi]
movq [edi+32],mm4
movq mm2, [esi+eax]
movq [edi+40],mm0
movq [edi+48],mm1
movq [edi+56],mm2
emms
ret
MMXLoadBlock ENDP
COMMENT ^
void MMXLoadMB(
BYTE *MBPtr,
BYTE *ImgPtr,
int pixel);
^
MMXLoadMB PROC NEAR C USES EDI ESI EAX EBX ECX EDX,
MBPtr: PTR BYTE, ImgPtr: PTR BYTE,
pixel: DWORD
mov edi, MBPtr
mov esi, ImgPtr
mov eax, pixel
mov ebx, eax
mov ecx, eax
add ebx, eax
add ecx, eax
mov edx, ebx
add ecx, eax
movq mm0, [esi]
add edx, ebx
movq mm1, [esi+8]
movq mm2, [esi+eax]
movq [edi], mm0
movq mm3, [esi+eax+8]
movq [edi+8],mm1
movq mm4, [esi+ebx]
add eax, edx
movq [edi+16],mm2
movq mm5, [esi+ebx+8]
movq [edi+24],mm3
movq mm6, [esi+ecx]
add ebx, edx
movq [edi+32],mm4
movq mm7, [esi+ecx+8]
movq [edi+40],mm5
movq mm0, [esi+edx]
add ecx, edx
movq [edi+48],mm6
movq mm1, [esi+edx+8]
movq [edi+56],mm7
movq mm2, [esi+eax]
movq [edi+64],mm0
movq mm3, [esi+eax+8]
movq [edi+72],mm1
movq mm4, [esi+ebx]
movq [edi+80],mm2
movq mm5, [esi+ebx+8]
movq [edi+88],mm3
movq mm6, [esi+ecx]
movq [edi+96],mm4
movq mm7, [esi+ecx+8]
movq [edi+104],mm5
add esi, edx
sub eax, edx
movq [edi+112],mm6
add esi, edx
sub ebx, edx
movq [edi+120],mm7
add edi, 128
sub ecx, edx
movq mm0, [esi]
movq mm1, [esi+8]
movq mm2, [esi+eax]
movq [edi], mm0
movq mm3, [esi+eax+8]
movq [edi+8],mm1
movq mm4, [esi+ebx]
add eax, edx
movq [edi+16],mm2
movq mm5, [esi+ebx+8]
movq [edi+24],mm3
movq mm6, [esi+ecx]
add ebx, edx
movq [edi+32],mm4
movq mm7, [esi+ecx+8]
movq [edi+40],mm5
movq mm0, [esi+edx]
add ecx, edx
movq [edi+48],mm6
movq mm1, [esi+edx+8]
movq [edi+56],mm7
movq mm2, [esi+eax]
movq [edi+64],mm0
movq mm3, [esi+eax+8]
movq [edi+72],mm1
movq mm4, [esi+ebx]
movq [edi+80],mm2
movq mm5, [esi+ebx+8]
movq [edi+88],mm3
movq mm6, [esi+ecx]
movq [edi+96],mm4
movq mm7, [esi+ecx+8]
movq [edi+104],mm5
movq [edi+112],mm6
movq [edi+120],mm7
emms
ret
MMXLoadMB ENDP
;load data or set zero from MBData struct to a 64 short
;buffer to perform DCT or iDCT
COMMENT ^
void MMXLoadMBData(
short *MBPtr,
short *Data);
^
MMXLoadMBData PROC NEAR C USES ESI EDI,
MBPtr: PTR SWORD, Data: PTR SWORD
mov esi, Data
mov edi, MBPtr
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]
movq [edi], mm0
movq [edi+8], mm1
movq [edi+32], mm2
movq [edi+40], mm3
movq [edi+64], mm4
movq [edi+72], mm5
movq [edi+96], mm6
movq [edi+104], mm7
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]
movq [edi+128], mm0
movq [edi+136], mm1
movq [edi+160], mm2
movq [edi+168], mm3
movq [edi+192], mm4
movq [edi+200], mm5
movq [edi+224], mm6
movq [edi+232], mm7
emms
ret
MMXLoadMBData ENDP
COMMENT ^
void MMXSetMBDataZero(short *MBPtr);
^
MMXSetMBDataZero PROC NEAR C USES EDI,
MBPtr: PTR SWORD
mov edi, MBPtr
pxor mm0, mm0
movq [edi], mm0
movq [edi+8], mm0
movq [edi+32], mm0
movq [edi+40], mm0
movq [edi+64], mm0
movq [edi+72], mm0
movq [edi+96], mm0
movq [edi+104], mm0
movq [edi+128], mm0
movq [edi+136], mm0
movq [edi+160], mm0
movq [edi+168], mm0
movq [edi+192], mm0
movq [edi+200], mm0
movq [edi+224], mm0
movq [edi+232], mm0
emms
ret
MMXSetMBDataZero ENDP
COMMENT ^
void MMXSetBlockZero(short *MBPtr);
^
MMXSetBlockZero PROC NEAR C USES EDI,
MBPtr: PTR SWORD
mov edi, MBPtr
pxor mm0, mm0
movq [edi], mm0
movq [edi+8], mm0
movq [edi+16], mm0
movq [edi+24], mm0
movq [edi+32], mm0
movq [edi+40], mm0
movq [edi+48], mm0
movq [edi+56], mm0
movq [edi+64], mm0
movq [edi+72], mm0
movq [edi+80], mm0
movq [edi+88], mm0
movq [edi+96], mm0
movq [edi+104], mm0
movq [edi+112], mm0
movq [edi+120], mm0
emms
ret
MMXSetBlockZero ENDP
;store data from MBData struct to Loss image buffer
COMMENT ^
void MMXStoreMB(
BYTE *Loss,
short *Data,
int pixel);
^
MMXStoreMB PROC NEAR C USES ESI EDI EAX EBX ECX EDX,
Loss: PTR BYTE, Data: PTR SWORD,
pixel: DWORD
mov esi, Data
mov edi, Loss
mov eax, pixel
mov ebx, eax
mov ecx, eax
add ebx, eax
add ecx, eax
mov edx, ebx
add ecx, eax
add edx, edx
movq mm0, [esi]
movq mm1, [esi+8]
movq mm2, [esi+16]
movq mm3, [esi+24]
packuswb mm0, mm1
movq mm4, [esi+32]
movq mm5, [esi+40]
packuswb mm2, mm3
movq [edi], mm0
movq mm6, [esi+48]
movq mm7, [esi+56]
packuswb mm4, mm5
movq [edi+8],mm2
movq mm0, [esi+64]
movq mm1, [esi+72]
packuswb mm6, mm7
movq [edi+eax],mm4
movq mm2, [esi+80]
movq mm3, [esi+88]
packuswb mm0, mm1
movq [edi+eax+8],mm6
movq mm4, [esi+96]
movq mm5, [esi+104]
packuswb mm2, mm3
movq [edi+ebx],mm0
movq mm6, [esi+112]
movq mm7, [esi+120]
packuswb mm4, mm5
add esi, 128
movq [edi+ebx+8],mm2
movq [edi+ecx],mm4
movq mm0, [esi]
movq mm1, [esi+8]
packuswb mm6, mm7
movq mm2, [esi+16]
movq mm3, [esi+24]
packuswb mm0, mm1
movq [edi+ecx+8],mm6
movq mm4, [esi+32]
movq mm5, [esi+40]
packuswb mm2, mm3
movq [edi+edx], mm0
movq mm6, [esi+48]
movq mm7, [esi+56]
packuswb mm4, mm5
movq [edi+edx+8],mm2
add edi, edx
movq mm0, [esi+64]
movq mm1, [esi+72]
packuswb mm6, mm7
movq [edi+eax],mm4
movq mm2, [esi+80]
movq mm3, [esi+88]
packuswb mm0, mm1
movq [edi+eax+8],mm6
movq mm4, [esi+96]
movq mm5, [esi+104]
packuswb mm2, mm3
movq [edi+ebx],mm0
movq mm6, [esi+112]
movq mm7, [esi+120]
packuswb mm4, mm5
add esi, 128
movq [edi+ebx+8],mm2
movq [edi+ecx],mm4
movq mm0, [esi]
movq mm1, [esi+8]
packuswb mm6, mm7
movq mm2, [esi+16]
movq mm3, [esi+24]
packuswb mm0, mm1
movq [edi+ecx+8],mm6
movq mm4, [esi+32]
movq mm5, [esi+40]
packuswb mm2, mm3
movq [edi+edx], mm0
movq mm6, [esi+48]
movq mm7, [esi+56]
packuswb mm4, mm5
movq [edi+edx+8],mm2
add edi, edx
movq mm0, [esi+64]
movq mm1, [esi+72]
packuswb mm6, mm7
movq [edi+eax],mm4
movq mm2, [esi+80]
movq mm3, [esi+88]
packuswb mm0, mm1
movq [edi+eax+8],mm6
movq mm4, [esi+96]
movq mm5, [esi+104]
packuswb mm2, mm3
movq [edi+ebx],mm0
movq mm6, [esi+112]
movq mm7, [esi+120]
packuswb mm4, mm5
add esi, 128
movq [edi+ebx+8],mm2
movq [edi+ecx],mm4
movq mm0, [esi]
movq mm1, [esi+8]
packuswb mm6, mm7
movq mm2, [esi+16]
movq mm3, [esi+24]
packuswb mm0, mm1
movq [edi+ecx+8],mm6
movq mm4, [esi+32]
movq mm5, [esi+40]
packuswb mm2, mm3
movq [edi+edx], mm0
movq mm6, [esi+48]
movq mm7, [esi+56]
packuswb mm4, mm5
movq [edi+edx+8],mm2
add edi, edx
movq mm0, [esi+64]
movq mm1, [esi+72]
packuswb mm6, mm7
movq [edi+eax],mm4
movq mm2, [esi+80]
movq mm3, [esi+88]
packuswb mm0, mm1
movq [edi+eax+8],mm6
movq mm4, [esi+96]
movq mm5, [esi+104]
packuswb mm2, mm3
movq [edi+ebx],mm0
movq mm6, [esi+112]
movq mm7, [esi+120]
packuswb mm4, mm5
movq [edi+ebx+8],mm2
packuswb mm6, mm7
movq [edi+ecx],mm4
movq [edi+ecx+8],mm6
emms
ret
MMXStoreMB ENDP
COMMENT ^
void MMXStoreBlock(
BYTE *Loss,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -