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/asm.h"
00025 #include "libavcodec/dnxhdenc.h"
00026
00027 #if HAVE_SSE2_INLINE
00028
00029 static void get_pixels_8x4_sym_sse2(DCTELEM *block, const uint8_t *pixels, int line_size)
00030 {
00031 __asm__ volatile(
00032 "pxor %%xmm5, %%xmm5 \n\t"
00033 "movq (%0), %%xmm0 \n\t"
00034 "add %2, %0 \n\t"
00035 "movq (%0), %%xmm1 \n\t"
00036 "movq (%0, %2), %%xmm2 \n\t"
00037 "movq (%0, %2,2), %%xmm3 \n\t"
00038 "punpcklbw %%xmm5, %%xmm0 \n\t"
00039 "punpcklbw %%xmm5, %%xmm1 \n\t"
00040 "punpcklbw %%xmm5, %%xmm2 \n\t"
00041 "punpcklbw %%xmm5, %%xmm3 \n\t"
00042 "movdqa %%xmm0, (%1) \n\t"
00043 "movdqa %%xmm1, 16(%1) \n\t"
00044 "movdqa %%xmm2, 32(%1) \n\t"
00045 "movdqa %%xmm3, 48(%1) \n\t"
00046 "movdqa %%xmm3 , 64(%1) \n\t"
00047 "movdqa %%xmm2 , 80(%1) \n\t"
00048 "movdqa %%xmm1 , 96(%1) \n\t"
00049 "movdqa %%xmm0, 112(%1) \n\t"
00050 : "+r" (pixels)
00051 : "r" (block), "r" ((x86_reg)line_size)
00052 );
00053 }
00054
00055 #endif
00056
00057 void ff_dnxhdenc_init_x86(DNXHDEncContext *ctx)
00058 {
00059 #if HAVE_SSE2_INLINE
00060 if (av_get_cpu_flags() & AV_CPU_FLAG_SSE2) {
00061 if (ctx->cid_table->bit_depth == 8)
00062 ctx->get_pixels_8x4_sym = get_pixels_8x4_sym_sse2;
00063 }
00064 #endif
00065 }