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

📄 mmxmem.asm

📁 这是G.723和G.729的音频编解码的源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
.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 + -