📄 idctmmx.cpp
字号:
#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 + -