diff options
Diffstat (limited to 'drivers/theora/x86')
-rw-r--r-- | drivers/theora/x86/mmxencfrag.c | 900 | ||||
-rw-r--r-- | drivers/theora/x86/mmxfdct.c | 665 | ||||
-rw-r--r-- | drivers/theora/x86/mmxfrag.c | 293 | ||||
-rw-r--r-- | drivers/theora/x86/mmxfrag.h | 64 | ||||
-rw-r--r-- | drivers/theora/x86/mmxidct.c | 564 | ||||
-rw-r--r-- | drivers/theora/x86/mmxloop.h | 215 | ||||
-rw-r--r-- | drivers/theora/x86/mmxstate.c | 188 | ||||
-rw-r--r-- | drivers/theora/x86/sse2fdct.c | 523 | ||||
-rw-r--r-- | drivers/theora/x86/x86enc.c | 49 | ||||
-rw-r--r-- | drivers/theora/x86/x86enc.h | 47 | ||||
-rw-r--r-- | drivers/theora/x86/x86int.h | 42 | ||||
-rw-r--r-- | drivers/theora/x86/x86state.c | 62 |
12 files changed, 0 insertions, 3612 deletions
diff --git a/drivers/theora/x86/mmxencfrag.c b/drivers/theora/x86/mmxencfrag.c deleted file mode 100644 index c79ff01fcc..0000000000 --- a/drivers/theora/x86/mmxencfrag.c +++ /dev/null @@ -1,900 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: - last mod: $Id: dsp_mmx.c 14579 2008-03-12 06:42:40Z xiphmont $ - - ********************************************************************/ -#include <stddef.h> -#include "x86enc.h" - -#if defined(OC_X86_ASM) - -unsigned oc_enc_frag_sad_mmxext(const unsigned char *_src, - const unsigned char *_ref,int _ystride){ - ptrdiff_t ystride3; - ptrdiff_t ret; - __asm__ __volatile__( - /*Load the first 4 rows of each block.*/ - "movq (%[src]),%%mm0\n\t" - "movq (%[ref]),%%mm1\n\t" - "movq (%[src],%[ystride]),%%mm2\n\t" - "movq (%[ref],%[ystride]),%%mm3\n\t" - "lea (%[ystride],%[ystride],2),%[ystride3]\n\t" - "movq (%[src],%[ystride],2),%%mm4\n\t" - "movq (%[ref],%[ystride],2),%%mm5\n\t" - "movq (%[src],%[ystride3]),%%mm6\n\t" - "movq (%[ref],%[ystride3]),%%mm7\n\t" - /*Compute their SADs and add them in %%mm0*/ - "psadbw %%mm1,%%mm0\n\t" - "psadbw %%mm3,%%mm2\n\t" - "lea (%[src],%[ystride],4),%[src]\n\t" - "paddw %%mm2,%%mm0\n\t" - "lea (%[ref],%[ystride],4),%[ref]\n\t" - /*Load the next 3 rows as registers become available.*/ - "movq (%[src]),%%mm2\n\t" - "movq (%[ref]),%%mm3\n\t" - "psadbw %%mm5,%%mm4\n\t" - "psadbw %%mm7,%%mm6\n\t" - "paddw %%mm4,%%mm0\n\t" - "movq (%[ref],%[ystride]),%%mm5\n\t" - "movq (%[src],%[ystride]),%%mm4\n\t" - "paddw %%mm6,%%mm0\n\t" - "movq (%[ref],%[ystride],2),%%mm7\n\t" - "movq (%[src],%[ystride],2),%%mm6\n\t" - /*Start adding their SADs to %%mm0*/ - "psadbw %%mm3,%%mm2\n\t" - "psadbw %%mm5,%%mm4\n\t" - "paddw %%mm2,%%mm0\n\t" - "psadbw %%mm7,%%mm6\n\t" - /*Load last row as registers become available.*/ - "movq (%[src],%[ystride3]),%%mm2\n\t" - "movq (%[ref],%[ystride3]),%%mm3\n\t" - /*And finish adding up their SADs.*/ - "paddw %%mm4,%%mm0\n\t" - "psadbw %%mm3,%%mm2\n\t" - "paddw %%mm6,%%mm0\n\t" - "paddw %%mm2,%%mm0\n\t" - "movd %%mm0,%[ret]\n\t" - :[ret]"=a"(ret),[src]"+%r"(_src),[ref]"+r"(_ref),[ystride3]"=&r"(ystride3) - :[ystride]"r"((ptrdiff_t)_ystride) - ); - return (unsigned)ret; -} - -unsigned oc_enc_frag_sad_thresh_mmxext(const unsigned char *_src, - const unsigned char *_ref,int _ystride,unsigned _thresh){ - /*Early termination is for suckers.*/ - return oc_enc_frag_sad_mmxext(_src,_ref,_ystride); -} - -/*Assumes the first two rows of %[ref1] and %[ref2] are in %%mm0...%%mm3, the - first two rows of %[src] are in %%mm4,%%mm5, and {1}x8 is in %%mm7. - We pre-load the next two rows of data as registers become available.*/ -#define OC_SAD2_LOOP \ - "#OC_SAD2_LOOP\n\t" \ - /*We want to compute (%%mm0+%%mm1>>1) on unsigned bytes without overflow, but \ - pavgb computes (%%mm0+%%mm1+1>>1). \ - The latter is exactly 1 too large when the low bit of two corresponding \ - bytes is only set in one of them. \ - Therefore we pxor the operands, pand to mask out the low bits, and psubb to \ - correct the output of pavgb.*/ \ - "movq %%mm0,%%mm6\n\t" \ - "lea (%[ref1],%[ystride],2),%[ref1]\n\t" \ - "pxor %%mm1,%%mm0\n\t" \ - "pavgb %%mm1,%%mm6\n\t" \ - "lea (%[ref2],%[ystride],2),%[ref2]\n\t" \ - "movq %%mm2,%%mm1\n\t" \ - "pand %%mm7,%%mm0\n\t" \ - "pavgb %%mm3,%%mm2\n\t" \ - "pxor %%mm3,%%mm1\n\t" \ - "movq (%[ref2],%[ystride]),%%mm3\n\t" \ - "psubb %%mm0,%%mm6\n\t" \ - "movq (%[ref1]),%%mm0\n\t" \ - "pand %%mm7,%%mm1\n\t" \ - "psadbw %%mm6,%%mm4\n\t" \ - "movd %[ret],%%mm6\n\t" \ - "psubb %%mm1,%%mm2\n\t" \ - "movq (%[ref2]),%%mm1\n\t" \ - "lea (%[src],%[ystride],2),%[src]\n\t" \ - "psadbw %%mm2,%%mm5\n\t" \ - "movq (%[ref1],%[ystride]),%%mm2\n\t" \ - "paddw %%mm4,%%mm5\n\t" \ - "movq (%[src]),%%mm4\n\t" \ - "paddw %%mm5,%%mm6\n\t" \ - "movq (%[src],%[ystride]),%%mm5\n\t" \ - "movd %%mm6,%[ret]\n\t" \ - -/*Same as above, but does not pre-load the next two rows.*/ -#define OC_SAD2_TAIL \ - "#OC_SAD2_TAIL\n\t" \ - "movq %%mm0,%%mm6\n\t" \ - "pavgb %%mm1,%%mm0\n\t" \ - "pxor %%mm1,%%mm6\n\t" \ - "movq %%mm2,%%mm1\n\t" \ - "pand %%mm7,%%mm6\n\t" \ - "pavgb %%mm3,%%mm2\n\t" \ - "pxor %%mm3,%%mm1\n\t" \ - "psubb %%mm6,%%mm0\n\t" \ - "pand %%mm7,%%mm1\n\t" \ - "psadbw %%mm0,%%mm4\n\t" \ - "psubb %%mm1,%%mm2\n\t" \ - "movd %[ret],%%mm6\n\t" \ - "psadbw %%mm2,%%mm5\n\t" \ - "paddw %%mm4,%%mm5\n\t" \ - "paddw %%mm5,%%mm6\n\t" \ - "movd %%mm6,%[ret]\n\t" \ - -unsigned oc_enc_frag_sad2_thresh_mmxext(const unsigned char *_src, - const unsigned char *_ref1,const unsigned char *_ref2,int _ystride, - unsigned _thresh){ - ptrdiff_t ret; - __asm__ __volatile__( - "movq (%[ref1]),%%mm0\n\t" - "movq (%[ref2]),%%mm1\n\t" - "movq (%[ref1],%[ystride]),%%mm2\n\t" - "movq (%[ref2],%[ystride]),%%mm3\n\t" - "xor %[ret],%[ret]\n\t" - "movq (%[src]),%%mm4\n\t" - "pxor %%mm7,%%mm7\n\t" - "pcmpeqb %%mm6,%%mm6\n\t" - "movq (%[src],%[ystride]),%%mm5\n\t" - "psubb %%mm6,%%mm7\n\t" - OC_SAD2_LOOP - OC_SAD2_LOOP - OC_SAD2_LOOP - OC_SAD2_TAIL - :[ret]"=&a"(ret),[src]"+r"(_src),[ref1]"+%r"(_ref1),[ref2]"+r"(_ref2) - :[ystride]"r"((ptrdiff_t)_ystride) - ); - return (unsigned)ret; -} - -/*Load an 8x4 array of pixel values from %[src] and %[ref] and compute their - 16-bit difference in %%mm0...%%mm7.*/ -#define OC_LOAD_SUB_8x4(_off) \ - "#OC_LOAD_SUB_8x4\n\t" \ - "movd "_off"(%[src]),%%mm0\n\t" \ - "movd "_off"(%[ref]),%%mm4\n\t" \ - "movd "_off"(%[src],%[src_ystride]),%%mm1\n\t" \ - "lea (%[src],%[src_ystride],2),%[src]\n\t" \ - "movd "_off"(%[ref],%[ref_ystride]),%%mm5\n\t" \ - "lea (%[ref],%[ref_ystride],2),%[ref]\n\t" \ - "movd "_off"(%[src]),%%mm2\n\t" \ - "movd "_off"(%[ref]),%%mm7\n\t" \ - "movd "_off"(%[src],%[src_ystride]),%%mm3\n\t" \ - "movd "_off"(%[ref],%[ref_ystride]),%%mm6\n\t" \ - "punpcklbw %%mm4,%%mm0\n\t" \ - "lea (%[src],%[src_ystride],2),%[src]\n\t" \ - "punpcklbw %%mm4,%%mm4\n\t" \ - "lea (%[ref],%[ref_ystride],2),%[ref]\n\t" \ - "psubw %%mm4,%%mm0\n\t" \ - "movd "_off"(%[src]),%%mm4\n\t" \ - "movq %%mm0,"_off"*2(%[buf])\n\t" \ - "movd "_off"(%[ref]),%%mm0\n\t" \ - "punpcklbw %%mm5,%%mm1\n\t" \ - "punpcklbw %%mm5,%%mm5\n\t" \ - "psubw %%mm5,%%mm1\n\t" \ - "movd "_off"(%[src],%[src_ystride]),%%mm5\n\t" \ - "punpcklbw %%mm7,%%mm2\n\t" \ - "punpcklbw %%mm7,%%mm7\n\t" \ - "psubw %%mm7,%%mm2\n\t" \ - "movd "_off"(%[ref],%[ref_ystride]),%%mm7\n\t" \ - "punpcklbw %%mm6,%%mm3\n\t" \ - "lea (%[src],%[src_ystride],2),%[src]\n\t" \ - "punpcklbw %%mm6,%%mm6\n\t" \ - "psubw %%mm6,%%mm3\n\t" \ - "movd "_off"(%[src]),%%mm6\n\t" \ - "punpcklbw %%mm0,%%mm4\n\t" \ - "lea (%[ref],%[ref_ystride],2),%[ref]\n\t" \ - "punpcklbw %%mm0,%%mm0\n\t" \ - "lea (%[src],%[src_ystride],2),%[src]\n\t" \ - "psubw %%mm0,%%mm4\n\t" \ - "movd "_off"(%[ref]),%%mm0\n\t" \ - "punpcklbw %%mm7,%%mm5\n\t" \ - "neg %[src_ystride]\n\t" \ - "punpcklbw %%mm7,%%mm7\n\t" \ - "psubw %%mm7,%%mm5\n\t" \ - "movd "_off"(%[src],%[src_ystride]),%%mm7\n\t" \ - "punpcklbw %%mm0,%%mm6\n\t" \ - "lea (%[ref],%[ref_ystride],2),%[ref]\n\t" \ - "punpcklbw %%mm0,%%mm0\n\t" \ - "neg %[ref_ystride]\n\t" \ - "psubw %%mm0,%%mm6\n\t" \ - "movd "_off"(%[ref],%[ref_ystride]),%%mm0\n\t" \ - "lea (%[src],%[src_ystride],8),%[src]\n\t" \ - "punpcklbw %%mm0,%%mm7\n\t" \ - "neg %[src_ystride]\n\t" \ - "punpcklbw %%mm0,%%mm0\n\t" \ - "lea (%[ref],%[ref_ystride],8),%[ref]\n\t" \ - "psubw %%mm0,%%mm7\n\t" \ - "neg %[ref_ystride]\n\t" \ - "movq "_off"*2(%[buf]),%%mm0\n\t" \ - -/*Load an 8x4 array of pixel values from %[src] into %%mm0...%%mm7.*/ -#define OC_LOAD_8x4(_off) \ - "#OC_LOAD_8x4\n\t" \ - "movd "_off"(%[src]),%%mm0\n\t" \ - "movd "_off"(%[src],%[ystride]),%%mm1\n\t" \ - "movd "_off"(%[src],%[ystride],2),%%mm2\n\t" \ - "pxor %%mm7,%%mm7\n\t" \ - "movd "_off"(%[src],%[ystride3]),%%mm3\n\t" \ - "punpcklbw %%mm7,%%mm0\n\t" \ - "movd "_off"(%[src4]),%%mm4\n\t" \ - "punpcklbw %%mm7,%%mm1\n\t" \ - "movd "_off"(%[src4],%[ystride]),%%mm5\n\t" \ - "punpcklbw %%mm7,%%mm2\n\t" \ - "movd "_off"(%[src4],%[ystride],2),%%mm6\n\t" \ - "punpcklbw %%mm7,%%mm3\n\t" \ - "movd "_off"(%[src4],%[ystride3]),%%mm7\n\t" \ - "punpcklbw %%mm4,%%mm4\n\t" \ - "punpcklbw %%mm5,%%mm5\n\t" \ - "psrlw $8,%%mm4\n\t" \ - "psrlw $8,%%mm5\n\t" \ - "punpcklbw %%mm6,%%mm6\n\t" \ - "punpcklbw %%mm7,%%mm7\n\t" \ - "psrlw $8,%%mm6\n\t" \ - "psrlw $8,%%mm7\n\t" \ - -/*Performs the first two stages of an 8-point 1-D Hadamard transform. - The transform is performed in place, except that outputs 0-3 are swapped with - outputs 4-7. - Outputs 2, 3, 6 and 7 from the second stage are negated (which allows us to - perform this stage in place with no temporary registers).*/ -#define OC_HADAMARD_AB_8x4 \ - "#OC_HADAMARD_AB_8x4\n\t" \ - /*Stage A: \ - Outputs 0-3 are swapped with 4-7 here.*/ \ - "paddw %%mm1,%%mm5\n\t" \ - "paddw %%mm2,%%mm6\n\t" \ - "paddw %%mm1,%%mm1\n\t" \ - "paddw %%mm2,%%mm2\n\t" \ - "psubw %%mm5,%%mm1\n\t" \ - "psubw %%mm6,%%mm2\n\t" \ - "paddw %%mm3,%%mm7\n\t" \ - "paddw %%mm0,%%mm4\n\t" \ - "paddw %%mm3,%%mm3\n\t" \ - "paddw %%mm0,%%mm0\n\t" \ - "psubw %%mm7,%%mm3\n\t" \ - "psubw %%mm4,%%mm0\n\t" \ - /*Stage B:*/ \ - "paddw %%mm2,%%mm0\n\t" \ - "paddw %%mm3,%%mm1\n\t" \ - "paddw %%mm6,%%mm4\n\t" \ - "paddw %%mm7,%%mm5\n\t" \ - "paddw %%mm2,%%mm2\n\t" \ - "paddw %%mm3,%%mm3\n\t" \ - "paddw %%mm6,%%mm6\n\t" \ - "paddw %%mm7,%%mm7\n\t" \ - "psubw %%mm0,%%mm2\n\t" \ - "psubw %%mm1,%%mm3\n\t" \ - "psubw %%mm4,%%mm6\n\t" \ - "psubw %%mm5,%%mm7\n\t" \ - -/*Performs the last stage of an 8-point 1-D Hadamard transform in place. - Ouputs 1, 3, 5, and 7 are negated (which allows us to perform this stage in - place with no temporary registers).*/ -#define OC_HADAMARD_C_8x4 \ - "#OC_HADAMARD_C_8x4\n\t" \ - /*Stage C:*/ \ - "paddw %%mm1,%%mm0\n\t" \ - "paddw %%mm3,%%mm2\n\t" \ - "paddw %%mm5,%%mm4\n\t" \ - "paddw %%mm7,%%mm6\n\t" \ - "paddw %%mm1,%%mm1\n\t" \ - "paddw %%mm3,%%mm3\n\t" \ - "paddw %%mm5,%%mm5\n\t" \ - "paddw %%mm7,%%mm7\n\t" \ - "psubw %%mm0,%%mm1\n\t" \ - "psubw %%mm2,%%mm3\n\t" \ - "psubw %%mm4,%%mm5\n\t" \ - "psubw %%mm6,%%mm7\n\t" \ - -/*Performs an 8-point 1-D Hadamard transform. - The transform is performed in place, except that outputs 0-3 are swapped with - outputs 4-7. - Outputs 1, 2, 5 and 6 are negated (which allows us to perform the transform - in place with no temporary registers).*/ -#define OC_HADAMARD_8x4 \ - OC_HADAMARD_AB_8x4 \ - OC_HADAMARD_C_8x4 \ - -/*Performs the first part of the final stage of the Hadamard transform and - summing of absolute values. - At the end of this part, %%mm1 will contain the DC coefficient of the - transform.*/ -#define OC_HADAMARD_C_ABS_ACCUM_A_8x4(_r6,_r7) \ - /*We use the fact that \ - (abs(a+b)+abs(a-b))/2=max(abs(a),abs(b)) \ - to merge the final butterfly with the abs and the first stage of \ - accumulation. \ - Thus we can avoid using pabsw, which is not available until SSSE3. \ - Emulating pabsw takes 3 instructions, so the straightforward MMXEXT \ - implementation would be (3+3)*8+7=55 instructions (+4 for spilling \ - registers). \ - Even with pabsw, it would be (3+1)*8+7=39 instructions (with no spills). \ - This implementation is only 26 (+4 for spilling registers).*/ \ - "#OC_HADAMARD_C_ABS_ACCUM_A_8x4\n\t" \ - "movq %%mm7,"_r7"(%[buf])\n\t" \ - "movq %%mm6,"_r6"(%[buf])\n\t" \ - /*mm7={0x7FFF}x4 \ - mm0=max(abs(mm0),abs(mm1))-0x7FFF*/ \ - "pcmpeqb %%mm7,%%mm7\n\t" \ - "movq %%mm0,%%mm6\n\t" \ - "psrlw $1,%%mm7\n\t" \ - "paddw %%mm1,%%mm6\n\t" \ - "pmaxsw %%mm1,%%mm0\n\t" \ - "paddsw %%mm7,%%mm6\n\t" \ - "psubw %%mm6,%%mm0\n\t" \ - /*mm2=max(abs(mm2),abs(mm3))-0x7FFF \ - mm4=max(abs(mm4),abs(mm5))-0x7FFF*/ \ - "movq %%mm2,%%mm6\n\t" \ - "movq %%mm4,%%mm1\n\t" \ - "pmaxsw %%mm3,%%mm2\n\t" \ - "pmaxsw %%mm5,%%mm4\n\t" \ - "paddw %%mm3,%%mm6\n\t" \ - "paddw %%mm5,%%mm1\n\t" \ - "movq "_r7"(%[buf]),%%mm3\n\t" \ - -/*Performs the second part of the final stage of the Hadamard transform and - summing of absolute values.*/ -#define OC_HADAMARD_C_ABS_ACCUM_B_8x4(_r6,_r7) \ - "#OC_HADAMARD_C_ABS_ACCUM_B_8x4\n\t" \ - "paddsw %%mm7,%%mm6\n\t" \ - "movq "_r6"(%[buf]),%%mm5\n\t" \ - "paddsw %%mm7,%%mm1\n\t" \ - "psubw %%mm6,%%mm2\n\t" \ - "psubw %%mm1,%%mm4\n\t" \ - /*mm7={1}x4 (needed for the horizontal add that follows) \ - mm0+=mm2+mm4+max(abs(mm3),abs(mm5))-0x7FFF*/ \ - "movq %%mm3,%%mm6\n\t" \ - "pmaxsw %%mm5,%%mm3\n\t" \ - "paddw %%mm2,%%mm0\n\t" \ - "paddw %%mm5,%%mm6\n\t" \ - "paddw %%mm4,%%mm0\n\t" \ - "paddsw %%mm7,%%mm6\n\t" \ - "paddw %%mm3,%%mm0\n\t" \ - "psrlw $14,%%mm7\n\t" \ - "psubw %%mm6,%%mm0\n\t" \ - -/*Performs the last stage of an 8-point 1-D Hadamard transform, takes the - absolute value of each component, and accumulates everything into mm0. - This is the only portion of SATD which requires MMXEXT (we could use plain - MMX, but it takes 4 instructions and an extra register to work around the - lack of a pmaxsw, which is a pretty serious penalty).*/ -#define OC_HADAMARD_C_ABS_ACCUM_8x4(_r6,_r7) \ - OC_HADAMARD_C_ABS_ACCUM_A_8x4(_r6,_r7) \ - OC_HADAMARD_C_ABS_ACCUM_B_8x4(_r6,_r7) \ - -/*Performs an 8-point 1-D Hadamard transform, takes the absolute value of each - component, and accumulates everything into mm0. - Note that mm0 will have an extra 4 added to each column, and that after - removing this value, the remainder will be half the conventional value.*/ -#define OC_HADAMARD_ABS_ACCUM_8x4(_r6,_r7) \ - OC_HADAMARD_AB_8x4 \ - OC_HADAMARD_C_ABS_ACCUM_8x4(_r6,_r7) - -/*Performs two 4x4 transposes (mostly) in place. - On input, {mm0,mm1,mm2,mm3} contains rows {e,f,g,h}, and {mm4,mm5,mm6,mm7} - contains rows {a,b,c,d}. - On output, {0x40,0x50,0x60,0x70}+_off(%[buf]) contains {e,f,g,h}^T, and - {mm4,mm5,mm6,mm7} contains the transposed rows {a,b,c,d}^T.*/ -#define OC_TRANSPOSE_4x4x2(_off) \ - "#OC_TRANSPOSE_4x4x2\n\t" \ - /*First 4x4 transpose:*/ \ - "movq %%mm5,0x10+"_off"(%[buf])\n\t" \ - /*mm0 = e3 e2 e1 e0 \ - mm1 = f3 f2 f1 f0 \ - mm2 = g3 g2 g1 g0 \ - mm3 = h3 h2 h1 h0*/ \ - "movq %%mm2,%%mm5\n\t" \ - "punpcklwd %%mm3,%%mm2\n\t" \ - "punpckhwd %%mm3,%%mm5\n\t" \ - "movq %%mm0,%%mm3\n\t" \ - "punpcklwd %%mm1,%%mm0\n\t" \ - "punpckhwd %%mm1,%%mm3\n\t" \ - /*mm0 = f1 e1 f0 e0 \ - mm3 = f3 e3 f2 e2 \ - mm2 = h1 g1 h0 g0 \ - mm5 = h3 g3 h2 g2*/ \ - "movq %%mm0,%%mm1\n\t" \ - "punpckldq %%mm2,%%mm0\n\t" \ - "punpckhdq %%mm2,%%mm1\n\t" \ - "movq %%mm3,%%mm2\n\t" \ - "punpckhdq %%mm5,%%mm3\n\t" \ - "movq %%mm0,0x40+"_off"(%[buf])\n\t" \ - "punpckldq %%mm5,%%mm2\n\t" \ - /*mm0 = h0 g0 f0 e0 \ - mm1 = h1 g1 f1 e1 \ - mm2 = h2 g2 f2 e2 \ - mm3 = h3 g3 f3 e3*/ \ - "movq 0x10+"_off"(%[buf]),%%mm5\n\t" \ - /*Second 4x4 transpose:*/ \ - /*mm4 = a3 a2 a1 a0 \ - mm5 = b3 b2 b1 b0 \ - mm6 = c3 c2 c1 c0 \ - mm7 = d3 d2 d1 d0*/ \ - "movq %%mm6,%%mm0\n\t" \ - "punpcklwd %%mm7,%%mm6\n\t" \ - "movq %%mm1,0x50+"_off"(%[buf])\n\t" \ - "punpckhwd %%mm7,%%mm0\n\t" \ - "movq %%mm4,%%mm7\n\t" \ - "punpcklwd %%mm5,%%mm4\n\t" \ - "movq %%mm2,0x60+"_off"(%[buf])\n\t" \ - "punpckhwd %%mm5,%%mm7\n\t" \ - /*mm4 = b1 a1 b0 a0 \ - mm7 = b3 a3 b2 a2 \ - mm6 = d1 c1 d0 c0 \ - mm0 = d3 c3 d2 c2*/ \ - "movq %%mm4,%%mm5\n\t" \ - "punpckldq %%mm6,%%mm4\n\t" \ - "movq %%mm3,0x70+"_off"(%[buf])\n\t" \ - "punpckhdq %%mm6,%%mm5\n\t" \ - "movq %%mm7,%%mm6\n\t" \ - "punpckhdq %%mm0,%%mm7\n\t" \ - "punpckldq %%mm0,%%mm6\n\t" \ - /*mm4 = d0 c0 b0 a0 \ - mm5 = d1 c1 b1 a1 \ - mm6 = d2 c2 b2 a2 \ - mm7 = d3 c3 b3 a3*/ \ - -static unsigned oc_int_frag_satd_thresh_mmxext(const unsigned char *_src, - int _src_ystride,const unsigned char *_ref,int _ref_ystride,unsigned _thresh){ - OC_ALIGN8(ogg_int16_t buf[64]); - ogg_int16_t *bufp; - unsigned ret; - unsigned ret2; - bufp=buf; - __asm__ __volatile__( - OC_LOAD_SUB_8x4("0x00") - OC_HADAMARD_8x4 - OC_TRANSPOSE_4x4x2("0x00") - /*Finish swapping out this 8x4 block to make room for the next one. - mm0...mm3 have been swapped out already.*/ - "movq %%mm4,0x00(%[buf])\n\t" - "movq %%mm5,0x10(%[buf])\n\t" - "movq %%mm6,0x20(%[buf])\n\t" - "movq %%mm7,0x30(%[buf])\n\t" - OC_LOAD_SUB_8x4("0x04") - OC_HADAMARD_8x4 - OC_TRANSPOSE_4x4x2("0x08") - /*Here the first 4x4 block of output from the last transpose is the second - 4x4 block of input for the next transform. - We have cleverly arranged that it already be in the appropriate place, so - we only have to do half the loads.*/ - "movq 0x10(%[buf]),%%mm1\n\t" - "movq 0x20(%[buf]),%%mm2\n\t" - "movq 0x30(%[buf]),%%mm3\n\t" - "movq 0x00(%[buf]),%%mm0\n\t" - OC_HADAMARD_ABS_ACCUM_8x4("0x28","0x38") - /*Up to this point, everything fit in 16 bits (8 input + 1 for the - difference + 2*3 for the two 8-point 1-D Hadamards - 1 for the abs - 1 - for the factor of two we dropped + 3 for the vertical accumulation). - Now we finally have to promote things to dwords. - We break this part out of OC_HADAMARD_ABS_ACCUM_8x4 to hide the long - latency of pmaddwd by starting the next series of loads now.*/ - "mov %[thresh],%[ret2]\n\t" - "pmaddwd %%mm7,%%mm0\n\t" - "movq 0x50(%[buf]),%%mm1\n\t" - "movq 0x58(%[buf]),%%mm5\n\t" - "movq %%mm0,%%mm4\n\t" - "movq 0x60(%[buf]),%%mm2\n\t" - "punpckhdq %%mm0,%%mm0\n\t" - "movq 0x68(%[buf]),%%mm6\n\t" - "paddd %%mm0,%%mm4\n\t" - "movq 0x70(%[buf]),%%mm3\n\t" - "movd %%mm4,%[ret]\n\t" - "movq 0x78(%[buf]),%%mm7\n\t" - /*The sums produced by OC_HADAMARD_ABS_ACCUM_8x4 each have an extra 4 - added to them, and a factor of two removed; correct the final sum here.*/ - "lea -32(%[ret],%[ret]),%[ret]\n\t" - "movq 0x40(%[buf]),%%mm0\n\t" - "cmp %[ret2],%[ret]\n\t" - "movq 0x48(%[buf]),%%mm4\n\t" - "jae 1f\n\t" - OC_HADAMARD_ABS_ACCUM_8x4("0x68","0x78") - "pmaddwd %%mm7,%%mm0\n\t" - /*There isn't much to stick in here to hide the latency this time, but the - alternative to pmaddwd is movq->punpcklwd->punpckhwd->paddd, whose - latency is even worse.*/ - "sub $32,%[ret]\n\t" - "movq %%mm0,%%mm4\n\t" - "punpckhdq %%mm0,%%mm0\n\t" - "paddd %%mm0,%%mm4\n\t" - "movd %%mm4,%[ret2]\n\t" - "lea (%[ret],%[ret2],2),%[ret]\n\t" - ".p2align 4,,15\n\t" - "1:\n\t" - /*Although it looks like we're using 7 registers here, gcc can alias %[ret] - and %[ret2] with some of the inputs, since for once we don't write to - them until after we're done using everything but %[buf] (which is also - listed as an output to ensure gcc _doesn't_ alias them against it).*/ - /*Note that _src_ystride and _ref_ystride must be given non-overlapping - constraints, otherewise if gcc can prove they're equal it will allocate - them to the same register (which is bad); _src and _ref face a similar - problem, though those are never actually the same.*/ - :[ret]"=a"(ret),[ret2]"=r"(ret2),[buf]"+r"(bufp) - :[src]"r"(_src),[src_ystride]"c"((ptrdiff_t)_src_ystride), - [ref]"r"(_ref),[ref_ystride]"d"((ptrdiff_t)_ref_ystride), - [thresh]"m"(_thresh) - /*We have to use neg, so we actually clobber the condition codes for once - (not to mention cmp, sub, and add).*/ - :"cc" - ); - return ret; -} - -unsigned oc_enc_frag_satd_thresh_mmxext(const unsigned char *_src, - const unsigned char *_ref,int _ystride,unsigned _thresh){ - return oc_int_frag_satd_thresh_mmxext(_src,_ystride,_ref,_ystride,_thresh); -} - -/*Our internal implementation of frag_copy2 takes an extra stride parameter so - we can share code with oc_enc_frag_satd2_thresh_mmxext().*/ -static void oc_int_frag_copy2_mmxext(unsigned char *_dst,int _dst_ystride, - const unsigned char *_src1,const unsigned char *_src2,int _src_ystride){ - __asm__ __volatile__( - /*Load the first 3 rows.*/ - "movq (%[src1]),%%mm0\n\t" - "movq (%[src2]),%%mm1\n\t" - "movq (%[src1],%[src_ystride]),%%mm2\n\t" - "lea (%[src1],%[src_ystride],2),%[src1]\n\t" - "movq (%[src2],%[src_ystride]),%%mm3\n\t" - "lea (%[src2],%[src_ystride],2),%[src2]\n\t" - "pxor %%mm7,%%mm7\n\t" - "movq (%[src1]),%%mm4\n\t" - "pcmpeqb %%mm6,%%mm6\n\t" - "movq (%[src2]),%%mm5\n\t" - /*mm7={1}x8.*/ - "psubb %%mm6,%%mm7\n\t" - /*Start averaging %%mm0 and %%mm1 into %%mm6.*/ - "movq %%mm0,%%mm6\n\t" - "pxor %%mm1,%%mm0\n\t" - "pavgb %%mm1,%%mm6\n\t" - /*%%mm1 is free, start averaging %%mm3 into %%mm2 using %%mm1.*/ - "movq %%mm2,%%mm1\n\t" - "pand %%mm7,%%mm0\n\t" - "pavgb %%mm3,%%mm2\n\t" - "pxor %%mm3,%%mm1\n\t" - /*%%mm3 is free.*/ - "psubb %%mm0,%%mm6\n\t" - /*%%mm0 is free, start loading the next row.*/ - "movq (%[src1],%[src_ystride]),%%mm0\n\t" - /*Start averaging %%mm5 and %%mm4 using %%mm3.*/ - "movq %%mm4,%%mm3\n\t" - /*%%mm6 (row 0) is done; write it out.*/ - "movq %%mm6,(%[dst])\n\t" - "pand %%mm7,%%mm1\n\t" - "pavgb %%mm5,%%mm4\n\t" - "psubb %%mm1,%%mm2\n\t" - /*%%mm1 is free, continue loading the next row.*/ - "movq (%[src2],%[src_ystride]),%%mm1\n\t" - "pxor %%mm5,%%mm3\n\t" - "lea (%[src1],%[src_ystride],2),%[src1]\n\t" - /*%%mm2 (row 1) is done; write it out.*/ - "movq %%mm2,(%[dst],%[dst_ystride])\n\t" - "pand %%mm7,%%mm3\n\t" - /*Start loading the next row.*/ - "movq (%[src1]),%%mm2\n\t" - "lea (%[dst],%[dst_ystride],2),%[dst]\n\t" - "psubb %%mm3,%%mm4\n\t" - "lea (%[src2],%[src_ystride],2),%[src2]\n\t" - /*%%mm4 (row 2) is done; write it out.*/ - "movq %%mm4,(%[dst])\n\t" - /*Continue loading the next row.*/ - "movq (%[src2]),%%mm3\n\t" - /*Start averaging %%mm0 and %%mm1 into %%mm6.*/ - "movq %%mm0,%%mm6\n\t" - "pxor %%mm1,%%mm0\n\t" - /*Start loading the next row.*/ - "movq (%[src1],%[src_ystride]),%%mm4\n\t" - "pavgb %%mm1,%%mm6\n\t" - /*%%mm1 is free; start averaging %%mm3 into %%mm2 using %%mm1.*/ - "movq %%mm2,%%mm1\n\t" - "pand %%mm7,%%mm0\n\t" - /*Continue loading the next row.*/ - "movq (%[src2],%[src_ystride]),%%mm5\n\t" - "pavgb %%mm3,%%mm2\n\t" - "lea (%[src1],%[src_ystride],2),%[src1]\n\t" - "pxor %%mm3,%%mm1\n\t" - /*%%mm3 is free.*/ - "psubb %%mm0,%%mm6\n\t" - /*%%mm0 is free, start loading the next row.*/ - "movq (%[src1]),%%mm0\n\t" - /*Start averaging %%mm5 into %%mm4 using %%mm3.*/ - "movq %%mm4,%%mm3\n\t" - /*%%mm6 (row 3) is done; write it out.*/ - "movq %%mm6,(%[dst],%[dst_ystride])\n\t" - "pand %%mm7,%%mm1\n\t" - "lea (%[src2],%[src_ystride],2),%[src2]\n\t" - "pavgb %%mm5,%%mm4\n\t" - "lea (%[dst],%[dst_ystride],2),%[dst]\n\t" - "psubb %%mm1,%%mm2\n\t" - /*%%mm1 is free; continue loading the next row.*/ - "movq (%[src2]),%%mm1\n\t" - "pxor %%mm5,%%mm3\n\t" - /*%%mm2 (row 4) is done; write it out.*/ - "movq %%mm2,(%[dst])\n\t" - "pand %%mm7,%%mm3\n\t" - /*Start loading the next row.*/ - "movq (%[src1],%[src_ystride]),%%mm2\n\t" - "psubb %%mm3,%%mm4\n\t" - /*Start averaging %%mm0 and %%mm1 into %%mm6.*/ - "movq %%mm0,%%mm6\n\t" - /*Continue loading the next row.*/ - "movq (%[src2],%[src_ystride]),%%mm3\n\t" - /*%%mm4 (row 5) is done; write it out.*/ - "movq %%mm4,(%[dst],%[dst_ystride])\n\t" - "pxor %%mm1,%%mm0\n\t" - "pavgb %%mm1,%%mm6\n\t" - /*%%mm4 is free; start averaging %%mm3 into %%mm2 using %%mm4.*/ - "movq %%mm2,%%mm4\n\t" - "pand %%mm7,%%mm0\n\t" - "pavgb %%mm3,%%mm2\n\t" - "pxor %%mm3,%%mm4\n\t" - "lea (%[dst],%[dst_ystride],2),%[dst]\n\t" - "psubb %%mm0,%%mm6\n\t" - "pand %%mm7,%%mm4\n\t" - /*%%mm6 (row 6) is done, write it out.*/ - "movq %%mm6,(%[dst])\n\t" - "psubb %%mm4,%%mm2\n\t" - /*%%mm2 (row 7) is done, write it out.*/ - "movq %%mm2,(%[dst],%[dst_ystride])\n\t" - :[dst]"+r"(_dst),[src1]"+%r"(_src1),[src2]"+r"(_src2) - :[dst_ystride]"r"((ptrdiff_t)_dst_ystride), - [src_ystride]"r"((ptrdiff_t)_src_ystride) - :"memory" - ); -} - -unsigned oc_enc_frag_satd2_thresh_mmxext(const unsigned char *_src, - const unsigned char *_ref1,const unsigned char *_ref2,int _ystride, - unsigned _thresh){ - OC_ALIGN8(unsigned char ref[64]); - oc_int_frag_copy2_mmxext(ref,8,_ref1,_ref2,_ystride); - return oc_int_frag_satd_thresh_mmxext(_src,_ystride,ref,8,_thresh); -} - -unsigned oc_enc_frag_intra_satd_mmxext(const unsigned char *_src, - int _ystride){ - OC_ALIGN8(ogg_int16_t buf[64]); - ogg_int16_t *bufp; - unsigned ret; - unsigned ret2; - bufp=buf; - __asm__ __volatile__( - OC_LOAD_8x4("0x00") - OC_HADAMARD_8x4 - OC_TRANSPOSE_4x4x2("0x00") - /*Finish swapping out this 8x4 block to make room for the next one. - mm0...mm3 have been swapped out already.*/ - "movq %%mm4,0x00(%[buf])\n\t" - "movq %%mm5,0x10(%[buf])\n\t" - "movq %%mm6,0x20(%[buf])\n\t" - "movq %%mm7,0x30(%[buf])\n\t" - OC_LOAD_8x4("0x04") - OC_HADAMARD_8x4 - OC_TRANSPOSE_4x4x2("0x08") - /*Here the first 4x4 block of output from the last transpose is the second - 4x4 block of input for the next transform. - We have cleverly arranged that it already be in the appropriate place, so - we only have to do half the loads.*/ - "movq 0x10(%[buf]),%%mm1\n\t" - "movq 0x20(%[buf]),%%mm2\n\t" - "movq 0x30(%[buf]),%%mm3\n\t" - "movq 0x00(%[buf]),%%mm0\n\t" - /*We split out the stages here so we can save the DC coefficient in the - middle.*/ - OC_HADAMARD_AB_8x4 - OC_HADAMARD_C_ABS_ACCUM_A_8x4("0x28","0x38") - "movd %%mm1,%[ret]\n\t" - OC_HADAMARD_C_ABS_ACCUM_B_8x4("0x28","0x38") - /*Up to this point, everything fit in 16 bits (8 input + 1 for the - difference + 2*3 for the two 8-point 1-D Hadamards - 1 for the abs - 1 - for the factor of two we dropped + 3 for the vertical accumulation). - Now we finally have to promote things to dwords. - We break this part out of OC_HADAMARD_ABS_ACCUM_8x4 to hide the long - latency of pmaddwd by starting the next series of loads now.*/ - "pmaddwd %%mm7,%%mm0\n\t" - "movq 0x50(%[buf]),%%mm1\n\t" - "movq 0x58(%[buf]),%%mm5\n\t" - "movq 0x60(%[buf]),%%mm2\n\t" - "movq %%mm0,%%mm4\n\t" - "movq 0x68(%[buf]),%%mm6\n\t" - "punpckhdq %%mm0,%%mm0\n\t" - "movq 0x70(%[buf]),%%mm3\n\t" - "paddd %%mm0,%%mm4\n\t" - "movq 0x78(%[buf]),%%mm7\n\t" - "movd %%mm4,%[ret2]\n\t" - "movq 0x40(%[buf]),%%mm0\n\t" - "movq 0x48(%[buf]),%%mm4\n\t" - OC_HADAMARD_ABS_ACCUM_8x4("0x68","0x78") - "pmaddwd %%mm7,%%mm0\n\t" - /*We assume that the DC coefficient is always positive (which is true, - because the input to the INTRA transform was not a difference).*/ - "movzx %w[ret],%[ret]\n\t" - "add %[ret2],%[ret2]\n\t" - "sub %[ret],%[ret2]\n\t" - "movq %%mm0,%%mm4\n\t" - "punpckhdq %%mm0,%%mm0\n\t" - "paddd %%mm0,%%mm4\n\t" - "movd %%mm4,%[ret]\n\t" - "lea -64(%[ret2],%[ret],2),%[ret]\n\t" - /*Although it looks like we're using 7 registers here, gcc can alias %[ret] - and %[ret2] with some of the inputs, since for once we don't write to - them until after we're done using everything but %[buf] (which is also - listed as an output to ensure gcc _doesn't_ alias them against it).*/ - :[ret]"=a"(ret),[ret2]"=r"(ret2),[buf]"+r"(bufp) - :[src]"r"(_src),[src4]"r"(_src+4*_ystride), - [ystride]"r"((ptrdiff_t)_ystride),[ystride3]"r"((ptrdiff_t)3*_ystride) - /*We have to use sub, so we actually clobber the condition codes for once - (not to mention add).*/ - :"cc" - ); - return ret; -} - -void oc_enc_frag_sub_mmx(ogg_int16_t _residue[64], - const unsigned char *_src,const unsigned char *_ref,int _ystride){ - int i; - __asm__ __volatile__("pxor %%mm7,%%mm7\n\t"::); - for(i=4;i-->0;){ - __asm__ __volatile__( - /*mm0=[src]*/ - "movq (%[src]),%%mm0\n\t" - /*mm1=[ref]*/ - "movq (%[ref]),%%mm1\n\t" - /*mm4=[src+ystride]*/ - "movq (%[src],%[ystride]),%%mm4\n\t" - /*mm5=[ref+ystride]*/ - "movq (%[ref],%[ystride]),%%mm5\n\t" - /*Compute [src]-[ref].*/ - "movq %%mm0,%%mm2\n\t" - "punpcklbw %%mm7,%%mm0\n\t" - "movq %%mm1,%%mm3\n\t" - "punpckhbw %%mm7,%%mm2\n\t" - "punpcklbw %%mm7,%%mm1\n\t" - "punpckhbw %%mm7,%%mm3\n\t" - "psubw %%mm1,%%mm0\n\t" - "psubw %%mm3,%%mm2\n\t" - /*Compute [src+ystride]-[ref+ystride].*/ - "movq %%mm4,%%mm1\n\t" - "punpcklbw %%mm7,%%mm4\n\t" - "movq %%mm5,%%mm3\n\t" - "punpckhbw %%mm7,%%mm1\n\t" - "lea (%[src],%[ystride],2),%[src]\n\t" - "punpcklbw %%mm7,%%mm5\n\t" - "lea (%[ref],%[ystride],2),%[ref]\n\t" - "punpckhbw %%mm7,%%mm3\n\t" - "psubw %%mm5,%%mm4\n\t" - "psubw %%mm3,%%mm1\n\t" - /*Write the answer out.*/ - "movq %%mm0,0x00(%[residue])\n\t" - "movq %%mm2,0x08(%[residue])\n\t" - "movq %%mm4,0x10(%[residue])\n\t" - "movq %%mm1,0x18(%[residue])\n\t" - "lea 0x20(%[residue]),%[residue]\n\t" - :[residue]"+r"(_residue),[src]"+r"(_src),[ref]"+r"(_ref) - :[ystride]"r"((ptrdiff_t)_ystride) - :"memory" - ); - } -} - -void oc_enc_frag_sub_128_mmx(ogg_int16_t _residue[64], - const unsigned char *_src,int _ystride){ - ptrdiff_t ystride3; - __asm__ __volatile__( - /*mm0=[src]*/ - "movq (%[src]),%%mm0\n\t" - /*mm1=[src+ystride]*/ - "movq (%[src],%[ystride]),%%mm1\n\t" - /*mm6={-1}x4*/ - "pcmpeqw %%mm6,%%mm6\n\t" - /*mm2=[src+2*ystride]*/ - "movq (%[src],%[ystride],2),%%mm2\n\t" - /*[ystride3]=3*[ystride]*/ - "lea (%[ystride],%[ystride],2),%[ystride3]\n\t" - /*mm6={1}x4*/ - "psllw $15,%%mm6\n\t" - /*mm3=[src+3*ystride]*/ - "movq (%[src],%[ystride3]),%%mm3\n\t" - /*mm6={128}x4*/ - "psrlw $8,%%mm6\n\t" - /*mm7=0*/ - "pxor %%mm7,%%mm7\n\t" - /*[src]=[src]+4*[ystride]*/ - "lea (%[src],%[ystride],4),%[src]\n\t" - /*Compute [src]-128 and [src+ystride]-128*/ - "movq %%mm0,%%mm4\n\t" - "punpcklbw %%mm7,%%mm0\n\t" - "movq %%mm1,%%mm5\n\t" - "punpckhbw %%mm7,%%mm4\n\t" - "psubw %%mm6,%%mm0\n\t" - "punpcklbw %%mm7,%%mm1\n\t" - "psubw %%mm6,%%mm4\n\t" - "punpckhbw %%mm7,%%mm5\n\t" - "psubw %%mm6,%%mm1\n\t" - "psubw %%mm6,%%mm5\n\t" - /*Write the answer out.*/ - "movq %%mm0,0x00(%[residue])\n\t" - "movq %%mm4,0x08(%[residue])\n\t" - "movq %%mm1,0x10(%[residue])\n\t" - "movq %%mm5,0x18(%[residue])\n\t" - /*mm0=[src+4*ystride]*/ - "movq (%[src]),%%mm0\n\t" - /*mm1=[src+5*ystride]*/ - "movq (%[src],%[ystride]),%%mm1\n\t" - /*Compute [src+2*ystride]-128 and [src+3*ystride]-128*/ - "movq %%mm2,%%mm4\n\t" - "punpcklbw %%mm7,%%mm2\n\t" - "movq %%mm3,%%mm5\n\t" - "punpckhbw %%mm7,%%mm4\n\t" - "psubw %%mm6,%%mm2\n\t" - "punpcklbw %%mm7,%%mm3\n\t" - "psubw %%mm6,%%mm4\n\t" - "punpckhbw %%mm7,%%mm5\n\t" - "psubw %%mm6,%%mm3\n\t" - "psubw %%mm6,%%mm5\n\t" - /*Write the answer out.*/ - "movq %%mm2,0x20(%[residue])\n\t" - "movq %%mm4,0x28(%[residue])\n\t" - "movq %%mm3,0x30(%[residue])\n\t" - "movq %%mm5,0x38(%[residue])\n\t" - /*mm2=[src+6*ystride]*/ - "movq (%[src],%[ystride],2),%%mm2\n\t" - /*mm3=[src+7*ystride]*/ - "movq (%[src],%[ystride3]),%%mm3\n\t" - /*Compute [src+4*ystride]-128 and [src+5*ystride]-128*/ - "movq %%mm0,%%mm4\n\t" - "punpcklbw %%mm7,%%mm0\n\t" - "movq %%mm1,%%mm5\n\t" - "punpckhbw %%mm7,%%mm4\n\t" - "psubw %%mm6,%%mm0\n\t" - "punpcklbw %%mm7,%%mm1\n\t" - "psubw %%mm6,%%mm4\n\t" - "punpckhbw %%mm7,%%mm5\n\t" - "psubw %%mm6,%%mm1\n\t" - "psubw %%mm6,%%mm5\n\t" - /*Write the answer out.*/ - "movq %%mm0,0x40(%[residue])\n\t" - "movq %%mm4,0x48(%[residue])\n\t" - "movq %%mm1,0x50(%[residue])\n\t" - "movq %%mm5,0x58(%[residue])\n\t" - /*Compute [src+6*ystride]-128 and [src+7*ystride]-128*/ - "movq %%mm2,%%mm4\n\t" - "punpcklbw %%mm7,%%mm2\n\t" - "movq %%mm3,%%mm5\n\t" - "punpckhbw %%mm7,%%mm4\n\t" - "psubw %%mm6,%%mm2\n\t" - "punpcklbw %%mm7,%%mm3\n\t" - "psubw %%mm6,%%mm4\n\t" - "punpckhbw %%mm7,%%mm5\n\t" - "psubw %%mm6,%%mm3\n\t" - "psubw %%mm6,%%mm5\n\t" - /*Write the answer out.*/ - "movq %%mm2,0x60(%[residue])\n\t" - "movq %%mm4,0x68(%[residue])\n\t" - "movq %%mm3,0x70(%[residue])\n\t" - "movq %%mm5,0x78(%[residue])\n\t" - :[src]"+r"(_src),[ystride3]"=&r"(ystride3) - :[residue]"r"(_residue),[ystride]"r"((ptrdiff_t)_ystride) - :"memory" - ); -} - -void oc_enc_frag_copy2_mmxext(unsigned char *_dst, - const unsigned char *_src1,const unsigned char *_src2,int _ystride){ - oc_int_frag_copy2_mmxext(_dst,_ystride,_src1,_src2,_ystride); -} - -#endif diff --git a/drivers/theora/x86/mmxfdct.c b/drivers/theora/x86/mmxfdct.c deleted file mode 100644 index 211875255e..0000000000 --- a/drivers/theora/x86/mmxfdct.c +++ /dev/null @@ -1,665 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 1999-2006 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ********************************************************************/ -/*MMX fDCT implementation for x86_32*/ -/*$Id: fdct_ses2.c 14579 2008-03-12 06:42:40Z xiphmont $*/ -#include "x86enc.h" - -#if defined(OC_X86_ASM) - -# define OC_FDCT_STAGE1_8x4 \ - "#OC_FDCT_STAGE1_8x4\n\t" \ - /*Stage 1:*/ \ - /*mm0=t7'=t0-t7*/ \ - "psubw %%mm7,%%mm0\n\t" \ - "paddw %%mm7,%%mm7\n\t" \ - /*mm1=t6'=t1-t6*/ \ - "psubw %%mm6,%%mm1\n\t" \ - "paddw %%mm6,%%mm6\n\t" \ - /*mm2=t5'=t2-t5*/ \ - "psubw %%mm5,%%mm2\n\t" \ - "paddw %%mm5,%%mm5\n\t" \ - /*mm3=t4'=t3-t4*/ \ - "psubw %%mm4,%%mm3\n\t" \ - "paddw %%mm4,%%mm4\n\t" \ - /*mm7=t0'=t0+t7*/ \ - "paddw %%mm0,%%mm7\n\t" \ - /*mm6=t1'=t1+t6*/ \ - "paddw %%mm1,%%mm6\n\t" \ - /*mm5=t2'=t2+t5*/ \ - "paddw %%mm2,%%mm5\n\t" \ - /*mm4=t3'=t3+t4*/ \ - "paddw %%mm3,%%mm4\n\t" \ - -# define OC_FDCT8x4(_r0,_r1,_r2,_r3,_r4,_r5,_r6,_r7) \ - "#OC_FDCT8x4\n\t" \ - /*Stage 2:*/ \ - /*mm7=t3''=t0'-t3'*/ \ - "psubw %%mm4,%%mm7\n\t" \ - "paddw %%mm4,%%mm4\n\t" \ - /*mm6=t2''=t1'-t2'*/ \ - "psubw %%mm5,%%mm6\n\t" \ - "movq %%mm7,"_r6"(%[y])\n\t" \ - "paddw %%mm5,%%mm5\n\t" \ - /*mm1=t5''=t6'-t5'*/ \ - "psubw %%mm2,%%mm1\n\t" \ - "movq %%mm6,"_r2"(%[y])\n\t" \ - /*mm4=t0''=t0'+t3'*/ \ - "paddw %%mm7,%%mm4\n\t" \ - "paddw %%mm2,%%mm2\n\t" \ - /*mm5=t1''=t1'+t2'*/ \ - "movq %%mm4,"_r0"(%[y])\n\t" \ - "paddw %%mm6,%%mm5\n\t" \ - /*mm2=t6''=t6'+t5'*/ \ - "paddw %%mm1,%%mm2\n\t" \ - "movq %%mm5,"_r4"(%[y])\n\t" \ - /*mm0=t7', mm1=t5'', mm2=t6'', mm3=t4'.*/ \ - /*mm4, mm5, mm6, mm7 are free.*/ \ - /*Stage 3:*/ \ - /*mm6={2}x4, mm7={27146,0xB500>>1}x2*/ \ - "mov $0x5A806A0A,%[a]\n\t" \ - "pcmpeqb %%mm6,%%mm6\n\t" \ - "movd %[a],%%mm7\n\t" \ - "psrlw $15,%%mm6\n\t" \ - "punpckldq %%mm7,%%mm7\n\t" \ - "paddw %%mm6,%%mm6\n\t" \ - /*mm0=0, m2={-1}x4 \ - mm5:mm4=t5''*27146+0xB500*/ \ - "movq %%mm1,%%mm4\n\t" \ - "movq %%mm1,%%mm5\n\t" \ - "punpcklwd %%mm6,%%mm4\n\t" \ - "movq %%mm2,"_r3"(%[y])\n\t" \ - "pmaddwd %%mm7,%%mm4\n\t" \ - "movq %%mm0,"_r7"(%[y])\n\t" \ - "punpckhwd %%mm6,%%mm5\n\t" \ - "pxor %%mm0,%%mm0\n\t" \ - "pmaddwd %%mm7,%%mm5\n\t" \ - "pcmpeqb %%mm2,%%mm2\n\t" \ - /*mm2=t6'', mm1=t5''+(t5''!=0) \ - mm4=(t5''*27146+0xB500>>16)*/ \ - "pcmpeqw %%mm1,%%mm0\n\t" \ - "psrad $16,%%mm4\n\t" \ - "psubw %%mm2,%%mm0\n\t" \ - "movq "_r3"(%[y]),%%mm2\n\t" \ - "psrad $16,%%mm5\n\t" \ - "paddw %%mm0,%%mm1\n\t" \ - "packssdw %%mm5,%%mm4\n\t" \ - /*mm4=s=(t5''*27146+0xB500>>16)+t5''+(t5''!=0)>>1*/ \ - "paddw %%mm1,%%mm4\n\t" \ - "movq "_r7"(%[y]),%%mm0\n\t" \ - "psraw $1,%%mm4\n\t" \ - "movq %%mm3,%%mm1\n\t" \ - /*mm3=t4''=t4'+s*/ \ - "paddw %%mm4,%%mm3\n\t" \ - /*mm1=t5'''=t4'-s*/ \ - "psubw %%mm4,%%mm1\n\t" \ - /*mm1=0, mm3={-1}x4 \ - mm5:mm4=t6''*27146+0xB500*/ \ - "movq %%mm2,%%mm4\n\t" \ - "movq %%mm2,%%mm5\n\t" \ - "punpcklwd %%mm6,%%mm4\n\t" \ - "movq %%mm1,"_r5"(%[y])\n\t" \ - "pmaddwd %%mm7,%%mm4\n\t" \ - "movq %%mm3,"_r1"(%[y])\n\t" \ - "punpckhwd %%mm6,%%mm5\n\t" \ - "pxor %%mm1,%%mm1\n\t" \ - "pmaddwd %%mm7,%%mm5\n\t" \ - "pcmpeqb %%mm3,%%mm3\n\t" \ - /*mm2=t6''+(t6''!=0), mm4=(t6''*27146+0xB500>>16)*/ \ - "psrad $16,%%mm4\n\t" \ - "pcmpeqw %%mm2,%%mm1\n\t" \ - "psrad $16,%%mm5\n\t" \ - "psubw %%mm3,%%mm1\n\t" \ - "packssdw %%mm5,%%mm4\n\t" \ - "paddw %%mm1,%%mm2\n\t" \ - /*mm1=t1'' \ - mm4=s=(t6''*27146+0xB500>>16)+t6''+(t6''!=0)>>1*/ \ - "paddw %%mm2,%%mm4\n\t" \ - "movq "_r4"(%[y]),%%mm1\n\t" \ - "psraw $1,%%mm4\n\t" \ - "movq %%mm0,%%mm2\n\t" \ - /*mm7={54491-0x7FFF,0x7FFF}x2 \ - mm0=t7''=t7'+s*/ \ - "paddw %%mm4,%%mm0\n\t" \ - /*mm2=t6'''=t7'-s*/ \ - "psubw %%mm4,%%mm2\n\t" \ - /*Stage 4:*/ \ - /*mm0=0, mm2=t0'' \ - mm5:mm4=t1''*27146+0xB500*/ \ - "movq %%mm1,%%mm4\n\t" \ - "movq %%mm1,%%mm5\n\t" \ - "punpcklwd %%mm6,%%mm4\n\t" \ - "movq %%mm2,"_r3"(%[y])\n\t" \ - "pmaddwd %%mm7,%%mm4\n\t" \ - "movq "_r0"(%[y]),%%mm2\n\t" \ - "punpckhwd %%mm6,%%mm5\n\t" \ - "movq %%mm0,"_r7"(%[y])\n\t" \ - "pmaddwd %%mm7,%%mm5\n\t" \ - "pxor %%mm0,%%mm0\n\t" \ - /*mm7={27146,0x4000>>1}x2 \ - mm0=s=(t1''*27146+0xB500>>16)+t1''+(t1''!=0)*/ \ - "psrad $16,%%mm4\n\t" \ - "mov $0x20006A0A,%[a]\n\t" \ - "pcmpeqw %%mm1,%%mm0\n\t" \ - "movd %[a],%%mm7\n\t" \ - "psrad $16,%%mm5\n\t" \ - "psubw %%mm3,%%mm0\n\t" \ - "packssdw %%mm5,%%mm4\n\t" \ - "paddw %%mm1,%%mm0\n\t" \ - "punpckldq %%mm7,%%mm7\n\t" \ - "paddw %%mm4,%%mm0\n\t" \ - /*mm6={0x00000E3D}x2 \ - mm1=-(t0''==0), mm5:mm4=t0''*27146+0x4000*/ \ - "movq %%mm2,%%mm4\n\t" \ - "movq %%mm2,%%mm5\n\t" \ - "punpcklwd %%mm6,%%mm4\n\t" \ - "mov $0x0E3D,%[a]\n\t" \ - "pmaddwd %%mm7,%%mm4\n\t" \ - "punpckhwd %%mm6,%%mm5\n\t" \ - "movd %[a],%%mm6\n\t" \ - "pmaddwd %%mm7,%%mm5\n\t" \ - "pxor %%mm1,%%mm1\n\t" \ - "punpckldq %%mm6,%%mm6\n\t" \ - "pcmpeqw %%mm2,%%mm1\n\t" \ - /*mm4=r=(t0''*27146+0x4000>>16)+t0''+(t0''!=0)*/ \ - "psrad $16,%%mm4\n\t" \ - "psubw %%mm3,%%mm1\n\t" \ - "psrad $16,%%mm5\n\t" \ - "paddw %%mm1,%%mm2\n\t" \ - "packssdw %%mm5,%%mm4\n\t" \ - "movq "_r5"(%[y]),%%mm1\n\t" \ - "paddw %%mm2,%%mm4\n\t" \ - /*mm2=t6'', mm0=_y[0]=u=r+s>>1 \ - The naive implementation could cause overflow, so we use \ - u=(r&s)+((r^s)>>1).*/ \ - "movq "_r3"(%[y]),%%mm2\n\t" \ - "movq %%mm0,%%mm7\n\t" \ - "pxor %%mm4,%%mm0\n\t" \ - "pand %%mm4,%%mm7\n\t" \ - "psraw $1,%%mm0\n\t" \ - "mov $0x7FFF54DC,%[a]\n\t" \ - "paddw %%mm7,%%mm0\n\t" \ - "movd %[a],%%mm7\n\t" \ - /*mm7={54491-0x7FFF,0x7FFF}x2 \ - mm4=_y[4]=v=r-u*/ \ - "psubw %%mm0,%%mm4\n\t" \ - "punpckldq %%mm7,%%mm7\n\t" \ - "movq %%mm4,"_r4"(%[y])\n\t" \ - /*mm0=0, mm7={36410}x4 \ - mm1=(t5'''!=0), mm5:mm4=54491*t5'''+0x0E3D*/ \ - "movq %%mm1,%%mm4\n\t" \ - "movq %%mm1,%%mm5\n\t" \ - "punpcklwd %%mm1,%%mm4\n\t" \ - "mov $0x8E3A8E3A,%[a]\n\t" \ - "pmaddwd %%mm7,%%mm4\n\t" \ - "movq %%mm0,"_r0"(%[y])\n\t" \ - "punpckhwd %%mm1,%%mm5\n\t" \ - "pxor %%mm0,%%mm0\n\t" \ - "pmaddwd %%mm7,%%mm5\n\t" \ - "pcmpeqw %%mm0,%%mm1\n\t" \ - "movd %[a],%%mm7\n\t" \ - "psubw %%mm3,%%mm1\n\t" \ - "punpckldq %%mm7,%%mm7\n\t" \ - "paddd %%mm6,%%mm4\n\t" \ - "paddd %%mm6,%%mm5\n\t" \ - /*mm0=0 \ - mm3:mm1=36410*t6'''+((t5'''!=0)<<16)*/ \ - "movq %%mm2,%%mm6\n\t" \ - "movq %%mm2,%%mm3\n\t" \ - "pmulhw %%mm7,%%mm6\n\t" \ - "paddw %%mm2,%%mm1\n\t" \ - "pmullw %%mm7,%%mm3\n\t" \ - "pxor %%mm0,%%mm0\n\t" \ - "paddw %%mm1,%%mm6\n\t" \ - "movq %%mm3,%%mm1\n\t" \ - "punpckhwd %%mm6,%%mm3\n\t" \ - "punpcklwd %%mm6,%%mm1\n\t" \ - /*mm3={-1}x4, mm6={1}x4 \ - mm4=_y[5]=u=(54491*t5'''+36410*t6'''+0x0E3D>>16)+(t5'''!=0)*/ \ - "paddd %%mm3,%%mm5\n\t" \ - "paddd %%mm1,%%mm4\n\t" \ - "psrad $16,%%mm5\n\t" \ - "pxor %%mm6,%%mm6\n\t" \ - "psrad $16,%%mm4\n\t" \ - "pcmpeqb %%mm3,%%mm3\n\t" \ - "packssdw %%mm5,%%mm4\n\t" \ - "psubw %%mm3,%%mm6\n\t" \ - /*mm1=t7'', mm7={26568,0x3400}x2 \ - mm2=s=t6'''-(36410*u>>16)*/ \ - "movq %%mm4,%%mm1\n\t" \ - "mov $0x340067C8,%[a]\n\t" \ - "pmulhw %%mm7,%%mm4\n\t" \ - "movd %[a],%%mm7\n\t" \ - "movq %%mm1,"_r5"(%[y])\n\t" \ - "punpckldq %%mm7,%%mm7\n\t" \ - "paddw %%mm1,%%mm4\n\t" \ - "movq "_r7"(%[y]),%%mm1\n\t" \ - "psubw %%mm4,%%mm2\n\t" \ - /*mm6={0x00007B1B}x2 \ - mm0=(s!=0), mm5:mm4=s*26568+0x3400*/ \ - "movq %%mm2,%%mm4\n\t" \ - "movq %%mm2,%%mm5\n\t" \ - "punpcklwd %%mm6,%%mm4\n\t" \ - "pcmpeqw %%mm2,%%mm0\n\t" \ - "pmaddwd %%mm7,%%mm4\n\t" \ - "mov $0x7B1B,%[a]\n\t" \ - "punpckhwd %%mm6,%%mm5\n\t" \ - "movd %[a],%%mm6\n\t" \ - "pmaddwd %%mm7,%%mm5\n\t" \ - "psubw %%mm3,%%mm0\n\t" \ - "punpckldq %%mm6,%%mm6\n\t" \ - /*mm7={64277-0x7FFF,0x7FFF}x2 \ - mm2=_y[3]=v=(s*26568+0x3400>>17)+s+(s!=0)*/ \ - "psrad $17,%%mm4\n\t" \ - "paddw %%mm0,%%mm2\n\t" \ - "psrad $17,%%mm5\n\t" \ - "mov $0x7FFF7B16,%[a]\n\t" \ - "packssdw %%mm5,%%mm4\n\t" \ - "movd %[a],%%mm7\n\t" \ - "paddw %%mm4,%%mm2\n\t" \ - "punpckldq %%mm7,%%mm7\n\t" \ - /*mm0=0, mm7={12785}x4 \ - mm1=(t7''!=0), mm2=t4'', mm5:mm4=64277*t7''+0x7B1B*/ \ - "movq %%mm1,%%mm4\n\t" \ - "movq %%mm1,%%mm5\n\t" \ - "movq %%mm2,"_r3"(%[y])\n\t" \ - "punpcklwd %%mm1,%%mm4\n\t" \ - "movq "_r1"(%[y]),%%mm2\n\t" \ - "pmaddwd %%mm7,%%mm4\n\t" \ - "mov $0x31F131F1,%[a]\n\t" \ - "punpckhwd %%mm1,%%mm5\n\t" \ - "pxor %%mm0,%%mm0\n\t" \ - "pmaddwd %%mm7,%%mm5\n\t" \ - "pcmpeqw %%mm0,%%mm1\n\t" \ - "movd %[a],%%mm7\n\t" \ - "psubw %%mm3,%%mm1\n\t" \ - "punpckldq %%mm7,%%mm7\n\t" \ - "paddd %%mm6,%%mm4\n\t" \ - "paddd %%mm6,%%mm5\n\t" \ - /*mm3:mm1=12785*t4'''+((t7''!=0)<<16)*/ \ - "movq %%mm2,%%mm6\n\t" \ - "movq %%mm2,%%mm3\n\t" \ - "pmulhw %%mm7,%%mm6\n\t" \ - "pmullw %%mm7,%%mm3\n\t" \ - "paddw %%mm1,%%mm6\n\t" \ - "movq %%mm3,%%mm1\n\t" \ - "punpckhwd %%mm6,%%mm3\n\t" \ - "punpcklwd %%mm6,%%mm1\n\t" \ - /*mm3={-1}x4, mm6={1}x4 \ - mm4=_y[1]=u=(12785*t4'''+64277*t7''+0x7B1B>>16)+(t7''!=0)*/ \ - "paddd %%mm3,%%mm5\n\t" \ - "paddd %%mm1,%%mm4\n\t" \ - "psrad $16,%%mm5\n\t" \ - "pxor %%mm6,%%mm6\n\t" \ - "psrad $16,%%mm4\n\t" \ - "pcmpeqb %%mm3,%%mm3\n\t" \ - "packssdw %%mm5,%%mm4\n\t" \ - "psubw %%mm3,%%mm6\n\t" \ - /*mm1=t3'', mm7={20539,0x3000}x2 \ - mm4=s=(12785*u>>16)-t4''*/ \ - "movq %%mm4,"_r1"(%[y])\n\t" \ - "pmulhw %%mm7,%%mm4\n\t" \ - "mov $0x3000503B,%[a]\n\t" \ - "movq "_r6"(%[y]),%%mm1\n\t" \ - "movd %[a],%%mm7\n\t" \ - "psubw %%mm2,%%mm4\n\t" \ - "punpckldq %%mm7,%%mm7\n\t" \ - /*mm6={0x00006CB7}x2 \ - mm0=(s!=0), mm5:mm4=s*20539+0x3000*/ \ - "movq %%mm4,%%mm5\n\t" \ - "movq %%mm4,%%mm2\n\t" \ - "punpcklwd %%mm6,%%mm4\n\t" \ - "pcmpeqw %%mm2,%%mm0\n\t" \ - "pmaddwd %%mm7,%%mm4\n\t" \ - "mov $0x6CB7,%[a]\n\t" \ - "punpckhwd %%mm6,%%mm5\n\t" \ - "movd %[a],%%mm6\n\t" \ - "pmaddwd %%mm7,%%mm5\n\t" \ - "psubw %%mm3,%%mm0\n\t" \ - "punpckldq %%mm6,%%mm6\n\t" \ - /*mm7={60547-0x7FFF,0x7FFF}x2 \ - mm2=_y[7]=v=(s*20539+0x3000>>20)+s+(s!=0)*/ \ - "psrad $20,%%mm4\n\t" \ - "paddw %%mm0,%%mm2\n\t" \ - "psrad $20,%%mm5\n\t" \ - "mov $0x7FFF6C84,%[a]\n\t" \ - "packssdw %%mm5,%%mm4\n\t" \ - "movd %[a],%%mm7\n\t" \ - "paddw %%mm4,%%mm2\n\t" \ - "punpckldq %%mm7,%%mm7\n\t" \ - /*mm0=0, mm7={25080}x4 \ - mm2=t2'', mm5:mm4=60547*t3''+0x6CB7*/ \ - "movq %%mm1,%%mm4\n\t" \ - "movq %%mm1,%%mm5\n\t" \ - "movq %%mm2,"_r7"(%[y])\n\t" \ - "punpcklwd %%mm1,%%mm4\n\t" \ - "movq "_r2"(%[y]),%%mm2\n\t" \ - "pmaddwd %%mm7,%%mm4\n\t" \ - "mov $0x61F861F8,%[a]\n\t" \ - "punpckhwd %%mm1,%%mm5\n\t" \ - "pxor %%mm0,%%mm0\n\t" \ - "pmaddwd %%mm7,%%mm5\n\t" \ - "movd %[a],%%mm7\n\t" \ - "pcmpeqw %%mm0,%%mm1\n\t" \ - "psubw %%mm3,%%mm1\n\t" \ - "punpckldq %%mm7,%%mm7\n\t" \ - "paddd %%mm6,%%mm4\n\t" \ - "paddd %%mm6,%%mm5\n\t" \ - /*mm3:mm1=25080*t2''+((t3''!=0)<<16)*/ \ - "movq %%mm2,%%mm6\n\t" \ - "movq %%mm2,%%mm3\n\t" \ - "pmulhw %%mm7,%%mm6\n\t" \ - "pmullw %%mm7,%%mm3\n\t" \ - "paddw %%mm1,%%mm6\n\t" \ - "movq %%mm3,%%mm1\n\t" \ - "punpckhwd %%mm6,%%mm3\n\t" \ - "punpcklwd %%mm6,%%mm1\n\t" \ - /*mm1={-1}x4 \ - mm4=u=(25080*t2''+60547*t3''+0x6CB7>>16)+(t3''!=0)*/ \ - "paddd %%mm3,%%mm5\n\t" \ - "paddd %%mm1,%%mm4\n\t" \ - "psrad $16,%%mm5\n\t" \ - "mov $0x28005460,%[a]\n\t" \ - "psrad $16,%%mm4\n\t" \ - "pcmpeqb %%mm1,%%mm1\n\t" \ - "packssdw %%mm5,%%mm4\n\t" \ - /*mm5={1}x4, mm6=_y[2]=u, mm7={21600,0x2800}x2 \ - mm4=s=(25080*u>>16)-t2''*/ \ - "movq %%mm4,%%mm6\n\t" \ - "pmulhw %%mm7,%%mm4\n\t" \ - "pxor %%mm5,%%mm5\n\t" \ - "movd %[a],%%mm7\n\t" \ - "psubw %%mm1,%%mm5\n\t" \ - "punpckldq %%mm7,%%mm7\n\t" \ - "psubw %%mm2,%%mm4\n\t" \ - /*mm2=s+(s!=0) \ - mm4:mm3=s*21600+0x2800*/ \ - "movq %%mm4,%%mm3\n\t" \ - "movq %%mm4,%%mm2\n\t" \ - "punpckhwd %%mm5,%%mm4\n\t" \ - "pcmpeqw %%mm2,%%mm0\n\t" \ - "pmaddwd %%mm7,%%mm4\n\t" \ - "psubw %%mm1,%%mm0\n\t" \ - "punpcklwd %%mm5,%%mm3\n\t" \ - "paddw %%mm0,%%mm2\n\t" \ - "pmaddwd %%mm7,%%mm3\n\t" \ - /*mm0=_y[4], mm1=_y[7], mm4=_y[0], mm5=_y[5] \ - mm3=_y[6]=v=(s*21600+0x2800>>18)+s+(s!=0)*/ \ - "movq "_r4"(%[y]),%%mm0\n\t" \ - "psrad $18,%%mm4\n\t" \ - "movq "_r5"(%[y]),%%mm5\n\t" \ - "psrad $18,%%mm3\n\t" \ - "movq "_r7"(%[y]),%%mm1\n\t" \ - "packssdw %%mm4,%%mm3\n\t" \ - "movq "_r0"(%[y]),%%mm4\n\t" \ - "paddw %%mm2,%%mm3\n\t" \ - -/*On input, mm4=_y[0], mm6=_y[2], mm0=_y[4], mm5=_y[5], mm3=_y[6], mm1=_y[7]. - On output, {_y[4],mm1,mm2,mm3} contains the transpose of _y[4...7] and - {mm4,mm5,mm6,mm7} contains the transpose of _y[0...3].*/ -# define OC_TRANSPOSE8x4(_r0,_r1,_r2,_r3,_r4,_r5,_r6,_r7) \ - "#OC_TRANSPOSE8x4\n\t" \ - /*First 4x4 transpose:*/ \ - /*mm0 = e3 e2 e1 e0 \ - mm5 = f3 f2 f1 f0 \ - mm3 = g3 g2 g1 g0 \ - mm1 = h3 h2 h1 h0*/ \ - "movq %%mm0,%%mm2\n\t" \ - "punpcklwd %%mm5,%%mm0\n\t" \ - "punpckhwd %%mm5,%%mm2\n\t" \ - "movq %%mm3,%%mm5\n\t" \ - "punpcklwd %%mm1,%%mm3\n\t" \ - "punpckhwd %%mm1,%%mm5\n\t" \ - /*mm0 = f1 e1 f0 e0 \ - mm2 = f3 e3 f2 e2 \ - mm3 = h1 g1 h0 g0 \ - mm5 = h3 g3 h2 g2*/ \ - "movq %%mm0,%%mm1\n\t" \ - "punpckldq %%mm3,%%mm0\n\t" \ - "movq %%mm0,"_r4"(%[y])\n\t" \ - "punpckhdq %%mm3,%%mm1\n\t" \ - "movq "_r1"(%[y]),%%mm0\n\t" \ - "movq %%mm2,%%mm3\n\t" \ - "punpckldq %%mm5,%%mm2\n\t" \ - "punpckhdq %%mm5,%%mm3\n\t" \ - "movq "_r3"(%[y]),%%mm5\n\t" \ - /*_y[4] = h0 g0 f0 e0 \ - mm1 = h1 g1 f1 e1 \ - mm2 = h2 g2 f2 e2 \ - mm3 = h3 g3 f3 e3*/ \ - /*Second 4x4 transpose:*/ \ - /*mm4 = a3 a2 a1 a0 \ - mm0 = b3 b2 b1 b0 \ - mm6 = c3 c2 c1 c0 \ - mm5 = d3 d2 d1 d0*/ \ - "movq %%mm4,%%mm7\n\t" \ - "punpcklwd %%mm0,%%mm4\n\t" \ - "punpckhwd %%mm0,%%mm7\n\t" \ - "movq %%mm6,%%mm0\n\t" \ - "punpcklwd %%mm5,%%mm6\n\t" \ - "punpckhwd %%mm5,%%mm0\n\t" \ - /*mm4 = b1 a1 b0 a0 \ - mm7 = b3 a3 b2 a2 \ - mm6 = d1 c1 d0 c0 \ - mm0 = d3 c3 d2 c2*/ \ - "movq %%mm4,%%mm5\n\t" \ - "punpckldq %%mm6,%%mm4\n\t" \ - "punpckhdq %%mm6,%%mm5\n\t" \ - "movq %%mm7,%%mm6\n\t" \ - "punpckhdq %%mm0,%%mm7\n\t" \ - "punpckldq %%mm0,%%mm6\n\t" \ - /*mm4 = d0 c0 b0 a0 \ - mm5 = d1 c1 b1 a1 \ - mm6 = d2 c2 b2 a2 \ - mm7 = d3 c3 b3 a3*/ \ - -/*MMX implementation of the fDCT.*/ -void oc_enc_fdct8x8_mmx(ogg_int16_t _y[64],const ogg_int16_t _x[64]){ - ptrdiff_t a; - __asm__ __volatile__( - /*Add two extra bits of working precision to improve accuracy; any more and - we could overflow.*/ - /*We also add biases to correct for some systematic error that remains in - the full fDCT->iDCT round trip.*/ - "movq 0x00(%[x]),%%mm0\n\t" - "movq 0x10(%[x]),%%mm1\n\t" - "movq 0x20(%[x]),%%mm2\n\t" - "movq 0x30(%[x]),%%mm3\n\t" - "pcmpeqb %%mm4,%%mm4\n\t" - "pxor %%mm7,%%mm7\n\t" - "movq %%mm0,%%mm5\n\t" - "psllw $2,%%mm0\n\t" - "pcmpeqw %%mm7,%%mm5\n\t" - "movq 0x70(%[x]),%%mm7\n\t" - "psllw $2,%%mm1\n\t" - "psubw %%mm4,%%mm5\n\t" - "psllw $2,%%mm2\n\t" - "mov $1,%[a]\n\t" - "pslld $16,%%mm5\n\t" - "movd %[a],%%mm6\n\t" - "psllq $16,%%mm5\n\t" - "mov $0x10001,%[a]\n\t" - "psllw $2,%%mm3\n\t" - "movd %[a],%%mm4\n\t" - "punpckhwd %%mm6,%%mm5\n\t" - "psubw %%mm6,%%mm1\n\t" - "movq 0x60(%[x]),%%mm6\n\t" - "paddw %%mm5,%%mm0\n\t" - "movq 0x50(%[x]),%%mm5\n\t" - "paddw %%mm4,%%mm0\n\t" - "movq 0x40(%[x]),%%mm4\n\t" - /*We inline stage1 of the transform here so we can get better instruction - scheduling with the shifts.*/ - /*mm0=t7'=t0-t7*/ - "psllw $2,%%mm7\n\t" - "psubw %%mm7,%%mm0\n\t" - "psllw $2,%%mm6\n\t" - "paddw %%mm7,%%mm7\n\t" - /*mm1=t6'=t1-t6*/ - "psllw $2,%%mm5\n\t" - "psubw %%mm6,%%mm1\n\t" - "psllw $2,%%mm4\n\t" - "paddw %%mm6,%%mm6\n\t" - /*mm2=t5'=t2-t5*/ - "psubw %%mm5,%%mm2\n\t" - "paddw %%mm5,%%mm5\n\t" - /*mm3=t4'=t3-t4*/ - "psubw %%mm4,%%mm3\n\t" - "paddw %%mm4,%%mm4\n\t" - /*mm7=t0'=t0+t7*/ - "paddw %%mm0,%%mm7\n\t" - /*mm6=t1'=t1+t6*/ - "paddw %%mm1,%%mm6\n\t" - /*mm5=t2'=t2+t5*/ - "paddw %%mm2,%%mm5\n\t" - /*mm4=t3'=t3+t4*/ - "paddw %%mm3,%%mm4\n\t" - OC_FDCT8x4("0x00","0x10","0x20","0x30","0x40","0x50","0x60","0x70") - OC_TRANSPOSE8x4("0x00","0x10","0x20","0x30","0x40","0x50","0x60","0x70") - /*Swap out this 8x4 block for the next one.*/ - "movq 0x08(%[x]),%%mm0\n\t" - "movq %%mm7,0x30(%[y])\n\t" - "movq 0x78(%[x]),%%mm7\n\t" - "movq %%mm1,0x50(%[y])\n\t" - "movq 0x18(%[x]),%%mm1\n\t" - "movq %%mm6,0x20(%[y])\n\t" - "movq 0x68(%[x]),%%mm6\n\t" - "movq %%mm2,0x60(%[y])\n\t" - "movq 0x28(%[x]),%%mm2\n\t" - "movq %%mm5,0x10(%[y])\n\t" - "movq 0x58(%[x]),%%mm5\n\t" - "movq %%mm3,0x70(%[y])\n\t" - "movq 0x38(%[x]),%%mm3\n\t" - /*And increase its working precision, too.*/ - "psllw $2,%%mm0\n\t" - "movq %%mm4,0x00(%[y])\n\t" - "psllw $2,%%mm7\n\t" - "movq 0x48(%[x]),%%mm4\n\t" - /*We inline stage1 of the transform here so we can get better instruction - scheduling with the shifts.*/ - /*mm0=t7'=t0-t7*/ - "psubw %%mm7,%%mm0\n\t" - "psllw $2,%%mm1\n\t" - "paddw %%mm7,%%mm7\n\t" - "psllw $2,%%mm6\n\t" - /*mm1=t6'=t1-t6*/ - "psubw %%mm6,%%mm1\n\t" - "psllw $2,%%mm2\n\t" - "paddw %%mm6,%%mm6\n\t" - "psllw $2,%%mm5\n\t" - /*mm2=t5'=t2-t5*/ - "psubw %%mm5,%%mm2\n\t" - "psllw $2,%%mm3\n\t" - "paddw %%mm5,%%mm5\n\t" - "psllw $2,%%mm4\n\t" - /*mm3=t4'=t3-t4*/ - "psubw %%mm4,%%mm3\n\t" - "paddw %%mm4,%%mm4\n\t" - /*mm7=t0'=t0+t7*/ - "paddw %%mm0,%%mm7\n\t" - /*mm6=t1'=t1+t6*/ - "paddw %%mm1,%%mm6\n\t" - /*mm5=t2'=t2+t5*/ - "paddw %%mm2,%%mm5\n\t" - /*mm4=t3'=t3+t4*/ - "paddw %%mm3,%%mm4\n\t" - OC_FDCT8x4("0x08","0x18","0x28","0x38","0x48","0x58","0x68","0x78") - OC_TRANSPOSE8x4("0x08","0x18","0x28","0x38","0x48","0x58","0x68","0x78") - /*Here the first 4x4 block of output from the last transpose is the second - 4x4 block of input for the next transform. - We have cleverly arranged that it already be in the appropriate place, - so we only have to do half the stores and loads.*/ - "movq 0x00(%[y]),%%mm0\n\t" - "movq %%mm1,0x58(%[y])\n\t" - "movq 0x10(%[y]),%%mm1\n\t" - "movq %%mm2,0x68(%[y])\n\t" - "movq 0x20(%[y]),%%mm2\n\t" - "movq %%mm3,0x78(%[y])\n\t" - "movq 0x30(%[y]),%%mm3\n\t" - OC_FDCT_STAGE1_8x4 - OC_FDCT8x4("0x00","0x10","0x20","0x30","0x08","0x18","0x28","0x38") - OC_TRANSPOSE8x4("0x00","0x10","0x20","0x30","0x08","0x18","0x28","0x38") - /*mm0={-2}x4*/ - "pcmpeqw %%mm0,%%mm0\n\t" - "paddw %%mm0,%%mm0\n\t" - /*Round the results.*/ - "psubw %%mm0,%%mm1\n\t" - "psubw %%mm0,%%mm2\n\t" - "psraw $2,%%mm1\n\t" - "psubw %%mm0,%%mm3\n\t" - "movq %%mm1,0x18(%[y])\n\t" - "psraw $2,%%mm2\n\t" - "psubw %%mm0,%%mm4\n\t" - "movq 0x08(%[y]),%%mm1\n\t" - "psraw $2,%%mm3\n\t" - "psubw %%mm0,%%mm5\n\t" - "psraw $2,%%mm4\n\t" - "psubw %%mm0,%%mm6\n\t" - "psraw $2,%%mm5\n\t" - "psubw %%mm0,%%mm7\n\t" - "psraw $2,%%mm6\n\t" - "psubw %%mm0,%%mm1\n\t" - "psraw $2,%%mm7\n\t" - "movq 0x40(%[y]),%%mm0\n\t" - "psraw $2,%%mm1\n\t" - "movq %%mm7,0x30(%[y])\n\t" - "movq 0x78(%[y]),%%mm7\n\t" - "movq %%mm1,0x08(%[y])\n\t" - "movq 0x50(%[y]),%%mm1\n\t" - "movq %%mm6,0x20(%[y])\n\t" - "movq 0x68(%[y]),%%mm6\n\t" - "movq %%mm2,0x28(%[y])\n\t" - "movq 0x60(%[y]),%%mm2\n\t" - "movq %%mm5,0x10(%[y])\n\t" - "movq 0x58(%[y]),%%mm5\n\t" - "movq %%mm3,0x38(%[y])\n\t" - "movq 0x70(%[y]),%%mm3\n\t" - "movq %%mm4,0x00(%[y])\n\t" - "movq 0x48(%[y]),%%mm4\n\t" - OC_FDCT_STAGE1_8x4 - OC_FDCT8x4("0x40","0x50","0x60","0x70","0x48","0x58","0x68","0x78") - OC_TRANSPOSE8x4("0x40","0x50","0x60","0x70","0x48","0x58","0x68","0x78") - /*mm0={-2}x4*/ - "pcmpeqw %%mm0,%%mm0\n\t" - "paddw %%mm0,%%mm0\n\t" - /*Round the results.*/ - "psubw %%mm0,%%mm1\n\t" - "psubw %%mm0,%%mm2\n\t" - "psraw $2,%%mm1\n\t" - "psubw %%mm0,%%mm3\n\t" - "movq %%mm1,0x58(%[y])\n\t" - "psraw $2,%%mm2\n\t" - "psubw %%mm0,%%mm4\n\t" - "movq 0x48(%[y]),%%mm1\n\t" - "psraw $2,%%mm3\n\t" - "psubw %%mm0,%%mm5\n\t" - "movq %%mm2,0x68(%[y])\n\t" - "psraw $2,%%mm4\n\t" - "psubw %%mm0,%%mm6\n\t" - "movq %%mm3,0x78(%[y])\n\t" - "psraw $2,%%mm5\n\t" - "psubw %%mm0,%%mm7\n\t" - "movq %%mm4,0x40(%[y])\n\t" - "psraw $2,%%mm6\n\t" - "psubw %%mm0,%%mm1\n\t" - "movq %%mm5,0x50(%[y])\n\t" - "psraw $2,%%mm7\n\t" - "movq %%mm6,0x60(%[y])\n\t" - "psraw $2,%%mm1\n\t" - "movq %%mm7,0x70(%[y])\n\t" - "movq %%mm1,0x48(%[y])\n\t" - :[a]"=&r"(a) - :[y]"r"(_y),[x]"r"(_x) - :"memory" - ); -} - -#endif diff --git a/drivers/theora/x86/mmxfrag.c b/drivers/theora/x86/mmxfrag.c deleted file mode 100644 index 2c732939c3..0000000000 --- a/drivers/theora/x86/mmxfrag.c +++ /dev/null @@ -1,293 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ******************************************************************** - - function: - last mod: $Id: mmxfrag.c 16503 2009-08-22 18:14:02Z giles $ - - ********************************************************************/ - -/*MMX acceleration of fragment reconstruction for motion compensation. - Originally written by Rudolf Marek. - Additional optimization by Nils Pipenbrinck. - Note: Loops are unrolled for best performance. - The iteration each instruction belongs to is marked in the comments as #i.*/ -#include <stddef.h> -#include "x86int.h" -#include "mmxfrag.h" - -#if defined(OC_X86_ASM) - -/*Copies an 8x8 block of pixels from _src to _dst, assuming _ystride bytes - between rows.*/ -void oc_frag_copy_mmx(unsigned char *_dst, - const unsigned char *_src,int _ystride){ - OC_FRAG_COPY_MMX(_dst,_src,_ystride); -} - -void oc_frag_recon_intra_mmx(unsigned char *_dst,int _ystride, - const ogg_int16_t *_residue){ - __asm__ __volatile__( - /*Set mm0 to 0xFFFFFFFFFFFFFFFF.*/ - "pcmpeqw %%mm0,%%mm0\n\t" - /*#0 Load low residue.*/ - "movq 0*8(%[residue]),%%mm1\n\t" - /*#0 Load high residue.*/ - "movq 1*8(%[residue]),%%mm2\n\t" - /*Set mm0 to 0x8000800080008000.*/ - "psllw $15,%%mm0\n\t" - /*#1 Load low residue.*/ - "movq 2*8(%[residue]),%%mm3\n\t" - /*#1 Load high residue.*/ - "movq 3*8(%[residue]),%%mm4\n\t" - /*Set mm0 to 0x0080008000800080.*/ - "psrlw $8,%%mm0\n\t" - /*#2 Load low residue.*/ - "movq 4*8(%[residue]),%%mm5\n\t" - /*#2 Load high residue.*/ - "movq 5*8(%[residue]),%%mm6\n\t" - /*#0 Bias low residue.*/ - "paddsw %%mm0,%%mm1\n\t" - /*#0 Bias high residue.*/ - "paddsw %%mm0,%%mm2\n\t" - /*#0 Pack to byte.*/ - "packuswb %%mm2,%%mm1\n\t" - /*#1 Bias low residue.*/ - "paddsw %%mm0,%%mm3\n\t" - /*#1 Bias high residue.*/ - "paddsw %%mm0,%%mm4\n\t" - /*#1 Pack to byte.*/ - "packuswb %%mm4,%%mm3\n\t" - /*#2 Bias low residue.*/ - "paddsw %%mm0,%%mm5\n\t" - /*#2 Bias high residue.*/ - "paddsw %%mm0,%%mm6\n\t" - /*#2 Pack to byte.*/ - "packuswb %%mm6,%%mm5\n\t" - /*#0 Write row.*/ - "movq %%mm1,(%[dst])\n\t" - /*#1 Write row.*/ - "movq %%mm3,(%[dst],%[ystride])\n\t" - /*#2 Write row.*/ - "movq %%mm5,(%[dst],%[ystride],2)\n\t" - /*#3 Load low residue.*/ - "movq 6*8(%[residue]),%%mm1\n\t" - /*#3 Load high residue.*/ - "movq 7*8(%[residue]),%%mm2\n\t" - /*#4 Load high residue.*/ - "movq 8*8(%[residue]),%%mm3\n\t" - /*#4 Load high residue.*/ - "movq 9*8(%[residue]),%%mm4\n\t" - /*#5 Load high residue.*/ - "movq 10*8(%[residue]),%%mm5\n\t" - /*#5 Load high residue.*/ - "movq 11*8(%[residue]),%%mm6\n\t" - /*#3 Bias low residue.*/ - "paddsw %%mm0,%%mm1\n\t" - /*#3 Bias high residue.*/ - "paddsw %%mm0,%%mm2\n\t" - /*#3 Pack to byte.*/ - "packuswb %%mm2,%%mm1\n\t" - /*#4 Bias low residue.*/ - "paddsw %%mm0,%%mm3\n\t" - /*#4 Bias high residue.*/ - "paddsw %%mm0,%%mm4\n\t" - /*#4 Pack to byte.*/ - "packuswb %%mm4,%%mm3\n\t" - /*#5 Bias low residue.*/ - "paddsw %%mm0,%%mm5\n\t" - /*#5 Bias high residue.*/ - "paddsw %%mm0,%%mm6\n\t" - /*#5 Pack to byte.*/ - "packuswb %%mm6,%%mm5\n\t" - /*#3 Write row.*/ - "movq %%mm1,(%[dst],%[ystride3])\n\t" - /*#4 Write row.*/ - "movq %%mm3,(%[dst4])\n\t" - /*#5 Write row.*/ - "movq %%mm5,(%[dst4],%[ystride])\n\t" - /*#6 Load low residue.*/ - "movq 12*8(%[residue]),%%mm1\n\t" - /*#6 Load high residue.*/ - "movq 13*8(%[residue]),%%mm2\n\t" - /*#7 Load low residue.*/ - "movq 14*8(%[residue]),%%mm3\n\t" - /*#7 Load high residue.*/ - "movq 15*8(%[residue]),%%mm4\n\t" - /*#6 Bias low residue.*/ - "paddsw %%mm0,%%mm1\n\t" - /*#6 Bias high residue.*/ - "paddsw %%mm0,%%mm2\n\t" - /*#6 Pack to byte.*/ - "packuswb %%mm2,%%mm1\n\t" - /*#7 Bias low residue.*/ - "paddsw %%mm0,%%mm3\n\t" - /*#7 Bias high residue.*/ - "paddsw %%mm0,%%mm4\n\t" - /*#7 Pack to byte.*/ - "packuswb %%mm4,%%mm3\n\t" - /*#6 Write row.*/ - "movq %%mm1,(%[dst4],%[ystride],2)\n\t" - /*#7 Write row.*/ - "movq %%mm3,(%[dst4],%[ystride3])\n\t" - : - :[residue]"r"(_residue), - [dst]"r"(_dst), - [dst4]"r"(_dst+(_ystride<<2)), - [ystride]"r"((ptrdiff_t)_ystride), - [ystride3]"r"((ptrdiff_t)_ystride*3) - :"memory" - ); -} - -void oc_frag_recon_inter_mmx(unsigned char *_dst,const unsigned char *_src, - int _ystride,const ogg_int16_t *_residue){ - int i; - /*Zero mm0.*/ - __asm__ __volatile__("pxor %%mm0,%%mm0\n\t"::); - for(i=4;i-->0;){ - __asm__ __volatile__( - /*#0 Load source.*/ - "movq (%[src]),%%mm3\n\t" - /*#1 Load source.*/ - "movq (%[src],%[ystride]),%%mm7\n\t" - /*#0 Get copy of src.*/ - "movq %%mm3,%%mm4\n\t" - /*#0 Expand high source.*/ - "punpckhbw %%mm0,%%mm4\n\t" - /*#0 Expand low source.*/ - "punpcklbw %%mm0,%%mm3\n\t" - /*#0 Add residue high.*/ - "paddsw 8(%[residue]),%%mm4\n\t" - /*#1 Get copy of src.*/ - "movq %%mm7,%%mm2\n\t" - /*#0 Add residue low.*/ - "paddsw (%[residue]), %%mm3\n\t" - /*#1 Expand high source.*/ - "punpckhbw %%mm0,%%mm2\n\t" - /*#0 Pack final row pixels.*/ - "packuswb %%mm4,%%mm3\n\t" - /*#1 Expand low source.*/ - "punpcklbw %%mm0,%%mm7\n\t" - /*#1 Add residue low.*/ - "paddsw 16(%[residue]),%%mm7\n\t" - /*#1 Add residue high.*/ - "paddsw 24(%[residue]),%%mm2\n\t" - /*Advance residue.*/ - "lea 32(%[residue]),%[residue]\n\t" - /*#1 Pack final row pixels.*/ - "packuswb %%mm2,%%mm7\n\t" - /*Advance src.*/ - "lea (%[src],%[ystride],2),%[src]\n\t" - /*#0 Write row.*/ - "movq %%mm3,(%[dst])\n\t" - /*#1 Write row.*/ - "movq %%mm7,(%[dst],%[ystride])\n\t" - /*Advance dst.*/ - "lea (%[dst],%[ystride],2),%[dst]\n\t" - :[residue]"+r"(_residue),[dst]"+r"(_dst),[src]"+r"(_src) - :[ystride]"r"((ptrdiff_t)_ystride) - :"memory" - ); - } -} - -void oc_frag_recon_inter2_mmx(unsigned char *_dst,const unsigned char *_src1, - const unsigned char *_src2,int _ystride,const ogg_int16_t *_residue){ - int i; - /*Zero mm7.*/ - __asm__ __volatile__("pxor %%mm7,%%mm7\n\t"::); - for(i=4;i-->0;){ - __asm__ __volatile__( - /*#0 Load src1.*/ - "movq (%[src1]),%%mm0\n\t" - /*#0 Load src2.*/ - "movq (%[src2]),%%mm2\n\t" - /*#0 Copy src1.*/ - "movq %%mm0,%%mm1\n\t" - /*#0 Copy src2.*/ - "movq %%mm2,%%mm3\n\t" - /*#1 Load src1.*/ - "movq (%[src1],%[ystride]),%%mm4\n\t" - /*#0 Unpack lower src1.*/ - "punpcklbw %%mm7,%%mm0\n\t" - /*#1 Load src2.*/ - "movq (%[src2],%[ystride]),%%mm5\n\t" - /*#0 Unpack higher src1.*/ - "punpckhbw %%mm7,%%mm1\n\t" - /*#0 Unpack lower src2.*/ - "punpcklbw %%mm7,%%mm2\n\t" - /*#0 Unpack higher src2.*/ - "punpckhbw %%mm7,%%mm3\n\t" - /*Advance src1 ptr.*/ - "lea (%[src1],%[ystride],2),%[src1]\n\t" - /*Advance src2 ptr.*/ - "lea (%[src2],%[ystride],2),%[src2]\n\t" - /*#0 Lower src1+src2.*/ - "paddsw %%mm2,%%mm0\n\t" - /*#0 Higher src1+src2.*/ - "paddsw %%mm3,%%mm1\n\t" - /*#1 Copy src1.*/ - "movq %%mm4,%%mm2\n\t" - /*#0 Build lo average.*/ - "psraw $1,%%mm0\n\t" - /*#1 Copy src2.*/ - "movq %%mm5,%%mm3\n\t" - /*#1 Unpack lower src1.*/ - "punpcklbw %%mm7,%%mm4\n\t" - /*#0 Build hi average.*/ - "psraw $1,%%mm1\n\t" - /*#1 Unpack higher src1.*/ - "punpckhbw %%mm7,%%mm2\n\t" - /*#0 low+=residue.*/ - "paddsw (%[residue]),%%mm0\n\t" - /*#1 Unpack lower src2.*/ - "punpcklbw %%mm7,%%mm5\n\t" - /*#0 high+=residue.*/ - "paddsw 8(%[residue]),%%mm1\n\t" - /*#1 Unpack higher src2.*/ - "punpckhbw %%mm7,%%mm3\n\t" - /*#1 Lower src1+src2.*/ - "paddsw %%mm4,%%mm5\n\t" - /*#0 Pack and saturate.*/ - "packuswb %%mm1,%%mm0\n\t" - /*#1 Higher src1+src2.*/ - "paddsw %%mm2,%%mm3\n\t" - /*#0 Write row.*/ - "movq %%mm0,(%[dst])\n\t" - /*#1 Build lo average.*/ - "psraw $1,%%mm5\n\t" - /*#1 Build hi average.*/ - "psraw $1,%%mm3\n\t" - /*#1 low+=residue.*/ - "paddsw 16(%[residue]),%%mm5\n\t" - /*#1 high+=residue.*/ - "paddsw 24(%[residue]),%%mm3\n\t" - /*#1 Pack and saturate.*/ - "packuswb %%mm3,%%mm5\n\t" - /*#1 Write row ptr.*/ - "movq %%mm5,(%[dst],%[ystride])\n\t" - /*Advance residue ptr.*/ - "add $32,%[residue]\n\t" - /*Advance dest ptr.*/ - "lea (%[dst],%[ystride],2),%[dst]\n\t" - :[dst]"+r"(_dst),[residue]"+r"(_residue), - [src1]"+%r"(_src1),[src2]"+r"(_src2) - :[ystride]"r"((ptrdiff_t)_ystride) - :"memory" - ); - } -} - -void oc_restore_fpu_mmx(void){ - __asm__ __volatile__("emms\n\t"); -} -#endif diff --git a/drivers/theora/x86/mmxfrag.h b/drivers/theora/x86/mmxfrag.h deleted file mode 100644 index a398427629..0000000000 --- a/drivers/theora/x86/mmxfrag.h +++ /dev/null @@ -1,64 +0,0 @@ -#if !defined(_x86_mmxfrag_H) -# define _x86_mmxfrag_H (1) -# include <stddef.h> -# include "x86int.h" - -#if defined(OC_X86_ASM) - -/*Copies an 8x8 block of pixels from _src to _dst, assuming _ystride bytes - between rows.*/ -#define OC_FRAG_COPY_MMX(_dst,_src,_ystride) \ - do{ \ - const unsigned char *src; \ - unsigned char *dst; \ - ptrdiff_t ystride3; \ - src=(_src); \ - dst=(_dst); \ - __asm__ __volatile__( \ - /*src+0*ystride*/ \ - "movq (%[src]),%%mm0\n\t" \ - /*src+1*ystride*/ \ - "movq (%[src],%[ystride]),%%mm1\n\t" \ - /*ystride3=ystride*3*/ \ - "lea (%[ystride],%[ystride],2),%[ystride3]\n\t" \ - /*src+2*ystride*/ \ - "movq (%[src],%[ystride],2),%%mm2\n\t" \ - /*src+3*ystride*/ \ - "movq (%[src],%[ystride3]),%%mm3\n\t" \ - /*dst+0*ystride*/ \ - "movq %%mm0,(%[dst])\n\t" \ - /*dst+1*ystride*/ \ - "movq %%mm1,(%[dst],%[ystride])\n\t" \ - /*Pointer to next 4.*/ \ - "lea (%[src],%[ystride],4),%[src]\n\t" \ - /*dst+2*ystride*/ \ - "movq %%mm2,(%[dst],%[ystride],2)\n\t" \ - /*dst+3*ystride*/ \ - "movq %%mm3,(%[dst],%[ystride3])\n\t" \ - /*Pointer to next 4.*/ \ - "lea (%[dst],%[ystride],4),%[dst]\n\t" \ - /*src+0*ystride*/ \ - "movq (%[src]),%%mm0\n\t" \ - /*src+1*ystride*/ \ - "movq (%[src],%[ystride]),%%mm1\n\t" \ - /*src+2*ystride*/ \ - "movq (%[src],%[ystride],2),%%mm2\n\t" \ - /*src+3*ystride*/ \ - "movq (%[src],%[ystride3]),%%mm3\n\t" \ - /*dst+0*ystride*/ \ - "movq %%mm0,(%[dst])\n\t" \ - /*dst+1*ystride*/ \ - "movq %%mm1,(%[dst],%[ystride])\n\t" \ - /*dst+2*ystride*/ \ - "movq %%mm2,(%[dst],%[ystride],2)\n\t" \ - /*dst+3*ystride*/ \ - "movq %%mm3,(%[dst],%[ystride3])\n\t" \ - :[dst]"+r"(dst),[src]"+r"(src),[ystride3]"=&r"(ystride3) \ - :[ystride]"r"((ptrdiff_t)(_ystride)) \ - :"memory" \ - ); \ - } \ - while(0) - -# endif -#endif diff --git a/drivers/theora/x86/mmxidct.c b/drivers/theora/x86/mmxidct.c deleted file mode 100644 index 76424e6364..0000000000 --- a/drivers/theora/x86/mmxidct.c +++ /dev/null @@ -1,564 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ******************************************************************** - - function: - last mod: $Id: mmxidct.c 16503 2009-08-22 18:14:02Z giles $ - - ********************************************************************/ - -/*MMX acceleration of Theora's iDCT. - Originally written by Rudolf Marek, based on code from On2's VP3.*/ -#include "x86int.h" -#include "../dct.h" - -#if defined(OC_X86_ASM) - -/*These are offsets into the table of constants below.*/ -/*7 rows of cosines, in order: pi/16 * (1 ... 7).*/ -#define OC_COSINE_OFFSET (0) -/*A row of 8's.*/ -#define OC_EIGHT_OFFSET (56) - - - -/*A table of constants used by the MMX routines.*/ -static const ogg_uint16_t __attribute__((aligned(8),used)) - OC_IDCT_CONSTS[(7+1)*4]={ - (ogg_uint16_t)OC_C1S7,(ogg_uint16_t)OC_C1S7, - (ogg_uint16_t)OC_C1S7,(ogg_uint16_t)OC_C1S7, - (ogg_uint16_t)OC_C2S6,(ogg_uint16_t)OC_C2S6, - (ogg_uint16_t)OC_C2S6,(ogg_uint16_t)OC_C2S6, - (ogg_uint16_t)OC_C3S5,(ogg_uint16_t)OC_C3S5, - (ogg_uint16_t)OC_C3S5,(ogg_uint16_t)OC_C3S5, - (ogg_uint16_t)OC_C4S4,(ogg_uint16_t)OC_C4S4, - (ogg_uint16_t)OC_C4S4,(ogg_uint16_t)OC_C4S4, - (ogg_uint16_t)OC_C5S3,(ogg_uint16_t)OC_C5S3, - (ogg_uint16_t)OC_C5S3,(ogg_uint16_t)OC_C5S3, - (ogg_uint16_t)OC_C6S2,(ogg_uint16_t)OC_C6S2, - (ogg_uint16_t)OC_C6S2,(ogg_uint16_t)OC_C6S2, - (ogg_uint16_t)OC_C7S1,(ogg_uint16_t)OC_C7S1, - (ogg_uint16_t)OC_C7S1,(ogg_uint16_t)OC_C7S1, - 8, 8, 8, 8 -}; - -/*Converts the expression in the argument to a string.*/ -#define OC_M2STR(_s) #_s - -/*38 cycles*/ -#define OC_IDCT_BEGIN \ - "#OC_IDCT_BEGIN\n\t" \ - "movq "OC_I(3)",%%mm2\n\t" \ - "movq "OC_C(3)",%%mm6\n\t" \ - "movq %%mm2,%%mm4\n\t" \ - "movq "OC_J(5)",%%mm7\n\t" \ - "pmulhw %%mm6,%%mm4\n\t" \ - "movq "OC_C(5)",%%mm1\n\t" \ - "pmulhw %%mm7,%%mm6\n\t" \ - "movq %%mm1,%%mm5\n\t" \ - "pmulhw %%mm2,%%mm1\n\t" \ - "movq "OC_I(1)",%%mm3\n\t" \ - "pmulhw %%mm7,%%mm5\n\t" \ - "movq "OC_C(1)",%%mm0\n\t" \ - "paddw %%mm2,%%mm4\n\t" \ - "paddw %%mm7,%%mm6\n\t" \ - "paddw %%mm1,%%mm2\n\t" \ - "movq "OC_J(7)",%%mm1\n\t" \ - "paddw %%mm5,%%mm7\n\t" \ - "movq %%mm0,%%mm5\n\t" \ - "pmulhw %%mm3,%%mm0\n\t" \ - "paddw %%mm7,%%mm4\n\t" \ - "pmulhw %%mm1,%%mm5\n\t" \ - "movq "OC_C(7)",%%mm7\n\t" \ - "psubw %%mm2,%%mm6\n\t" \ - "paddw %%mm3,%%mm0\n\t" \ - "pmulhw %%mm7,%%mm3\n\t" \ - "movq "OC_I(2)",%%mm2\n\t" \ - "pmulhw %%mm1,%%mm7\n\t" \ - "paddw %%mm1,%%mm5\n\t" \ - "movq %%mm2,%%mm1\n\t" \ - "pmulhw "OC_C(2)",%%mm2\n\t" \ - "psubw %%mm5,%%mm3\n\t" \ - "movq "OC_J(6)",%%mm5\n\t" \ - "paddw %%mm7,%%mm0\n\t" \ - "movq %%mm5,%%mm7\n\t" \ - "psubw %%mm4,%%mm0\n\t" \ - "pmulhw "OC_C(2)",%%mm5\n\t" \ - "paddw %%mm1,%%mm2\n\t" \ - "pmulhw "OC_C(6)",%%mm1\n\t" \ - "paddw %%mm4,%%mm4\n\t" \ - "paddw %%mm0,%%mm4\n\t" \ - "psubw %%mm6,%%mm3\n\t" \ - "paddw %%mm7,%%mm5\n\t" \ - "paddw %%mm6,%%mm6\n\t" \ - "pmulhw "OC_C(6)",%%mm7\n\t" \ - "paddw %%mm3,%%mm6\n\t" \ - "movq %%mm4,"OC_I(1)"\n\t" \ - "psubw %%mm5,%%mm1\n\t" \ - "movq "OC_C(4)",%%mm4\n\t" \ - "movq %%mm3,%%mm5\n\t" \ - "pmulhw %%mm4,%%mm3\n\t" \ - "paddw %%mm2,%%mm7\n\t" \ - "movq %%mm6,"OC_I(2)"\n\t" \ - "movq %%mm0,%%mm2\n\t" \ - "movq "OC_I(0)",%%mm6\n\t" \ - "pmulhw %%mm4,%%mm0\n\t" \ - "paddw %%mm3,%%mm5\n\t" \ - "movq "OC_J(4)",%%mm3\n\t" \ - "psubw %%mm1,%%mm5\n\t" \ - "paddw %%mm0,%%mm2\n\t" \ - "psubw %%mm3,%%mm6\n\t" \ - "movq %%mm6,%%mm0\n\t" \ - "pmulhw %%mm4,%%mm6\n\t" \ - "paddw %%mm3,%%mm3\n\t" \ - "paddw %%mm1,%%mm1\n\t" \ - "paddw %%mm0,%%mm3\n\t" \ - "paddw %%mm5,%%mm1\n\t" \ - "pmulhw %%mm3,%%mm4\n\t" \ - "paddw %%mm0,%%mm6\n\t" \ - "psubw %%mm2,%%mm6\n\t" \ - "paddw %%mm2,%%mm2\n\t" \ - "movq "OC_I(1)",%%mm0\n\t" \ - "paddw %%mm6,%%mm2\n\t" \ - "paddw %%mm3,%%mm4\n\t" \ - "psubw %%mm1,%%mm2\n\t" \ - "#end OC_IDCT_BEGIN\n\t" \ - -/*38+8=46 cycles.*/ -#define OC_ROW_IDCT \ - "#OC_ROW_IDCT\n" \ - OC_IDCT_BEGIN \ - /*r3=D'*/ \ - "movq "OC_I(2)",%%mm3\n\t" \ - /*r4=E'=E-G*/ \ - "psubw %%mm7,%%mm4\n\t" \ - /*r1=H'+H'*/ \ - "paddw %%mm1,%%mm1\n\t" \ - /*r7=G+G*/ \ - "paddw %%mm7,%%mm7\n\t" \ - /*r1=R1=A''+H'*/ \ - "paddw %%mm2,%%mm1\n\t" \ - /*r7=G'=E+G*/ \ - "paddw %%mm4,%%mm7\n\t" \ - /*r4=R4=E'-D'*/ \ - "psubw %%mm3,%%mm4\n\t" \ - "paddw %%mm3,%%mm3\n\t" \ - /*r6=R6=F'-B''*/ \ - "psubw %%mm5,%%mm6\n\t" \ - "paddw %%mm5,%%mm5\n\t" \ - /*r3=R3=E'+D'*/ \ - "paddw %%mm4,%%mm3\n\t" \ - /*r5=R5=F'+B''*/ \ - "paddw %%mm6,%%mm5\n\t" \ - /*r7=R7=G'-C'*/ \ - "psubw %%mm0,%%mm7\n\t" \ - "paddw %%mm0,%%mm0\n\t" \ - /*Save R1.*/ \ - "movq %%mm1,"OC_I(1)"\n\t" \ - /*r0=R0=G.+C.*/ \ - "paddw %%mm7,%%mm0\n\t" \ - "#end OC_ROW_IDCT\n\t" \ - -/*The following macro does two 4x4 transposes in place. - At entry, we assume: - r0 = a3 a2 a1 a0 - I(1) = b3 b2 b1 b0 - r2 = c3 c2 c1 c0 - r3 = d3 d2 d1 d0 - - r4 = e3 e2 e1 e0 - r5 = f3 f2 f1 f0 - r6 = g3 g2 g1 g0 - r7 = h3 h2 h1 h0 - - At exit, we have: - I(0) = d0 c0 b0 a0 - I(1) = d1 c1 b1 a1 - I(2) = d2 c2 b2 a2 - I(3) = d3 c3 b3 a3 - - J(4) = h0 g0 f0 e0 - J(5) = h1 g1 f1 e1 - J(6) = h2 g2 f2 e2 - J(7) = h3 g3 f3 e3 - - I(0) I(1) I(2) I(3) is the transpose of r0 I(1) r2 r3. - J(4) J(5) J(6) J(7) is the transpose of r4 r5 r6 r7. - - Since r1 is free at entry, we calculate the Js first.*/ -/*19 cycles.*/ -#define OC_TRANSPOSE \ - "#OC_TRANSPOSE\n\t" \ - "movq %%mm4,%%mm1\n\t" \ - "punpcklwd %%mm5,%%mm4\n\t" \ - "movq %%mm0,"OC_I(0)"\n\t" \ - "punpckhwd %%mm5,%%mm1\n\t" \ - "movq %%mm6,%%mm0\n\t" \ - "punpcklwd %%mm7,%%mm6\n\t" \ - "movq %%mm4,%%mm5\n\t" \ - "punpckldq %%mm6,%%mm4\n\t" \ - "punpckhdq %%mm6,%%mm5\n\t" \ - "movq %%mm1,%%mm6\n\t" \ - "movq %%mm4,"OC_J(4)"\n\t" \ - "punpckhwd %%mm7,%%mm0\n\t" \ - "movq %%mm5,"OC_J(5)"\n\t" \ - "punpckhdq %%mm0,%%mm6\n\t" \ - "movq "OC_I(0)",%%mm4\n\t" \ - "punpckldq %%mm0,%%mm1\n\t" \ - "movq "OC_I(1)",%%mm5\n\t" \ - "movq %%mm4,%%mm0\n\t" \ - "movq %%mm6,"OC_J(7)"\n\t" \ - "punpcklwd %%mm5,%%mm0\n\t" \ - "movq %%mm1,"OC_J(6)"\n\t" \ - "punpckhwd %%mm5,%%mm4\n\t" \ - "movq %%mm2,%%mm5\n\t" \ - "punpcklwd %%mm3,%%mm2\n\t" \ - "movq %%mm0,%%mm1\n\t" \ - "punpckldq %%mm2,%%mm0\n\t" \ - "punpckhdq %%mm2,%%mm1\n\t" \ - "movq %%mm4,%%mm2\n\t" \ - "movq %%mm0,"OC_I(0)"\n\t" \ - "punpckhwd %%mm3,%%mm5\n\t" \ - "movq %%mm1,"OC_I(1)"\n\t" \ - "punpckhdq %%mm5,%%mm4\n\t" \ - "punpckldq %%mm5,%%mm2\n\t" \ - "movq %%mm4,"OC_I(3)"\n\t" \ - "movq %%mm2,"OC_I(2)"\n\t" \ - "#end OC_TRANSPOSE\n\t" \ - -/*38+19=57 cycles.*/ -#define OC_COLUMN_IDCT \ - "#OC_COLUMN_IDCT\n" \ - OC_IDCT_BEGIN \ - "paddw "OC_8",%%mm2\n\t" \ - /*r1=H'+H'*/ \ - "paddw %%mm1,%%mm1\n\t" \ - /*r1=R1=A''+H'*/ \ - "paddw %%mm2,%%mm1\n\t" \ - /*r2=NR2*/ \ - "psraw $4,%%mm2\n\t" \ - /*r4=E'=E-G*/ \ - "psubw %%mm7,%%mm4\n\t" \ - /*r1=NR1*/ \ - "psraw $4,%%mm1\n\t" \ - /*r3=D'*/ \ - "movq "OC_I(2)",%%mm3\n\t" \ - /*r7=G+G*/ \ - "paddw %%mm7,%%mm7\n\t" \ - /*Store NR2 at I(2).*/ \ - "movq %%mm2,"OC_I(2)"\n\t" \ - /*r7=G'=E+G*/ \ - "paddw %%mm4,%%mm7\n\t" \ - /*Store NR1 at I(1).*/ \ - "movq %%mm1,"OC_I(1)"\n\t" \ - /*r4=R4=E'-D'*/ \ - "psubw %%mm3,%%mm4\n\t" \ - "paddw "OC_8",%%mm4\n\t" \ - /*r3=D'+D'*/ \ - "paddw %%mm3,%%mm3\n\t" \ - /*r3=R3=E'+D'*/ \ - "paddw %%mm4,%%mm3\n\t" \ - /*r4=NR4*/ \ - "psraw $4,%%mm4\n\t" \ - /*r6=R6=F'-B''*/ \ - "psubw %%mm5,%%mm6\n\t" \ - /*r3=NR3*/ \ - "psraw $4,%%mm3\n\t" \ - "paddw "OC_8",%%mm6\n\t" \ - /*r5=B''+B''*/ \ - "paddw %%mm5,%%mm5\n\t" \ - /*r5=R5=F'+B''*/ \ - "paddw %%mm6,%%mm5\n\t" \ - /*r6=NR6*/ \ - "psraw $4,%%mm6\n\t" \ - /*Store NR4 at J(4).*/ \ - "movq %%mm4,"OC_J(4)"\n\t" \ - /*r5=NR5*/ \ - "psraw $4,%%mm5\n\t" \ - /*Store NR3 at I(3).*/ \ - "movq %%mm3,"OC_I(3)"\n\t" \ - /*r7=R7=G'-C'*/ \ - "psubw %%mm0,%%mm7\n\t" \ - "paddw "OC_8",%%mm7\n\t" \ - /*r0=C'+C'*/ \ - "paddw %%mm0,%%mm0\n\t" \ - /*r0=R0=G'+C'*/ \ - "paddw %%mm7,%%mm0\n\t" \ - /*r7=NR7*/ \ - "psraw $4,%%mm7\n\t" \ - /*Store NR6 at J(6).*/ \ - "movq %%mm6,"OC_J(6)"\n\t" \ - /*r0=NR0*/ \ - "psraw $4,%%mm0\n\t" \ - /*Store NR5 at J(5).*/ \ - "movq %%mm5,"OC_J(5)"\n\t" \ - /*Store NR7 at J(7).*/ \ - "movq %%mm7,"OC_J(7)"\n\t" \ - /*Store NR0 at I(0).*/ \ - "movq %%mm0,"OC_I(0)"\n\t" \ - "#end OC_COLUMN_IDCT\n\t" \ - -#define OC_MID(_m,_i) OC_M2STR(_m+(_i)*8)"(%[c])" -#define OC_C(_i) OC_MID(OC_COSINE_OFFSET,_i-1) -#define OC_8 OC_MID(OC_EIGHT_OFFSET,0) - -static void oc_idct8x8_slow(ogg_int16_t _y[64]){ - /*This routine accepts an 8x8 matrix, but in partially transposed form. - Every 4x4 block is transposed.*/ - __asm__ __volatile__( -#define OC_I(_k) OC_M2STR((_k*16))"(%[y])" -#define OC_J(_k) OC_M2STR(((_k-4)*16)+8)"(%[y])" - OC_ROW_IDCT - OC_TRANSPOSE -#undef OC_I -#undef OC_J -#define OC_I(_k) OC_M2STR((_k*16)+64)"(%[y])" -#define OC_J(_k) OC_M2STR(((_k-4)*16)+72)"(%[y])" - OC_ROW_IDCT - OC_TRANSPOSE -#undef OC_I -#undef OC_J -#define OC_I(_k) OC_M2STR((_k*16))"(%[y])" -#define OC_J(_k) OC_I(_k) - OC_COLUMN_IDCT -#undef OC_I -#undef OC_J -#define OC_I(_k) OC_M2STR((_k*16)+8)"(%[y])" -#define OC_J(_k) OC_I(_k) - OC_COLUMN_IDCT -#undef OC_I -#undef OC_J - : - :[y]"r"(_y),[c]"r"(OC_IDCT_CONSTS) - ); -} - -/*25 cycles.*/ -#define OC_IDCT_BEGIN_10 \ - "#OC_IDCT_BEGIN_10\n\t" \ - "movq "OC_I(3)",%%mm2\n\t" \ - "nop\n\t" \ - "movq "OC_C(3)",%%mm6\n\t" \ - "movq %%mm2,%%mm4\n\t" \ - "movq "OC_C(5)",%%mm1\n\t" \ - "pmulhw %%mm6,%%mm4\n\t" \ - "movq "OC_I(1)",%%mm3\n\t" \ - "pmulhw %%mm2,%%mm1\n\t" \ - "movq "OC_C(1)",%%mm0\n\t" \ - "paddw %%mm2,%%mm4\n\t" \ - "pxor %%mm6,%%mm6\n\t" \ - "paddw %%mm1,%%mm2\n\t" \ - "movq "OC_I(2)",%%mm5\n\t" \ - "pmulhw %%mm3,%%mm0\n\t" \ - "movq %%mm5,%%mm1\n\t" \ - "paddw %%mm3,%%mm0\n\t" \ - "pmulhw "OC_C(7)",%%mm3\n\t" \ - "psubw %%mm2,%%mm6\n\t" \ - "pmulhw "OC_C(2)",%%mm5\n\t" \ - "psubw %%mm4,%%mm0\n\t" \ - "movq "OC_I(2)",%%mm7\n\t" \ - "paddw %%mm4,%%mm4\n\t" \ - "paddw %%mm5,%%mm7\n\t" \ - "paddw %%mm0,%%mm4\n\t" \ - "pmulhw "OC_C(6)",%%mm1\n\t" \ - "psubw %%mm6,%%mm3\n\t" \ - "movq %%mm4,"OC_I(1)"\n\t" \ - "paddw %%mm6,%%mm6\n\t" \ - "movq "OC_C(4)",%%mm4\n\t" \ - "paddw %%mm3,%%mm6\n\t" \ - "movq %%mm3,%%mm5\n\t" \ - "pmulhw %%mm4,%%mm3\n\t" \ - "movq %%mm6,"OC_I(2)"\n\t" \ - "movq %%mm0,%%mm2\n\t" \ - "movq "OC_I(0)",%%mm6\n\t" \ - "pmulhw %%mm4,%%mm0\n\t" \ - "paddw %%mm3,%%mm5\n\t" \ - "paddw %%mm0,%%mm2\n\t" \ - "psubw %%mm1,%%mm5\n\t" \ - "pmulhw %%mm4,%%mm6\n\t" \ - "paddw "OC_I(0)",%%mm6\n\t" \ - "paddw %%mm1,%%mm1\n\t" \ - "movq %%mm6,%%mm4\n\t" \ - "paddw %%mm5,%%mm1\n\t" \ - "psubw %%mm2,%%mm6\n\t" \ - "paddw %%mm2,%%mm2\n\t" \ - "movq "OC_I(1)",%%mm0\n\t" \ - "paddw %%mm6,%%mm2\n\t" \ - "psubw %%mm1,%%mm2\n\t" \ - "nop\n\t" \ - "#end OC_IDCT_BEGIN_10\n\t" \ - -/*25+8=33 cycles.*/ -#define OC_ROW_IDCT_10 \ - "#OC_ROW_IDCT_10\n\t" \ - OC_IDCT_BEGIN_10 \ - /*r3=D'*/ \ - "movq "OC_I(2)",%%mm3\n\t" \ - /*r4=E'=E-G*/ \ - "psubw %%mm7,%%mm4\n\t" \ - /*r1=H'+H'*/ \ - "paddw %%mm1,%%mm1\n\t" \ - /*r7=G+G*/ \ - "paddw %%mm7,%%mm7\n\t" \ - /*r1=R1=A''+H'*/ \ - "paddw %%mm2,%%mm1\n\t" \ - /*r7=G'=E+G*/ \ - "paddw %%mm4,%%mm7\n\t" \ - /*r4=R4=E'-D'*/ \ - "psubw %%mm3,%%mm4\n\t" \ - "paddw %%mm3,%%mm3\n\t" \ - /*r6=R6=F'-B''*/ \ - "psubw %%mm5,%%mm6\n\t" \ - "paddw %%mm5,%%mm5\n\t" \ - /*r3=R3=E'+D'*/ \ - "paddw %%mm4,%%mm3\n\t" \ - /*r5=R5=F'+B''*/ \ - "paddw %%mm6,%%mm5\n\t" \ - /*r7=R7=G'-C'*/ \ - "psubw %%mm0,%%mm7\n\t" \ - "paddw %%mm0,%%mm0\n\t" \ - /*Save R1.*/ \ - "movq %%mm1,"OC_I(1)"\n\t" \ - /*r0=R0=G'+C'*/ \ - "paddw %%mm7,%%mm0\n\t" \ - "#end OC_ROW_IDCT_10\n\t" \ - -/*25+19=44 cycles'*/ -#define OC_COLUMN_IDCT_10 \ - "#OC_COLUMN_IDCT_10\n\t" \ - OC_IDCT_BEGIN_10 \ - "paddw "OC_8",%%mm2\n\t" \ - /*r1=H'+H'*/ \ - "paddw %%mm1,%%mm1\n\t" \ - /*r1=R1=A''+H'*/ \ - "paddw %%mm2,%%mm1\n\t" \ - /*r2=NR2*/ \ - "psraw $4,%%mm2\n\t" \ - /*r4=E'=E-G*/ \ - "psubw %%mm7,%%mm4\n\t" \ - /*r1=NR1*/ \ - "psraw $4,%%mm1\n\t" \ - /*r3=D'*/ \ - "movq "OC_I(2)",%%mm3\n\t" \ - /*r7=G+G*/ \ - "paddw %%mm7,%%mm7\n\t" \ - /*Store NR2 at I(2).*/ \ - "movq %%mm2,"OC_I(2)"\n\t" \ - /*r7=G'=E+G*/ \ - "paddw %%mm4,%%mm7\n\t" \ - /*Store NR1 at I(1).*/ \ - "movq %%mm1,"OC_I(1)"\n\t" \ - /*r4=R4=E'-D'*/ \ - "psubw %%mm3,%%mm4\n\t" \ - "paddw "OC_8",%%mm4\n\t" \ - /*r3=D'+D'*/ \ - "paddw %%mm3,%%mm3\n\t" \ - /*r3=R3=E'+D'*/ \ - "paddw %%mm4,%%mm3\n\t" \ - /*r4=NR4*/ \ - "psraw $4,%%mm4\n\t" \ - /*r6=R6=F'-B''*/ \ - "psubw %%mm5,%%mm6\n\t" \ - /*r3=NR3*/ \ - "psraw $4,%%mm3\n\t" \ - "paddw "OC_8",%%mm6\n\t" \ - /*r5=B''+B''*/ \ - "paddw %%mm5,%%mm5\n\t" \ - /*r5=R5=F'+B''*/ \ - "paddw %%mm6,%%mm5\n\t" \ - /*r6=NR6*/ \ - "psraw $4,%%mm6\n\t" \ - /*Store NR4 at J(4).*/ \ - "movq %%mm4,"OC_J(4)"\n\t" \ - /*r5=NR5*/ \ - "psraw $4,%%mm5\n\t" \ - /*Store NR3 at I(3).*/ \ - "movq %%mm3,"OC_I(3)"\n\t" \ - /*r7=R7=G'-C'*/ \ - "psubw %%mm0,%%mm7\n\t" \ - "paddw "OC_8",%%mm7\n\t" \ - /*r0=C'+C'*/ \ - "paddw %%mm0,%%mm0\n\t" \ - /*r0=R0=G'+C'*/ \ - "paddw %%mm7,%%mm0\n\t" \ - /*r7=NR7*/ \ - "psraw $4,%%mm7\n\t" \ - /*Store NR6 at J(6).*/ \ - "movq %%mm6,"OC_J(6)"\n\t" \ - /*r0=NR0*/ \ - "psraw $4,%%mm0\n\t" \ - /*Store NR5 at J(5).*/ \ - "movq %%mm5,"OC_J(5)"\n\t" \ - /*Store NR7 at J(7).*/ \ - "movq %%mm7,"OC_J(7)"\n\t" \ - /*Store NR0 at I(0).*/ \ - "movq %%mm0,"OC_I(0)"\n\t" \ - "#end OC_COLUMN_IDCT_10\n\t" \ - -static void oc_idct8x8_10(ogg_int16_t _y[64]){ - __asm__ __volatile__( -#define OC_I(_k) OC_M2STR((_k*16))"(%[y])" -#define OC_J(_k) OC_M2STR(((_k-4)*16)+8)"(%[y])" - /*Done with dequant, descramble, and partial transpose. - Now do the iDCT itself.*/ - OC_ROW_IDCT_10 - OC_TRANSPOSE -#undef OC_I -#undef OC_J -#define OC_I(_k) OC_M2STR((_k*16))"(%[y])" -#define OC_J(_k) OC_I(_k) - OC_COLUMN_IDCT_10 -#undef OC_I -#undef OC_J -#define OC_I(_k) OC_M2STR((_k*16)+8)"(%[y])" -#define OC_J(_k) OC_I(_k) - OC_COLUMN_IDCT_10 -#undef OC_I -#undef OC_J - : - :[y]"r"(_y),[c]"r"(OC_IDCT_CONSTS) - ); -} - -/*Performs an inverse 8x8 Type-II DCT transform. - The input is assumed to be scaled by a factor of 4 relative to orthonormal - version of the transform.*/ -void oc_idct8x8_mmx(ogg_int16_t _y[64],int _last_zzi){ - /*_last_zzi is subtly different from an actual count of the number of - coefficients we decoded for this block. - It contains the value of zzi BEFORE the final token in the block was - decoded. - In most cases this is an EOB token (the continuation of an EOB run from a - previous block counts), and so this is the same as the coefficient count. - However, in the case that the last token was NOT an EOB token, but filled - the block up with exactly 64 coefficients, _last_zzi will be less than 64. - Provided the last token was not a pure zero run, the minimum value it can - be is 46, and so that doesn't affect any of the cases in this routine. - However, if the last token WAS a pure zero run of length 63, then _last_zzi - will be 1 while the number of coefficients decoded is 64. - Thus, we will trigger the following special case, where the real - coefficient count would not. - Note also that a zero run of length 64 will give _last_zzi a value of 0, - but we still process the DC coefficient, which might have a non-zero value - due to DC prediction. - Although convoluted, this is arguably the correct behavior: it allows us to - use a smaller transform when the block ends with a long zero run instead - of a normal EOB token. - It could be smarter... multiple separate zero runs at the end of a block - will fool it, but an encoder that generates these really deserves what it - gets. - Needless to say we inherited this approach from VP3.*/ - /*Then perform the iDCT.*/ - if(_last_zzi<10)oc_idct8x8_10(_y); - else oc_idct8x8_slow(_y); -} - -#endif diff --git a/drivers/theora/x86/mmxloop.h b/drivers/theora/x86/mmxloop.h deleted file mode 100644 index 2e870c795d..0000000000 --- a/drivers/theora/x86/mmxloop.h +++ /dev/null @@ -1,215 +0,0 @@ -#if !defined(_x86_mmxloop_H) -# define _x86_mmxloop_H (1) -# include <stddef.h> -# include "x86int.h" - -#if defined(OC_X86_ASM) - -/*On entry, mm0={a0,...,a7}, mm1={b0,...,b7}, mm2={c0,...,c7}, mm3={d0,...d7}. - On exit, mm1={b0+lflim(R_0,L),...,b7+lflim(R_7,L)} and - mm2={c0-lflim(R_0,L),...,c7-lflim(R_7,L)}; mm0 and mm3 are clobbered.*/ -#define OC_LOOP_FILTER8_MMX \ - "#OC_LOOP_FILTER8_MMX\n\t" \ - /*mm7=0*/ \ - "pxor %%mm7,%%mm7\n\t" \ - /*mm6:mm0={a0,...,a7}*/ \ - "movq %%mm0,%%mm6\n\t" \ - "punpcklbw %%mm7,%%mm0\n\t" \ - "punpckhbw %%mm7,%%mm6\n\t" \ - /*mm3:mm5={d0,...,d7}*/ \ - "movq %%mm3,%%mm5\n\t" \ - "punpcklbw %%mm7,%%mm3\n\t" \ - "punpckhbw %%mm7,%%mm5\n\t" \ - /*mm6:mm0={a0-d0,...,a7-d7}*/ \ - "psubw %%mm3,%%mm0\n\t" \ - "psubw %%mm5,%%mm6\n\t" \ - /*mm3:mm1={b0,...,b7}*/ \ - "movq %%mm1,%%mm3\n\t" \ - "punpcklbw %%mm7,%%mm1\n\t" \ - "movq %%mm2,%%mm4\n\t" \ - "punpckhbw %%mm7,%%mm3\n\t" \ - /*mm5:mm4={c0,...,c7}*/ \ - "movq %%mm2,%%mm5\n\t" \ - "punpcklbw %%mm7,%%mm4\n\t" \ - "punpckhbw %%mm7,%%mm5\n\t" \ - /*mm7={3}x4 \ - mm5:mm4={c0-b0,...,c7-b7}*/ \ - "pcmpeqw %%mm7,%%mm7\n\t" \ - "psubw %%mm1,%%mm4\n\t" \ - "psrlw $14,%%mm7\n\t" \ - "psubw %%mm3,%%mm5\n\t" \ - /*Scale by 3.*/ \ - "pmullw %%mm7,%%mm4\n\t" \ - "pmullw %%mm7,%%mm5\n\t" \ - /*mm7={4}x4 \ - mm5:mm4=f={a0-d0+3*(c0-b0),...,a7-d7+3*(c7-b7)}*/ \ - "psrlw $1,%%mm7\n\t" \ - "paddw %%mm0,%%mm4\n\t" \ - "psllw $2,%%mm7\n\t" \ - "movq (%[ll]),%%mm0\n\t" \ - "paddw %%mm6,%%mm5\n\t" \ - /*R_i has the range [-127,128], so we compute -R_i instead. \ - mm4=-R_i=-(f+4>>3)=0xFF^(f-4>>3)*/ \ - "psubw %%mm7,%%mm4\n\t" \ - "psubw %%mm7,%%mm5\n\t" \ - "psraw $3,%%mm4\n\t" \ - "psraw $3,%%mm5\n\t" \ - "pcmpeqb %%mm7,%%mm7\n\t" \ - "packsswb %%mm5,%%mm4\n\t" \ - "pxor %%mm6,%%mm6\n\t" \ - "pxor %%mm7,%%mm4\n\t" \ - "packuswb %%mm3,%%mm1\n\t" \ - /*Now compute lflim of -mm4 cf. Section 7.10 of the sepc.*/ \ - /*There's no unsigned byte+signed byte with unsigned saturation op code, so \ - we have to split things by sign (the other option is to work in 16 bits, \ - but working in 8 bits gives much better parallelism). \ - We compute abs(R_i), but save a mask of which terms were negative in mm6. \ - Then we compute mm4=abs(lflim(R_i,L))=min(abs(R_i),max(2*L-abs(R_i),0)). \ - Finally, we split mm4 into positive and negative pieces using the mask in \ - mm6, and add and subtract them as appropriate.*/ \ - /*mm4=abs(-R_i)*/ \ - /*mm7=255-2*L*/ \ - "pcmpgtb %%mm4,%%mm6\n\t" \ - "psubb %%mm0,%%mm7\n\t" \ - "pxor %%mm6,%%mm4\n\t" \ - "psubb %%mm0,%%mm7\n\t" \ - "psubb %%mm6,%%mm4\n\t" \ - /*mm7=255-max(2*L-abs(R_i),0)*/ \ - "paddusb %%mm4,%%mm7\n\t" \ - /*mm4=min(abs(R_i),max(2*L-abs(R_i),0))*/ \ - "paddusb %%mm7,%%mm4\n\t" \ - "psubusb %%mm7,%%mm4\n\t" \ - /*Now split mm4 by the original sign of -R_i.*/ \ - "movq %%mm4,%%mm5\n\t" \ - "pand %%mm6,%%mm4\n\t" \ - "pandn %%mm5,%%mm6\n\t" \ - /*mm1={b0+lflim(R_0,L),...,b7+lflim(R_7,L)}*/ \ - /*mm2={c0-lflim(R_0,L),...,c7-lflim(R_7,L)}*/ \ - "paddusb %%mm4,%%mm1\n\t" \ - "psubusb %%mm4,%%mm2\n\t" \ - "psubusb %%mm6,%%mm1\n\t" \ - "paddusb %%mm6,%%mm2\n\t" \ - -#define OC_LOOP_FILTER_V_MMX(_pix,_ystride,_ll) \ - do{ \ - ptrdiff_t ystride3__; \ - __asm__ __volatile__( \ - /*mm0={a0,...,a7}*/ \ - "movq (%[pix]),%%mm0\n\t" \ - /*ystride3=_ystride*3*/ \ - "lea (%[ystride],%[ystride],2),%[ystride3]\n\t" \ - /*mm3={d0,...,d7}*/ \ - "movq (%[pix],%[ystride3]),%%mm3\n\t" \ - /*mm1={b0,...,b7}*/ \ - "movq (%[pix],%[ystride]),%%mm1\n\t" \ - /*mm2={c0,...,c7}*/ \ - "movq (%[pix],%[ystride],2),%%mm2\n\t" \ - OC_LOOP_FILTER8_MMX \ - /*Write it back out.*/ \ - "movq %%mm1,(%[pix],%[ystride])\n\t" \ - "movq %%mm2,(%[pix],%[ystride],2)\n\t" \ - :[ystride3]"=&r"(ystride3__) \ - :[pix]"r"(_pix-_ystride*2),[ystride]"r"((ptrdiff_t)(_ystride)), \ - [ll]"r"(_ll) \ - :"memory" \ - ); \ - } \ - while(0) - -#define OC_LOOP_FILTER_H_MMX(_pix,_ystride,_ll) \ - do{ \ - unsigned char *pix__; \ - ptrdiff_t ystride3__; \ - ptrdiff_t d__; \ - pix__=(_pix)-2; \ - __asm__ __volatile__( \ - /*x x x x d0 c0 b0 a0*/ \ - "movd (%[pix]),%%mm0\n\t" \ - /*x x x x d1 c1 b1 a1*/ \ - "movd (%[pix],%[ystride]),%%mm1\n\t" \ - /*ystride3=_ystride*3*/ \ - "lea (%[ystride],%[ystride],2),%[ystride3]\n\t" \ - /*x x x x d2 c2 b2 a2*/ \ - "movd (%[pix],%[ystride],2),%%mm2\n\t" \ - /*x x x x d3 c3 b3 a3*/ \ - "lea (%[pix],%[ystride],4),%[d]\n\t" \ - "movd (%[pix],%[ystride3]),%%mm3\n\t" \ - /*x x x x d4 c4 b4 a4*/ \ - "movd (%[d]),%%mm4\n\t" \ - /*x x x x d5 c5 b5 a5*/ \ - "movd (%[d],%[ystride]),%%mm5\n\t" \ - /*x x x x d6 c6 b6 a6*/ \ - "movd (%[d],%[ystride],2),%%mm6\n\t" \ - /*x x x x d7 c7 b7 a7*/ \ - "movd (%[d],%[ystride3]),%%mm7\n\t" \ - /*mm0=d1 d0 c1 c0 b1 b0 a1 a0*/ \ - "punpcklbw %%mm1,%%mm0\n\t" \ - /*mm2=d3 d2 c3 c2 b3 b2 a3 a2*/ \ - "punpcklbw %%mm3,%%mm2\n\t" \ - /*mm3=d1 d0 c1 c0 b1 b0 a1 a0*/ \ - "movq %%mm0,%%mm3\n\t" \ - /*mm0=b3 b2 b1 b0 a3 a2 a1 a0*/ \ - "punpcklwd %%mm2,%%mm0\n\t" \ - /*mm3=d3 d2 d1 d0 c3 c2 c1 c0*/ \ - "punpckhwd %%mm2,%%mm3\n\t" \ - /*mm1=b3 b2 b1 b0 a3 a2 a1 a0*/ \ - "movq %%mm0,%%mm1\n\t" \ - /*mm4=d5 d4 c5 c4 b5 b4 a5 a4*/ \ - "punpcklbw %%mm5,%%mm4\n\t" \ - /*mm6=d7 d6 c7 c6 b7 b6 a7 a6*/ \ - "punpcklbw %%mm7,%%mm6\n\t" \ - /*mm5=d5 d4 c5 c4 b5 b4 a5 a4*/ \ - "movq %%mm4,%%mm5\n\t" \ - /*mm4=b7 b6 b5 b4 a7 a6 a5 a4*/ \ - "punpcklwd %%mm6,%%mm4\n\t" \ - /*mm5=d7 d6 d5 d4 c7 c6 c5 c4*/ \ - "punpckhwd %%mm6,%%mm5\n\t" \ - /*mm2=d3 d2 d1 d0 c3 c2 c1 c0*/ \ - "movq %%mm3,%%mm2\n\t" \ - /*mm0=a7 a6 a5 a4 a3 a2 a1 a0*/ \ - "punpckldq %%mm4,%%mm0\n\t" \ - /*mm1=b7 b6 b5 b4 b3 b2 b1 b0*/ \ - "punpckhdq %%mm4,%%mm1\n\t" \ - /*mm2=c7 c6 c5 c4 c3 c2 c1 c0*/ \ - "punpckldq %%mm5,%%mm2\n\t" \ - /*mm3=d7 d6 d5 d4 d3 d2 d1 d0*/ \ - "punpckhdq %%mm5,%%mm3\n\t" \ - OC_LOOP_FILTER8_MMX \ - /*mm2={b0+R_0'',...,b7+R_7''}*/ \ - "movq %%mm1,%%mm0\n\t" \ - /*mm1={b0+R_0'',c0-R_0'',...,b3+R_3'',c3-R_3''}*/ \ - "punpcklbw %%mm2,%%mm1\n\t" \ - /*mm2={b4+R_4'',c4-R_4'',...,b7+R_7'',c7-R_7''}*/ \ - "punpckhbw %%mm2,%%mm0\n\t" \ - /*[d]=c1 b1 c0 b0*/ \ - "movd %%mm1,%[d]\n\t" \ - "movw %w[d],1(%[pix])\n\t" \ - "psrlq $32,%%mm1\n\t" \ - "shr $16,%[d]\n\t" \ - "movw %w[d],1(%[pix],%[ystride])\n\t" \ - /*[d]=c3 b3 c2 b2*/ \ - "movd %%mm1,%[d]\n\t" \ - "movw %w[d],1(%[pix],%[ystride],2)\n\t" \ - "shr $16,%[d]\n\t" \ - "movw %w[d],1(%[pix],%[ystride3])\n\t" \ - "lea (%[pix],%[ystride],4),%[pix]\n\t" \ - /*[d]=c5 b5 c4 b4*/ \ - "movd %%mm0,%[d]\n\t" \ - "movw %w[d],1(%[pix])\n\t" \ - "psrlq $32,%%mm0\n\t" \ - "shr $16,%[d]\n\t" \ - "movw %w[d],1(%[pix],%[ystride])\n\t" \ - /*[d]=c7 b7 c6 b6*/ \ - "movd %%mm0,%[d]\n\t" \ - "movw %w[d],1(%[pix],%[ystride],2)\n\t" \ - "shr $16,%[d]\n\t" \ - "movw %w[d],1(%[pix],%[ystride3])\n\t" \ - :[pix]"+r"(pix__),[ystride3]"=&r"(ystride3__),[d]"=&r"(d__) \ - :[ystride]"r"((ptrdiff_t)(_ystride)),[ll]"r"(_ll) \ - :"memory" \ - ); \ - } \ - while(0) - -# endif -#endif diff --git a/drivers/theora/x86/mmxstate.c b/drivers/theora/x86/mmxstate.c deleted file mode 100644 index 808b0a789b..0000000000 --- a/drivers/theora/x86/mmxstate.c +++ /dev/null @@ -1,188 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ******************************************************************** - - function: - last mod: $Id: mmxstate.c 16503 2009-08-22 18:14:02Z giles $ - - ********************************************************************/ - -/*MMX acceleration of complete fragment reconstruction algorithm. - Originally written by Rudolf Marek.*/ -#include <string.h> -#include "x86int.h" -#include "mmxfrag.h" -#include "mmxloop.h" - -#if defined(OC_X86_ASM) - -void oc_state_frag_recon_mmx(const oc_theora_state *_state,ptrdiff_t _fragi, - int _pli,ogg_int16_t _dct_coeffs[64],int _last_zzi,ogg_uint16_t _dc_quant){ - unsigned char *dst; - ptrdiff_t frag_buf_off; - int ystride; - int mb_mode; - /*Apply the inverse transform.*/ - /*Special case only having a DC component.*/ - if(_last_zzi<2){ - /*Note that this value must be unsigned, to keep the __asm__ block from - sign-extending it when it puts it in a register.*/ - ogg_uint16_t p; - /*We round this dequant product (and not any of the others) because there's - no iDCT rounding.*/ - p=(ogg_int16_t)(_dct_coeffs[0]*(ogg_int32_t)_dc_quant+15>>5); - /*Fill _dct_coeffs with p.*/ - __asm__ __volatile__( - /*mm0=0000 0000 0000 AAAA*/ - "movd %[p],%%mm0\n\t" - /*mm0=0000 0000 AAAA AAAA*/ - "punpcklwd %%mm0,%%mm0\n\t" - /*mm0=AAAA AAAA AAAA AAAA*/ - "punpckldq %%mm0,%%mm0\n\t" - "movq %%mm0,(%[y])\n\t" - "movq %%mm0,8(%[y])\n\t" - "movq %%mm0,16(%[y])\n\t" - "movq %%mm0,24(%[y])\n\t" - "movq %%mm0,32(%[y])\n\t" - "movq %%mm0,40(%[y])\n\t" - "movq %%mm0,48(%[y])\n\t" - "movq %%mm0,56(%[y])\n\t" - "movq %%mm0,64(%[y])\n\t" - "movq %%mm0,72(%[y])\n\t" - "movq %%mm0,80(%[y])\n\t" - "movq %%mm0,88(%[y])\n\t" - "movq %%mm0,96(%[y])\n\t" - "movq %%mm0,104(%[y])\n\t" - "movq %%mm0,112(%[y])\n\t" - "movq %%mm0,120(%[y])\n\t" - : - :[y]"r"(_dct_coeffs),[p]"r"((unsigned)p) - :"memory" - ); - } - else{ - /*Dequantize the DC coefficient.*/ - _dct_coeffs[0]=(ogg_int16_t)(_dct_coeffs[0]*(int)_dc_quant); - oc_idct8x8_mmx(_dct_coeffs,_last_zzi); - } - /*Fill in the target buffer.*/ - frag_buf_off=_state->frag_buf_offs[_fragi]; - mb_mode=_state->frags[_fragi].mb_mode; - ystride=_state->ref_ystride[_pli]; - dst=_state->ref_frame_data[_state->ref_frame_idx[OC_FRAME_SELF]]+frag_buf_off; - if(mb_mode==OC_MODE_INTRA)oc_frag_recon_intra_mmx(dst,ystride,_dct_coeffs); - else{ - const unsigned char *ref; - int mvoffsets[2]; - ref= - _state->ref_frame_data[_state->ref_frame_idx[OC_FRAME_FOR_MODE(mb_mode)]] - +frag_buf_off; - if(oc_state_get_mv_offsets(_state,mvoffsets,_pli, - _state->frag_mvs[_fragi][0],_state->frag_mvs[_fragi][1])>1){ - oc_frag_recon_inter2_mmx(dst,ref+mvoffsets[0],ref+mvoffsets[1],ystride, - _dct_coeffs); - } - else oc_frag_recon_inter_mmx(dst,ref+mvoffsets[0],ystride,_dct_coeffs); - } -} - -/*We copy these entire function to inline the actual MMX routines so that we - use only a single indirect call.*/ - -/*Copies the fragments specified by the lists of fragment indices from one - frame to another. - _fragis: A pointer to a list of fragment indices. - _nfragis: The number of fragment indices to copy. - _dst_frame: The reference frame to copy to. - _src_frame: The reference frame to copy from. - _pli: The color plane the fragments lie in.*/ -void oc_state_frag_copy_list_mmx(const oc_theora_state *_state, - const ptrdiff_t *_fragis,ptrdiff_t _nfragis, - int _dst_frame,int _src_frame,int _pli){ - const ptrdiff_t *frag_buf_offs; - const unsigned char *src_frame_data; - unsigned char *dst_frame_data; - ptrdiff_t fragii; - int ystride; - dst_frame_data=_state->ref_frame_data[_state->ref_frame_idx[_dst_frame]]; - src_frame_data=_state->ref_frame_data[_state->ref_frame_idx[_src_frame]]; - ystride=_state->ref_ystride[_pli]; - frag_buf_offs=_state->frag_buf_offs; - for(fragii=0;fragii<_nfragis;fragii++){ - ptrdiff_t frag_buf_off; - frag_buf_off=frag_buf_offs[_fragis[fragii]]; - OC_FRAG_COPY_MMX(dst_frame_data+frag_buf_off, - src_frame_data+frag_buf_off,ystride); - } -} - -/*Apply the loop filter to a given set of fragment rows in the given plane. - The filter may be run on the bottom edge, affecting pixels in the next row of - fragments, so this row also needs to be available. - _bv: The bounding values array. - _refi: The index of the frame buffer to filter. - _pli: The color plane to filter. - _fragy0: The Y coordinate of the first fragment row to filter. - _fragy_end: The Y coordinate of the fragment row to stop filtering at.*/ -void oc_state_loop_filter_frag_rows_mmx(const oc_theora_state *_state, - int _bv[256],int _refi,int _pli,int _fragy0,int _fragy_end){ - OC_ALIGN8(unsigned char ll[8]); - const oc_fragment_plane *fplane; - const oc_fragment *frags; - const ptrdiff_t *frag_buf_offs; - unsigned char *ref_frame_data; - ptrdiff_t fragi_top; - ptrdiff_t fragi_bot; - ptrdiff_t fragi0; - ptrdiff_t fragi0_end; - int ystride; - int nhfrags; - memset(ll,_state->loop_filter_limits[_state->qis[0]],sizeof(ll)); - fplane=_state->fplanes+_pli; - nhfrags=fplane->nhfrags; - fragi_top=fplane->froffset; - fragi_bot=fragi_top+fplane->nfrags; - fragi0=fragi_top+_fragy0*(ptrdiff_t)nhfrags; - fragi0_end=fragi0+(_fragy_end-_fragy0)*(ptrdiff_t)nhfrags; - ystride=_state->ref_ystride[_pli]; - frags=_state->frags; - frag_buf_offs=_state->frag_buf_offs; - ref_frame_data=_state->ref_frame_data[_refi]; - /*The following loops are constructed somewhat non-intuitively on purpose. - The main idea is: if a block boundary has at least one coded fragment on - it, the filter is applied to it. - However, the order that the filters are applied in matters, and VP3 chose - the somewhat strange ordering used below.*/ - while(fragi0<fragi0_end){ - ptrdiff_t fragi; - ptrdiff_t fragi_end; - fragi=fragi0; - fragi_end=fragi+nhfrags; - while(fragi<fragi_end){ - if(frags[fragi].coded){ - unsigned char *ref; - ref=ref_frame_data+frag_buf_offs[fragi]; - if(fragi>fragi0)OC_LOOP_FILTER_H_MMX(ref,ystride,ll); - if(fragi0>fragi_top)OC_LOOP_FILTER_V_MMX(ref,ystride,ll); - if(fragi+1<fragi_end&&!frags[fragi+1].coded){ - OC_LOOP_FILTER_H_MMX(ref+8,ystride,ll); - } - if(fragi+nhfrags<fragi_bot&&!frags[fragi+nhfrags].coded){ - OC_LOOP_FILTER_V_MMX(ref+(ystride<<3),ystride,ll); - } - } - fragi++; - } - fragi0+=nhfrags; - } -} - -#endif diff --git a/drivers/theora/x86/sse2fdct.c b/drivers/theora/x86/sse2fdct.c deleted file mode 100644 index 86c17d68b1..0000000000 --- a/drivers/theora/x86/sse2fdct.c +++ /dev/null @@ -1,523 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 1999-2006 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ********************************************************************/ -/*SSE2 fDCT implementation for x86_64.*/ -/*$Id: fdct_ses2.c 14579 2008-03-12 06:42:40Z xiphmont $*/ -#include <stddef.h> -#include "x86enc.h" - -#if defined(OC_X86_64_ASM) - -# define OC_FDCT8x8 \ - /*Note: xmm15={0}x8 and xmm14={-1}x8.*/ \ - "#OC_FDCT8x8\n\t" \ - /*Stage 1:*/ \ - "movdqa %%xmm0,%%xmm11\n\t" \ - "movdqa %%xmm1,%%xmm10\n\t" \ - "movdqa %%xmm2,%%xmm9\n\t" \ - "movdqa %%xmm3,%%xmm8\n\t" \ - /*xmm11=t7'=t0-t7*/ \ - "psubw %%xmm7,%%xmm11\n\t" \ - /*xmm10=t6'=t1-t6*/ \ - "psubw %%xmm6,%%xmm10\n\t" \ - /*xmm9=t5'=t2-t5*/ \ - "psubw %%xmm5,%%xmm9\n\t" \ - /*xmm8=t4'=t3-t4*/ \ - "psubw %%xmm4,%%xmm8\n\t" \ - /*xmm0=t0'=t0+t7*/ \ - "paddw %%xmm7,%%xmm0\n\t" \ - /*xmm1=t1'=t1+t6*/ \ - "paddw %%xmm6,%%xmm1\n\t" \ - /*xmm5=t2'=t2+t5*/ \ - "paddw %%xmm2,%%xmm5\n\t" \ - /*xmm4=t3'=t3+t4*/ \ - "paddw %%xmm3,%%xmm4\n\t" \ - /*xmm2,3,6,7 are now free.*/ \ - /*Stage 2:*/ \ - "movdqa %%xmm0,%%xmm3\n\t" \ - "mov $0x5A806A0A,%[a]\n\t" \ - "movdqa %%xmm1,%%xmm2\n\t" \ - "movd %[a],%%xmm13\n\t" \ - "movdqa %%xmm10,%%xmm6\n\t" \ - "pshufd $00,%%xmm13,%%xmm13\n\t" \ - /*xmm2=t2''=t1'-t2'*/ \ - "psubw %%xmm5,%%xmm2\n\t" \ - "pxor %%xmm12,%%xmm12\n\t" \ - /*xmm3=t3''=t0'-t3'*/ \ - "psubw %%xmm4,%%xmm3\n\t" \ - "psubw %%xmm14,%%xmm12\n\t" \ - /*xmm10=t5''=t6'-t5'*/ \ - "psubw %%xmm9,%%xmm10\n\t" \ - "paddw %%xmm12,%%xmm12\n\t" \ - /*xmm4=t0''=t0'+t3'*/ \ - "paddw %%xmm0,%%xmm4\n\t" \ - /*xmm1=t1''=t1'+t2'*/ \ - "paddw %%xmm5,%%xmm1\n\t" \ - /*xmm6=t6''=t6'+t5'*/ \ - "paddw %%xmm9,%%xmm6\n\t" \ - /*xmm0,xmm5,xmm9 are now free.*/ \ - /*Stage 3:*/ \ - /*xmm10:xmm5=t5''*27146+0xB500 \ - xmm0=t5''*/ \ - "movdqa %%xmm10,%%xmm5\n\t" \ - "movdqa %%xmm10,%%xmm0\n\t" \ - "punpckhwd %%xmm12,%%xmm10\n\t" \ - "pmaddwd %%xmm13,%%xmm10\n\t" \ - "punpcklwd %%xmm12,%%xmm5\n\t" \ - "pmaddwd %%xmm13,%%xmm5\n\t" \ - /*xmm5=(t5''*27146+0xB500>>16)+t5''*/ \ - "psrad $16,%%xmm10\n\t" \ - "psrad $16,%%xmm5\n\t" \ - "packssdw %%xmm10,%%xmm5\n\t" \ - "paddw %%xmm0,%%xmm5\n\t" \ - /*xmm0=s=(t5''*27146+0xB500>>16)+t5''+(t5''!=0)>>1*/ \ - "pcmpeqw %%xmm15,%%xmm0\n\t" \ - "psubw %%xmm14,%%xmm0\n\t" \ - "paddw %%xmm5,%%xmm0\n\t" \ - "movdqa %%xmm8,%%xmm5\n\t" \ - "psraw $1,%%xmm0\n\t" \ - /*xmm5=t5'''=t4'-s*/ \ - "psubw %%xmm0,%%xmm5\n\t" \ - /*xmm8=t4''=t4'+s*/ \ - "paddw %%xmm0,%%xmm8\n\t" \ - /*xmm0,xmm7,xmm9,xmm10 are free.*/ \ - /*xmm7:xmm9=t6''*27146+0xB500*/ \ - "movdqa %%xmm6,%%xmm7\n\t" \ - "movdqa %%xmm6,%%xmm9\n\t" \ - "punpckhwd %%xmm12,%%xmm7\n\t" \ - "pmaddwd %%xmm13,%%xmm7\n\t" \ - "punpcklwd %%xmm12,%%xmm9\n\t" \ - "pmaddwd %%xmm13,%%xmm9\n\t" \ - /*xmm9=(t6''*27146+0xB500>>16)+t6''*/ \ - "psrad $16,%%xmm7\n\t" \ - "psrad $16,%%xmm9\n\t" \ - "packssdw %%xmm7,%%xmm9\n\t" \ - "paddw %%xmm6,%%xmm9\n\t" \ - /*xmm9=s=(t6''*27146+0xB500>>16)+t6''+(t6''!=0)>>1*/ \ - "pcmpeqw %%xmm15,%%xmm6\n\t" \ - "psubw %%xmm14,%%xmm6\n\t" \ - "paddw %%xmm6,%%xmm9\n\t" \ - "movdqa %%xmm11,%%xmm7\n\t" \ - "psraw $1,%%xmm9\n\t" \ - /*xmm7=t6'''=t7'-s*/ \ - "psubw %%xmm9,%%xmm7\n\t" \ - /*xmm9=t7''=t7'+s*/ \ - "paddw %%xmm11,%%xmm9\n\t" \ - /*xmm0,xmm6,xmm10,xmm11 are free.*/ \ - /*Stage 4:*/ \ - /*xmm10:xmm0=t1''*27146+0xB500*/ \ - "movdqa %%xmm1,%%xmm0\n\t" \ - "movdqa %%xmm1,%%xmm10\n\t" \ - "punpcklwd %%xmm12,%%xmm0\n\t" \ - "pmaddwd %%xmm13,%%xmm0\n\t" \ - "punpckhwd %%xmm12,%%xmm10\n\t" \ - "pmaddwd %%xmm13,%%xmm10\n\t" \ - /*xmm0=(t1''*27146+0xB500>>16)+t1''*/ \ - "psrad $16,%%xmm0\n\t" \ - "psrad $16,%%xmm10\n\t" \ - "mov $0x20006A0A,%[a]\n\t" \ - "packssdw %%xmm10,%%xmm0\n\t" \ - "movd %[a],%%xmm13\n\t" \ - "paddw %%xmm1,%%xmm0\n\t" \ - /*xmm0=s=(t1''*27146+0xB500>>16)+t1''+(t1''!=0)*/ \ - "pcmpeqw %%xmm15,%%xmm1\n\t" \ - "pshufd $00,%%xmm13,%%xmm13\n\t" \ - "psubw %%xmm14,%%xmm1\n\t" \ - "paddw %%xmm1,%%xmm0\n\t" \ - /*xmm10:xmm4=t0''*27146+0x4000*/ \ - "movdqa %%xmm4,%%xmm1\n\t" \ - "movdqa %%xmm4,%%xmm10\n\t" \ - "punpcklwd %%xmm12,%%xmm4\n\t" \ - "pmaddwd %%xmm13,%%xmm4\n\t" \ - "punpckhwd %%xmm12,%%xmm10\n\t" \ - "pmaddwd %%xmm13,%%xmm10\n\t" \ - /*xmm4=(t0''*27146+0x4000>>16)+t0''*/ \ - "psrad $16,%%xmm4\n\t" \ - "psrad $16,%%xmm10\n\t" \ - "mov $0x6CB7,%[a]\n\t" \ - "packssdw %%xmm10,%%xmm4\n\t" \ - "movd %[a],%%xmm12\n\t" \ - "paddw %%xmm1,%%xmm4\n\t" \ - /*xmm4=r=(t0''*27146+0x4000>>16)+t0''+(t0''!=0)*/ \ - "pcmpeqw %%xmm15,%%xmm1\n\t" \ - "pshufd $00,%%xmm12,%%xmm12\n\t" \ - "psubw %%xmm14,%%xmm1\n\t" \ - "mov $0x7FFF6C84,%[a]\n\t" \ - "paddw %%xmm1,%%xmm4\n\t" \ - /*xmm0=_y[0]=u=r+s>>1 \ - The naive implementation could cause overflow, so we use \ - u=(r&s)+((r^s)>>1).*/ \ - "movdqa %%xmm0,%%xmm6\n\t" \ - "pxor %%xmm4,%%xmm0\n\t" \ - "pand %%xmm4,%%xmm6\n\t" \ - "psraw $1,%%xmm0\n\t" \ - "movd %[a],%%xmm13\n\t" \ - "paddw %%xmm6,%%xmm0\n\t" \ - /*xmm4=_y[4]=v=r-u*/ \ - "pshufd $00,%%xmm13,%%xmm13\n\t" \ - "psubw %%xmm0,%%xmm4\n\t" \ - /*xmm1,xmm6,xmm10,xmm11 are free.*/ \ - /*xmm6:xmm10=60547*t3''+0x6CB7*/ \ - "movdqa %%xmm3,%%xmm10\n\t" \ - "movdqa %%xmm3,%%xmm6\n\t" \ - "punpcklwd %%xmm3,%%xmm10\n\t" \ - "pmaddwd %%xmm13,%%xmm10\n\t" \ - "mov $0x61F861F8,%[a]\n\t" \ - "punpckhwd %%xmm3,%%xmm6\n\t" \ - "pmaddwd %%xmm13,%%xmm6\n\t" \ - "movd %[a],%%xmm13\n\t" \ - "paddd %%xmm12,%%xmm10\n\t" \ - "pshufd $00,%%xmm13,%%xmm13\n\t" \ - "paddd %%xmm12,%%xmm6\n\t" \ - /*xmm1:xmm2=25080*t2'' \ - xmm12=t2''*/ \ - "movdqa %%xmm2,%%xmm11\n\t" \ - "movdqa %%xmm2,%%xmm12\n\t" \ - "pmullw %%xmm13,%%xmm2\n\t" \ - "pmulhw %%xmm13,%%xmm11\n\t" \ - "movdqa %%xmm2,%%xmm1\n\t" \ - "punpcklwd %%xmm11,%%xmm2\n\t" \ - "punpckhwd %%xmm11,%%xmm1\n\t" \ - /*xmm10=u=(25080*t2''+60547*t3''+0x6CB7>>16)+(t3''!=0)*/ \ - "paddd %%xmm2,%%xmm10\n\t" \ - "paddd %%xmm1,%%xmm6\n\t" \ - "psrad $16,%%xmm10\n\t" \ - "pcmpeqw %%xmm15,%%xmm3\n\t" \ - "psrad $16,%%xmm6\n\t" \ - "psubw %%xmm14,%%xmm3\n\t" \ - "packssdw %%xmm6,%%xmm10\n\t" \ - "paddw %%xmm3,%%xmm10\n\t" \ - /*xmm2=_y[2]=u \ - xmm10=s=(25080*u>>16)-t2''*/ \ - "movdqa %%xmm10,%%xmm2\n\t" \ - "pmulhw %%xmm13,%%xmm10\n\t" \ - "psubw %%xmm12,%%xmm10\n\t" \ - /*xmm1:xmm6=s*21600+0x2800*/ \ - "pxor %%xmm12,%%xmm12\n\t" \ - "psubw %%xmm14,%%xmm12\n\t" \ - "mov $0x28005460,%[a]\n\t" \ - "movd %[a],%%xmm13\n\t" \ - "pshufd $00,%%xmm13,%%xmm13\n\t" \ - "movdqa %%xmm10,%%xmm6\n\t" \ - "movdqa %%xmm10,%%xmm1\n\t" \ - "punpcklwd %%xmm12,%%xmm6\n\t" \ - "pmaddwd %%xmm13,%%xmm6\n\t" \ - "mov $0x0E3D,%[a]\n\t" \ - "punpckhwd %%xmm12,%%xmm1\n\t" \ - "pmaddwd %%xmm13,%%xmm1\n\t" \ - /*xmm6=(s*21600+0x2800>>18)+s*/ \ - "psrad $18,%%xmm6\n\t" \ - "psrad $18,%%xmm1\n\t" \ - "movd %[a],%%xmm12\n\t" \ - "packssdw %%xmm1,%%xmm6\n\t" \ - "pshufd $00,%%xmm12,%%xmm12\n\t" \ - "paddw %%xmm10,%%xmm6\n\t" \ - /*xmm6=_y[6]=v=(s*21600+0x2800>>18)+s+(s!=0)*/ \ - "mov $0x7FFF54DC,%[a]\n\t" \ - "pcmpeqw %%xmm15,%%xmm10\n\t" \ - "movd %[a],%%xmm13\n\t" \ - "psubw %%xmm14,%%xmm10\n\t" \ - "pshufd $00,%%xmm13,%%xmm13\n\t" \ - "paddw %%xmm10,%%xmm6\n\t " \ - /*xmm1,xmm3,xmm10,xmm11 are free.*/ \ - /*xmm11:xmm10=54491*t5'''+0x0E3D*/ \ - "movdqa %%xmm5,%%xmm10\n\t" \ - "movdqa %%xmm5,%%xmm11\n\t" \ - "punpcklwd %%xmm5,%%xmm10\n\t" \ - "pmaddwd %%xmm13,%%xmm10\n\t" \ - "mov $0x8E3A8E3A,%[a]\n\t" \ - "punpckhwd %%xmm5,%%xmm11\n\t" \ - "pmaddwd %%xmm13,%%xmm11\n\t" \ - "movd %[a],%%xmm13\n\t" \ - "paddd %%xmm12,%%xmm10\n\t" \ - "pshufd $00,%%xmm13,%%xmm13\n\t" \ - "paddd %%xmm12,%%xmm11\n\t" \ - /*xmm7:xmm12=36410*t6''' \ - xmm1=t6'''*/ \ - "movdqa %%xmm7,%%xmm3\n\t" \ - "movdqa %%xmm7,%%xmm1\n\t" \ - "pmulhw %%xmm13,%%xmm3\n\t" \ - "pmullw %%xmm13,%%xmm7\n\t" \ - "paddw %%xmm1,%%xmm3\n\t" \ - "movdqa %%xmm7,%%xmm12\n\t" \ - "punpckhwd %%xmm3,%%xmm7\n\t" \ - "punpcklwd %%xmm3,%%xmm12\n\t" \ - /*xmm10=u=(54491*t5'''+36410*t6'''+0x0E3D>>16)+(t5'''!=0)*/ \ - "paddd %%xmm12,%%xmm10\n\t" \ - "paddd %%xmm7,%%xmm11\n\t" \ - "psrad $16,%%xmm10\n\t" \ - "pcmpeqw %%xmm15,%%xmm5\n\t" \ - "psrad $16,%%xmm11\n\t" \ - "psubw %%xmm14,%%xmm5\n\t" \ - "packssdw %%xmm11,%%xmm10\n\t" \ - "pxor %%xmm12,%%xmm12\n\t" \ - "paddw %%xmm5,%%xmm10\n\t" \ - /*xmm5=_y[5]=u \ - xmm1=s=t6'''-(36410*u>>16)*/ \ - "psubw %%xmm14,%%xmm12\n\t" \ - "movdqa %%xmm10,%%xmm5\n\t" \ - "mov $0x340067C8,%[a]\n\t" \ - "pmulhw %%xmm13,%%xmm10\n\t" \ - "movd %[a],%%xmm13\n\t" \ - "paddw %%xmm5,%%xmm10\n\t" \ - "pshufd $00,%%xmm13,%%xmm13\n\t" \ - "psubw %%xmm10,%%xmm1\n\t" \ - /*xmm11:xmm3=s*26568+0x3400*/ \ - "movdqa %%xmm1,%%xmm3\n\t" \ - "movdqa %%xmm1,%%xmm11\n\t" \ - "punpcklwd %%xmm12,%%xmm3\n\t" \ - "pmaddwd %%xmm13,%%xmm3\n\t" \ - "mov $0x7B1B,%[a]\n\t" \ - "punpckhwd %%xmm12,%%xmm11\n\t" \ - "pmaddwd %%xmm13,%%xmm11\n\t" \ - /*xmm3=(s*26568+0x3400>>17)+s*/ \ - "psrad $17,%%xmm3\n\t" \ - "psrad $17,%%xmm11\n\t" \ - "movd %[a],%%xmm12\n\t" \ - "packssdw %%xmm11,%%xmm3\n\t" \ - "pshufd $00,%%xmm12,%%xmm12\n\t" \ - "paddw %%xmm1,%%xmm3\n\t" \ - /*xmm3=_y[3]=v=(s*26568+0x3400>>17)+s+(s!=0)*/ \ - "mov $0x7FFF7B16,%[a]\n\t" \ - "pcmpeqw %%xmm15,%%xmm1\n\t" \ - "movd %[a],%%xmm13\n\t" \ - "psubw %%xmm14,%%xmm1\n\t" \ - "pshufd $00,%%xmm13,%%xmm13\n\t" \ - "paddw %%xmm1,%%xmm3\n\t " \ - /*xmm1,xmm7,xmm10,xmm11 are free.*/ \ - /*xmm11:xmm10=64277*t7''+0x7B1B*/ \ - "movdqa %%xmm9,%%xmm10\n\t" \ - "movdqa %%xmm9,%%xmm11\n\t" \ - "punpcklwd %%xmm9,%%xmm10\n\t" \ - "pmaddwd %%xmm13,%%xmm10\n\t" \ - "mov $0x31F131F1,%[a]\n\t" \ - "punpckhwd %%xmm9,%%xmm11\n\t" \ - "pmaddwd %%xmm13,%%xmm11\n\t" \ - "movd %[a],%%xmm13\n\t" \ - "paddd %%xmm12,%%xmm10\n\t" \ - "pshufd $00,%%xmm13,%%xmm13\n\t" \ - "paddd %%xmm12,%%xmm11\n\t" \ - /*xmm12:xmm7=12785*t4''*/ \ - "movdqa %%xmm8,%%xmm7\n\t" \ - "movdqa %%xmm8,%%xmm1\n\t" \ - "pmullw %%xmm13,%%xmm7\n\t" \ - "pmulhw %%xmm13,%%xmm1\n\t" \ - "movdqa %%xmm7,%%xmm12\n\t" \ - "punpcklwd %%xmm1,%%xmm7\n\t" \ - "punpckhwd %%xmm1,%%xmm12\n\t" \ - /*xmm10=u=(12785*t4''+64277*t7''+0x7B1B>>16)+(t7''!=0)*/ \ - "paddd %%xmm7,%%xmm10\n\t" \ - "paddd %%xmm12,%%xmm11\n\t" \ - "psrad $16,%%xmm10\n\t" \ - "pcmpeqw %%xmm15,%%xmm9\n\t" \ - "psrad $16,%%xmm11\n\t" \ - "psubw %%xmm14,%%xmm9\n\t" \ - "packssdw %%xmm11,%%xmm10\n\t" \ - "pxor %%xmm12,%%xmm12\n\t" \ - "paddw %%xmm9,%%xmm10\n\t" \ - /*xmm1=_y[1]=u \ - xmm10=s=(12785*u>>16)-t4''*/ \ - "psubw %%xmm14,%%xmm12\n\t" \ - "movdqa %%xmm10,%%xmm1\n\t" \ - "mov $0x3000503B,%[a]\n\t" \ - "pmulhw %%xmm13,%%xmm10\n\t" \ - "movd %[a],%%xmm13\n\t" \ - "psubw %%xmm8,%%xmm10\n\t" \ - "pshufd $00,%%xmm13,%%xmm13\n\t" \ - /*xmm8:xmm7=s*20539+0x3000*/ \ - "movdqa %%xmm10,%%xmm7\n\t" \ - "movdqa %%xmm10,%%xmm8\n\t" \ - "punpcklwd %%xmm12,%%xmm7\n\t" \ - "pmaddwd %%xmm13,%%xmm7\n\t" \ - "punpckhwd %%xmm12,%%xmm8\n\t" \ - "pmaddwd %%xmm13,%%xmm8\n\t" \ - /*xmm7=(s*20539+0x3000>>20)+s*/ \ - "psrad $20,%%xmm7\n\t" \ - "psrad $20,%%xmm8\n\t" \ - "packssdw %%xmm8,%%xmm7\n\t" \ - "paddw %%xmm10,%%xmm7\n\t" \ - /*xmm7=_y[7]=v=(s*20539+0x3000>>20)+s+(s!=0)*/ \ - "pcmpeqw %%xmm15,%%xmm10\n\t" \ - "psubw %%xmm14,%%xmm10\n\t" \ - "paddw %%xmm10,%%xmm7\n\t " \ - -# define OC_TRANSPOSE8x8 \ - "#OC_TRANSPOSE8x8\n\t" \ - "movdqa %%xmm4,%%xmm8\n\t" \ - /*xmm4 = f3 e3 f2 e2 f1 e1 f0 e0*/ \ - "punpcklwd %%xmm5,%%xmm4\n\t" \ - /*xmm8 = f7 e7 f6 e6 f5 e5 f4 e4*/ \ - "punpckhwd %%xmm5,%%xmm8\n\t" \ - /*xmm5 is free.*/ \ - "movdqa %%xmm0,%%xmm5\n\t" \ - /*xmm0 = b3 a3 b2 a2 b1 a1 b0 a0*/ \ - "punpcklwd %%xmm1,%%xmm0\n\t" \ - /*xmm5 = b7 a7 b6 a6 b5 a5 b4 a4*/ \ - "punpckhwd %%xmm1,%%xmm5\n\t" \ - /*xmm1 is free.*/ \ - "movdqa %%xmm6,%%xmm1\n\t" \ - /*xmm6 = h3 g3 h2 g2 h1 g1 h0 g0*/ \ - "punpcklwd %%xmm7,%%xmm6\n\t" \ - /*xmm1 = h7 g7 h6 g6 h5 g5 h4 g4*/ \ - "punpckhwd %%xmm7,%%xmm1\n\t" \ - /*xmm7 is free.*/ \ - "movdqa %%xmm2,%%xmm7\n\t" \ - /*xmm7 = d3 c3 d2 c2 d1 c1 d0 c0*/ \ - "punpcklwd %%xmm3,%%xmm7\n\t" \ - /*xmm2 = d7 c7 d6 c6 d5 c5 d4 c4*/ \ - "punpckhwd %%xmm3,%%xmm2\n\t" \ - /*xmm3 is free.*/ \ - "movdqa %%xmm0,%%xmm3\n\t" \ - /*xmm0 = d1 c1 b1 a1 d0 c0 b0 a0*/ \ - "punpckldq %%xmm7,%%xmm0\n\t" \ - /*xmm3 = d3 c3 b3 a3 d2 c2 b2 a2*/ \ - "punpckhdq %%xmm7,%%xmm3\n\t" \ - /*xmm7 is free.*/ \ - "movdqa %%xmm5,%%xmm7\n\t" \ - /*xmm5 = d5 c5 b5 a5 d4 c4 b4 a4*/ \ - "punpckldq %%xmm2,%%xmm5\n\t" \ - /*xmm7 = d7 c7 b7 a7 d6 c6 b6 a6*/ \ - "punpckhdq %%xmm2,%%xmm7\n\t" \ - /*xmm2 is free.*/ \ - "movdqa %%xmm4,%%xmm2\n\t" \ - /*xmm2 = h1 g1 f1 e1 h0 g0 f0 e0*/ \ - "punpckldq %%xmm6,%%xmm2\n\t" \ - /*xmm4 = h3 g3 f3 e3 h2 g2 f2 e2*/ \ - "punpckhdq %%xmm6,%%xmm4\n\t" \ - /*xmm6 is free.*/ \ - "movdqa %%xmm8,%%xmm6\n\t" \ - /*xmm6 = h5 g5 f5 e5 h4 g4 f4 e4*/ \ - "punpckldq %%xmm1,%%xmm6\n\t" \ - /*xmm8 = h7 g7 f7 e7 h6 g6 f6 e6*/ \ - "punpckhdq %%xmm1,%%xmm8\n\t" \ - /*xmm1 is free.*/ \ - "movdqa %%xmm0,%%xmm1\n\t" \ - /*xmm0 = h0 g0 f0 e0 d0 c0 b0 a0*/ \ - "punpcklqdq %%xmm2,%%xmm0\n\t" \ - /*xmm1 = h1 g1 f1 e1 d1 c1 b1 a1*/ \ - "punpckhqdq %%xmm2,%%xmm1\n\t" \ - /*xmm2 is free.*/ \ - "movdqa %%xmm3,%%xmm2\n\t" \ - /*xmm2 = h2 g2 f2 e2 d2 c2 b2 a2*/ \ - "punpcklqdq %%xmm4,%%xmm2\n\t" \ - /*xmm3 = h3 g3 f3 e3 d3 c3 b3 a3*/ \ - "punpckhqdq %%xmm4,%%xmm3\n\t" \ - /*xmm4 is free.*/ \ - "movdqa %%xmm5,%%xmm4\n\t" \ - /*xmm4 = h4 g4 f4 e4 d4 c4 b4 a4*/ \ - "punpcklqdq %%xmm6,%%xmm4\n\t" \ - /*xmm5 = h5 g5 f5 e5 d5 c5 b5 a5*/ \ - "punpckhqdq %%xmm6,%%xmm5\n\t" \ - /*xmm6 is free.*/ \ - "movdqa %%xmm7,%%xmm6\n\t" \ - /*xmm6 = h6 g6 f6 e6 d6 c6 b6 a6*/ \ - "punpcklqdq %%xmm8,%%xmm6\n\t" \ - /*xmm7 = h7 g7 f7 e7 d7 c7 b7 a7*/ \ - "punpckhqdq %%xmm8,%%xmm7\n\t" \ - /*xmm8 is free.*/ \ - -/*SSE2 implementation of the fDCT for x86-64 only. - Because of the 8 extra XMM registers on x86-64, this version can operate - without any temporary stack access at all.*/ -void oc_enc_fdct8x8_x86_64sse2(ogg_int16_t _y[64],const ogg_int16_t _x[64]){ - ptrdiff_t a; - __asm__ __volatile__( - /*Load the input.*/ - "movdqa 0x00(%[x]),%%xmm0\n\t" - "movdqa 0x10(%[x]),%%xmm1\n\t" - "movdqa 0x20(%[x]),%%xmm2\n\t" - "movdqa 0x30(%[x]),%%xmm3\n\t" - "movdqa 0x40(%[x]),%%xmm4\n\t" - "movdqa 0x50(%[x]),%%xmm5\n\t" - "movdqa 0x60(%[x]),%%xmm6\n\t" - "movdqa 0x70(%[x]),%%xmm7\n\t" - /*Add two extra bits of working precision to improve accuracy; any more and - we could overflow.*/ - /*We also add a few biases to correct for some systematic error that - remains in the full fDCT->iDCT round trip.*/ - /*xmm15={0}x8*/ - "pxor %%xmm15,%%xmm15\n\t" - /*xmm14={-1}x8*/ - "pcmpeqb %%xmm14,%%xmm14\n\t" - "psllw $2,%%xmm0\n\t" - /*xmm8=xmm0*/ - "movdqa %%xmm0,%%xmm8\n\t" - "psllw $2,%%xmm1\n\t" - /*xmm8={_x[7...0]==0}*/ - "pcmpeqw %%xmm15,%%xmm8\n\t" - "psllw $2,%%xmm2\n\t" - /*xmm8={_x[7...0]!=0}*/ - "psubw %%xmm14,%%xmm8\n\t" - "psllw $2,%%xmm3\n\t" - /*%[a]=1*/ - "mov $1,%[a]\n\t" - /*xmm8={_x[6]!=0,0,_x[4]!=0,0,_x[2]!=0,0,_x[0]!=0,0}*/ - "pslld $16,%%xmm8\n\t" - "psllw $2,%%xmm4\n\t" - /*xmm9={0,0,0,0,0,0,0,1}*/ - "movd %[a],%%xmm9\n\t" - /*xmm8={0,0,_x[2]!=0,0,_x[0]!=0,0}*/ - "pshufhw $0x00,%%xmm8,%%xmm8\n\t" - "psllw $2,%%xmm5\n\t" - /*%[a]={1}x2*/ - "mov $0x10001,%[a]\n\t" - /*xmm8={0,0,0,0,0,0,0,_x[0]!=0}*/ - "pshuflw $0x01,%%xmm8,%%xmm8\n\t" - "psllw $2,%%xmm6\n\t" - /*xmm10={0,0,0,0,0,0,1,1}*/ - "movd %[a],%%xmm10\n\t" - /*xmm0=_x[7...0]+{0,0,0,0,0,0,0,_x[0]!=0}*/ - "paddw %%xmm8,%%xmm0\n\t" - "psllw $2,%%xmm7\n\t" - /*xmm0=_x[7...0]+{0,0,0,0,0,0,1,(_x[0]!=0)+1}*/ - "paddw %%xmm10,%%xmm0\n\t" - /*xmm1=_x[15...8]-{0,0,0,0,0,0,0,1}*/ - "psubw %%xmm9,%%xmm1\n\t" - /*Transform columns.*/ - OC_FDCT8x8 - /*Transform rows.*/ - OC_TRANSPOSE8x8 - OC_FDCT8x8 - /*TODO: zig-zag ordering?*/ - OC_TRANSPOSE8x8 - /*xmm14={-2,-2,-2,-2,-2,-2,-2,-2}*/ - "paddw %%xmm14,%%xmm14\n\t" - "psubw %%xmm14,%%xmm0\n\t" - "psubw %%xmm14,%%xmm1\n\t" - "psraw $2,%%xmm0\n\t" - "psubw %%xmm14,%%xmm2\n\t" - "psraw $2,%%xmm1\n\t" - "psubw %%xmm14,%%xmm3\n\t" - "psraw $2,%%xmm2\n\t" - "psubw %%xmm14,%%xmm4\n\t" - "psraw $2,%%xmm3\n\t" - "psubw %%xmm14,%%xmm5\n\t" - "psraw $2,%%xmm4\n\t" - "psubw %%xmm14,%%xmm6\n\t" - "psraw $2,%%xmm5\n\t" - "psubw %%xmm14,%%xmm7\n\t" - "psraw $2,%%xmm6\n\t" - "psraw $2,%%xmm7\n\t" - /*Store the result.*/ - "movdqa %%xmm0,0x00(%[y])\n\t" - "movdqa %%xmm1,0x10(%[y])\n\t" - "movdqa %%xmm2,0x20(%[y])\n\t" - "movdqa %%xmm3,0x30(%[y])\n\t" - "movdqa %%xmm4,0x40(%[y])\n\t" - "movdqa %%xmm5,0x50(%[y])\n\t" - "movdqa %%xmm6,0x60(%[y])\n\t" - "movdqa %%xmm7,0x70(%[y])\n\t" - :[a]"=&r"(a) - :[y]"r"(_y),[x]"r"(_x) - :"memory" - ); -} -#endif diff --git a/drivers/theora/x86/x86enc.c b/drivers/theora/x86/x86enc.c deleted file mode 100644 index 43b7be3ea3..0000000000 --- a/drivers/theora/x86/x86enc.c +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ******************************************************************** - - function: - last mod: $Id: x86state.c 15675 2009-02-06 09:43:27Z tterribe $ - - ********************************************************************/ -#include "x86enc.h" - -#if defined(OC_X86_ASM) - -#include "../cpu.c" - -void oc_enc_vtable_init_x86(oc_enc_ctx *_enc){ - ogg_uint32_t cpu_flags; - cpu_flags=oc_cpu_flags_get(); - oc_enc_vtable_init_c(_enc); - if(cpu_flags&OC_CPU_X86_MMX){ - _enc->opt_vtable.frag_sub=oc_enc_frag_sub_mmx; - _enc->opt_vtable.frag_sub_128=oc_enc_frag_sub_128_mmx; - _enc->opt_vtable.frag_recon_intra=oc_frag_recon_intra_mmx; - _enc->opt_vtable.frag_recon_inter=oc_frag_recon_inter_mmx; - _enc->opt_vtable.fdct8x8=oc_enc_fdct8x8_mmx; - } - if(cpu_flags&OC_CPU_X86_MMXEXT){ - _enc->opt_vtable.frag_sad=oc_enc_frag_sad_mmxext; - _enc->opt_vtable.frag_sad_thresh=oc_enc_frag_sad_thresh_mmxext; - _enc->opt_vtable.frag_sad2_thresh=oc_enc_frag_sad2_thresh_mmxext; - _enc->opt_vtable.frag_satd_thresh=oc_enc_frag_satd_thresh_mmxext; - _enc->opt_vtable.frag_satd2_thresh=oc_enc_frag_satd2_thresh_mmxext; - _enc->opt_vtable.frag_intra_satd=oc_enc_frag_intra_satd_mmxext; - _enc->opt_vtable.frag_copy2=oc_enc_frag_copy2_mmxext; - } - if(cpu_flags&OC_CPU_X86_SSE2){ -# if defined(OC_X86_64_ASM) - /*_enc->opt_vtable.fdct8x8=oc_enc_fdct8x8_x86_64sse2;*/ -# endif - } -} -#endif diff --git a/drivers/theora/x86/x86enc.h b/drivers/theora/x86/x86enc.h deleted file mode 100644 index 06c3908bcd..0000000000 --- a/drivers/theora/x86/x86enc.h +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ******************************************************************** - - function: - last mod: $Id: x86int.h 15675 2009-02-06 09:43:27Z tterribe $ - - ********************************************************************/ - -#if !defined(_x86_x86enc_H) -# define _x86_x86enc_H (1) -# include "../encint.h" -# include "x86int.h" - -void oc_enc_vtable_init_x86(oc_enc_ctx *_enc); - -unsigned oc_enc_frag_sad_mmxext(const unsigned char *_src, - const unsigned char *_ref,int _ystride); -unsigned oc_enc_frag_sad_thresh_mmxext(const unsigned char *_src, - const unsigned char *_ref,int _ystride,unsigned _thresh); -unsigned oc_enc_frag_sad2_thresh_mmxext(const unsigned char *_src, - const unsigned char *_ref1,const unsigned char *_ref2,int _ystride, - unsigned _thresh); -unsigned oc_enc_frag_satd_thresh_mmxext(const unsigned char *_src, - const unsigned char *_ref,int _ystride,unsigned _thresh); -unsigned oc_enc_frag_satd2_thresh_mmxext(const unsigned char *_src, - const unsigned char *_ref1,const unsigned char *_ref2,int _ystride, - unsigned _thresh); -unsigned oc_enc_frag_intra_satd_mmxext(const unsigned char *_src,int _ystride); -void oc_enc_frag_sub_mmx(ogg_int16_t _diff[64], - const unsigned char *_x,const unsigned char *_y,int _stride); -void oc_enc_frag_sub_128_mmx(ogg_int16_t _diff[64], - const unsigned char *_x,int _stride); -void oc_enc_frag_copy2_mmxext(unsigned char *_dst, - const unsigned char *_src1,const unsigned char *_src2,int _ystride); -void oc_enc_fdct8x8_mmx(ogg_int16_t _y[64],const ogg_int16_t _x[64]); -void oc_enc_fdct8x8_x86_64sse2(ogg_int16_t _y[64],const ogg_int16_t _x[64]); - -#endif diff --git a/drivers/theora/x86/x86int.h b/drivers/theora/x86/x86int.h deleted file mode 100644 index ede724f5aa..0000000000 --- a/drivers/theora/x86/x86int.h +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ******************************************************************** - - function: - last mod: $Id: x86int.h 16503 2009-08-22 18:14:02Z giles $ - - ********************************************************************/ - -#if !defined(_x86_x86int_H) -# define _x86_x86int_H (1) -# include "../internal.h" - -void oc_state_vtable_init_x86(oc_theora_state *_state); - -void oc_frag_copy_mmx(unsigned char *_dst, - const unsigned char *_src,int _ystride); -void oc_frag_recon_intra_mmx(unsigned char *_dst,int _ystride, - const ogg_int16_t *_residue); -void oc_frag_recon_inter_mmx(unsigned char *_dst, - const unsigned char *_src,int _ystride,const ogg_int16_t *_residue); -void oc_frag_recon_inter2_mmx(unsigned char *_dst,const unsigned char *_src1, - const unsigned char *_src2,int _ystride,const ogg_int16_t *_residue); -void oc_idct8x8_mmx(ogg_int16_t _y[64],int _last_zzi); -void oc_state_frag_recon_mmx(const oc_theora_state *_state,ptrdiff_t _fragi, - int _pli,ogg_int16_t _dct_coeffs[64],int _last_zzi,ogg_uint16_t _dc_quant); -void oc_state_frag_copy_list_mmx(const oc_theora_state *_state, - const ptrdiff_t *_fragis,ptrdiff_t _nfragis, - int _dst_frame,int _src_frame,int _pli); -void oc_state_loop_filter_frag_rows_mmx(const oc_theora_state *_state, - int _bv[256],int _refi,int _pli,int _fragy0,int _fragy_end); -void oc_restore_fpu_mmx(void); - -#endif diff --git a/drivers/theora/x86/x86state.c b/drivers/theora/x86/x86state.c deleted file mode 100644 index a786bec284..0000000000 --- a/drivers/theora/x86/x86state.c +++ /dev/null @@ -1,62 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ******************************************************************** - - function: - last mod: $Id: x86state.c 16503 2009-08-22 18:14:02Z giles $ - - ********************************************************************/ - -#include "x86int.h" - -#if defined(OC_X86_ASM) - -#include "../cpu.c" - -/*This table has been modified from OC_FZIG_ZAG by baking a 4x4 transpose into - each quadrant of the destination.*/ -static const unsigned char OC_FZIG_ZAG_MMX[128]={ - 0, 8, 1, 2, 9,16,24,17, - 10, 3,32,11,18,25, 4,12, - 5,26,19,40,33,34,41,48, - 27, 6,13,20,28,21,14, 7, - 56,49,42,35,43,50,57,36, - 15,22,29,30,23,44,37,58, - 51,59,38,45,52,31,60,53, - 46,39,47,54,61,62,55,63, - 64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64, - 64,64,64,64,64,64,64,64, -}; - -void oc_state_vtable_init_x86(oc_theora_state *_state){ - _state->cpu_flags=oc_cpu_flags_get(); - if(_state->cpu_flags&OC_CPU_X86_MMX){ - _state->opt_vtable.frag_copy=oc_frag_copy_mmx; - _state->opt_vtable.frag_recon_intra=oc_frag_recon_intra_mmx; - _state->opt_vtable.frag_recon_inter=oc_frag_recon_inter_mmx; - _state->opt_vtable.frag_recon_inter2=oc_frag_recon_inter2_mmx; - _state->opt_vtable.idct8x8=oc_idct8x8_mmx; - _state->opt_vtable.state_frag_recon=oc_state_frag_recon_mmx; - _state->opt_vtable.state_frag_copy_list=oc_state_frag_copy_list_mmx; - _state->opt_vtable.state_loop_filter_frag_rows= - oc_state_loop_filter_frag_rows_mmx; - _state->opt_vtable.restore_fpu=oc_restore_fpu_mmx; - _state->opt_data.dct_fzig_zag=OC_FZIG_ZAG_MMX; - } - else oc_state_vtable_init_c(_state); -} -#endif |