Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Loongson SIMD optimized h264qpel
  3.  *
  4.  * Copyright (c) 2015 Loongson Technology Corporation Limited
  5.  * Copyright (c) 2015 Zhou Xiaoyong <zhouxiaoyong@loongson.cn>
  6.  *
  7.  * This file is part of FFmpeg.
  8.  *
  9.  * FFmpeg is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU Lesser General Public
  11.  * License as published by the Free Software Foundation; either
  12.  * version 2.1 of the License, or (at your option) any later version.
  13.  *
  14.  * FFmpeg is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17.  * Lesser General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU Lesser General Public
  20.  * License along with FFmpeg; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22.  */
  23.  
  24. #include "h264dsp_mips.h"
  25. #include "libavcodec/bit_depth_template.c"
  26.  
  27. static inline void copy_block4_mmi(uint8_t *dst, const uint8_t *src,
  28.         int dstStride, int srcStride, int h)
  29. {
  30.     __asm__ volatile (
  31.         "1:                                     \r\n"
  32.         "gslwlc1 $f2, 3(%[src])                 \r\n"
  33.         "gslwrc1 $f2, 0(%[src])                 \r\n"
  34.         "gsswlc1 $f2, 3(%[dst])                 \r\n"
  35.         "gsswrc1 $f2, 0(%[dst])                 \r\n"
  36.         "dadd %[src], %[src], %[srcStride]      \r\n"
  37.         "dadd %[dst], %[dst], %[dstStride]      \r\n"
  38.         "daddi %[h], %[h], -1                   \r\n"
  39.         "bnez %[h], 1b                          \r\n"
  40.         : [dst]"+&r"(dst),[src]"+&r"(src)
  41.         : [dstStride]"r"(dstStride),[srcStride]"r"(srcStride),[h]"r"(h)
  42.         : "$f2"
  43.     );
  44. }
  45.  
  46. static inline void copy_block8_mmi(uint8_t *dst, const uint8_t *src,
  47.         int dstStride, int srcStride, int h)
  48. {
  49.     __asm__ volatile (
  50.         "1:                                     \r\n"
  51.         "gsldlc1 $f2, 7(%[src])                 \r\n"
  52.         "gsldrc1 $f2, 0(%[src])                 \r\n"
  53.         "gssdlc1 $f2, 7(%[dst])                 \r\n"
  54.         "gssdrc1 $f2, 0(%[dst])                 \r\n"
  55.         "dadd %[src], %[src], %[srcStride]      \r\n"
  56.         "dadd %[dst], %[dst], %[dstStride]      \r\n"
  57.         "daddi %[h], %[h], -1                   \r\n"
  58.         "bnez %[h], 1b                          \r\n"
  59.         : [dst]"+&r"(dst),[src]"+&r"(src)
  60.         : [dstStride]"r"(dstStride),[srcStride]"r"(srcStride),[h]"r"(h)
  61.         : "$f2"
  62.     );
  63. }
  64.  
  65. static inline void copy_block16_mmi(uint8_t *dst, const uint8_t *src,
  66.         int dstStride, int srcStride, int h)
  67. {
  68.     __asm__ volatile (
  69.         "1:                                     \r\n"
  70.         "gsldlc1 $f2, 7(%[src])                 \r\n"
  71.         "gsldrc1 $f2, 0(%[src])                 \r\n"
  72.         "gsldlc1 $f4, 15(%[src])                \r\n"
  73.         "gsldrc1 $f4, 8(%[src])                 \r\n"
  74.         "gssdlc1 $f2, 7(%[dst])                 \r\n"
  75.         "gssdrc1 $f2, 0(%[dst])                 \r\n"
  76.         "gssdlc1 $f4, 15(%[dst])                \r\n"
  77.         "gssdrc1 $f4, 8(%[dst])                 \r\n"
  78.         "dadd %[src], %[src], %[srcStride]      \r\n"
  79.         "dadd %[dst], %[dst], %[dstStride]      \r\n"
  80.         "daddi %[h], %[h], -1                   \r\n"
  81.         "bnez %[h], 1b                          \r\n"
  82.         : [dst]"+&r"(dst),[src]"+&r"(src)
  83.         : [dstStride]"r"(dstStride),[srcStride]"r"(srcStride),[h]"r"(h)
  84.         : "$f2","$f4"
  85.     );
  86. }
  87.  
  88. #define op_put(a, b) a = b
  89. #define op_avg(a, b) a = rnd_avg_pixel4(a, b)
  90. static inline void put_pixels4_mmi(uint8_t *block, const uint8_t *pixels,
  91.         ptrdiff_t line_size, int h)
  92. {
  93.     __asm__ volatile (
  94.         "1:                                     \r\n"
  95.         "gslwlc1 $f2, 3(%[pixels])              \r\n"
  96.         "gslwrc1 $f2, 0(%[pixels])              \r\n"
  97.         "gsswlc1 $f2, 3(%[block])               \r\n"
  98.         "gsswrc1 $f2, 0(%[block])               \r\n"
  99.         "dadd %[pixels], %[pixels], %[line_size]\r\n"
  100.         "dadd %[block], %[block], %[line_size]  \r\n"
  101.         "daddi %[h], %[h], -1                   \r\n"
  102.         "bnez %[h], 1b                          \r\n"
  103.         : [block]"+&r"(block),[pixels]"+&r"(pixels)
  104.         : [line_size]"r"(line_size),[h]"r"(h)
  105.         : "$f2"
  106.     );
  107. }
  108.  
  109. static inline void put_pixels8_mmi(uint8_t *block, const uint8_t *pixels,
  110.         ptrdiff_t line_size, int h)
  111. {
  112.     __asm__ volatile (
  113.         "1:                                     \r\n"
  114.         "gsldlc1 $f2, 7(%[pixels])              \r\n"
  115.         "gsldrc1 $f2, 0(%[pixels])              \r\n"
  116.         "gssdlc1 $f2, 7(%[block])               \r\n"
  117.         "gssdrc1 $f2, 0(%[block])               \r\n"
  118.         "dadd %[pixels], %[pixels], %[line_size]\r\n"
  119.         "dadd %[block], %[block], %[line_size]  \r\n"
  120.         "daddi %[h], %[h], -1                   \r\n"
  121.         "bnez %[h], 1b                          \r\n"
  122.         : [block]"+&r"(block),[pixels]"+&r"(pixels)
  123.         : [line_size]"r"(line_size),[h]"r"(h)
  124.         : "$f2"
  125.     );
  126. }
  127.  
  128. static inline void put_pixels16_mmi(uint8_t *block, const uint8_t *pixels,
  129.         ptrdiff_t line_size, int h)
  130. {
  131.     __asm__ volatile (
  132.         "1:                                     \r\n"
  133.         "gsldlc1 $f2, 7(%[pixels])              \r\n"
  134.         "gsldrc1 $f2, 0(%[pixels])              \r\n"
  135.         "gsldlc1 $f4, 15(%[pixels])             \r\n"
  136.         "gsldrc1 $f4, 8(%[pixels])              \r\n"
  137.         "gssdlc1 $f2, 7(%[block])               \r\n"
  138.         "gssdrc1 $f2, 0(%[block])               \r\n"
  139.         "gssdlc1 $f4, 15(%[block])              \r\n"
  140.         "gssdrc1 $f4, 8(%[block])               \r\n"
  141.         "dadd %[pixels], %[pixels], %[line_size]\r\n"
  142.         "dadd %[block], %[block], %[line_size]  \r\n"
  143.         "daddi %[h], %[h], -1                   \r\n"
  144.         "bnez %[h], 1b                          \r\n"
  145.         : [block]"+&r"(block),[pixels]"+&r"(pixels)
  146.         : [line_size]"r"(line_size),[h]"r"(h)
  147.         : "$f2","$f4"
  148.     );
  149. }
  150.  
  151. static inline void avg_pixels4_mmi(uint8_t *block, const uint8_t *pixels,
  152.         ptrdiff_t line_size, int h)
  153. {
  154.     __asm__ volatile (
  155.         "1:                                     \r\n"
  156.         "gslwlc1 $f2, 3(%[pixels])              \r\n"
  157.         "gslwrc1 $f2, 0(%[pixels])              \r\n"
  158.         "gslwlc1 $f4, 3(%[block])               \r\n"
  159.         "gslwrc1 $f4, 0(%[block])               \r\n"
  160.         "pavgb $f2, $f2, $f4                    \r\n"
  161.         "gsswlc1 $f2, 3(%[block])               \r\n"
  162.         "gsswrc1 $f2, 0(%[block])               \r\n"
  163.         "dadd %[pixels], %[pixels], %[line_size]\r\n"
  164.         "dadd %[block], %[block], %[line_size]  \r\n"
  165.         "daddi %[h], %[h], -1                   \r\n"
  166.         "bnez %[h], 1b                          \r\n"
  167.         : [block]"+&r"(block),[pixels]"+&r"(pixels)
  168.         : [line_size]"r"(line_size),[h]"r"(h)
  169.         : "$f2","$f4"
  170.     );
  171. }
  172.  
  173. static inline void avg_pixels8_mmi(uint8_t *block, const uint8_t *pixels,
  174.         ptrdiff_t line_size, int h)
  175. {
  176.     __asm__ volatile (
  177.         "1:                                     \r\n"
  178.         "gsldlc1 $f2, 7(%[block])               \r\n"
  179.         "gsldrc1 $f2, 0(%[block])               \r\n"
  180.         "gsldlc1 $f4, 7(%[pixels])              \r\n"
  181.         "gsldrc1 $f4, 0(%[pixels])              \r\n"
  182.         "pavgb $f2, $f2, $f4                    \r\n"
  183.         "gssdlc1 $f2, 7(%[block])               \r\n"
  184.         "gssdrc1 $f2, 0(%[block])               \r\n"
  185.         "dadd %[pixels], %[pixels], %[line_size]\r\n"
  186.         "dadd %[block], %[block], %[line_size]  \r\n"
  187.         "daddi %[h], %[h], -1                   \r\n"
  188.         "bnez %[h], 1b                          \r\n"
  189.         : [block]"+&r"(block),[pixels]"+&r"(pixels)
  190.         : [line_size]"r"(line_size),[h]"r"(h)
  191.         : "$f2","$f4"
  192.     );
  193. }
  194.  
  195. static inline void avg_pixels16_mmi(uint8_t *block, const uint8_t *pixels,
  196.         ptrdiff_t line_size, int h)
  197. {
  198.     __asm__ volatile (
  199.         "1:                                     \r\n"
  200.         "gsldlc1 $f2, 7(%[block])               \r\n"
  201.         "gsldrc1 $f2, 0(%[block])               \r\n"
  202.         "gsldlc1 $f4, 15(%[block])              \r\n"
  203.         "gsldrc1 $f4, 8(%[block])               \r\n"
  204.         "gsldlc1 $f6, 7(%[pixels])              \r\n"
  205.         "gsldrc1 $f6, 0(%[pixels])              \r\n"
  206.         "gsldlc1 $f8, 15(%[pixels])             \r\n"
  207.         "gsldrc1 $f8, 8(%[pixels])              \r\n"
  208.         "pavgb $f2, $f2, $f6                    \r\n"
  209.         "pavgb $f4, $f4, $f8                    \r\n"
  210.         "gssdlc1 $f2, 7(%[block])               \r\n"
  211.         "gssdrc1 $f2, 0(%[block])               \r\n"
  212.         "gssdlc1 $f4, 15(%[block])              \r\n"
  213.         "gssdrc1 $f4, 8(%[block])               \r\n"
  214.         "dadd %[pixels], %[pixels], %[line_size]\r\n"
  215.         "dadd %[block], %[block], %[line_size]  \r\n"
  216.         "daddi %[h], %[h], -1                   \r\n"
  217.         "bnez %[h], 1b                          \r\n"
  218.         : [block]"+&r"(block),[pixels]"+&r"(pixels)
  219.         : [line_size]"r"(line_size),[h]"r"(h)
  220.         : "$f2","$f4","$f6","$f8"
  221.     );
  222. }
  223.  
  224. static inline void put_pixels4_l2_mmi(uint8_t *dst, const uint8_t *src1,
  225.         const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2,
  226.         int h)
  227. {
  228.     int i;
  229.     for (i = 0; i < h; i++) {
  230.         pixel4 a, b;
  231.         a = AV_RN4P(&src1[i * src_stride1]);
  232.         b = AV_RN4P(&src2[i * src_stride2]);
  233.         op_put(*((pixel4 *) &dst[i * dst_stride]), rnd_avg_pixel4(a, b));
  234.     }
  235. }
  236.  
  237. static inline void put_pixels8_l2_mmi(uint8_t *dst, const uint8_t *src1,
  238.         const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2,
  239.         int h)
  240. {
  241.     int i;
  242.     for (i = 0; i < h; i++) {
  243.         pixel4 a, b;
  244.         a = AV_RN4P(&src1[i * src_stride1]);
  245.         b = AV_RN4P(&src2[i * src_stride2]);
  246.         op_put(*((pixel4 *) &dst[i * dst_stride]), rnd_avg_pixel4(a, b));
  247.         a = AV_RN4P(&src1[i * src_stride1 + 4]);
  248.         b = AV_RN4P(&src2[i * src_stride2 + 4]);
  249.         op_put(*((pixel4 *) &dst[i * dst_stride + 4]), rnd_avg_pixel4(a, b));
  250.     }
  251. }
  252.  
  253. static inline void put_pixels16_l2_mmi(uint8_t *dst, const uint8_t *src1,
  254.         const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2,
  255.         int h)
  256. {
  257.     int i;
  258.     for (i = 0; i < h; i++) {
  259.         pixel4 a, b;
  260.         a = AV_RN4P(&src1[i * src_stride1]);
  261.         b = AV_RN4P(&src2[i * src_stride2]);
  262.         op_put(*((pixel4 *) &dst[i * dst_stride]), rnd_avg_pixel4(a, b));
  263.         a = AV_RN4P(&src1[i * src_stride1 + 4]);
  264.         b = AV_RN4P(&src2[i * src_stride2 + 4]);
  265.         op_put(*((pixel4 *) &dst[i * dst_stride + 4]), rnd_avg_pixel4(a, b));
  266.         a = AV_RN4P(&src1[i * src_stride1 + 8]);
  267.         b = AV_RN4P(&src2[i * src_stride2 + 8]);
  268.         op_put(*((pixel4 *) &dst[i * dst_stride + 8]), rnd_avg_pixel4(a, b));
  269.         a = AV_RN4P(&src1[i * src_stride1 + 12]);
  270.         b = AV_RN4P(&src2[i * src_stride2 + 12]);
  271.         op_put(*((pixel4 *) &dst[i * dst_stride + 12]), rnd_avg_pixel4(a, b));
  272.     }
  273. }
  274.  
  275. static inline void avg_pixels4_l2_mmi(uint8_t *dst, const uint8_t *src1,
  276.         const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2,
  277.         int h)
  278. {
  279.     int i;
  280.     for (i = 0; i < h; i++) {
  281.         pixel4 a, b;
  282.         a = AV_RN4P(&src1[i * src_stride1]);
  283.         b = AV_RN4P(&src2[i * src_stride2]);
  284.         op_avg(*((pixel4 *) &dst[i * dst_stride]), rnd_avg_pixel4(a, b));
  285.     }
  286. }
  287.  
  288. static inline void avg_pixels8_l2_mmi(uint8_t *dst, const uint8_t *src1,
  289.         const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2,
  290.         int h)
  291. {
  292.     int i;
  293.     for (i = 0; i < h; i++) {
  294.         pixel4 a, b;
  295.         a = AV_RN4P(&src1[i * src_stride1]);
  296.         b = AV_RN4P(&src2[i * src_stride2]);
  297.         op_avg(*((pixel4 *) &dst[i * dst_stride]), rnd_avg_pixel4(a, b));
  298.         a = AV_RN4P(&src1[i * src_stride1 + 4]);
  299.         b = AV_RN4P(&src2[i * src_stride2 + 4]);
  300.         op_avg(*((pixel4 *) &dst[i * dst_stride + 4]), rnd_avg_pixel4(a, b));
  301.     }
  302. }
  303.  
  304. static inline void avg_pixels16_l2_mmi(uint8_t *dst, const uint8_t *src1,
  305.         const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2,
  306.         int h)
  307. {
  308.     int i;
  309.     for (i = 0; i < h; i++) {
  310.         pixel4 a, b;
  311.         a = AV_RN4P(&src1[i * src_stride1]);
  312.         b = AV_RN4P(&src2[i * src_stride2]);
  313.         op_avg(*((pixel4 *) &dst[i * dst_stride]), rnd_avg_pixel4(a, b));
  314.         a = AV_RN4P(&src1[i * src_stride1 + 4]);
  315.         b = AV_RN4P(&src2[i * src_stride2 + 4]);
  316.         op_avg(*((pixel4 *) &dst[i * dst_stride + 4]), rnd_avg_pixel4(a, b));
  317.         a = AV_RN4P(&src1[i * src_stride1 + 8]);
  318.         b = AV_RN4P(&src2[i * src_stride2 + 8]);
  319.         op_avg(*((pixel4 *) &dst[i * dst_stride + 8]), rnd_avg_pixel4(a, b));
  320.         a = AV_RN4P(&src1[i * src_stride1 + 12]);
  321.         b = AV_RN4P(&src2[i * src_stride2 + 12]);
  322.         op_avg(*((pixel4 *) &dst[i * dst_stride + 12]), rnd_avg_pixel4(a, b));
  323.  
  324.     }
  325. }
  326. #undef op_put
  327. #undef op_avg
  328.  
  329. #define op2_avg(a, b)  a = (((a)+CLIP(((b) + 512)>>10)+1)>>1)
  330. #define op2_put(a, b)  a = CLIP(((b) + 512)>>10)
  331. static void put_h264_qpel4_h_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  332.         int dstStride, int srcStride)
  333. {
  334.     __asm__ volatile (
  335.         "xor $f0, $f0, $f0                      \r\n"
  336.         "dli $8, 4                              \r\n"
  337.         "1:                                     \r\n"
  338.         "gslwlc1 $f2, 1(%[src])                 \r\n"
  339.         "gslwrc1 $f2, -2(%[src])                \r\n"
  340.         "gslwlc1 $f4, 2(%[src])                 \r\n"
  341.         "gslwrc1 $f4, -1(%[src])                \r\n"
  342.         "gslwlc1 $f6, 3(%[src])                 \r\n"
  343.         "gslwrc1 $f6, 0(%[src])                 \r\n"
  344.         "gslwlc1 $f8, 4(%[src])                 \r\n"
  345.         "gslwrc1 $f8, 1(%[src])                 \r\n"
  346.         "gslwlc1 $f10, 5(%[src])                \r\n"
  347.         "gslwrc1 $f10, 2(%[src])                \r\n"
  348.         "gslwlc1 $f12, 6(%[src])                \r\n"
  349.         "gslwrc1 $f12, 3(%[src])                \r\n"
  350.         "punpcklbh $f2, $f2, $f0                \r\n"
  351.         "punpcklbh $f4, $f4, $f0                \r\n"
  352.         "punpcklbh $f6, $f6, $f0                \r\n"
  353.         "punpcklbh $f8, $f8, $f0                \r\n"
  354.         "punpcklbh $f10, $f10, $f0              \r\n"
  355.         "punpcklbh $f12, $f12, $f0              \r\n"
  356.         "paddsh $f14, $f6, $f8                  \r\n"
  357.         "paddsh $f16, $f4, $f10                 \r\n"
  358.         "paddsh $f18, $f2, $f12                 \r\n"
  359.         "pmullh $f14, $f14, %[ff_pw_20]         \r\n"
  360.         "pmullh $f16, $f16, %[ff_pw_5]          \r\n"
  361.         "psubsh $f14, $f14, $f16                \r\n"
  362.         "paddsh $f18, $f14, $f18                \r\n"
  363.         "paddsh $f18, $f18, %[ff_pw_16]         \r\n"
  364.         "psrah $f18, $f18, %[ff_pw_5]           \r\n"
  365.         "packushb $f18, $f18, $f0               \r\n"
  366.         "gsswlc1 $f18, 3(%[dst])                \r\n"
  367.         "gsswrc1 $f18, 0(%[dst])                \r\n"
  368.         "dadd %[dst], %[dst], %[dstStride]      \r\n"
  369.         "dadd %[src], %[src], %[srcStride]      \r\n"
  370.         "daddi $8, $8, -1                       \r\n"
  371.         "bnez $8, 1b                            \r\n"
  372.         : [dst]"+&r"(dst),[src]"+&r"(src)
  373.         : [dstStride]"r"(dstStride),[srcStride]"r"(srcStride),
  374.           [ff_pw_20]"f"(ff_pw_20),[ff_pw_5]"f"(ff_pw_5),[ff_pw_16]"f"(ff_pw_16)
  375.         : "$8","$f0","$f2","$f4","$f6","$f8","$f10","$f12","$f14","$f16",
  376.           "$f18"
  377.     );
  378. }
  379.  
  380. static void put_h264_qpel8_h_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  381.         int dstStride, int srcStride)
  382. {
  383.     __asm__ volatile (
  384.         "xor $f0, $f0, $f0                      \r\n"
  385.         "dli $8, 8                              \r\n"
  386.         "1:                                     \r\n"
  387.         "gsldlc1 $f2, 5(%[src])                 \r\n"
  388.         "gsldrc1 $f2, -2(%[src])                \r\n"
  389.         "gsldlc1 $f4, 6(%[src])                 \r\n"
  390.         "gsldrc1 $f4, -1(%[src])                \r\n"
  391.         "gsldlc1 $f6, 7(%[src])                 \r\n"
  392.         "gsldrc1 $f6, 0(%[src])                 \r\n"
  393.         "gsldlc1 $f8, 8(%[src])                 \r\n"
  394.         "gsldrc1 $f8, 1(%[src])                 \r\n"
  395.         "gsldlc1 $f10, 9(%[src])                \r\n"
  396.         "gsldrc1 $f10, 2(%[src])                \r\n"
  397.         "gsldlc1 $f12, 10(%[src])               \r\n"
  398.         "gsldrc1 $f12, 3(%[src])                \r\n"
  399.         "punpcklbh $f14, $f6, $f0               \r\n"
  400.         "punpckhbh $f16, $f6, $f0               \r\n"
  401.         "punpcklbh $f18, $f8, $f0               \r\n"
  402.         "punpckhbh $f20, $f8, $f0               \r\n"
  403.         "paddsh $f6, $f14, $f18                 \r\n"
  404.         "paddsh $f8, $f16, $f20                 \r\n"
  405.         "pmullh $f6, $f6, %[ff_pw_20]           \r\n"
  406.         "pmullh $f8, $f8, %[ff_pw_20]           \r\n"
  407.         "punpcklbh $f14, $f4, $f0               \r\n"
  408.         "punpckhbh $f16, $f4, $f0               \r\n"
  409.         "punpcklbh $f18, $f10, $f0              \r\n"
  410.         "punpckhbh $f20, $f10, $f0              \r\n"
  411.         "paddsh $f4, $f14, $f18                 \r\n"
  412.         "paddsh $f10, $f16, $f20                \r\n"
  413.         "pmullh $f4, $f4, %[ff_pw_5]            \r\n"
  414.         "pmullh $f10, $f10, %[ff_pw_5]          \r\n"
  415.         "punpcklbh $f14, $f2, $f0               \r\n"
  416.         "punpckhbh $f16, $f2, $f0               \r\n"
  417.         "punpcklbh $f18, $f12, $f0              \r\n"
  418.         "punpckhbh $f20, $f12, $f0              \r\n"
  419.         "paddsh $f2, $f14, $f18                 \r\n"
  420.         "paddsh $f12, $f16, $f20                \r\n"
  421.         "psubsh $f6, $f6, $f4                   \r\n"
  422.         "psubsh $f8, $f8, $f10                  \r\n"
  423.         "paddsh $f6, $f6, $f2                   \r\n"
  424.         "paddsh $f8, $f8, $f12                  \r\n"
  425.         "paddsh $f6, $f6, %[ff_pw_16]           \r\n"
  426.         "paddsh $f8, $f8, %[ff_pw_16]           \r\n"
  427.         "psrah $f6, $f6, %[ff_pw_5]             \r\n"
  428.         "psrah $f8, $f8, %[ff_pw_5]             \r\n"
  429.         "packushb $f18, $f6, $f8                \r\n"
  430.         "sdc1 $f18, 0(%[dst])                   \r\n"
  431.         "dadd %[dst], %[dst], %[dstStride]      \r\n"
  432.         "dadd %[src], %[src], %[srcStride]      \r\n"
  433.         "daddi $8, $8, -1                       \r\n"
  434.         "bnez $8, 1b                            \r\n"
  435.         : [dst]"+&r"(dst),[src]"+&r"(src)
  436.         : [dstStride]"r"(dstStride),[srcStride]"r"(srcStride),
  437.           [ff_pw_20]"f"(ff_pw_20),[ff_pw_5]"f"(ff_pw_5),[ff_pw_16]"f"(ff_pw_16)
  438.         : "$8","$f0","$f2","$f4","$f6","$f8","$f10","$f12","$f14","$f16",
  439.           "$f18","$f20"
  440.     );
  441. }
  442.  
  443. static void put_h264_qpel16_h_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  444.         int dstStride, int srcStride)
  445. {
  446.     put_h264_qpel8_h_lowpass_mmi(dst, src, dstStride, srcStride);
  447.     put_h264_qpel8_h_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  448.     src += 8*srcStride;
  449.     dst += 8*dstStride;
  450.     put_h264_qpel8_h_lowpass_mmi(dst, src, dstStride, srcStride);
  451.     put_h264_qpel8_h_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  452. }
  453.  
  454. static void avg_h264_qpel4_h_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  455.         int dstStride, int srcStride)
  456. {
  457.     __asm__ volatile (
  458.         "xor $f0, $f0, $f0                      \r\n"
  459.         "dli $8, 4                              \r\n"
  460.         "1:                                     \r\n"
  461.         "gslwlc1 $f2, 1(%[src])                 \r\n"
  462.         "gslwrc1 $f2, -2(%[src])                \r\n"
  463.         "gslwlc1 $f4, 2(%[src])                 \r\n"
  464.         "gslwrc1 $f4, -1(%[src])                \r\n"
  465.         "gslwlc1 $f6, 3(%[src])                 \r\n"
  466.         "gslwrc1 $f6, 0(%[src])                 \r\n"
  467.         "gslwlc1 $f8, 4(%[src])                 \r\n"
  468.         "gslwrc1 $f8, 1(%[src])                 \r\n"
  469.         "gslwlc1 $f10, 5(%[src])                \r\n"
  470.         "gslwrc1 $f10, 2(%[src])                \r\n"
  471.         "gslwlc1 $f12, 6(%[src])                \r\n"
  472.         "gslwrc1 $f12, 3(%[src])                \r\n"
  473.         "punpcklbh $f2, $f2, $f0                \r\n"
  474.         "punpcklbh $f4, $f4, $f0                \r\n"
  475.         "punpcklbh $f6, $f6, $f0                \r\n"
  476.         "punpcklbh $f8, $f8, $f0                \r\n"
  477.         "punpcklbh $f10, $f10, $f0              \r\n"
  478.         "punpcklbh $f12, $f12, $f0              \r\n"
  479.         "paddsh $f14, $f6, $f8                  \r\n"
  480.         "paddsh $f16, $f4, $f10                 \r\n"
  481.         "paddsh $f18, $f2, $f12                 \r\n"
  482.         "pmullh $f14, $f14, %[ff_pw_20]         \r\n"
  483.         "pmullh $f16, $f16, %[ff_pw_5]          \r\n"
  484.         "psubsh $f14, $f14, $f16                \r\n"
  485.         "paddsh $f18, $f14, $f18                \r\n"
  486.         "paddsh $f18, $f18, %[ff_pw_16]         \r\n"
  487.         "psrah $f18, $f18, %[ff_pw_5]           \r\n"
  488.         "packushb $f18, $f18, $f0               \r\n"
  489.         "lwc1 $f20, 0(%[dst])                   \r\n"
  490.         "pavgb $f18, $f18, $f20                 \r\n"
  491.         "gsswlc1 $f18, 3(%[dst])                \r\n"
  492.         "gsswrc1 $f18, 0(%[dst])                \r\n"
  493.         "dadd %[dst], %[dst], %[dstStride]      \r\n"
  494.         "dadd %[src], %[src], %[srcStride]      \r\n"
  495.         "daddi $8, $8, -1                       \r\n"
  496.         "bnez $8, 1b                            \r\n"
  497.         : [dst]"+&r"(dst),[src]"+&r"(src)
  498.         : [dstStride]"r"(dstStride),[srcStride]"r"(srcStride),
  499.           [ff_pw_20]"f"(ff_pw_20),[ff_pw_5]"f"(ff_pw_5),[ff_pw_16]"f"(ff_pw_16)
  500.         : "$8","$f0","$f2","$f4","$f6","$f8","$f10","$f12","$f14","$f16",
  501.           "$f18","$f20"
  502.     );
  503. }
  504.  
  505. static void avg_h264_qpel8_h_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  506.         int dstStride, int srcStride)
  507. {
  508.     __asm__ volatile (
  509.         "xor $f0, $f0, $f0                      \r\n"
  510.         "dli $8, 8                              \r\n"
  511.         "1:                                     \r\n"
  512.         "gsldlc1 $f2, 5(%[src])                 \r\n"
  513.         "gsldrc1 $f2, -2(%[src])                \r\n"
  514.         "gsldlc1 $f4, 6(%[src])                 \r\n"
  515.         "gsldrc1 $f4, -1(%[src])                \r\n"
  516.         "gsldlc1 $f6, 7(%[src])                 \r\n"
  517.         "gsldrc1 $f6, 0(%[src])                 \r\n"
  518.         "gsldlc1 $f8, 8(%[src])                 \r\n"
  519.         "gsldrc1 $f8, 1(%[src])                 \r\n"
  520.         "gsldlc1 $f10, 9(%[src])                \r\n"
  521.         "gsldrc1 $f10, 2(%[src])                \r\n"
  522.         "gsldlc1 $f12, 10(%[src])               \r\n"
  523.         "gsldrc1 $f12, 3(%[src])                \r\n"
  524.         "punpcklbh $f14, $f6, $f0               \r\n"
  525.         "punpckhbh $f16, $f6, $f0               \r\n"
  526.         "punpcklbh $f18, $f8, $f0               \r\n"
  527.         "punpckhbh $f20, $f8, $f0               \r\n"
  528.         "paddsh $f6, $f14, $f18                 \r\n"
  529.         "paddsh $f8, $f16, $f20                 \r\n"
  530.         "pmullh $f6, $f6, %[ff_pw_20]           \r\n"
  531.         "pmullh $f8, $f8, %[ff_pw_20]           \r\n"
  532.         "punpcklbh $f14, $f4, $f0               \r\n"
  533.         "punpckhbh $f16, $f4, $f0               \r\n"
  534.         "punpcklbh $f18, $f10, $f0              \r\n"
  535.         "punpckhbh $f20, $f10, $f0              \r\n"
  536.         "paddsh $f4, $f14, $f18                 \r\n"
  537.         "paddsh $f10, $f16, $f20                \r\n"
  538.         "pmullh $f4, $f4, %[ff_pw_5]            \r\n"
  539.         "pmullh $f10, $f10, %[ff_pw_5]          \r\n"
  540.         "punpcklbh $f14, $f2, $f0               \r\n"
  541.         "punpckhbh $f16, $f2, $f0               \r\n"
  542.         "punpcklbh $f18, $f12, $f0              \r\n"
  543.         "punpckhbh $f20, $f12, $f0              \r\n"
  544.         "paddsh $f2, $f14, $f18                 \r\n"
  545.         "paddsh $f12, $f16, $f20                \r\n"
  546.         "psubsh $f6, $f6, $f4                   \r\n"
  547.         "psubsh $f8, $f8, $f10                  \r\n"
  548.         "paddsh $f6, $f6, $f2                   \r\n"
  549.         "paddsh $f8, $f8, $f12                  \r\n"
  550.         "paddsh $f6, $f6, %[ff_pw_16]           \r\n"
  551.         "paddsh $f8, $f8, %[ff_pw_16]           \r\n"
  552.         "psrah $f6, $f6, %[ff_pw_5]             \r\n"
  553.         "psrah $f8, $f8, %[ff_pw_5]             \r\n"
  554.         "packushb $f18, $f6, $f8                \r\n"
  555.         "ldc1 $f20, 0(%[dst])                   \r\n"
  556.         "pavgb $f18, $f18, $f20                 \r\n"
  557.         "sdc1 $f18, 0(%[dst])                   \r\n"
  558.         "dadd %[dst], %[dst], %[dstStride]      \r\n"
  559.         "dadd %[src], %[src], %[srcStride]      \r\n"
  560.         "daddi $8, $8, -1                       \r\n"
  561.         "bnez $8, 1b                            \r\n"
  562.         : [dst]"+&r"(dst),[src]"+&r"(src)
  563.         : [dstStride]"r"(dstStride),[srcStride]"r"(srcStride),
  564.           [ff_pw_20]"f"(ff_pw_20),[ff_pw_5]"f"(ff_pw_5),[ff_pw_16]"f"(ff_pw_16)
  565.         : "$8","$f0","$f2","$f4","$f6","$f8","$f10","$f12","$f14","$f16",
  566.           "$f18","$f20"
  567.     );
  568. }
  569.  
  570. static void avg_h264_qpel16_h_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  571.         int dstStride, int srcStride)
  572. {
  573.     avg_h264_qpel8_h_lowpass_mmi(dst, src, dstStride, srcStride);
  574.     avg_h264_qpel8_h_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  575.     src += 8*srcStride;
  576.     dst += 8*dstStride;
  577.     avg_h264_qpel8_h_lowpass_mmi(dst, src, dstStride, srcStride);
  578.     avg_h264_qpel8_h_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  579. }
  580.  
  581. static void put_h264_qpel4_v_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  582.         int dstStride, int srcStride)
  583. {
  584.     __asm__ volatile (
  585.         "xor $f0, $f0, $f0                      \r\n"
  586.         "gslwlc1 $f2, 3(%[srcB])                \r\n"
  587.         "gslwrc1 $f2, 0(%[srcB])                \r\n"
  588.         "gslwlc1 $f4, 3(%[srcA])                \r\n"
  589.         "gslwrc1 $f4, 0(%[srcA])                \r\n"
  590.         "gslwlc1 $f6, 3(%[src0])                \r\n"
  591.         "gslwrc1 $f6, 0(%[src0])                \r\n"
  592.         "gslwlc1 $f8, 3(%[src1])                \r\n"
  593.         "gslwrc1 $f8, 0(%[src1])                \r\n"
  594.         "gslwlc1 $f10, 3(%[src2])               \r\n"
  595.         "gslwrc1 $f10, 0(%[src2])               \r\n"
  596.         "gslwlc1 $f12, 3(%[src3])               \r\n"
  597.         "gslwrc1 $f12, 0(%[src3])               \r\n"
  598.         "gslwlc1 $f14, 3(%[src4])               \r\n"
  599.         "gslwrc1 $f14, 0(%[src4])               \r\n"
  600.         "gslwlc1 $f16, 3(%[src5])               \r\n"
  601.         "gslwrc1 $f16, 0(%[src5])               \r\n"
  602.         "gslwlc1 $f18, 3(%[src6])               \r\n"
  603.         "gslwrc1 $f18, 0(%[src6])               \r\n"
  604.         "punpcklbh $f2, $f2, $f0                \r\n"
  605.         "punpcklbh $f4, $f4, $f0                \r\n"
  606.         "punpcklbh $f6, $f6, $f0                \r\n"
  607.         "punpcklbh $f8, $f8, $f0                \r\n"
  608.         "punpcklbh $f10, $f10, $f0              \r\n"
  609.         "punpcklbh $f12, $f12, $f0              \r\n"
  610.         "punpcklbh $f14, $f14, $f0              \r\n"
  611.         "punpcklbh $f16, $f16, $f0              \r\n"
  612.         "punpcklbh $f18, $f18, $f0              \r\n"
  613.         "paddsh $f20, $f6, $f8                  \r\n"
  614.         "pmullh $f20, $f20, %[ff_pw_20]         \r\n"
  615.         "paddsh $f22, $f4, $f10                 \r\n"
  616.         "pmullh $f22, $f22, %[ff_pw_5]          \r\n"
  617.         "psubsh $f24, $f20, $f22                \r\n"
  618.         "paddsh $f24, $f24, $f2                 \r\n"
  619.         "paddsh $f24, $f24, $f12                \r\n"
  620.         "paddsh $f20, $f8, $f10                 \r\n"
  621.         "pmullh $f20, $f20, %[ff_pw_20]         \r\n"
  622.         "paddsh $f22, $f6, $f12                 \r\n"
  623.         "pmullh $f22, $f22, %[ff_pw_5]          \r\n"
  624.         "psubsh $f26, $f20, $f22                \r\n"
  625.         "paddsh $f26, $f26, $f4                 \r\n"
  626.         "paddsh $f26, $f26, $f14                \r\n"
  627.         "paddsh $f20, $f10, $f12                \r\n"
  628.         "pmullh $f20, $f20, %[ff_pw_20]         \r\n"
  629.         "paddsh $f22, $f8, $f14                 \r\n"
  630.         "pmullh $f22, $f22, %[ff_pw_5]          \r\n"
  631.         "psubsh $f28, $f20, $f22                \r\n"
  632.         "paddsh $f28, $f28, $f6                 \r\n"
  633.         "paddsh $f28, $f28, $f16                \r\n"
  634.         "paddsh $f20, $f12, $f14                \r\n"
  635.         "pmullh $f20, $f20, %[ff_pw_20]         \r\n"
  636.         "paddsh $f22, $f10, $f16                \r\n"
  637.         "pmullh $f22, $f22, %[ff_pw_5]          \r\n"
  638.         "psubsh $f30, $f20, $f22                \r\n"
  639.         "paddsh $f30, $f30, $f8                 \r\n"
  640.         "paddsh $f30, $f30, $f18                \r\n"
  641.         "paddsh $f24, $f24, %[ff_pw_16]         \r\n"
  642.         "paddsh $f26, $f26, %[ff_pw_16]         \r\n"
  643.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  644.         "paddsh $f30, $f30, %[ff_pw_16]         \r\n"
  645.         "psrah $f24, $f24, %[ff_pw_5]           \r\n"
  646.         "psrah $f26, $f26, %[ff_pw_5]           \r\n"
  647.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  648.         "psrah $f30, $f30, %[ff_pw_5]           \r\n"
  649.         "packushb $f24, $f24, $f0               \r\n"
  650.         "packushb $f26, $f26, $f0               \r\n"
  651.         "packushb $f28, $f28, $f0               \r\n"
  652.         "packushb $f30, $f30, $f0               \r\n"
  653.         "swc1 $f24, 0(%[dst0])                  \r\n"
  654.         "swc1 $f26, 0(%[dst1])                  \r\n"
  655.         "swc1 $f28, 0(%[dst2])                  \r\n"
  656.         "swc1 $f30, 0(%[dst3])                  \r\n"
  657.         ::[dst0]"r"(dst),               [dst1]"r"(dst+dstStride),
  658.           [dst2]"r"(dst+2*dstStride),   [dst3]"r"(dst+3*dstStride),
  659.           [srcB]"r"(src-2*srcStride),   [srcA]"r"(src-srcStride),
  660.           [src0]"r"(src),               [src1]"r"(src+srcStride),
  661.           [src2]"r"(src+2*srcStride),   [src3]"r"(src+3*srcStride),
  662.           [src4]"r"(src+4*srcStride),   [src5]"r"(src+5*srcStride),
  663.           [src6]"r"(src+6*srcStride),   [ff_pw_20]"f"(ff_pw_20),
  664.           [ff_pw_5]"f"(ff_pw_5),        [ff_pw_16]"f"(ff_pw_16)
  665.         : "$f0","$f2","$f4","$f6","$f8","$f10","$f12","$f14","$f16","$f18",
  666.           "$f20","$f22","$f24","$f26","$f28","$f30"
  667.     );
  668. }
  669.  
  670. static void put_h264_qpel8_v_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  671.         int dstStride, int srcStride)
  672. {
  673.     __asm__ volatile (
  674.         "xor $f0, $f0, $f0                      \r\n"
  675.         "gsldlc1 $f2, 7(%[srcB])                \r\n"
  676.         "gsldrc1 $f2, 0(%[srcB])                \r\n"
  677.         "gsldlc1 $f4, 7(%[srcA])                \r\n"
  678.         "gsldrc1 $f4, 0(%[srcA])                \r\n"
  679.         "gsldlc1 $f6, 7(%[src0])                \r\n"
  680.         "gsldrc1 $f6, 0(%[src0])                \r\n"
  681.         "gsldlc1 $f8, 7(%[src1])                \r\n"
  682.         "gsldrc1 $f8, 0(%[src1])                \r\n"
  683.         "gsldlc1 $f10, 7(%[src2])               \r\n"
  684.         "gsldrc1 $f10, 0(%[src2])               \r\n"
  685.         "gsldlc1 $f12, 7(%[src3])               \r\n"
  686.         "gsldrc1 $f12, 0(%[src3])               \r\n"
  687.         "gsldlc1 $f14, 7(%[src4])               \r\n"
  688.         "gsldrc1 $f14, 0(%[src4])               \r\n"
  689.         "gsldlc1 $f16, 7(%[src5])               \r\n"
  690.         "gsldrc1 $f16, 0(%[src5])               \r\n"
  691.         "gsldlc1 $f18, 7(%[src6])               \r\n"
  692.         "gsldrc1 $f18, 0(%[src6])               \r\n"
  693.         "gsldlc1 $f20, 7(%[src7])               \r\n"
  694.         "gsldrc1 $f20, 0(%[src7])               \r\n"
  695.         "gsldlc1 $f22, 7(%[src8])               \r\n"
  696.         "gsldrc1 $f22, 0(%[src8])               \r\n"
  697.         "gsldlc1 $f24, 7(%[src9])               \r\n"
  698.         "gsldrc1 $f24, 0(%[src9])               \r\n"
  699.         "gsldlc1 $f26, 7(%[src10])              \r\n"
  700.         "gsldrc1 $f26, 0(%[src10])              \r\n"
  701.         "punpcklbh $f1, $f2, $f0                \r\n"
  702.         "punpckhbh $f2, $f2, $f0                \r\n"
  703.         "punpcklbh $f3, $f4, $f0                \r\n"
  704.         "punpckhbh $f4, $f4, $f0                \r\n"
  705.         "punpcklbh $f5, $f6, $f0                \r\n"
  706.         "punpckhbh $f6, $f6, $f0                \r\n"
  707.         "punpcklbh $f7, $f8, $f0                \r\n"
  708.         "punpckhbh $f8, $f8, $f0                \r\n"
  709.         "punpcklbh $f9, $f10, $f0               \r\n"
  710.         "punpckhbh $f10, $f10, $f0              \r\n"
  711.         "punpcklbh $f11, $f12, $f0              \r\n"
  712.         "punpckhbh $f12, $f12, $f0              \r\n"
  713.         "punpcklbh $f13, $f14, $f0              \r\n"
  714.         "punpckhbh $f14, $f14, $f0              \r\n"
  715.         "punpcklbh $f15, $f16, $f0              \r\n"
  716.         "punpckhbh $f16, $f16, $f0              \r\n"
  717.         "punpcklbh $f17, $f18, $f0              \r\n"
  718.         "punpckhbh $f18, $f18, $f0              \r\n"
  719.         "punpcklbh $f19, $f20, $f0              \r\n"
  720.         "punpckhbh $f20, $f20, $f0              \r\n"
  721.         "punpcklbh $f21, $f22, $f0              \r\n"
  722.         "punpckhbh $f22, $f22, $f0              \r\n"
  723.         "punpcklbh $f23, $f24, $f0              \r\n"
  724.         "punpckhbh $f24, $f24, $f0              \r\n"
  725.         "punpcklbh $f25, $f26, $f0              \r\n"
  726.         "punpckhbh $f26, $f26, $f0              \r\n"
  727.         "paddsh $f27, $f5, $f7                  \r\n"
  728.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  729.         "paddsh $f28, $f6, $f8                  \r\n"//src0+src1
  730.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  731.         "psubsh $f27, $f27, $f3                 \r\n"
  732.         "psubsh $f28, $f28, $f4                 \r\n"
  733.         "psubsh $f27, $f27, $f9                 \r\n"
  734.         "psubsh $f28, $f28, $f10                \r\n"
  735.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  736.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  737.         "paddsh $f27, $f27, $f1                 \r\n"
  738.         "paddsh $f28, $f28, $f2                 \r\n"
  739.         "paddsh $f27, $f27, $f11                \r\n"
  740.         "paddsh $f28, $f28, $f12                \r\n"
  741.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  742.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  743.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  744.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  745.         "packushb $f27, $f27, $f0               \r\n"
  746.         "packushb $f28, $f28, $f0               \r\n"
  747.         "punpcklwd $f2, $f27, $f28              \r\n"
  748.         "sdc1 $f2, 0(%[dst0])                   \r\n"
  749.         "paddsh $f27, $f7, $f9                  \r\n"
  750.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  751.         "paddsh $f28, $f8, $f10                 \r\n"//src1+src2
  752.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  753.         "psubsh $f27, $f27, $f5                 \r\n"
  754.         "psubsh $f28, $f28, $f6                 \r\n"
  755.         "psubsh $f27, $f27, $f11                \r\n"
  756.         "psubsh $f28, $f28, $f12                \r\n"
  757.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  758.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  759.         "paddsh $f27, $f27, $f3                 \r\n"
  760.         "paddsh $f28, $f28, $f4                 \r\n"
  761.         "paddsh $f27, $f27, $f13                \r\n"
  762.         "paddsh $f28, $f28, $f14                \r\n"
  763.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  764.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  765.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  766.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  767.         "packushb $f27, $f27, $f0               \r\n"
  768.         "packushb $f28, $f28, $f0               \r\n"
  769.         "punpcklwd $f4, $f27, $f28              \r\n"
  770.         "sdc1 $f4, 0(%[dst1])                   \r\n"
  771.         "paddsh $f27, $f9, $f11                 \r\n"
  772.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  773.         "paddsh $f28, $f10, $f12                \r\n"//src2+src3
  774.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  775.         "psubsh $f27, $f27, $f7                 \r\n"
  776.         "psubsh $f28, $f28, $f8                 \r\n"
  777.         "psubsh $f27, $f27, $f13                \r\n"
  778.         "psubsh $f28, $f28, $f14                \r\n"
  779.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  780.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  781.         "paddsh $f27, $f27, $f5                 \r\n"
  782.         "paddsh $f28, $f28, $f6                 \r\n"
  783.         "paddsh $f27, $f27, $f15                \r\n"
  784.         "paddsh $f28, $f28, $f16                \r\n"
  785.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  786.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  787.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  788.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  789.         "packushb $f27, $f27, $f0               \r\n"
  790.         "packushb $f28, $f28, $f0               \r\n"
  791.         "punpcklwd $f6, $f27, $f28              \r\n"
  792.         "sdc1 $f6, 0(%[dst2])                   \r\n"
  793.         "paddsh $f27, $f11, $f13                \r\n"
  794.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  795.         "paddsh $f28, $f12, $f14                \r\n"//src3+src4
  796.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  797.         "psubsh $f27, $f27, $f9                 \r\n"
  798.         "psubsh $f28, $f28, $f10                \r\n"
  799.         "psubsh $f27, $f27, $f15                \r\n"
  800.         "psubsh $f28, $f28, $f16                \r\n"
  801.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  802.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  803.         "paddsh $f27, $f27, $f7                 \r\n"
  804.         "paddsh $f28, $f28, $f8                 \r\n"
  805.         "paddsh $f27, $f27, $f17                \r\n"
  806.         "paddsh $f28, $f28, $f18                \r\n"
  807.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  808.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  809.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  810.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  811.         "packushb $f27, $f27, $f0               \r\n"
  812.         "packushb $f28, $f28, $f0               \r\n"
  813.         "punpcklwd $f8, $f27, $f28              \r\n"
  814.         "sdc1 $f8, 0(%[dst3])                   \r\n"
  815.         "paddsh $f27, $f13, $f15                \r\n"
  816.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  817.         "paddsh $f28, $f14, $f16                \r\n"//src4+src5
  818.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  819.         "psubsh $f27, $f27, $f11                \r\n"
  820.         "psubsh $f28, $f28, $f12                \r\n"
  821.         "psubsh $f27, $f27, $f17                \r\n"
  822.         "psubsh $f28, $f28, $f18                \r\n"
  823.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  824.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  825.         "paddsh $f27, $f27, $f9                 \r\n"
  826.         "paddsh $f28, $f28, $f10                \r\n"
  827.         "paddsh $f27, $f27, $f19                \r\n"
  828.         "paddsh $f28, $f28, $f20                \r\n"
  829.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  830.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  831.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  832.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  833.         "packushb $f27, $f27, $f0               \r\n"
  834.         "packushb $f28, $f28, $f0               \r\n"
  835.         "punpcklwd $f10, $f27, $f28             \r\n"
  836.         "sdc1 $f10, 0(%[dst4])                  \r\n"
  837.  
  838.         "paddsh $f27, $f15, $f17                \r\n"
  839.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  840.         "paddsh $f28, $f16, $f18                \r\n"//src5+src6
  841.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  842.         "psubsh $f27, $f27, $f13                \r\n"
  843.         "psubsh $f28, $f28, $f14                \r\n"
  844.         "psubsh $f27, $f27, $f19                \r\n"
  845.         "psubsh $f28, $f28, $f20                \r\n"
  846.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  847.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  848.         "paddsh $f27, $f27, $f11                \r\n"
  849.         "paddsh $f28, $f28, $f12                \r\n"
  850.         "paddsh $f27, $f27, $f21                \r\n"
  851.         "paddsh $f28, $f28, $f22                \r\n"
  852.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  853.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  854.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  855.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  856.         "packushb $f27, $f27, $f0               \r\n"
  857.         "packushb $f28, $f28, $f0               \r\n"
  858.         "punpcklwd $f12, $f27, $f28             \r\n"
  859.         "sdc1 $f12, 0(%[dst5])                  \r\n"
  860.         "paddsh $f27, $f17, $f19                \r\n"
  861.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  862.         "paddsh $f28, $f18, $f20                \r\n"//src6+src7
  863.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  864.         "psubsh $f27, $f27, $f15                \r\n"
  865.         "psubsh $f28, $f28, $f16                \r\n"
  866.         "psubsh $f27, $f27, $f21                \r\n"
  867.         "psubsh $f28, $f28, $f22                \r\n"
  868.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  869.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  870.         "paddsh $f27, $f27, $f13                \r\n"
  871.         "paddsh $f28, $f28, $f14                \r\n"
  872.         "paddsh $f27, $f27, $f23                \r\n"
  873.         "paddsh $f28, $f28, $f24                \r\n"
  874.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  875.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  876.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  877.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  878.         "packushb $f27, $f27, $f0               \r\n"
  879.         "packushb $f28, $f28, $f0               \r\n"
  880.         "punpcklwd $f14, $f27, $f28             \r\n"
  881.         "sdc1 $f14, 0(%[dst6])                  \r\n"
  882.         "paddsh $f27, $f19, $f21                \r\n"
  883.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  884.         "paddsh $f28, $f20, $f22                \r\n"//src7+src8
  885.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  886.         "psubsh $f27, $f27, $f17                \r\n"
  887.         "psubsh $f28, $f28, $f18                \r\n"
  888.         "psubsh $f27, $f27, $f23                \r\n"
  889.         "psubsh $f28, $f28, $f24                \r\n"
  890.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  891.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  892.         "paddsh $f27, $f27, $f15                \r\n"
  893.         "paddsh $f28, $f28, $f16                \r\n"
  894.         "paddsh $f27, $f27, $f25                \r\n"
  895.         "paddsh $f28, $f28, $f26                \r\n"
  896.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  897.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  898.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  899.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  900.         "packushb $f27, $f27, $f0               \r\n"
  901.         "packushb $f28, $f28, $f0               \r\n"
  902.         "punpcklwd $f16, $f27, $f28             \r\n"
  903.         "sdc1 $f16, 0(%[dst7])                  \r\n"
  904.         ::[dst0]"r"(dst),               [dst1]"r"(dst+dstStride),
  905.           [dst2]"r"(dst+2*dstStride),   [dst3]"r"(dst+3*dstStride),
  906.           [dst4]"r"(dst+4*dstStride),   [dst5]"r"(dst+5*dstStride),
  907.           [dst6]"r"(dst+6*dstStride),   [dst7]"r"(dst+7*dstStride),
  908.           [srcB]"r"(src-2*srcStride),   [srcA]"r"(src-srcStride),
  909.           [src0]"r"(src),               [src1]"r"(src+srcStride),
  910.           [src2]"r"(src+2*srcStride),   [src3]"r"(src+3*srcStride),
  911.           [src4]"r"(src+4*srcStride),   [src5]"r"(src+5*srcStride),
  912.           [src6]"r"(src+6*srcStride),   [src7]"r"(src+7*srcStride),
  913.           [src8]"r"(src+8*srcStride),   [src9]"r"(src+9*srcStride),
  914.           [src10]"r"(src+10*srcStride), [ff_pw_4]"f"(ff_pw_4),
  915.           [ff_pw_5]"f"(ff_pw_5),        [ff_pw_16]"f"(ff_pw_16)
  916.         : "$f0","$f1","$f2","$f3","$f4","$f5","$f6","$f7","$f8","$f9","$f10",
  917.           "$f11","$f12","$f13","$f14","$f15","$f16","$f17","$f18","$f19",
  918.           "$f20","$f21","$f22","$f23","$f24","$f25","$f26","$f27","$f28"
  919.     );
  920. }
  921.  
  922. static void put_h264_qpel16_v_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  923.         int dstStride, int srcStride)
  924. {
  925.     put_h264_qpel8_v_lowpass_mmi(dst, src, dstStride, srcStride);
  926.     put_h264_qpel8_v_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  927.     src += 8*srcStride;
  928.     dst += 8*dstStride;
  929.     put_h264_qpel8_v_lowpass_mmi(dst, src, dstStride, srcStride);
  930.     put_h264_qpel8_v_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  931. }
  932.  
  933. static void avg_h264_qpel4_v_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  934.         int dstStride, int srcStride)
  935. {
  936.     __asm__ volatile (
  937.         "xor $f0, $f0, $f0                      \r\n"
  938.         "gslwlc1 $f2, 3(%[srcB])                \r\n"
  939.         "gslwrc1 $f2, 0(%[srcB])                \r\n"
  940.         "gslwlc1 $f4, 3(%[srcA])                \r\n"
  941.         "gslwrc1 $f4, 0(%[srcA])                \r\n"
  942.         "gslwlc1 $f6, 3(%[src0])                \r\n"
  943.         "gslwrc1 $f6, 0(%[src0])                \r\n"
  944.         "gslwlc1 $f8, 3(%[src1])                \r\n"
  945.         "gslwrc1 $f8, 0(%[src1])                \r\n"
  946.         "gslwlc1 $f10, 3(%[src2])               \r\n"
  947.         "gslwrc1 $f10, 0(%[src2])               \r\n"
  948.         "gslwlc1 $f12, 3(%[src3])               \r\n"
  949.         "gslwrc1 $f12, 0(%[src3])               \r\n"
  950.         "gslwlc1 $f14, 3(%[src4])               \r\n"
  951.         "gslwrc1 $f14, 0(%[src4])               \r\n"
  952.         "gslwlc1 $f16, 3(%[src5])               \r\n"
  953.         "gslwrc1 $f16, 0(%[src5])               \r\n"
  954.         "gslwlc1 $f18, 3(%[src6])               \r\n"
  955.         "gslwrc1 $f18, 0(%[src6])               \r\n"
  956.         "punpcklbh $f2, $f2, $f0                \r\n"
  957.         "punpcklbh $f4, $f4, $f0                \r\n"
  958.         "punpcklbh $f6, $f6, $f0                \r\n"
  959.         "punpcklbh $f8, $f8, $f0                \r\n"
  960.         "punpcklbh $f10, $f10, $f0              \r\n"
  961.         "punpcklbh $f12, $f12, $f0              \r\n"
  962.         "punpcklbh $f14, $f14, $f0              \r\n"
  963.         "punpcklbh $f16, $f16, $f0              \r\n"
  964.         "punpcklbh $f18, $f18, $f0              \r\n"
  965.         "paddsh $f20, $f6, $f8                  \r\n"
  966.         "pmullh $f20, $f20, %[ff_pw_20]         \r\n"
  967.         "paddsh $f22, $f4, $f10                 \r\n"
  968.         "pmullh $f22, $f22, %[ff_pw_5]          \r\n"
  969.         "psubsh $f24, $f20, $f22                \r\n"
  970.         "paddsh $f24, $f24, $f2                 \r\n"
  971.         "paddsh $f24, $f24, $f12                \r\n"
  972.         "paddsh $f20, $f8, $f10                 \r\n"
  973.         "pmullh $f20, $f20, %[ff_pw_20]         \r\n"
  974.         "paddsh $f22, $f6, $f12                 \r\n"
  975.         "pmullh $f22, $f22, %[ff_pw_5]          \r\n"
  976.         "psubsh $f26, $f20, $f22                \r\n"
  977.         "paddsh $f26, $f26, $f4                 \r\n"
  978.         "paddsh $f26, $f26, $f14                \r\n"
  979.         "paddsh $f20, $f10, $f12                \r\n"
  980.         "pmullh $f20, $f20, %[ff_pw_20]         \r\n"
  981.         "paddsh $f22, $f8, $f14                 \r\n"
  982.         "pmullh $f22, $f22, %[ff_pw_5]          \r\n"
  983.         "psubsh $f28, $f20, $f22                \r\n"
  984.         "paddsh $f28, $f28, $f6                 \r\n"
  985.         "paddsh $f28, $f28, $f16                \r\n"
  986.         "paddsh $f20, $f12, $f14                \r\n"
  987.         "pmullh $f20, $f20, %[ff_pw_20]         \r\n"
  988.         "paddsh $f22, $f10, $f16                \r\n"
  989.         "pmullh $f22, $f22, %[ff_pw_5]          \r\n"
  990.         "psubsh $f30, $f20, $f22                \r\n"
  991.         "paddsh $f30, $f30, $f8                 \r\n"
  992.         "paddsh $f30, $f30, $f18                \r\n"
  993.         "paddsh $f24, $f24, %[ff_pw_16]         \r\n"
  994.         "paddsh $f26, $f26, %[ff_pw_16]         \r\n"
  995.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  996.         "paddsh $f30, $f30, %[ff_pw_16]         \r\n"
  997.         "psrah $f24, $f24, %[ff_pw_5]           \r\n"
  998.         "psrah $f26, $f26, %[ff_pw_5]           \r\n"
  999.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  1000.         "psrah $f30, $f30, %[ff_pw_5]           \r\n"
  1001.         "packushb $f24, $f24, $f0               \r\n"
  1002.         "packushb $f26, $f26, $f0               \r\n"
  1003.         "packushb $f28, $f28, $f0               \r\n"
  1004.         "packushb $f30, $f30, $f0               \r\n"
  1005.         "lwc1 $f2, 0(%[dst0])                   \r\n"
  1006.         "lwc1 $f4, 0(%[dst1])                   \r\n"
  1007.         "lwc1 $f6, 0(%[dst2])                   \r\n"
  1008.         "lwc1 $f8, 0(%[dst3])                   \r\n"
  1009.         "pavgb $f24, $f2, $f24                  \r\n"
  1010.         "pavgb $f26, $f4, $f26                  \r\n"
  1011.         "pavgb $f28, $f6, $f28                  \r\n"
  1012.         "pavgb $f30, $f8, $f30                  \r\n"
  1013.         "swc1 $f24, 0(%[dst0])                  \r\n"
  1014.         "swc1 $f26, 0(%[dst1])                  \r\n"
  1015.         "swc1 $f28, 0(%[dst2])                  \r\n"
  1016.         "swc1 $f30, 0(%[dst3])                  \r\n"
  1017.         ::[dst0]"r"(dst),               [dst1]"r"(dst+dstStride),
  1018.           [dst2]"r"(dst+2*dstStride),   [dst3]"r"(dst+3*dstStride),
  1019.           [srcB]"r"(src-2*srcStride),   [srcA]"r"(src-srcStride),
  1020.           [src0]"r"(src),               [src1]"r"(src+srcStride),
  1021.           [src2]"r"(src+2*srcStride),   [src3]"r"(src+3*srcStride),
  1022.           [src4]"r"(src+4*srcStride),   [src5]"r"(src+5*srcStride),
  1023.           [src6]"r"(src+6*srcStride),   [ff_pw_20]"f"(ff_pw_20),
  1024.           [ff_pw_5]"f"(ff_pw_5),        [ff_pw_16]"f"(ff_pw_16)
  1025.         : "$f0","$f2","$f4","$f6","$f8","$f10","$f12","$f14","$f16","$f18",
  1026.           "$f20","$f22","$f24","$f26","$f28","$f30"
  1027.     );
  1028. }
  1029.  
  1030. static void avg_h264_qpel8_v_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  1031.         int dstStride, int srcStride)
  1032. {
  1033.     __asm__ volatile (
  1034.         "xor $f0, $f0, $f0                      \r\n"
  1035.         "gsldlc1 $f2, 7(%[srcB])                \r\n"
  1036.         "gsldrc1 $f2, 0(%[srcB])                \r\n"
  1037.         "gsldlc1 $f4, 7(%[srcA])                \r\n"
  1038.         "gsldrc1 $f4, 0(%[srcA])                \r\n"
  1039.         "gsldlc1 $f6, 7(%[src0])                \r\n"
  1040.         "gsldrc1 $f6, 0(%[src0])                \r\n"
  1041.         "gsldlc1 $f8, 7(%[src1])                \r\n"
  1042.         "gsldrc1 $f8, 0(%[src1])                \r\n"
  1043.         "gsldlc1 $f10, 7(%[src2])               \r\n"
  1044.         "gsldrc1 $f10, 0(%[src2])               \r\n"
  1045.         "gsldlc1 $f12, 7(%[src3])               \r\n"
  1046.         "gsldrc1 $f12, 0(%[src3])               \r\n"
  1047.         "gsldlc1 $f14, 7(%[src4])               \r\n"
  1048.         "gsldrc1 $f14, 0(%[src4])               \r\n"
  1049.         "gsldlc1 $f16, 7(%[src5])               \r\n"
  1050.         "gsldrc1 $f16, 0(%[src5])               \r\n"
  1051.         "gsldlc1 $f18, 7(%[src6])               \r\n"
  1052.         "gsldrc1 $f18, 0(%[src6])               \r\n"
  1053.         "gsldlc1 $f20, 7(%[src7])               \r\n"
  1054.         "gsldrc1 $f20, 0(%[src7])               \r\n"
  1055.         "gsldlc1 $f22, 7(%[src8])               \r\n"
  1056.         "gsldrc1 $f22, 0(%[src8])               \r\n"
  1057.         "gsldlc1 $f24, 7(%[src9])               \r\n"
  1058.         "gsldrc1 $f24, 0(%[src9])               \r\n"
  1059.         "gsldlc1 $f26, 7(%[src10])              \r\n"
  1060.         "gsldrc1 $f26, 0(%[src10])              \r\n"
  1061.         "punpcklbh $f1, $f2, $f0                \r\n"
  1062.         "punpckhbh $f2, $f2, $f0                \r\n"
  1063.         "punpcklbh $f3, $f4, $f0                \r\n"
  1064.         "punpckhbh $f4, $f4, $f0                \r\n"
  1065.         "punpcklbh $f5, $f6, $f0                \r\n"
  1066.         "punpckhbh $f6, $f6, $f0                \r\n"
  1067.         "punpcklbh $f7, $f8, $f0                \r\n"
  1068.         "punpckhbh $f8, $f8, $f0                \r\n"
  1069.         "punpcklbh $f9, $f10, $f0               \r\n"
  1070.         "punpckhbh $f10, $f10, $f0              \r\n"
  1071.         "punpcklbh $f11, $f12, $f0              \r\n"
  1072.         "punpckhbh $f12, $f12, $f0              \r\n"
  1073.         "punpcklbh $f13, $f14, $f0              \r\n"
  1074.         "punpckhbh $f14, $f14, $f0              \r\n"
  1075.         "punpcklbh $f15, $f16, $f0              \r\n"
  1076.         "punpckhbh $f16, $f16, $f0              \r\n"
  1077.         "punpcklbh $f17, $f18, $f0              \r\n"
  1078.         "punpckhbh $f18, $f18, $f0              \r\n"
  1079.         "punpcklbh $f19, $f20, $f0              \r\n"
  1080.         "punpckhbh $f20, $f20, $f0              \r\n"
  1081.         "punpcklbh $f21, $f22, $f0              \r\n"
  1082.         "punpckhbh $f22, $f22, $f0              \r\n"
  1083.         "punpcklbh $f23, $f24, $f0              \r\n"
  1084.         "punpckhbh $f24, $f24, $f0              \r\n"
  1085.         "punpcklbh $f25, $f26, $f0              \r\n"
  1086.         "punpckhbh $f26, $f26, $f0              \r\n"
  1087.         "paddsh $f27, $f5, $f7                  \r\n"
  1088.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  1089.         "paddsh $f28, $f6, $f8                  \r\n"//src0+src1
  1090.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  1091.         "psubsh $f27, $f27, $f3                 \r\n"
  1092.         "psubsh $f28, $f28, $f4                 \r\n"
  1093.         "psubsh $f27, $f27, $f9                 \r\n"
  1094.         "psubsh $f28, $f28, $f10                \r\n"
  1095.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  1096.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  1097.         "paddsh $f27, $f27, $f1                 \r\n"
  1098.         "paddsh $f28, $f28, $f2                 \r\n"
  1099.         "paddsh $f27, $f27, $f11                \r\n"
  1100.         "paddsh $f28, $f28, $f12                \r\n"
  1101.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  1102.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  1103.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  1104.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  1105.         "packushb $f27, $f27, $f0               \r\n"
  1106.         "packushb $f28, $f28, $f0               \r\n"
  1107.         "punpcklwd $f2, $f27, $f28              \r\n"
  1108.         "ldc1 $f28, 0(%[dst0])                  \r\n"
  1109.         "pavgb $f2, $f2, $f28                   \r\n"
  1110.         "sdc1 $f2, 0(%[dst0])                   \r\n"
  1111.         "paddsh $f27, $f7, $f9                  \r\n"
  1112.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  1113.         "paddsh $f28, $f8, $f10                 \r\n"//src1+src2
  1114.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  1115.         "psubsh $f27, $f27, $f5                 \r\n"
  1116.         "psubsh $f28, $f28, $f6                 \r\n"
  1117.         "psubsh $f27, $f27, $f11                \r\n"
  1118.         "psubsh $f28, $f28, $f12                \r\n"
  1119.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  1120.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  1121.         "paddsh $f27, $f27, $f3                 \r\n"
  1122.         "paddsh $f28, $f28, $f4                 \r\n"
  1123.         "paddsh $f27, $f27, $f13                \r\n"
  1124.         "paddsh $f28, $f28, $f14                \r\n"
  1125.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  1126.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  1127.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  1128.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  1129.         "packushb $f27, $f27, $f0               \r\n"
  1130.         "packushb $f28, $f28, $f0               \r\n"
  1131.         "punpcklwd $f4, $f27, $f28              \r\n"
  1132.         "ldc1 $f28, 0(%[dst1])                  \r\n"
  1133.         "pavgb $f4, $f4, $f28                   \r\n"
  1134.         "sdc1 $f4, 0(%[dst1])                   \r\n"
  1135.         "paddsh $f27, $f9, $f11                 \r\n"
  1136.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  1137.         "paddsh $f28, $f10, $f12                \r\n"//src2+src3
  1138.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  1139.         "psubsh $f27, $f27, $f7                 \r\n"
  1140.         "psubsh $f28, $f28, $f8                 \r\n"
  1141.         "psubsh $f27, $f27, $f13                \r\n"
  1142.         "psubsh $f28, $f28, $f14                \r\n"
  1143.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  1144.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  1145.         "paddsh $f27, $f27, $f5                 \r\n"
  1146.         "paddsh $f28, $f28, $f6                 \r\n"
  1147.         "paddsh $f27, $f27, $f15                \r\n"
  1148.         "paddsh $f28, $f28, $f16                \r\n"
  1149.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  1150.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  1151.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  1152.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  1153.         "packushb $f27, $f27, $f0               \r\n"
  1154.         "packushb $f28, $f28, $f0               \r\n"
  1155.         "punpcklwd $f6, $f27, $f28              \r\n"
  1156.         "ldc1 $f28, 0(%[dst2])                  \r\n"
  1157.         "pavgb $f6, $f6, $f28                   \r\n"
  1158.         "sdc1 $f6, 0(%[dst2])                   \r\n"
  1159.         "paddsh $f27, $f11, $f13                \r\n"
  1160.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  1161.         "paddsh $f28, $f12, $f14                \r\n"//src3+src4
  1162.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  1163.         "psubsh $f27, $f27, $f9                 \r\n"
  1164.         "psubsh $f28, $f28, $f10                \r\n"
  1165.         "psubsh $f27, $f27, $f15                \r\n"
  1166.         "psubsh $f28, $f28, $f16                \r\n"
  1167.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  1168.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  1169.         "paddsh $f27, $f27, $f7                 \r\n"
  1170.         "paddsh $f28, $f28, $f8                 \r\n"
  1171.         "paddsh $f27, $f27, $f17                \r\n"
  1172.         "paddsh $f28, $f28, $f18                \r\n"
  1173.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  1174.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  1175.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  1176.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  1177.         "packushb $f27, $f27, $f0               \r\n"
  1178.         "packushb $f28, $f28, $f0               \r\n"
  1179.         "punpcklwd $f8, $f27, $f28              \r\n"
  1180.         "ldc1 $f28, 0(%[dst3])                  \r\n"
  1181.         "pavgb $f8, $f8, $f28                   \r\n"
  1182.         "sdc1 $f8, 0(%[dst3])                   \r\n"
  1183.         "paddsh $f27, $f13, $f15                \r\n"
  1184.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  1185.         "paddsh $f28, $f14, $f16                \r\n"//src4+src5
  1186.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  1187.         "psubsh $f27, $f27, $f11                \r\n"
  1188.         "psubsh $f28, $f28, $f12                \r\n"
  1189.         "psubsh $f27, $f27, $f17                \r\n"
  1190.         "psubsh $f28, $f28, $f18                \r\n"
  1191.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  1192.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  1193.         "paddsh $f27, $f27, $f9                 \r\n"
  1194.         "paddsh $f28, $f28, $f10                \r\n"
  1195.         "paddsh $f27, $f27, $f19                \r\n"
  1196.         "paddsh $f28, $f28, $f20                \r\n"
  1197.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  1198.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  1199.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  1200.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  1201.         "packushb $f27, $f27, $f0               \r\n"
  1202.         "packushb $f28, $f28, $f0               \r\n"
  1203.         "punpcklwd $f10, $f27, $f28             \r\n"
  1204.         "ldc1 $f28, 0(%[dst4])                  \r\n"
  1205.         "pavgb $f10, $f10, $f28                 \r\n"
  1206.         "sdc1 $f10, 0(%[dst4])                  \r\n"
  1207.         "paddsh $f27, $f15, $f17                \r\n"
  1208.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  1209.         "paddsh $f28, $f16, $f18                \r\n"//src5+src6
  1210.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  1211.         "psubsh $f27, $f27, $f13                \r\n"
  1212.         "psubsh $f28, $f28, $f14                \r\n"
  1213.         "psubsh $f27, $f27, $f19                \r\n"
  1214.         "psubsh $f28, $f28, $f20                \r\n"
  1215.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  1216.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  1217.         "paddsh $f27, $f27, $f11                \r\n"
  1218.         "paddsh $f28, $f28, $f12                \r\n"
  1219.         "paddsh $f27, $f27, $f21                \r\n"
  1220.         "paddsh $f28, $f28, $f22                \r\n"
  1221.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  1222.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  1223.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  1224.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  1225.         "packushb $f27, $f27, $f0               \r\n"
  1226.         "packushb $f28, $f28, $f0               \r\n"
  1227.         "punpcklwd $f12, $f27, $f28             \r\n"
  1228.         "ldc1 $f28, 0(%[dst5])                  \r\n"
  1229.         "pavgb $f12, $f12, $f28                 \r\n"
  1230.         "sdc1 $f12, 0(%[dst5])                  \r\n"
  1231.         "paddsh $f27, $f17, $f19                \r\n"
  1232.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  1233.         "paddsh $f28, $f18, $f20                \r\n"//src6+src7
  1234.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  1235.         "psubsh $f27, $f27, $f15                \r\n"
  1236.         "psubsh $f28, $f28, $f16                \r\n"
  1237.         "psubsh $f27, $f27, $f21                \r\n"
  1238.         "psubsh $f28, $f28, $f22                \r\n"
  1239.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  1240.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  1241.         "paddsh $f27, $f27, $f13                \r\n"
  1242.         "paddsh $f28, $f28, $f14                \r\n"
  1243.         "paddsh $f27, $f27, $f23                \r\n"
  1244.         "paddsh $f28, $f28, $f24                \r\n"
  1245.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  1246.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  1247.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  1248.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  1249.         "packushb $f27, $f27, $f0               \r\n"
  1250.         "packushb $f28, $f28, $f0               \r\n"
  1251.         "punpcklwd $f14, $f27, $f28             \r\n"
  1252.         "ldc1 $f28, 0(%[dst6])                  \r\n"
  1253.         "pavgb $f14, $f14, $f28                 \r\n"
  1254.         "sdc1 $f14, 0(%[dst6])                  \r\n"
  1255.         "paddsh $f27, $f19, $f21                \r\n"
  1256.         "pmullh $f27, $f27, %[ff_pw_4]          \r\n"
  1257.         "paddsh $f28, $f20, $f22                \r\n"//src7+src8
  1258.         "pmullh $f28, $f28, %[ff_pw_4]          \r\n"
  1259.         "psubsh $f27, $f27, $f17                \r\n"
  1260.         "psubsh $f28, $f28, $f18                \r\n"
  1261.         "psubsh $f27, $f27, $f23                \r\n"
  1262.         "psubsh $f28, $f28, $f24                \r\n"
  1263.         "pmullh $f27, $f27, %[ff_pw_5]          \r\n"
  1264.         "pmullh $f28, $f28, %[ff_pw_5]          \r\n"
  1265.         "paddsh $f27, $f27, $f15                \r\n"
  1266.         "paddsh $f28, $f28, $f16                \r\n"
  1267.         "paddsh $f27, $f27, $f25                \r\n"
  1268.         "paddsh $f28, $f28, $f26                \r\n"
  1269.         "paddsh $f27, $f27, %[ff_pw_16]         \r\n"
  1270.         "paddsh $f28, $f28, %[ff_pw_16]         \r\n"
  1271.         "psrah $f27, $f27, %[ff_pw_5]           \r\n"
  1272.         "psrah $f28, $f28, %[ff_pw_5]           \r\n"
  1273.         "packushb $f27, $f27, $f0               \r\n"
  1274.         "packushb $f28, $f28, $f0               \r\n"
  1275.         "punpcklwd $f16, $f27, $f28             \r\n"
  1276.         "ldc1 $f28, 0(%[dst7])                  \r\n"
  1277.         "pavgb $f16, $f16, $f28                 \r\n"
  1278.         "sdc1 $f16, 0(%[dst7])                  \r\n"
  1279.         ::[dst0]"r"(dst),               [dst1]"r"(dst+dstStride),
  1280.           [dst2]"r"(dst+2*dstStride),   [dst3]"r"(dst+3*dstStride),
  1281.           [dst4]"r"(dst+4*dstStride),   [dst5]"r"(dst+5*dstStride),
  1282.           [dst6]"r"(dst+6*dstStride),   [dst7]"r"(dst+7*dstStride),
  1283.           [srcB]"r"(src-2*srcStride),   [srcA]"r"(src-srcStride),
  1284.           [src0]"r"(src),               [src1]"r"(src+srcStride),
  1285.           [src2]"r"(src+2*srcStride),   [src3]"r"(src+3*srcStride),
  1286.           [src4]"r"(src+4*srcStride),   [src5]"r"(src+5*srcStride),
  1287.           [src6]"r"(src+6*srcStride),   [src7]"r"(src+7*srcStride),
  1288.           [src8]"r"(src+8*srcStride),   [src9]"r"(src+9*srcStride),
  1289.           [src10]"r"(src+10*srcStride), [ff_pw_4]"f"(ff_pw_4),
  1290.           [ff_pw_5]"f"(ff_pw_5),        [ff_pw_16]"f"(ff_pw_16)
  1291.         : "$f0","$f1","$f2","$f3","$f4","$f5","$f6","$f7","$f8","$f9","$f10",
  1292.           "$f11","$f12","$f13","$f14","$f15","$f16","$f17","$f18","$f19",
  1293.           "$f20","$f21","$f22","$f23","$f24","$f25","$f26","$f27","$f28"
  1294.     );
  1295. }
  1296.  
  1297. static void avg_h264_qpel16_v_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  1298.         int dstStride, int srcStride)
  1299. {
  1300.     avg_h264_qpel8_v_lowpass_mmi(dst, src, dstStride, srcStride);
  1301.     avg_h264_qpel8_v_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  1302.     src += 8*srcStride;
  1303.     dst += 8*dstStride;
  1304.     avg_h264_qpel8_v_lowpass_mmi(dst, src, dstStride, srcStride);
  1305.     avg_h264_qpel8_v_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  1306. }
  1307.  
  1308. static void put_h264_qpel4_hv_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  1309.         int dstStride, int srcStride)
  1310. {
  1311.     int i;
  1312.     int16_t _tmp[36];
  1313.     int16_t *tmp = _tmp;
  1314.     src -= 2*srcStride;
  1315.     __asm__ volatile (
  1316.         "xor $f0, $f0, $f0                      \r\n"
  1317.         "dli $8, 9                              \r\n"
  1318.         "1:                                     \r\n"
  1319.         "gslwlc1 $f2, 1(%[src])                 \r\n"
  1320.         "gslwrc1 $f2, -2(%[src])                \r\n"
  1321.         "gslwlc1 $f4, 2(%[src])                 \r\n"
  1322.         "gslwrc1 $f4, -1(%[src])                \r\n"
  1323.         "gslwlc1 $f6, 3(%[src])                 \r\n"
  1324.         "gslwrc1 $f6, 0(%[src])                 \r\n"
  1325.         "gslwlc1 $f8, 4(%[src])                 \r\n"
  1326.         "gslwrc1 $f8, 1(%[src])                 \r\n"
  1327.         "gslwlc1 $f10, 5(%[src])                \r\n"
  1328.         "gslwrc1 $f10, 2(%[src])                \r\n"
  1329.         "gslwlc1 $f12, 6(%[src])                \r\n"
  1330.         "gslwrc1 $f12, 3(%[src])                \r\n"
  1331.         "punpcklbh $f2, $f2, $f0                \r\n"
  1332.         "punpcklbh $f4, $f4, $f0                \r\n"
  1333.         "punpcklbh $f6, $f6, $f0                \r\n"
  1334.         "punpcklbh $f8, $f8, $f0                \r\n"
  1335.         "punpcklbh $f10, $f10, $f0              \r\n"
  1336.         "punpcklbh $f12, $f12, $f0              \r\n"
  1337.         "paddsh $f14, $f6, $f8                  \r\n"
  1338.         "paddsh $f16, $f4, $f10                 \r\n"
  1339.         "paddsh $f18, $f2, $f12                 \r\n"
  1340.         "pmullh $f14, $f14, %[ff_pw_20]         \r\n"
  1341.         "pmullh $f16, $f16, %[ff_pw_5]          \r\n"
  1342.         "psubsh $f14, $f14, $f16                \r\n"
  1343.         "paddsh $f18, $f14, $f18                \r\n"
  1344.         "sdc1 $f18, 0(%[tmp])                   \r\n"
  1345.         "dadd %[tmp], %[tmp], %[tmpStride]      \r\n"
  1346.         "dadd %[src], %[src], %[srcStride]      \r\n"
  1347.         "daddi $8, $8, -1                       \r\n"
  1348.         "bnez $8, 1b                            \r\n"
  1349.         : [tmp]"+&r"(tmp),[src]"+&r"(src)
  1350.         : [tmpStride]"r"(8),[srcStride]"r"(srcStride),
  1351.           [ff_pw_20]"f"(ff_pw_20),[ff_pw_5]"f"(ff_pw_5)
  1352.         : "$8","$f0","$f2","$f4","$f6","$f8","$f10","$f12","$f14","$f16","$f18"
  1353.     );
  1354.  
  1355.     tmp -= 28;
  1356.  
  1357.     for(i=0; i<4; i++) {
  1358.         const int16_t tmpB= tmp[-8];
  1359.         const int16_t tmpA= tmp[-4];
  1360.         const int16_t tmp0= tmp[ 0];
  1361.         const int16_t tmp1= tmp[ 4];
  1362.         const int16_t tmp2= tmp[ 8];
  1363.         const int16_t tmp3= tmp[12];
  1364.         const int16_t tmp4= tmp[16];
  1365.         const int16_t tmp5= tmp[20];
  1366.         const int16_t tmp6= tmp[24];
  1367.         op2_put(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));
  1368.         op2_put(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));
  1369.         op2_put(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));
  1370.         op2_put(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));
  1371.         dst++;
  1372.         tmp++;
  1373.     }
  1374. }
  1375.  
  1376. static void put_h264_qpel8_hv_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  1377.         int dstStride, int srcStride)
  1378. {
  1379.     int16_t _tmp[104];
  1380.     int16_t *tmp = _tmp;
  1381.     int i;
  1382.     src -= 2*srcStride;
  1383.  
  1384.     __asm__ volatile (
  1385.         "xor $f0, $f0, $f0                      \r\n"
  1386.         "dli $8, 13                             \r\n"
  1387.         "1:                                     \r\n"
  1388.         "gsldlc1 $f2, 5(%[src])                 \r\n"
  1389.         "gsldrc1 $f2, -2(%[src])                \r\n"
  1390.         "gsldlc1 $f4, 6(%[src])                 \r\n"
  1391.         "gsldrc1 $f4, -1(%[src])                \r\n"
  1392.         "gsldlc1 $f6, 7(%[src])                 \r\n"
  1393.         "gsldrc1 $f6, 0(%[src])                 \r\n"
  1394.         "gsldlc1 $f8, 8(%[src])                 \r\n"
  1395.         "gsldrc1 $f8, 1(%[src])                 \r\n"
  1396.         "gsldlc1 $f10, 9(%[src])                \r\n"
  1397.         "gsldrc1 $f10, 2(%[src])                \r\n"
  1398.         "gsldlc1 $f12, 10(%[src])               \r\n"
  1399.         "gsldrc1 $f12, 3(%[src])                \r\n"
  1400.         "punpcklbh $f1, $f2, $f0                \r\n"
  1401.         "punpcklbh $f3, $f4, $f0                \r\n"
  1402.         "punpcklbh $f5, $f6, $f0                \r\n"
  1403.         "punpcklbh $f7, $f8, $f0                \r\n"
  1404.         "punpcklbh $f9, $f10, $f0               \r\n"
  1405.         "punpcklbh $f11, $f12, $f0              \r\n"
  1406.         "punpckhbh $f2, $f2, $f0                \r\n"
  1407.         "punpckhbh $f4, $f4, $f0                \r\n"
  1408.         "punpckhbh $f6, $f6, $f0                \r\n"
  1409.         "punpckhbh $f8, $f8, $f0                \r\n"
  1410.         "punpckhbh $f10, $f10, $f0              \r\n"
  1411.         "punpckhbh $f12, $f12, $f0              \r\n"
  1412.         "paddsh $f13, $f5, $f7                  \r\n"
  1413.         "paddsh $f15, $f3, $f9                 \r\n"
  1414.         "paddsh $f17, $f1, $f11                 \r\n"
  1415.         "pmullh $f13, $f13, %[ff_pw_20]         \r\n"
  1416.         "pmullh $f15, $f15, %[ff_pw_5]          \r\n"
  1417.         "psubsh $f13, $f13, $f15                \r\n"
  1418.         "paddsh $f17, $f13, $f17                \r\n"
  1419.         "paddsh $f14, $f6, $f8                  \r\n"
  1420.         "paddsh $f16, $f4, $f10                 \r\n"
  1421.         "paddsh $f18, $f2, $f12                 \r\n"
  1422.         "pmullh $f14, $f14, %[ff_pw_20]         \r\n"
  1423.         "pmullh $f16, $f16, %[ff_pw_5]          \r\n"
  1424.         "psubsh $f14, $f14, $f16                \r\n"
  1425.         "paddsh $f18, $f14, $f18                \r\n"
  1426.         "sdc1 $f17, 0(%[tmp])                   \r\n"
  1427.         "sdc1 $f18, 8(%[tmp])                   \r\n"
  1428.         "dadd %[tmp], %[tmp], %[tmpStride]      \r\n"
  1429.         "dadd %[src], %[src], %[srcStride]      \r\n"
  1430.         "daddi $8, $8, -1                       \r\n"
  1431.         "bnez $8, 1b                            \r\n"
  1432.         : [tmp]"+&r"(tmp),[src]"+&r"(src)
  1433.         : [tmpStride]"r"(16),[srcStride]"r"(srcStride),
  1434.           [ff_pw_20]"f"(ff_pw_20),[ff_pw_5]"f"(ff_pw_5)
  1435.         : "$8","$f0","$f1","$f2","$f3","$f4","$f5","$f6","$f7","$f8","$f9",
  1436.           "$f10","$f11","$f12","$f13","$f14","$f15","$f16","$f17","$f18"
  1437.     );
  1438.  
  1439.     tmp -= 88;
  1440.  
  1441.     for(i=0; i<8; i++) {
  1442.         const int tmpB= tmp[-16];
  1443.         const int tmpA= tmp[ -8];
  1444.         const int tmp0= tmp[  0];
  1445.         const int tmp1= tmp[  8];
  1446.         const int tmp2= tmp[ 16];
  1447.         const int tmp3= tmp[ 24];
  1448.         const int tmp4= tmp[ 32];
  1449.         const int tmp5= tmp[ 40];
  1450.         const int tmp6= tmp[ 48];
  1451.         const int tmp7= tmp[ 56];
  1452.         const int tmp8= tmp[ 64];
  1453.         const int tmp9= tmp[ 72];
  1454.         const int tmp10=tmp[ 80];
  1455.         op2_put(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));
  1456.         op2_put(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));
  1457.         op2_put(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));
  1458.         op2_put(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));
  1459.         op2_put(dst[4*dstStride], (tmp4+tmp5)*20 - (tmp3+tmp6)*5 + (tmp2+tmp7));
  1460.         op2_put(dst[5*dstStride], (tmp5+tmp6)*20 - (tmp4+tmp7)*5 + (tmp3+tmp8));
  1461.         op2_put(dst[6*dstStride], (tmp6+tmp7)*20 - (tmp5+tmp8)*5 + (tmp4+tmp9));
  1462.         op2_put(dst[7*dstStride], (tmp7+tmp8)*20 - (tmp6+tmp9)*5 + (tmp5+tmp10));
  1463.         dst++;
  1464.         tmp++;
  1465.     }
  1466. }
  1467.  
  1468. static void put_h264_qpel16_hv_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  1469.         int dstStride, int srcStride)
  1470. {
  1471.     put_h264_qpel8_hv_lowpass_mmi(dst, src, dstStride, srcStride);
  1472.     put_h264_qpel8_hv_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  1473.     src += 8*srcStride;
  1474.     dst += 8*dstStride;
  1475.     put_h264_qpel8_hv_lowpass_mmi(dst, src, dstStride, srcStride);
  1476.     put_h264_qpel8_hv_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  1477. }
  1478.  
  1479. static void avg_h264_qpel4_hv_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  1480.         int dstStride, int srcStride)
  1481. {
  1482.     int i;
  1483.     int16_t _tmp[36];
  1484.     int16_t *tmp = _tmp;
  1485.     src -= 2*srcStride;
  1486.  
  1487.     __asm__ volatile (
  1488.         "xor $f0, $f0, $f0                      \r\n"
  1489.         "dli $8, 9                              \r\n"
  1490.         "1:                                     \r\n"
  1491.         "gslwlc1 $f2, 1(%[src])                 \r\n"
  1492.         "gslwrc1 $f2, -2(%[src])                \r\n"
  1493.         "gslwlc1 $f4, 2(%[src])                 \r\n"
  1494.         "gslwrc1 $f4, -1(%[src])                \r\n"
  1495.         "gslwlc1 $f6, 3(%[src])                 \r\n"
  1496.         "gslwrc1 $f6, 0(%[src])                 \r\n"
  1497.         "gslwlc1 $f8, 4(%[src])                 \r\n"
  1498.         "gslwrc1 $f8, 1(%[src])                 \r\n"
  1499.         "gslwlc1 $f10, 5(%[src])                \r\n"
  1500.         "gslwrc1 $f10, 2(%[src])                \r\n"
  1501.         "gslwlc1 $f12, 6(%[src])                \r\n"
  1502.         "gslwrc1 $f12, 3(%[src])                \r\n"
  1503.         "punpcklbh $f2, $f2, $f0                \r\n"
  1504.         "punpcklbh $f4, $f4, $f0                \r\n"
  1505.         "punpcklbh $f6, $f6, $f0                \r\n"
  1506.         "punpcklbh $f8, $f8, $f0                \r\n"
  1507.         "punpcklbh $f10, $f10, $f0              \r\n"
  1508.         "punpcklbh $f12, $f12, $f0              \r\n"
  1509.         "paddsh $f14, $f6, $f8                  \r\n"
  1510.         "paddsh $f16, $f4, $f10                 \r\n"
  1511.         "paddsh $f18, $f2, $f12                 \r\n"
  1512.         "pmullh $f14, $f14, %[ff_pw_20]         \r\n"
  1513.         "pmullh $f16, $f16, %[ff_pw_5]          \r\n"
  1514.         "psubsh $f14, $f14, $f16                \r\n"
  1515.         "paddsh $f18, $f14, $f18                \r\n"
  1516.         "sdc1 $f18, 0(%[tmp])                   \r\n"
  1517.         "dadd %[tmp], %[tmp], %[tmpStride]      \r\n"
  1518.         "dadd %[src], %[src], %[srcStride]      \r\n"
  1519.         "daddi $8, $8, -1                       \r\n"
  1520.         "bnez $8, 1b                            \r\n"
  1521.         : [tmp]"+&r"(tmp),[src]"+&r"(src)
  1522.         : [tmpStride]"r"(8),[srcStride]"r"(srcStride),
  1523.           [ff_pw_20]"f"(ff_pw_20),[ff_pw_5]"f"(ff_pw_5)
  1524.         : "$8","$f0","$f2","$f4","$f6","$f8","$f10","$f12","$f14","$f16","$f18"
  1525.     );
  1526.  
  1527.     tmp -= 28;
  1528.  
  1529.     for(i=0; i<4; i++)
  1530.     {
  1531.         const int16_t tmpB= tmp[-8];
  1532.         const int16_t tmpA= tmp[-4];
  1533.         const int16_t tmp0= tmp[ 0];
  1534.         const int16_t tmp1= tmp[ 4];
  1535.         const int16_t tmp2= tmp[ 8];
  1536.         const int16_t tmp3= tmp[12];
  1537.         const int16_t tmp4= tmp[16];
  1538.         const int16_t tmp5= tmp[20];
  1539.         const int16_t tmp6= tmp[24];
  1540.         op2_avg(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));
  1541.         op2_avg(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));
  1542.         op2_avg(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));
  1543.         op2_avg(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));
  1544.         dst++;
  1545.         tmp++;
  1546.     }
  1547. }
  1548.  
  1549. static void avg_h264_qpel8_hv_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  1550.         int dstStride, int srcStride)
  1551. {
  1552.     int16_t _tmp[104];
  1553.     int16_t *tmp = _tmp;
  1554.     int i;
  1555.     src -= 2*srcStride;
  1556.  
  1557.     __asm__ volatile (
  1558.         "xor $f0, $f0, $f0                      \r\n"
  1559.         "dli $8, 13                             \r\n"
  1560.         "1:                                     \r\n"
  1561.         "gsldlc1 $f2, 5(%[src])                 \r\n"
  1562.         "gsldrc1 $f2, -2(%[src])                \r\n"
  1563.         "gsldlc1 $f4, 6(%[src])                 \r\n"
  1564.         "gsldrc1 $f4, -1(%[src])                \r\n"
  1565.         "gsldlc1 $f6, 7(%[src])                 \r\n"
  1566.         "gsldrc1 $f6, 0(%[src])                 \r\n"
  1567.         "gsldlc1 $f8, 8(%[src])                 \r\n"
  1568.         "gsldrc1 $f8, 1(%[src])                 \r\n"
  1569.         "gsldlc1 $f10, 9(%[src])                \r\n"
  1570.         "gsldrc1 $f10, 2(%[src])                \r\n"
  1571.         "gsldlc1 $f12, 10(%[src])               \r\n"
  1572.         "gsldrc1 $f12, 3(%[src])                \r\n"
  1573.         "punpcklbh $f1, $f2, $f0                \r\n"
  1574.         "punpcklbh $f3, $f4, $f0                \r\n"
  1575.         "punpcklbh $f5, $f6, $f0                \r\n"
  1576.         "punpcklbh $f7, $f8, $f0                \r\n"
  1577.         "punpcklbh $f9, $f10, $f0               \r\n"
  1578.         "punpcklbh $f11, $f12, $f0              \r\n"
  1579.         "punpckhbh $f2, $f2, $f0                \r\n"
  1580.         "punpckhbh $f4, $f4, $f0                \r\n"
  1581.         "punpckhbh $f6, $f6, $f0                \r\n"
  1582.         "punpckhbh $f8, $f8, $f0                \r\n"
  1583.         "punpckhbh $f10, $f10, $f0              \r\n"
  1584.         "punpckhbh $f12, $f12, $f0              \r\n"
  1585.         "paddsh $f13, $f5, $f7                  \r\n"
  1586.         "paddsh $f15, $f3, $f9                 \r\n"
  1587.         "paddsh $f17, $f1, $f11                 \r\n"
  1588.         "pmullh $f13, $f13, %[ff_pw_20]         \r\n"
  1589.         "pmullh $f15, $f15, %[ff_pw_5]          \r\n"
  1590.         "psubsh $f13, $f13, $f15                \r\n"
  1591.         "paddsh $f17, $f13, $f17                \r\n"
  1592.         "paddsh $f14, $f6, $f8                  \r\n"
  1593.         "paddsh $f16, $f4, $f10                 \r\n"
  1594.         "paddsh $f18, $f2, $f12                 \r\n"
  1595.         "pmullh $f14, $f14, %[ff_pw_20]         \r\n"
  1596.         "pmullh $f16, $f16, %[ff_pw_5]          \r\n"
  1597.         "psubsh $f14, $f14, $f16                \r\n"
  1598.         "paddsh $f18, $f14, $f18                \r\n"
  1599.  
  1600.         "sdc1 $f17, 0(%[tmp])                   \r\n"
  1601.         "sdc1 $f18, 8(%[tmp])                   \r\n"
  1602.         "dadd %[tmp], %[tmp], %[tmpStride]      \r\n"
  1603.         "dadd %[src], %[src], %[srcStride]      \r\n"
  1604.         "daddi $8, $8, -1                       \r\n"
  1605.         "bnez $8, 1b                            \r\n"
  1606.         : [tmp]"+&r"(tmp),[src]"+&r"(src)
  1607.         : [tmpStride]"r"(16),[srcStride]"r"(srcStride),
  1608.           [ff_pw_20]"f"(ff_pw_20),[ff_pw_5]"f"(ff_pw_5)
  1609.         : "$8","$f0","$f1","$f2","$f3","$f4","$f5","$f6","$f7","$f8","$f9",
  1610.           "$f10","$f11","$f12","$f13","$f14","$f15","$f16","$f17","$f18"
  1611.     );
  1612.  
  1613.     tmp -= 88;
  1614.  
  1615.     for(i=0; i<8; i++) {
  1616.         const int tmpB= tmp[-16];
  1617.         const int tmpA= tmp[ -8];
  1618.         const int tmp0= tmp[  0];
  1619.         const int tmp1= tmp[  8];
  1620.         const int tmp2= tmp[ 16];
  1621.         const int tmp3= tmp[ 24];
  1622.         const int tmp4= tmp[ 32];
  1623.         const int tmp5= tmp[ 40];
  1624.         const int tmp6= tmp[ 48];
  1625.         const int tmp7= tmp[ 56];
  1626.         const int tmp8= tmp[ 64];
  1627.         const int tmp9= tmp[ 72];
  1628.         const int tmp10=tmp[ 80];
  1629.         op2_avg(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));
  1630.         op2_avg(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));
  1631.         op2_avg(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));
  1632.         op2_avg(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));
  1633.         op2_avg(dst[4*dstStride], (tmp4+tmp5)*20 - (tmp3+tmp6)*5 + (tmp2+tmp7));
  1634.         op2_avg(dst[5*dstStride], (tmp5+tmp6)*20 - (tmp4+tmp7)*5 + (tmp3+tmp8));
  1635.         op2_avg(dst[6*dstStride], (tmp6+tmp7)*20 - (tmp5+tmp8)*5 + (tmp4+tmp9));
  1636.         op2_avg(dst[7*dstStride], (tmp7+tmp8)*20 - (tmp6+tmp9)*5 + (tmp5+tmp10));
  1637.         dst++;
  1638.         tmp++;
  1639.     }
  1640. }
  1641.  
  1642. static void avg_h264_qpel16_hv_lowpass_mmi(uint8_t *dst, const uint8_t *src,
  1643.         int dstStride, int srcStride){
  1644.     avg_h264_qpel8_hv_lowpass_mmi(dst, src, dstStride, srcStride);
  1645.     avg_h264_qpel8_hv_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  1646.     src += 8*srcStride;
  1647.     dst += 8*dstStride;
  1648.     avg_h264_qpel8_hv_lowpass_mmi(dst, src, dstStride, srcStride);
  1649.     avg_h264_qpel8_hv_lowpass_mmi(dst+8, src+8, dstStride, srcStride);
  1650. }
  1651.  
  1652. //DEF_H264_MC_MMI(put_, 4)
  1653. void ff_put_h264_qpel4_mc00_mmi(uint8_t *dst, const uint8_t *src,
  1654.         ptrdiff_t stride)
  1655. {
  1656.     put_pixels4_mmi(dst, src, stride, 4);
  1657. }
  1658.  
  1659. void ff_put_h264_qpel4_mc10_mmi(uint8_t *dst, const uint8_t *src,
  1660.         ptrdiff_t stride)
  1661. {
  1662.     uint8_t half[16];
  1663.     put_h264_qpel4_h_lowpass_mmi(half, src, 4, stride);
  1664.     put_pixels4_l2_mmi(dst, src, half, stride, stride, 4, 4);
  1665. }
  1666.  
  1667. void ff_put_h264_qpel4_mc20_mmi(uint8_t *dst, const uint8_t *src,
  1668.         ptrdiff_t stride)
  1669. {
  1670.     put_h264_qpel4_h_lowpass_mmi(dst, src, stride, stride);
  1671. }
  1672.  
  1673. void ff_put_h264_qpel4_mc30_mmi(uint8_t *dst, const uint8_t *src,
  1674.         ptrdiff_t stride)
  1675. {
  1676.     uint8_t half[16];
  1677.     put_h264_qpel4_h_lowpass_mmi(half, src, 4, stride);
  1678.     put_pixels4_l2_mmi(dst, src+1, half, stride, stride, 4, 4);
  1679. }
  1680.  
  1681. void ff_put_h264_qpel4_mc01_mmi(uint8_t *dst, const uint8_t *src,
  1682.         ptrdiff_t stride)
  1683. {
  1684.     uint8_t full[36];
  1685.     uint8_t * const full_mid= full + 8;
  1686.     uint8_t half[16];
  1687.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1688.     put_h264_qpel4_v_lowpass_mmi(half, full_mid, 4, 4);
  1689.     put_pixels4_l2_mmi(dst, full_mid, half, stride, 4, 4, 4);
  1690. }
  1691.  
  1692. void ff_put_h264_qpel4_mc02_mmi(uint8_t *dst, const uint8_t *src,
  1693.         ptrdiff_t stride)
  1694. {
  1695.     uint8_t full[36];
  1696.     uint8_t * const full_mid= full + 8;
  1697.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1698.     put_h264_qpel4_v_lowpass_mmi(dst, full_mid, stride, 4);
  1699. }
  1700.  
  1701. void ff_put_h264_qpel4_mc03_mmi(uint8_t *dst, const uint8_t *src,
  1702.         ptrdiff_t stride)
  1703. {
  1704.     uint8_t full[36];
  1705.     uint8_t * const full_mid= full + 8;
  1706.     uint8_t half[16];
  1707.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1708.     put_h264_qpel4_v_lowpass_mmi(half, full_mid, 4, 4);
  1709.     put_pixels4_l2_mmi(dst, full_mid+4, half, stride, 4, 4, 4);
  1710. }
  1711.  
  1712. void ff_put_h264_qpel4_mc11_mmi(uint8_t *dst, const uint8_t *src,
  1713.         ptrdiff_t stride)
  1714. {
  1715.     uint8_t full[36];
  1716.     uint8_t * const full_mid= full + 8;
  1717.     uint8_t halfH[16];
  1718.     uint8_t halfV[16];
  1719.     put_h264_qpel4_h_lowpass_mmi(halfH, src, 4, stride);
  1720.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1721.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1722.     put_pixels4_l2_mmi(dst, halfH, halfV, stride, 4, 4, 4);
  1723. }
  1724.  
  1725. void ff_put_h264_qpel4_mc31_mmi(uint8_t *dst, const uint8_t *src,
  1726.         ptrdiff_t stride)
  1727. {
  1728.     uint8_t full[36];
  1729.     uint8_t * const full_mid= full + 8;
  1730.     uint8_t halfH[16];
  1731.     uint8_t halfV[16];
  1732.     put_h264_qpel4_h_lowpass_mmi(halfH, src, 4, stride);
  1733.     copy_block4_mmi(full, src - stride*2 + 1, 4,  stride, 9);
  1734.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1735.     put_pixels4_l2_mmi(dst, halfH, halfV, stride, 4, 4, 4);
  1736. }
  1737.  
  1738. void ff_put_h264_qpel4_mc13_mmi(uint8_t *dst, const uint8_t *src,
  1739.         ptrdiff_t stride)
  1740. {
  1741.     uint8_t full[36];
  1742.     uint8_t * const full_mid= full + 8;
  1743.     uint8_t halfH[16];
  1744.     uint8_t halfV[16];
  1745.     put_h264_qpel4_h_lowpass_mmi(halfH, src + stride, 4, stride);
  1746.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1747.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1748.     put_pixels4_l2_mmi(dst, halfH, halfV, stride, 4, 4, 4);
  1749. }
  1750.  
  1751. void ff_put_h264_qpel4_mc33_mmi(uint8_t *dst, const uint8_t *src,
  1752.         ptrdiff_t stride)
  1753. {
  1754.     uint8_t full[36];
  1755.     uint8_t * const full_mid= full + 8;
  1756.     uint8_t halfH[16];
  1757.     uint8_t halfV[16];
  1758.     put_h264_qpel4_h_lowpass_mmi(halfH, src + stride, 4, stride);
  1759.     copy_block4_mmi(full, src - stride*2 + 1, 4,  stride, 9);
  1760.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1761.     put_pixels4_l2_mmi(dst, halfH, halfV, stride, 4, 4, 4);
  1762. }
  1763.  
  1764. void ff_put_h264_qpel4_mc22_mmi(uint8_t *dst, const uint8_t *src,
  1765.         ptrdiff_t stride)
  1766. {
  1767.     put_h264_qpel4_hv_lowpass_mmi(dst, src, stride, stride);
  1768. }
  1769.  
  1770. void ff_put_h264_qpel4_mc21_mmi(uint8_t *dst, const uint8_t *src,
  1771.         ptrdiff_t stride)
  1772. {
  1773.     uint8_t halfH[16];
  1774.     uint8_t halfHV[16];
  1775.     put_h264_qpel4_h_lowpass_mmi(halfH, src, 4, stride);
  1776.     put_h264_qpel4_hv_lowpass_mmi(halfHV, src, 4, stride);
  1777.     put_pixels4_l2_mmi(dst, halfH, halfHV, stride, 4, 4, 4);
  1778. }
  1779.  
  1780. void ff_put_h264_qpel4_mc23_mmi(uint8_t *dst, const uint8_t *src,
  1781.         ptrdiff_t stride)
  1782. {
  1783.     uint8_t halfH[16];
  1784.     uint8_t halfHV[16];
  1785.     put_h264_qpel4_h_lowpass_mmi(halfH, src + stride, 4, stride);
  1786.     put_h264_qpel4_hv_lowpass_mmi(halfHV, src, 4, stride);
  1787.     put_pixels4_l2_mmi(dst, halfH, halfHV, stride, 4, 4, 4);
  1788. }
  1789.  
  1790. void ff_put_h264_qpel4_mc12_mmi(uint8_t *dst, const uint8_t *src,
  1791.         ptrdiff_t stride)
  1792. {
  1793.     uint8_t full[36];
  1794.     uint8_t * const full_mid= full + 8;
  1795.     uint8_t halfV[16];
  1796.     uint8_t halfHV[16];
  1797.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1798.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1799.     put_h264_qpel4_hv_lowpass_mmi(halfHV, src, 4, stride);
  1800.     put_pixels4_l2_mmi(dst, halfV, halfHV, stride, 4, 4, 4);
  1801. }
  1802.  
  1803. void ff_put_h264_qpel4_mc32_mmi(uint8_t *dst, const uint8_t *src,
  1804.         ptrdiff_t stride)
  1805. {
  1806.     uint8_t full[36];
  1807.     uint8_t * const full_mid= full + 8;
  1808.     uint8_t halfV[16];
  1809.     uint8_t halfHV[16];
  1810.     copy_block4_mmi(full, src - stride*2 + 1, 4,  stride, 9);
  1811.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1812.     put_h264_qpel4_hv_lowpass_mmi(halfHV, src, 4, stride);
  1813.     put_pixels4_l2_mmi(dst, halfV, halfHV, stride, 4, 4, 4);
  1814. }
  1815.  
  1816. //DEF_H264_MC_MMI(avg_, 4)
  1817. void ff_avg_h264_qpel4_mc00_mmi(uint8_t *dst, const uint8_t *src,
  1818.         ptrdiff_t stride)
  1819. {
  1820.     avg_pixels4_mmi(dst, src, stride, 4);
  1821. }
  1822.  
  1823. void ff_avg_h264_qpel4_mc10_mmi(uint8_t *dst, const uint8_t *src,
  1824.         ptrdiff_t stride)
  1825. {
  1826.     uint8_t half[16];
  1827.     put_h264_qpel4_h_lowpass_mmi(half, src, 4, stride);
  1828.     avg_pixels4_l2_mmi(dst, src, half, stride, stride, 4, 4);
  1829. }
  1830.  
  1831. void ff_avg_h264_qpel4_mc20_mmi(uint8_t *dst, const uint8_t *src,
  1832.         ptrdiff_t stride)
  1833. {
  1834.     avg_h264_qpel4_h_lowpass_mmi(dst, src, stride, stride);
  1835. }
  1836.  
  1837. void ff_avg_h264_qpel4_mc30_mmi(uint8_t *dst, const uint8_t *src,
  1838.         ptrdiff_t stride)
  1839. {
  1840.     uint8_t half[16];
  1841.     put_h264_qpel4_h_lowpass_mmi(half, src, 4, stride);
  1842.     avg_pixels4_l2_mmi(dst, src+1, half, stride, stride, 4, 4);
  1843. }
  1844.  
  1845. void ff_avg_h264_qpel4_mc01_mmi(uint8_t *dst, const uint8_t *src,
  1846.         ptrdiff_t stride)
  1847. {
  1848.     uint8_t full[36];
  1849.     uint8_t * const full_mid= full + 8;
  1850.     uint8_t half[16];
  1851.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1852.     put_h264_qpel4_v_lowpass_mmi(half, full_mid, 4, 4);
  1853.     avg_pixels4_l2_mmi(dst, full_mid, half, stride, 4, 4, 4);
  1854. }
  1855.  
  1856. void ff_avg_h264_qpel4_mc02_mmi(uint8_t *dst, const uint8_t *src,
  1857.         ptrdiff_t stride)
  1858. {
  1859.     uint8_t full[36];
  1860.     uint8_t * const full_mid= full + 8;
  1861.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1862.     avg_h264_qpel4_v_lowpass_mmi(dst, full_mid, stride, 4);
  1863. }
  1864.  
  1865. void ff_avg_h264_qpel4_mc03_mmi(uint8_t *dst, const uint8_t *src,
  1866.         ptrdiff_t stride)
  1867. {
  1868.     uint8_t full[36];
  1869.     uint8_t * const full_mid= full + 8;
  1870.     uint8_t half[16];
  1871.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1872.     put_h264_qpel4_v_lowpass_mmi(half, full_mid, 4, 4);
  1873.     avg_pixels4_l2_mmi(dst, full_mid+4, half, stride, 4, 4, 4);
  1874. }
  1875.  
  1876. void ff_avg_h264_qpel4_mc11_mmi(uint8_t *dst, const uint8_t *src,
  1877.         ptrdiff_t stride)
  1878. {
  1879.     uint8_t full[36];
  1880.     uint8_t * const full_mid= full + 8;
  1881.     uint8_t halfH[16];
  1882.     uint8_t halfV[16];
  1883.     put_h264_qpel4_h_lowpass_mmi(halfH, src, 4, stride);
  1884.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1885.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1886.     avg_pixels4_l2_mmi(dst, halfH, halfV, stride, 4, 4, 4);
  1887. }
  1888.  
  1889. void ff_avg_h264_qpel4_mc31_mmi(uint8_t *dst, const uint8_t *src,
  1890.         ptrdiff_t stride)
  1891. {
  1892.     uint8_t full[36];
  1893.     uint8_t * const full_mid= full + 8;
  1894.     uint8_t halfH[16];
  1895.     uint8_t halfV[16];
  1896.     put_h264_qpel4_h_lowpass_mmi(halfH, src, 4, stride);
  1897.     copy_block4_mmi(full, src - stride*2 + 1, 4,  stride, 9);
  1898.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1899.     avg_pixels4_l2_mmi(dst, halfH, halfV, stride, 4, 4, 4);
  1900. }
  1901.  
  1902. void ff_avg_h264_qpel4_mc13_mmi(uint8_t *dst, const uint8_t *src,
  1903.         ptrdiff_t stride)
  1904. {
  1905.     uint8_t full[36];
  1906.     uint8_t * const full_mid= full + 8;
  1907.     uint8_t halfH[16];
  1908.     uint8_t halfV[16];
  1909.     put_h264_qpel4_h_lowpass_mmi(halfH, src + stride, 4, stride);
  1910.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1911.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1912.     avg_pixels4_l2_mmi(dst, halfH, halfV, stride, 4, 4, 4);
  1913. }
  1914.  
  1915. void ff_avg_h264_qpel4_mc33_mmi(uint8_t *dst, const uint8_t *src,
  1916.         ptrdiff_t stride)
  1917. {
  1918.     uint8_t full[36];
  1919.     uint8_t * const full_mid= full + 8;
  1920.     uint8_t halfH[16];
  1921.     uint8_t halfV[16];
  1922.     put_h264_qpel4_h_lowpass_mmi(halfH, src + stride, 4, stride);
  1923.     copy_block4_mmi(full, src - stride*2 + 1, 4,  stride, 9);
  1924.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1925.     avg_pixels4_l2_mmi(dst, halfH, halfV, stride, 4, 4, 4);
  1926. }
  1927.  
  1928. void ff_avg_h264_qpel4_mc22_mmi(uint8_t *dst, const uint8_t *src,
  1929.         ptrdiff_t stride)
  1930. {
  1931.     avg_h264_qpel4_hv_lowpass_mmi(dst, src, stride, stride);
  1932. }
  1933.  
  1934. void ff_avg_h264_qpel4_mc21_mmi(uint8_t *dst, const uint8_t *src,
  1935.         ptrdiff_t stride)
  1936. {
  1937.     uint8_t halfH[16];
  1938.     uint8_t halfHV[16];
  1939.     put_h264_qpel4_h_lowpass_mmi(halfH, src, 4, stride);
  1940.     put_h264_qpel4_hv_lowpass_mmi(halfHV, src, 4, stride);
  1941.     avg_pixels4_l2_mmi(dst, halfH, halfHV, stride, 4, 4, 4);
  1942. }
  1943.  
  1944. void ff_avg_h264_qpel4_mc23_mmi(uint8_t *dst, const uint8_t *src,
  1945.         ptrdiff_t stride)
  1946. {
  1947.     uint8_t halfH[16];
  1948.     uint8_t halfHV[16];
  1949.     put_h264_qpel4_h_lowpass_mmi(halfH, src + stride, 4, stride);
  1950.     put_h264_qpel4_hv_lowpass_mmi(halfHV, src, 4, stride);
  1951.     avg_pixels4_l2_mmi(dst, halfH, halfHV, stride, 4, 4, 4);
  1952. }
  1953.  
  1954. void ff_avg_h264_qpel4_mc12_mmi(uint8_t *dst, const uint8_t *src,
  1955.         ptrdiff_t stride)
  1956. {
  1957.     uint8_t full[36];
  1958.     uint8_t * const full_mid= full + 8;
  1959.     uint8_t halfV[16];
  1960.     uint8_t halfHV[16];
  1961.     copy_block4_mmi(full, src - stride*2, 4,  stride, 9);
  1962.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1963.     put_h264_qpel4_hv_lowpass_mmi(halfHV, src, 4, stride);
  1964.     avg_pixels4_l2_mmi(dst, halfV, halfHV, stride, 4, 4, 4);
  1965. }
  1966.  
  1967. void ff_avg_h264_qpel4_mc32_mmi(uint8_t *dst, const uint8_t *src,
  1968.         ptrdiff_t stride)
  1969. {
  1970.     uint8_t full[36];
  1971.     uint8_t * const full_mid= full + 8;
  1972.     uint8_t halfV[16];
  1973.     uint8_t halfHV[16];
  1974.     copy_block4_mmi(full, src - stride*2 + 1, 4,  stride, 9);
  1975.     put_h264_qpel4_v_lowpass_mmi(halfV, full_mid, 4, 4);
  1976.     put_h264_qpel4_hv_lowpass_mmi(halfHV, src, 4, stride);
  1977.     avg_pixels4_l2_mmi(dst, halfV, halfHV, stride, 4, 4, 4);
  1978. }
  1979.  
  1980. //DEF_H264_MC_MMI(put_, 8)
  1981. void ff_put_h264_qpel8_mc00_mmi(uint8_t *dst, const uint8_t *src,
  1982.         ptrdiff_t stride)
  1983. {
  1984.     put_pixels8_mmi(dst, src, stride, 8);
  1985. }
  1986.  
  1987. void ff_put_h264_qpel8_mc10_mmi(uint8_t *dst, const uint8_t *src,
  1988.         ptrdiff_t stride)
  1989. {
  1990.     uint8_t half[64];
  1991.     put_h264_qpel8_h_lowpass_mmi(half, src, 8, stride);
  1992.     put_pixels8_l2_mmi(dst, src, half, stride, stride, 8, 8);
  1993. }
  1994.  
  1995. void ff_put_h264_qpel8_mc20_mmi(uint8_t *dst, const uint8_t *src,
  1996.         ptrdiff_t stride)
  1997. {
  1998.     put_h264_qpel8_h_lowpass_mmi(dst, src, stride, stride);
  1999. }
  2000.  
  2001. void ff_put_h264_qpel8_mc30_mmi(uint8_t *dst, const uint8_t *src,
  2002.         ptrdiff_t stride)
  2003. {
  2004.     uint8_t half[64];
  2005.     put_h264_qpel8_h_lowpass_mmi(half, src, 8, stride);
  2006.     put_pixels8_l2_mmi(dst, src+1, half, stride, stride, 8, 8);
  2007. }
  2008.  
  2009. void ff_put_h264_qpel8_mc01_mmi(uint8_t *dst, const uint8_t *src,
  2010.         ptrdiff_t stride)
  2011. {
  2012.     uint8_t full[104];
  2013.     uint8_t * const full_mid= full + 16;
  2014.     uint8_t half[64];
  2015.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2016.     put_h264_qpel8_v_lowpass_mmi(half, full_mid, 8, 8);
  2017.     put_pixels8_l2_mmi(dst, full_mid, half, stride, 8, 8, 8);
  2018. }
  2019.  
  2020. void ff_put_h264_qpel8_mc02_mmi(uint8_t *dst, const uint8_t *src,
  2021.         ptrdiff_t stride)
  2022. {
  2023.     uint8_t full[104];
  2024.     uint8_t * const full_mid= full + 16;
  2025.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2026.     put_h264_qpel8_v_lowpass_mmi(dst, full_mid, stride, 8);
  2027. }
  2028.  
  2029. void ff_put_h264_qpel8_mc03_mmi(uint8_t *dst, const uint8_t *src,
  2030.         ptrdiff_t stride)
  2031. {
  2032.     uint8_t full[104];
  2033.     uint8_t * const full_mid= full + 16;
  2034.     uint8_t half[64];
  2035.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2036.     put_h264_qpel8_v_lowpass_mmi(half, full_mid, 8, 8);
  2037.     put_pixels8_l2_mmi(dst, full_mid+8, half, stride, 8, 8, 8);
  2038. }
  2039.  
  2040. void ff_put_h264_qpel8_mc11_mmi(uint8_t *dst, const uint8_t *src,
  2041.         ptrdiff_t stride)
  2042. {
  2043.     uint8_t full[104];
  2044.     uint8_t * const full_mid= full + 16;
  2045.     uint8_t halfH[64];
  2046.     uint8_t halfV[64];
  2047.     put_h264_qpel8_h_lowpass_mmi(halfH, src, 8, stride);
  2048.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2049.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2050.     put_pixels8_l2_mmi(dst, halfH, halfV, stride, 8, 8, 8);
  2051. }
  2052.  
  2053. void ff_put_h264_qpel8_mc31_mmi(uint8_t *dst, const uint8_t *src,
  2054.         ptrdiff_t stride)
  2055. {
  2056.     uint8_t full[104];
  2057.     uint8_t * const full_mid= full + 16;
  2058.     uint8_t halfH[64];
  2059.     uint8_t halfV[64];
  2060.     put_h264_qpel8_h_lowpass_mmi(halfH, src, 8, stride);
  2061.     copy_block8_mmi(full, src - stride*2 + 1, 8,  stride, 13);
  2062.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2063.     put_pixels8_l2_mmi(dst, halfH, halfV, stride, 8, 8, 8);
  2064. }
  2065.  
  2066. void ff_put_h264_qpel8_mc13_mmi(uint8_t *dst, const uint8_t *src,
  2067.         ptrdiff_t stride)
  2068. {
  2069.     uint8_t full[104];
  2070.     uint8_t * const full_mid= full + 16;
  2071.     uint8_t halfH[64];
  2072.     uint8_t halfV[64];
  2073.     put_h264_qpel8_h_lowpass_mmi(halfH, src + stride, 8, stride);
  2074.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2075.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2076.     put_pixels8_l2_mmi(dst, halfH, halfV, stride, 8, 8, 8);
  2077. }
  2078.  
  2079. void ff_put_h264_qpel8_mc33_mmi(uint8_t *dst, const uint8_t *src,
  2080.         ptrdiff_t stride)
  2081. {
  2082.     uint8_t full[104];
  2083.     uint8_t * const full_mid= full + 16;
  2084.     uint8_t halfH[64];
  2085.     uint8_t halfV[64];
  2086.     put_h264_qpel8_h_lowpass_mmi(halfH, src + stride, 8, stride);
  2087.     copy_block8_mmi(full, src - stride*2 + 1, 8,  stride, 13);
  2088.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2089.     put_pixels8_l2_mmi(dst, halfH, halfV, stride, 8, 8, 8);
  2090. }
  2091.  
  2092. void ff_put_h264_qpel8_mc22_mmi(uint8_t *dst, const uint8_t *src,
  2093.         ptrdiff_t stride)
  2094. {
  2095.     put_h264_qpel8_hv_lowpass_mmi(dst, src, stride, stride);
  2096. }
  2097.  
  2098. void ff_put_h264_qpel8_mc21_mmi(uint8_t *dst, const uint8_t *src,
  2099.         ptrdiff_t stride)
  2100. {
  2101.     uint8_t halfH[64];
  2102.     uint8_t halfHV[64];
  2103.     put_h264_qpel8_h_lowpass_mmi(halfH, src, 8, stride);
  2104.     put_h264_qpel8_hv_lowpass_mmi(halfHV, src, 8, stride);
  2105.     put_pixels8_l2_mmi(dst, halfH, halfHV, stride, 8, 8, 8);
  2106. }
  2107.  
  2108. void ff_put_h264_qpel8_mc23_mmi(uint8_t *dst, const uint8_t *src,
  2109.         ptrdiff_t stride)
  2110. {
  2111.     uint8_t halfH[64];
  2112.     uint8_t halfHV[64];
  2113.     put_h264_qpel8_h_lowpass_mmi(halfH, src + stride, 8, stride);
  2114.     put_h264_qpel8_hv_lowpass_mmi(halfHV, src, 8, stride);
  2115.     put_pixels8_l2_mmi(dst, halfH, halfHV, stride, 8, 8, 8);
  2116. }
  2117.  
  2118. void ff_put_h264_qpel8_mc12_mmi(uint8_t *dst, const uint8_t *src,
  2119.         ptrdiff_t stride)
  2120. {
  2121.     uint8_t full[104];
  2122.     uint8_t * const full_mid= full + 16;
  2123.     uint8_t halfV[64];
  2124.     uint8_t halfHV[64];
  2125.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2126.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2127.     put_h264_qpel8_hv_lowpass_mmi(halfHV, src, 8, stride);
  2128.     put_pixels8_l2_mmi(dst, halfV, halfHV, stride, 8, 8, 8);
  2129. }
  2130.  
  2131. void ff_put_h264_qpel8_mc32_mmi(uint8_t *dst, const uint8_t *src,
  2132.         ptrdiff_t stride)
  2133. {
  2134.     uint8_t full[104];
  2135.     uint8_t * const full_mid= full + 16;
  2136.     uint8_t halfV[64];
  2137.     uint8_t halfHV[64];
  2138.     copy_block8_mmi(full, src - stride*2 + 1, 8,  stride, 13);
  2139.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2140.     put_h264_qpel8_hv_lowpass_mmi(halfHV, src, 8, stride);
  2141.     put_pixels8_l2_mmi(dst, halfV, halfHV, stride, 8, 8, 8);
  2142. }
  2143.  
  2144. //DEF_H264_MC_MMI(avg_, 8)
  2145. void ff_avg_h264_qpel8_mc00_mmi(uint8_t *dst, const uint8_t *src,
  2146.         ptrdiff_t stride)
  2147. {
  2148.     avg_pixels8_mmi(dst, src, stride, 8);
  2149. }
  2150.  
  2151. void ff_avg_h264_qpel8_mc10_mmi(uint8_t *dst, const uint8_t *src,
  2152.         ptrdiff_t stride)
  2153. {
  2154.     uint8_t half[64];
  2155.     put_h264_qpel8_h_lowpass_mmi(half, src, 8, stride);
  2156.     avg_pixels8_l2_mmi(dst, src, half, stride, stride, 8, 8);
  2157. }
  2158.  
  2159. void ff_avg_h264_qpel8_mc20_mmi(uint8_t *dst, const uint8_t *src,
  2160.         ptrdiff_t stride)
  2161. {
  2162.     avg_h264_qpel8_h_lowpass_mmi(dst, src, stride, stride);
  2163. }
  2164.  
  2165. void ff_avg_h264_qpel8_mc30_mmi(uint8_t *dst, const uint8_t *src,
  2166.         ptrdiff_t stride)
  2167. {
  2168.     uint8_t half[64];
  2169.     put_h264_qpel8_h_lowpass_mmi(half, src, 8, stride);
  2170.     avg_pixels8_l2_mmi(dst, src+1, half, stride, stride, 8, 8);
  2171. }
  2172.  
  2173. void ff_avg_h264_qpel8_mc01_mmi(uint8_t *dst, const uint8_t *src,
  2174.         ptrdiff_t stride)
  2175. {
  2176.     uint8_t full[104];
  2177.     uint8_t * const full_mid= full + 16;
  2178.     uint8_t half[64];
  2179.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2180.     put_h264_qpel8_v_lowpass_mmi(half, full_mid, 8, 8);
  2181.     avg_pixels8_l2_mmi(dst, full_mid, half, stride, 8, 8, 8);
  2182. }
  2183.  
  2184. void ff_avg_h264_qpel8_mc02_mmi(uint8_t *dst, const uint8_t *src,
  2185.         ptrdiff_t stride)
  2186. {
  2187.     uint8_t full[104];
  2188.     uint8_t * const full_mid= full + 16;
  2189.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2190.     avg_h264_qpel8_v_lowpass_mmi(dst, full_mid, stride, 8);
  2191. }
  2192.  
  2193. void ff_avg_h264_qpel8_mc03_mmi(uint8_t *dst, const uint8_t *src,
  2194.         ptrdiff_t stride)
  2195. {
  2196.     uint8_t full[104];
  2197.     uint8_t * const full_mid= full + 16;
  2198.     uint8_t half[64];
  2199.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2200.     put_h264_qpel8_v_lowpass_mmi(half, full_mid, 8, 8);
  2201.     avg_pixels8_l2_mmi(dst, full_mid+8, half, stride, 8, 8, 8);
  2202. }
  2203.  
  2204. void ff_avg_h264_qpel8_mc11_mmi(uint8_t *dst, const uint8_t *src,
  2205.         ptrdiff_t stride)
  2206. {
  2207.     uint8_t full[104];
  2208.     uint8_t * const full_mid= full + 16;
  2209.     uint8_t halfH[64];
  2210.     uint8_t halfV[64];
  2211.     put_h264_qpel8_h_lowpass_mmi(halfH, src, 8, stride);
  2212.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2213.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2214.     avg_pixels8_l2_mmi(dst, halfH, halfV, stride, 8, 8, 8);
  2215. }
  2216.  
  2217. void ff_avg_h264_qpel8_mc31_mmi(uint8_t *dst, const uint8_t *src,
  2218.         ptrdiff_t stride)
  2219. {
  2220.     uint8_t full[104];
  2221.     uint8_t * const full_mid= full + 16;
  2222.     uint8_t halfH[64];
  2223.     uint8_t halfV[64];
  2224.     put_h264_qpel8_h_lowpass_mmi(halfH, src, 8, stride);
  2225.     copy_block8_mmi(full, src - stride*2 + 1, 8,  stride, 13);
  2226.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2227.     avg_pixels8_l2_mmi(dst, halfH, halfV, stride, 8, 8, 8);
  2228. }
  2229.  
  2230. void ff_avg_h264_qpel8_mc13_mmi(uint8_t *dst, const uint8_t *src,
  2231.         ptrdiff_t stride)
  2232. {
  2233.     uint8_t full[104];
  2234.     uint8_t * const full_mid= full + 16;
  2235.     uint8_t halfH[64];
  2236.     uint8_t halfV[64];
  2237.     put_h264_qpel8_h_lowpass_mmi(halfH, src + stride, 8, stride);
  2238.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2239.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2240.     avg_pixels8_l2_mmi(dst, halfH, halfV, stride, 8, 8, 8);
  2241. }
  2242.  
  2243. void ff_avg_h264_qpel8_mc33_mmi(uint8_t *dst, const uint8_t *src,
  2244.         ptrdiff_t stride)
  2245. {
  2246.     uint8_t full[104];
  2247.     uint8_t * const full_mid= full + 16;
  2248.     uint8_t halfH[64];
  2249.     uint8_t halfV[64];
  2250.     put_h264_qpel8_h_lowpass_mmi(halfH, src + stride, 8, stride);
  2251.     copy_block8_mmi(full, src - stride*2 + 1, 8,  stride, 13);
  2252.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2253.     avg_pixels8_l2_mmi(dst, halfH, halfV, stride, 8, 8, 8);
  2254. }
  2255.  
  2256. void ff_avg_h264_qpel8_mc22_mmi(uint8_t *dst, const uint8_t *src,
  2257.         ptrdiff_t stride)
  2258. {
  2259.     avg_h264_qpel8_hv_lowpass_mmi(dst, src, stride, stride);
  2260. }
  2261.  
  2262. void ff_avg_h264_qpel8_mc21_mmi(uint8_t *dst, const uint8_t *src,
  2263.         ptrdiff_t stride)
  2264. {
  2265.     uint8_t halfH[64];
  2266.     uint8_t halfHV[64];
  2267.     put_h264_qpel8_h_lowpass_mmi(halfH, src, 8, stride);
  2268.     put_h264_qpel8_hv_lowpass_mmi(halfHV, src, 8, stride);
  2269.     avg_pixels8_l2_mmi(dst, halfH, halfHV, stride, 8, 8, 8);
  2270. }
  2271.  
  2272. void ff_avg_h264_qpel8_mc23_mmi(uint8_t *dst, const uint8_t *src,
  2273.         ptrdiff_t stride)
  2274. {
  2275.     uint8_t halfH[64];
  2276.     uint8_t halfHV[64];
  2277.     put_h264_qpel8_h_lowpass_mmi(halfH, src + stride, 8, stride);
  2278.     put_h264_qpel8_hv_lowpass_mmi(halfHV, src, 8, stride);
  2279.     avg_pixels8_l2_mmi(dst, halfH, halfHV, stride, 8, 8, 8);
  2280. }
  2281.  
  2282. void ff_avg_h264_qpel8_mc12_mmi(uint8_t *dst, const uint8_t *src,
  2283.         ptrdiff_t stride)
  2284. {
  2285.     uint8_t full[104];
  2286.     uint8_t * const full_mid= full + 16;
  2287.     uint8_t halfV[64];
  2288.     uint8_t halfHV[64];
  2289.     copy_block8_mmi(full, src - stride*2, 8,  stride, 13);
  2290.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2291.     put_h264_qpel8_hv_lowpass_mmi(halfHV, src, 8, stride);
  2292.     avg_pixels8_l2_mmi(dst, halfV, halfHV, stride, 8, 8, 8);
  2293. }
  2294.  
  2295. void ff_avg_h264_qpel8_mc32_mmi(uint8_t *dst, const uint8_t *src,
  2296.         ptrdiff_t stride)
  2297. {
  2298.     uint8_t full[104];
  2299.     uint8_t * const full_mid= full + 16;
  2300.     uint8_t halfV[64];
  2301.     uint8_t halfHV[64];
  2302.     copy_block8_mmi(full, src - stride*2 + 1, 8,  stride, 13);
  2303.     put_h264_qpel8_v_lowpass_mmi(halfV, full_mid, 8, 8);
  2304.     put_h264_qpel8_hv_lowpass_mmi(halfHV, src, 8, stride);
  2305.     avg_pixels8_l2_mmi(dst, halfV, halfHV, stride, 8, 8, 8);
  2306. }
  2307.  
  2308. //DEF_H264_MC_MMI(put_, 16)
  2309. void ff_put_h264_qpel16_mc00_mmi(uint8_t *dst, const uint8_t *src,
  2310.         ptrdiff_t stride)
  2311. {
  2312.     put_pixels16_mmi(dst, src, stride, 16);
  2313. }
  2314.  
  2315. void ff_put_h264_qpel16_mc10_mmi(uint8_t *dst, const uint8_t *src,
  2316.         ptrdiff_t stride)
  2317. {
  2318.     uint8_t half[256];
  2319.     put_h264_qpel16_h_lowpass_mmi(half, src, 16, stride);
  2320.     put_pixels16_l2_mmi(dst, src, half, stride, stride, 16, 16);
  2321. }
  2322.  
  2323. void ff_put_h264_qpel16_mc20_mmi(uint8_t *dst, const uint8_t *src,
  2324.         ptrdiff_t stride)
  2325. {
  2326.     put_h264_qpel16_h_lowpass_mmi(dst, src, stride, stride);
  2327. }
  2328.  
  2329. void ff_put_h264_qpel16_mc30_mmi(uint8_t *dst, const uint8_t *src,
  2330.         ptrdiff_t stride)
  2331. {
  2332.     uint8_t half[256];
  2333.     put_h264_qpel16_h_lowpass_mmi(half, src, 16, stride);
  2334.     put_pixels16_l2_mmi(dst, src+1, half, stride, stride, 16, 16);
  2335. }
  2336.  
  2337. void ff_put_h264_qpel16_mc01_mmi(uint8_t *dst, const uint8_t *src,
  2338.         ptrdiff_t stride)
  2339. {
  2340.     uint8_t full[336];
  2341.     uint8_t * const full_mid= full + 32;
  2342.     uint8_t half[256];
  2343.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2344.     put_h264_qpel16_v_lowpass_mmi(half, full_mid, 16, 16);
  2345.     put_pixels16_l2_mmi(dst, full_mid, half, stride, 16, 16, 16);
  2346. }
  2347.  
  2348. void ff_put_h264_qpel16_mc02_mmi(uint8_t *dst, const uint8_t *src,
  2349.         ptrdiff_t stride)
  2350. {
  2351.     uint8_t full[336];
  2352.     uint8_t * const full_mid= full + 32;
  2353.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2354.     put_h264_qpel16_v_lowpass_mmi(dst, full_mid, stride, 16);
  2355. }
  2356.  
  2357. void ff_put_h264_qpel16_mc03_mmi(uint8_t *dst, const uint8_t *src,
  2358.         ptrdiff_t stride)
  2359. {
  2360.     uint8_t full[336];
  2361.     uint8_t * const full_mid= full + 32;
  2362.     uint8_t half[256];
  2363.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2364.     put_h264_qpel16_v_lowpass_mmi(half, full_mid, 16, 16);
  2365.     put_pixels16_l2_mmi(dst, full_mid+16, half, stride, 16, 16, 16);
  2366. }
  2367.  
  2368. void ff_put_h264_qpel16_mc11_mmi(uint8_t *dst, const uint8_t *src,
  2369.         ptrdiff_t stride)
  2370. {
  2371.     uint8_t full[336];
  2372.     uint8_t * const full_mid= full + 32;
  2373.     uint8_t halfH[256];
  2374.     uint8_t halfV[256];
  2375.     put_h264_qpel16_h_lowpass_mmi(halfH, src, 16, stride);
  2376.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2377.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2378.     put_pixels16_l2_mmi(dst, halfH, halfV, stride, 16, 16, 16);
  2379. }
  2380.  
  2381. void ff_put_h264_qpel16_mc31_mmi(uint8_t *dst, const uint8_t *src,
  2382.         ptrdiff_t stride)
  2383. {
  2384.     uint8_t full[336];
  2385.     uint8_t * const full_mid= full + 32;
  2386.     uint8_t halfH[256];
  2387.     uint8_t halfV[256];
  2388.     put_h264_qpel16_h_lowpass_mmi(halfH, src, 16, stride);
  2389.     copy_block16_mmi(full, src - stride*2 + 1, 16,  stride, 21);
  2390.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2391.     put_pixels16_l2_mmi(dst, halfH, halfV, stride, 16, 16, 16);
  2392. }
  2393.  
  2394. void ff_put_h264_qpel16_mc13_mmi(uint8_t *dst, const uint8_t *src,
  2395.         ptrdiff_t stride)
  2396. {
  2397.     uint8_t full[336];
  2398.     uint8_t * const full_mid= full + 32;
  2399.     uint8_t halfH[256];
  2400.     uint8_t halfV[256];
  2401.     put_h264_qpel16_h_lowpass_mmi(halfH, src + stride, 16, stride);
  2402.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2403.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2404.     put_pixels16_l2_mmi(dst, halfH, halfV, stride, 16, 16, 16);
  2405. }
  2406.  
  2407. void ff_put_h264_qpel16_mc33_mmi(uint8_t *dst, const uint8_t *src,
  2408.         ptrdiff_t stride)
  2409. {
  2410.     uint8_t full[336];
  2411.     uint8_t * const full_mid= full + 32;
  2412.     uint8_t halfH[256];
  2413.     uint8_t halfV[256];
  2414.     put_h264_qpel16_h_lowpass_mmi(halfH, src + stride, 16, stride);
  2415.     copy_block16_mmi(full, src - stride*2 + 1, 16,  stride, 21);
  2416.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2417.     put_pixels16_l2_mmi(dst, halfH, halfV, stride, 16, 16, 16);
  2418. }
  2419.  
  2420. void ff_put_h264_qpel16_mc22_mmi(uint8_t *dst, const uint8_t *src,
  2421.         ptrdiff_t stride)
  2422. {
  2423.     put_h264_qpel16_hv_lowpass_mmi(dst, src, stride, stride);
  2424. }
  2425.  
  2426. void ff_put_h264_qpel16_mc21_mmi(uint8_t *dst, const uint8_t *src,
  2427.         ptrdiff_t stride)
  2428. {
  2429.     uint8_t halfH[256];
  2430.     uint8_t halfHV[256];
  2431.     put_h264_qpel16_h_lowpass_mmi(halfH, src, 16, stride);
  2432.     put_h264_qpel16_hv_lowpass_mmi(halfHV, src, 16, stride);
  2433.     put_pixels16_l2_mmi(dst, halfH, halfHV, stride, 16, 16, 16);
  2434. }
  2435.  
  2436. void ff_put_h264_qpel16_mc23_mmi(uint8_t *dst, const uint8_t *src,
  2437.         ptrdiff_t stride)
  2438. {
  2439.     uint8_t halfH[256];
  2440.     uint8_t halfHV[256];
  2441.     put_h264_qpel16_h_lowpass_mmi(halfH, src + stride, 16, stride);
  2442.     put_h264_qpel16_hv_lowpass_mmi(halfHV, src, 16, stride);
  2443.     put_pixels16_l2_mmi(dst, halfH, halfHV, stride, 16, 16, 16);
  2444. }
  2445.  
  2446. void ff_put_h264_qpel16_mc12_mmi(uint8_t *dst, const uint8_t *src,
  2447.         ptrdiff_t stride)
  2448. {
  2449.     uint8_t full[336];
  2450.     uint8_t * const full_mid= full + 32;
  2451.     uint8_t halfV[256];
  2452.     uint8_t halfHV[256];
  2453.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2454.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2455.     put_h264_qpel16_hv_lowpass_mmi(halfHV, src, 16, stride);
  2456.     put_pixels16_l2_mmi(dst, halfV, halfHV, stride, 16, 16, 16);
  2457. }
  2458.  
  2459. void ff_put_h264_qpel16_mc32_mmi(uint8_t *dst, const uint8_t *src,
  2460.         ptrdiff_t stride)
  2461. {
  2462.     uint8_t full[336];
  2463.     uint8_t * const full_mid= full + 32;
  2464.     uint8_t halfV[256];
  2465.     uint8_t halfHV[256];
  2466.     copy_block16_mmi(full, src - stride*2 + 1, 16,  stride, 21);
  2467.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2468.     put_h264_qpel16_hv_lowpass_mmi(halfHV, src, 16, stride);
  2469.     put_pixels16_l2_mmi(dst, halfV, halfHV, stride, 16, 16, 16);
  2470. }
  2471.  
  2472. //DEF_H264_MC_MMI(avg_, 16)
  2473. void ff_avg_h264_qpel16_mc00_mmi(uint8_t *dst, const uint8_t *src,
  2474.         ptrdiff_t stride)
  2475. {
  2476.     avg_pixels16_mmi(dst, src, stride, 16);
  2477. }
  2478.  
  2479. void ff_avg_h264_qpel16_mc10_mmi(uint8_t *dst, const uint8_t *src,
  2480.         ptrdiff_t stride)
  2481. {
  2482.     uint8_t half[256];
  2483.     put_h264_qpel16_h_lowpass_mmi(half, src, 16, stride);
  2484.     avg_pixels16_l2_mmi(dst, src, half, stride, stride, 16, 16);
  2485. }
  2486.  
  2487. void ff_avg_h264_qpel16_mc20_mmi(uint8_t *dst, const uint8_t *src,
  2488.         ptrdiff_t stride)
  2489. {
  2490.     avg_h264_qpel16_h_lowpass_mmi(dst, src, stride, stride);
  2491. }
  2492.  
  2493. void ff_avg_h264_qpel16_mc30_mmi(uint8_t *dst, const uint8_t *src,
  2494.         ptrdiff_t stride)
  2495. {
  2496.     uint8_t half[256];
  2497.     put_h264_qpel16_h_lowpass_mmi(half, src, 16, stride);
  2498.     avg_pixels16_l2_mmi(dst, src+1, half, stride, stride, 16, 16);
  2499. }
  2500.  
  2501. void ff_avg_h264_qpel16_mc01_mmi(uint8_t *dst, const uint8_t *src,
  2502.         ptrdiff_t stride)
  2503. {
  2504.     uint8_t full[336];
  2505.     uint8_t * const full_mid= full + 32;
  2506.     uint8_t half[256];
  2507.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2508.     put_h264_qpel16_v_lowpass_mmi(half, full_mid, 16, 16);
  2509.     avg_pixels16_l2_mmi(dst, full_mid, half, stride, 16, 16, 16);
  2510. }
  2511.  
  2512. void ff_avg_h264_qpel16_mc02_mmi(uint8_t *dst, const uint8_t *src,
  2513.         ptrdiff_t stride)
  2514. {
  2515.     uint8_t full[336];
  2516.     uint8_t * const full_mid= full + 32;
  2517.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2518.     avg_h264_qpel16_v_lowpass_mmi(dst, full_mid, stride, 16);
  2519. }
  2520.  
  2521. void ff_avg_h264_qpel16_mc03_mmi(uint8_t *dst, const uint8_t *src,
  2522.         ptrdiff_t stride)
  2523. {
  2524.     uint8_t full[336];
  2525.     uint8_t * const full_mid= full + 32;
  2526.     uint8_t half[256];
  2527.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2528.     put_h264_qpel16_v_lowpass_mmi(half, full_mid, 16, 16);
  2529.     avg_pixels16_l2_mmi(dst, full_mid+16, half, stride, 16, 16, 16);
  2530. }
  2531.  
  2532. void ff_avg_h264_qpel16_mc11_mmi(uint8_t *dst, const uint8_t *src,
  2533.         ptrdiff_t stride)
  2534. {
  2535.     uint8_t full[336];
  2536.     uint8_t * const full_mid= full + 32;
  2537.     uint8_t halfH[256];
  2538.     uint8_t halfV[256];
  2539.     put_h264_qpel16_h_lowpass_mmi(halfH, src, 16, stride);
  2540.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2541.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2542.     avg_pixels16_l2_mmi(dst, halfH, halfV, stride, 16, 16, 16);
  2543. }
  2544.  
  2545. void ff_avg_h264_qpel16_mc31_mmi(uint8_t *dst, const uint8_t *src,
  2546.         ptrdiff_t stride)
  2547. {
  2548.     uint8_t full[336];
  2549.     uint8_t * const full_mid= full + 32;
  2550.     uint8_t halfH[256];
  2551.     uint8_t halfV[256];
  2552.     put_h264_qpel16_h_lowpass_mmi(halfH, src, 16, stride);
  2553.     copy_block16_mmi(full, src - stride*2 + 1, 16,  stride, 21);
  2554.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2555.     avg_pixels16_l2_mmi(dst, halfH, halfV, stride, 16, 16, 16);
  2556. }
  2557.  
  2558. void ff_avg_h264_qpel16_mc13_mmi(uint8_t *dst, const uint8_t *src,
  2559.         ptrdiff_t stride)
  2560. {
  2561.     uint8_t full[336];
  2562.     uint8_t * const full_mid= full + 32;
  2563.     uint8_t halfH[256];
  2564.     uint8_t halfV[256];
  2565.     put_h264_qpel16_h_lowpass_mmi(halfH, src + stride, 16, stride);
  2566.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2567.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2568.     avg_pixels16_l2_mmi(dst, halfH, halfV, stride, 16, 16, 16);
  2569. }
  2570.  
  2571. void ff_avg_h264_qpel16_mc33_mmi(uint8_t *dst, const uint8_t *src,
  2572.         ptrdiff_t stride)
  2573. {
  2574.     uint8_t full[336];
  2575.     uint8_t * const full_mid= full + 32;
  2576.     uint8_t halfH[256];
  2577.     uint8_t halfV[256];
  2578.     put_h264_qpel16_h_lowpass_mmi(halfH, src + stride, 16, stride);
  2579.     copy_block16_mmi(full, src - stride*2 + 1, 16,  stride, 21);
  2580.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2581.     avg_pixels16_l2_mmi(dst, halfH, halfV, stride, 16, 16, 16);
  2582. }
  2583.  
  2584. void ff_avg_h264_qpel16_mc22_mmi(uint8_t *dst, const uint8_t *src,
  2585.         ptrdiff_t stride)
  2586. {
  2587.     avg_h264_qpel16_hv_lowpass_mmi(dst, src, stride, stride);
  2588. }
  2589.  
  2590. void ff_avg_h264_qpel16_mc21_mmi(uint8_t *dst, const uint8_t *src,
  2591.         ptrdiff_t stride)
  2592. {
  2593.     uint8_t halfH[256];
  2594.     uint8_t halfHV[256];
  2595.     put_h264_qpel16_h_lowpass_mmi(halfH, src, 16, stride);
  2596.     put_h264_qpel16_hv_lowpass_mmi(halfHV, src, 16, stride);
  2597.     avg_pixels16_l2_mmi(dst, halfH, halfHV, stride, 16, 16, 16);
  2598. }
  2599.  
  2600. void ff_avg_h264_qpel16_mc23_mmi(uint8_t *dst, const uint8_t *src,
  2601.         ptrdiff_t stride)
  2602. {
  2603.     uint8_t halfH[256];
  2604.     uint8_t halfHV[256];
  2605.     put_h264_qpel16_h_lowpass_mmi(halfH, src + stride, 16, stride);
  2606.     put_h264_qpel16_hv_lowpass_mmi(halfHV, src, 16, stride);
  2607.     avg_pixels16_l2_mmi(dst, halfH, halfHV, stride, 16, 16, 16);
  2608. }
  2609.  
  2610. void ff_avg_h264_qpel16_mc12_mmi(uint8_t *dst, const uint8_t *src,
  2611.         ptrdiff_t stride)
  2612. {
  2613.     uint8_t full[336];
  2614.     uint8_t * const full_mid= full + 32;
  2615.     uint8_t halfV[256];
  2616.     uint8_t halfHV[256];
  2617.     copy_block16_mmi(full, src - stride*2, 16,  stride, 21);
  2618.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2619.     put_h264_qpel16_hv_lowpass_mmi(halfHV, src, 16, stride);
  2620.     avg_pixels16_l2_mmi(dst, halfV, halfHV, stride, 16, 16, 16);
  2621. }
  2622.  
  2623. void ff_avg_h264_qpel16_mc32_mmi(uint8_t *dst, const uint8_t *src,
  2624.         ptrdiff_t stride)
  2625. {
  2626.     uint8_t full[336];
  2627.     uint8_t * const full_mid= full + 32;
  2628.     uint8_t halfV[256];
  2629.     uint8_t halfHV[256];
  2630.     copy_block16_mmi(full, src - stride*2 + 1, 16,  stride, 21);
  2631.     put_h264_qpel16_v_lowpass_mmi(halfV, full_mid, 16, 16);
  2632.     put_h264_qpel16_hv_lowpass_mmi(halfHV, src, 16, stride);
  2633.     avg_pixels16_l2_mmi(dst, halfV, halfHV, stride, 16, 16, 16);
  2634. }
  2635.  
  2636. #undef op2_avg
  2637. #undef op2_put
  2638.