;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; お約束 .586 .mmx .model flat _TEXT64 segment page public use32 'CODE' align 8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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] lea esi, [esi+8] movq mm1, [esi] lea esi, [esi+8] movq mm2, [esi] lea esi, [esi+8] movq mm3, [esi] lea esi, [esi+8] movq mm4, [esi] lea esi, [esi+8] movq mm5, [esi] lea esi, [esi+8] movq mm6, [esi] lea esi, [esi+8] movq mm7, [esi] lea esi, [esi+8] 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] lea esi, [esi+8] movq mm1, [esi] lea esi, [esi+8] movq mm2, [esi] lea esi, [esi+8] movq mm3, [esi] lea esi, [esi+8] movq mm4, [esi] lea esi, [esi+8] movq mm5, [esi] lea esi, [esi+8] movq mm6, [esi] lea esi, [esi+8] movq mm7, [esi] lea esi, [esi+8] 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 ;------------------------------------------------------------------- ; コア(ループは使わない、この程度の規模なら展開した方が良いはず) movq mm0, [esi] lea esi, [esi+8] movq mm1, [esi] lea esi, [esi+8] movq mm2, [esi] lea esi, [esi+8] movq mm3, [esi] lea esi, [esi+8] ; 差分ブロック2行読み取り movq mm4, [edi] movq mm5, [edi+ecx] ; フレーム2行読み取り movq mm6, mm4 punpcklbw mm6, mm7 punpckhbw mm4, mm7 paddw mm0, mm6 paddw mm1, mm4 packuswb mm0, mm1 movq mm6, mm5 punpcklbw mm6, mm7 punpckhbw mm5, mm7 paddw mm2, mm6 paddw mm3, mm5 packuswb mm2, mm3 movq [edi], mm0 lea edi, [edi+ecx] movq [edi], mm2 lea edi, [edi+ecx] ; 出力 movq mm0, [esi] lea esi, [esi+8] movq mm1, [esi] lea esi, [esi+8] movq mm2, [esi] lea esi, [esi+8] movq mm3, [esi] lea esi, [esi+8] ; 差分ブロック2行読み取り movq mm4, [edi] movq mm5, [edi+ecx] ; フレーム2行読み取り movq mm6, mm4 punpcklbw mm6, mm7 punpckhbw mm4, mm7 paddw mm0, mm6 paddw mm1, mm4 packuswb mm0, mm1 movq mm6, mm5 punpcklbw mm6, mm7 punpckhbw mm5, mm7 paddw mm2, mm6 paddw mm3, mm5 packuswb mm2, mm3 movq [edi], mm0 lea edi, [edi+ecx] movq [edi], mm2 lea edi, [edi+ecx] ;出力 movq mm0, [esi] lea esi, [esi+8] movq mm1, [esi] lea esi, [esi+8] movq mm2, [esi] lea esi, [esi+8] movq mm3, [esi] lea esi, [esi+8] ; 差分ブロック2行読み取り movq mm4, [edi] movq mm5, [edi+ecx] ; フレーム2行読み取り movq mm6, mm4 punpcklbw mm6, mm7 punpckhbw mm4, mm7 paddw mm0, mm6 paddw mm1, mm4 packuswb mm0, mm1 movq mm6, mm5 punpcklbw mm6, mm7 punpckhbw mm5, mm7 paddw mm2, mm6 paddw mm3, mm5 packuswb mm2, mm3 movq [edi], mm0 lea edi, [edi+ecx] movq [edi], mm2 lea edi, [edi+ecx] ; 出力 movq mm0, [esi] lea esi, [esi+8] movq mm1, [esi] lea esi, [esi+8] movq mm2, [esi] lea esi, [esi+8] movq mm3, [esi] lea esi, [esi+8] ; 差分ブロック2行読み取り movq mm4, [edi] movq mm5, [edi+ecx] ; フレーム2行読み取り movq mm6, mm4 punpcklbw mm6, mm7 punpckhbw mm4, mm7 paddw mm0, mm6 paddw mm1, mm4 packuswb mm0, mm1 movq mm6, mm5 punpcklbw mm6, mm7 punpckhbw mm5, mm7 paddw mm2, mm6 paddw mm3, mm5 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 ;------------------------------------------------------------------- ; 終了 END