dsputil_h264_template_mmx.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:5k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Copyright (c) 2005 Zoltan Hidvegi <hzoli -a- hzoli -d- com>
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  */
  18. /**
  19.  * MMX optimized version of (put|avg)_h264_chroma_mc8.
  20.  * H264_CHROMA_MC8_TMPL must be defined to the desired function name and
  21.  * H264_CHROMA_OP must be defined to empty for put and pavgb/pavgusb for avg.
  22.  */
  23. static void H264_CHROMA_MC8_TMPL(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y)
  24. {
  25.     uint64_t AA __align8;
  26.     uint64_t DD __align8;
  27.     unsigned long srcos = (long)src & 7;
  28.     uint64_t sh1 __align8 = srcos * 8;
  29.     uint64_t sh2 __align8 = 56 - sh1;
  30.     int i;
  31.     assert(x<8 && y<8 && x>=0 && y>=0);
  32.     asm volatile("movd %1, %%mm4nt"
  33.                  "movd %2, %%mm6nt"
  34.                  "punpcklwd %%mm4, %%mm4nt"
  35.                  "punpcklwd %%mm6, %%mm6nt"
  36.                  "punpckldq %%mm4, %%mm4nt" /* mm4 = x words */
  37.                  "punpckldq %%mm6, %%mm6nt" /* mm6 = y words */
  38.                  "movq %%mm4, %%mm5nt"
  39.                  "pmullw %%mm6, %%mm4nt"    /* mm4 = x * y */
  40.                  "psllw $3, %%mm5nt"
  41.                  "psllw $3, %%mm6nt"
  42.                  "movq %%mm5, %%mm7nt"
  43.                  "paddw %%mm6, %%mm7nt"
  44.                  "movq %%mm4, %0nt"         /* DD = x * y */
  45.                  "psubw %%mm4, %%mm5nt"     /* mm5 = B = 8x - xy */
  46.                  "psubw %%mm4, %%mm6nt"     /* mm6 = C = 8y - xy */
  47.                  "paddw %3, %%mm4nt"
  48.                  "psubw %%mm7, %%mm4nt"     /* mm4 = A = xy - (8x+8y) + 64 */
  49.                  "pxor %%mm7, %%mm7nt"
  50.                  : "=m" (DD) : "rm" (x), "rm" (y), "m" (ff_pw_64));
  51.     asm volatile("movq %%mm4, %0" : "=m" (AA));
  52.     src -= srcos;
  53.     asm volatile(
  54.         /* mm0 = src[0..7], mm1 = src[1..8] */
  55.         "movq %0, %%mm1nt"
  56.         "movq %1, %%mm0nt"
  57.         "psrlq %2, %%mm1nt"
  58.         "psllq %3, %%mm0nt"
  59.         "movq %%mm0, %%mm4nt"
  60.         "psllq $8, %%mm0nt"
  61.         "por %%mm1, %%mm0nt"
  62.         "psrlq $8, %%mm1nt"
  63.         "por %%mm4, %%mm1nt"
  64.         : : "m" (src[0]), "m" (src[8]), "m" (sh1), "m" (sh2));
  65.     for(i=0; i<h; i++) {
  66.         asm volatile(
  67.             /* [mm2,mm3] = A * src[0..7] */
  68.             "movq %%mm0, %%mm2nt"
  69.             "punpcklbw %%mm7, %%mm2nt"
  70.             "pmullw %0, %%mm2nt"
  71.             "movq %%mm0, %%mm3nt"
  72.             "punpckhbw %%mm7, %%mm3nt"
  73.             "pmullw %0, %%mm3nt"
  74.             /* [mm2,mm3] += B * src[1..8] */
  75.             "movq %%mm1, %%mm0nt"
  76.             "punpcklbw %%mm7, %%mm0nt"
  77.             "pmullw %%mm5, %%mm0nt"
  78.             "punpckhbw %%mm7, %%mm1nt"
  79.             "pmullw %%mm5, %%mm1nt"
  80.             "paddw %%mm0, %%mm2nt"
  81.             "paddw %%mm1, %%mm3nt"
  82.             : : "m" (AA));
  83.         src += stride;
  84.         asm volatile(
  85.             /* mm0 = src[0..7], mm1 = src[1..8] */
  86.             "movq %0, %%mm1nt"
  87.             "movq %1, %%mm0nt"
  88.             "psrlq %2, %%mm1nt"
  89.             "psllq %3, %%mm0nt"
  90.             "movq %%mm0, %%mm4nt"
  91.             "psllq $8, %%mm0nt"
  92.             "por %%mm1, %%mm0nt"
  93.             "psrlq $8, %%mm1nt"
  94.             "por %%mm4, %%mm1nt"
  95.             : : "m" (src[0]), "m" (src[8]), "m" (sh1), "m" (sh2));
  96.         asm volatile(
  97.             /* [mm2,mm3] += C *  src[0..7] */
  98.             "movq %mm0, %mm4nt"
  99.             "punpcklbw %mm7, %mm4nt"
  100.             "pmullw %mm6, %mm4nt"
  101.             "paddw %mm4, %mm2nt"
  102.             "movq %mm0, %mm4nt"
  103.             "punpckhbw %mm7, %mm4nt"
  104.             "pmullw %mm6, %mm4nt"
  105.             "paddw %mm4, %mm3nt");
  106.         asm volatile(
  107.             /* [mm2,mm3] += D *  src[1..8] */
  108.             "movq %%mm1, %%mm4nt"
  109.             "punpcklbw %%mm7, %%mm4nt"
  110.             "pmullw %0, %%mm4nt"
  111.             "paddw %%mm4, %%mm2nt"
  112.             "movq %%mm1, %%mm4nt"
  113.             "punpckhbw %%mm7, %%mm4nt"
  114.             "pmullw %0, %%mm4nt"
  115.             "paddw %%mm4, %%mm3nt"
  116.             : : "m" (DD));
  117.         asm volatile(
  118.             /* dst[0..7] = pack(([mm2,mm3] + 32) >> 6) */
  119.             "paddw %1, %%mm2nt"
  120.             "paddw %1, %%mm3nt"
  121.             "psrlw $6, %%mm2nt"
  122.             "psrlw $6, %%mm3nt"
  123.             "packuswb %%mm3, %%mm2nt"
  124.             H264_CHROMA_OP(%0, %%mm2)
  125.             "movq %%mm2, %0nt"
  126.             : "=m" (dst[0]) : "m" (ff_pw_32));
  127.         dst+= stride;
  128.     }
  129. }