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

📄 idctmmx.cpp

📁 mpeg2编码解码源程序代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#define INP			eax
#define OUT			ecx
#define TABLE		ebx
#define ROUNDER		edx
//#define round_inv_col	edx
//#define ROW_STRIDE		16

#define DCT_8_INV_ROW __asm {										\
	__asm 	movq mm0, mptr [INP] 									\
	__asm 	movq mm1, mptr [INP+8]									\
	__asm 	movq mm2, mm0 											\
	__asm 	movq mm3, mptr [TABLE]									\
	__asm 	punpcklwd mm0, mm1 										\
	__asm 	movq mm5, mm0 											\
	__asm 	punpckldq mm0, mm0 										\
	__asm	movq mm4, mptr [TABLE+8] 								\
	__asm	punpckhwd mm2, mm1										\
	__asm	pmaddwd mm3, mm0 										\
	__asm	movq mm6, mm2 											\
	__asm	movq mm1, mptr [TABLE+32] 								\
	__asm	punpckldq mm2, mm2 										\
	__asm	pmaddwd mm4, mm2 										\
	__asm	punpckhdq mm5, mm5 										\
	__asm	pmaddwd mm0, mptr [TABLE+16] 							\
	__asm	punpckhdq mm6, mm6 										\
	__asm	movq mm7, mptr [TABLE+40]								\
	__asm	pmaddwd mm1, mm5 										\
	__asm	paddd mm3, mptr [ROUNDER] 								\
	__asm	pmaddwd mm7, mm6 										\
	__asm	pmaddwd mm2, mptr [TABLE+24]							\
	__asm	paddd mm3, mm4 											\
	__asm	pmaddwd mm5, mptr [TABLE+48]							\
	__asm	movq mm4, mm3 											\
	__asm	pmaddwd mm6, mptr [TABLE+56]							\
	__asm	paddd mm1, mm7 											\
	__asm	paddd mm0, mptr [ROUNDER]								\
	__asm	psubd mm3, mm1 											\
	__asm	psrad mm3, SHIFT_INV_ROW 								\
	__asm	paddd mm1, mm4 											\
	__asm	paddd mm0, mm2 											\
	__asm	psrad mm1, SHIFT_INV_ROW 								\
	__asm	paddd mm5, mm6 											\
	__asm	movq mm4, mm0 											\
	__asm	paddd mm0, mm5 											\
	__asm	psubd mm4, mm5 											\
	__asm	psrad mm0, SHIFT_INV_ROW								\
	__asm	psrad mm4, SHIFT_INV_ROW 								\
	__asm	packssdw mm1, mm0 										\
	__asm	packssdw mm4, mm3 										\
	__asm	movq mm7, mm4 											\
	__asm	psrld mm4, 16 											\
	__asm	pslld mm7, 16 											\
	__asm	movq mptr [OUT], mm1									\
	__asm	por mm7, mm4 											\
	__asm	movq mptr [OUT+8], mm7 									\
}

