00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "libavutil/x86_cpu.h"
00025 #include "libavcodec/dnxhdenc.h"
00026
00027 static void get_pixels_8x4_sym_sse2(DCTELEM *block, const uint8_t *pixels, int line_size)
00028 {
00029 __asm__ volatile(
00030 "pxor %%xmm5, %%xmm5 \n\t"
00031 "movq (%0), %%xmm0 \n\t"
00032 "add %2, %0 \n\t"
00033 "movq (%0), %%xmm1 \n\t"
00034 "movq (%0, %2), %%xmm2 \n\t"
00035 "movq (%0, %2,2), %%xmm3 \n\t"
00036 "punpcklbw %%xmm5, %%xmm0 \n\t"
00037 "punpcklbw %%xmm5, %%xmm1 \n\t"
00038 "punpcklbw %%xmm5, %%xmm2 \n\t"
00039 "punpcklbw %%xmm5, %%xmm3 \n\t"
00040 "movdqa %%xmm0, (%1) \n\t"
00041 "movdqa %%xmm1, 16(%1) \n\t"
00042 "movdqa %%xmm2, 32(%1) \n\t"
00043 "movdqa %%xmm3, 48(%1) \n\t"
00044 "movdqa %%xmm3 , 64(%1) \n\t"
00045 "movdqa %%xmm2 , 80(%1) \n\t"
00046 "movdqa %%xmm1 , 96(%1) \n\t"
00047 "movdqa %%xmm0, 112(%1) \n\t"
00048 : "+r" (pixels)
00049 : "r" (block), "r" ((x86_reg)line_size)
00050 );
00051 }
00052
00053 void ff_dnxhd_init_mmx(DNXHDEncContext *ctx)
00054 {
00055 if (av_get_cpu_flags() & AV_CPU_FLAG_SSE2) {
00056 if (ctx->cid_table->bit_depth == 8)
00057 ctx->get_pixels_8x4_sym = get_pixels_8x4_sym_sse2;
00058 }
00059 }