#define DCT_8_INV_COL_4 __asm {										\
	__asm 	movq	mm0, qword ptr tg_3_16							\
	__asm 	movq	mm3, mword ptr [INP+16*3]						\
	__asm 	movq	mm1, mm0										\
	__asm 	movq	mm5, mword ptr [INP+16*5]						\
	__asm 	pmulhw	mm0, mm3										\
	__asm 	movq	mm4, mword ptr tg_1_16							\
	__asm 	pmulhw	mm1, mm5										\
	__asm 	movq	mm7, mword ptr [INP+16*7]						\
	__asm 	movq	mm2, mm4										\
	__asm 	movq	mm6, mword ptr [INP+16*1]						\
	__asm 	pmulhw	mm4, mm7										\
	__asm 	paddsw	mm0, mm3										\
	__asm 	pmulhw	mm2, mm6										\
	__asm 	paddsw	mm1, mm3										\
	__asm 	psubsw	mm0, mm5										\
	__asm 	movq	mm3, mword ptr ocos_4_16						\
	__asm 	paddsw	mm1, mm5										\
	__asm 	paddsw	mm4, mm6										\
	__asm 	psubsw	mm2, mm7										\
	__asm 	movq	mm5, mm4										\
	__asm 	movq	mm6, mm2										\
	__asm 	paddsw	mm5, mm1										\
	__asm 	psubsw	mm6, mm0										\
	__asm 	psubsw	mm4, mm1										\
	__asm 	paddsw	mm2, mm0										\
	__asm 	movq	mm7, mword ptr tg_2_16							\
	__asm 	movq	mm1, mm4										\
	__asm 	movq	mword ptr [OUT+3*16], mm5						\
	__asm 	paddsw	mm1, mm2										\
	__asm 	movq	mword ptr [OUT+5*16], mm6						\
	__asm 	psubsw	mm4, mm2										\
	__asm 	movq	mm5, mword ptr [INP+2*16]						\
	__asm 	movq	mm0, mm7										\
	__asm 	movq	mm6, mword ptr [INP+6*16]						\
	__asm 	pmulhw	mm0, mm5										\
	__asm 	pmulhw	mm7, mm6										\
	__asm 	pmulhw	mm1, mm3										\
	__asm 	movq	mm2, mword ptr [INP+0*16]						\
	__asm 	pmulhw	mm4, mm3										\
	__asm 	psubsw	mm0, mm6										\
	__asm 	movq	mm3, mm2										\
	__asm 	movq	mm6, mword ptr [INP+4*16]						\
	__asm 	paddsw	mm7, mm5										\
	__asm 	paddsw	mm2, mm6										\
	__asm 	psubsw	mm3, mm6										\
	__asm 	movq	mm5, mm2										\
	__asm 	movq	mm6, mm3										\
	__asm 	psubsw	mm2, mm7										\
	__asm 	paddsw	mm3, mm0										\
	__asm 	paddsw mm1, mm1											\
	__asm 	paddsw mm4, mm4											\
	__asm 	paddsw	mm5, mm7										\
	__asm 	psubsw	mm6, mm0										\
	__asm 	movq	mm7, mm3										\
	__asm 	movq	mm0, mm6										\
	__asm 	paddsw	mm3, mm1										\
	__asm 	paddsw	mm6, mm4										\
	__asm 	psraw	mm3, SHIFT_INV_COL								\
	__asm 	psubsw	mm7, mm1										\
	__asm 	psraw	mm6, SHIFT_INV_COL								\
	__asm 	psubsw	mm0, mm4										\
	__asm 	movq	mm1, mword ptr [OUT+3*16]						\
	__asm 	psraw	mm7, SHIFT_INV_COL								\
	__asm 	movq	mm4, mm5										\
	__asm 	psraw	mm0, SHIFT_INV_COL								\
	__asm 	movq	mword ptr [OUT+1*16], mm3						\
	__asm 	paddsw	mm5, mm1										\
	__asm 	movq	mword ptr [OUT+2*16], mm6						\
	__asm 	psubsw	mm4, mm1										\
	__asm 	movq	mm3, mword ptr [OUT+5*16]						\
	__asm 	psraw	mm5, SHIFT_INV_COL								\
	__asm 	movq	mm6, mm2										\
	__asm 	psraw	mm4, SHIFT_INV_COL								\
	__asm 	movq	mword ptr [OUT+5*16], mm0						\
	__asm 	paddsw	mm2, mm3										\
	__asm 	movq	mword ptr [OUT+6*16], mm7						\
	__asm 	psubsw	mm6, mm3										\
	__asm 	movq	mword ptr [OUT+0*16], mm5						\
	__asm 	psraw	mm2, SHIFT_INV_COL								\
	__asm 	movq	mword ptr [OUT+7*16], mm4						\
	__asm 	psraw	mm6, SHIFT_INV_COL								\
	__asm 	movq	mword ptr [OUT+3*16], mm2						\
	__asm 	movq	mword ptr [OUT+4*16], mm6						\
}

void MMX_IDCT(short *block)
{
__asm	mov INP, block		
__asm	mov OUT, block
__asm	lea TABLE, tab_i_04
__asm	lea ROUNDER, rounder_0
	DCT_8_INV_ROW
//__asm	mov INP, block+8
//__asm	mov OUT, block+8
__asm	add INP, 16
__asm	add OUT, 16
__asm	lea TABLE, tab_i_17
__asm	lea ROUNDER, rounder_1
	DCT_8_INV_ROW	
__asm	add INP, 16
__asm	add OUT, 16
__asm	lea TABLE, tab_i_26
__asm	lea ROUNDER, rounder_2
	DCT_8_INV_ROW
__asm	add INP, 16
__asm	add OUT, 16
__asm	lea TABLE, tab_i_35
__asm	lea ROUNDER, rounder_3
	DCT_8_INV_ROW
__asm	add INP, 16
__asm	add OUT, 16
__asm	lea TABLE, tab_i_04
__asm	lea ROUNDER, rounder_4
	DCT_8_INV_ROW
__asm	add INP, 16
__asm	add OUT, 16
__asm	lea TABLE, tab_i_35
__asm	lea ROUNDER, rounder_5
	DCT_8_INV_ROW
__asm	add INP, 16
__asm	add OUT, 16
__asm	lea TABLE, tab_i_26
__asm	lea ROUNDER, rounder_6
	DCT_8_INV_ROW
__asm	add INP, 16
__asm	add OUT, 16
__asm	lea TABLE, tab_i_17
__asm	lea ROUNDER, rounder_7
	DCT_8_INV_ROW
__asm	mov INP, block
__asm	mov OUT, block
	DCT_8_INV_COL_4
__asm	add INP, 8
__asm	add OUT, 8
	DCT_8_INV_COL_4
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -