Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Simple IDCT MMX
  3.  *
  4.  * Copyright (c) 2001, 2002 Michael Niedermayer <michaelni@gmx.at>
  5.  *
  6.  * This file is part of FFmpeg.
  7.  *
  8.  * FFmpeg is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Lesser General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2.1 of the License, or (at your option) any later version.
  12.  *
  13.  * FFmpeg is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Lesser General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with FFmpeg; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21.  */
  22.  
  23. #include "libavutil/mem.h"
  24. #include "libavutil/x86/asm.h"
  25.  
  26. #include "libavcodec/idctdsp.h"
  27.  
  28. #include "idctdsp.h"
  29. #include "simple_idct.h"
  30.  
  31. #if HAVE_INLINE_ASM
  32.  
  33. /*
  34. 23170.475006
  35. 22725.260826
  36. 21406.727617
  37. 19265.545870
  38. 16384.000000
  39. 12872.826198
  40. 8866.956905
  41. 4520.335430
  42. */
  43. #define C0 23170 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  44. #define C1 22725 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  45. #define C2 21407 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  46. #define C3 19266 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  47. #define C4 16383 //cos(i*M_PI/16)*sqrt(2)*(1<<14) - 0.5
  48. #define C5 12873 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  49. #define C6 8867  //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  50. #define C7 4520  //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  51.  
  52. #define ROW_SHIFT 11
  53. #define COL_SHIFT 20 // 6
  54.  
  55. DECLARE_ASM_CONST(8, uint64_t, wm1010)= 0xFFFF0000FFFF0000ULL;
  56. DECLARE_ASM_CONST(8, uint64_t, d40000)= 0x0000000000040000ULL;
  57.  
  58. DECLARE_ALIGNED(8, static const int16_t, coeffs)[]= {
  59.         1<<(ROW_SHIFT-1), 0, 1<<(ROW_SHIFT-1), 0,
  60. //        1<<(COL_SHIFT-1), 0, 1<<(COL_SHIFT-1), 0,
  61. //        0, 1<<(COL_SHIFT-1-16), 0, 1<<(COL_SHIFT-1-16),
  62.         1<<(ROW_SHIFT-1), 1, 1<<(ROW_SHIFT-1), 0,
  63.         // the 1 = ((1<<(COL_SHIFT-1))/C4)<<ROW_SHIFT :)
  64. //        0, 0, 0, 0,
  65. //        0, 0, 0, 0,
  66.  
  67.  C4,  C4,  C4,  C4,
  68.  C4, -C4,  C4, -C4,
  69.  
  70.  C2,  C6,  C2,  C6,
  71.  C6, -C2,  C6, -C2,
  72.  
  73.  C1,  C3,  C1,  C3,
  74.  C5,  C7,  C5,  C7,
  75.  
  76.  C3, -C7,  C3, -C7,
  77. -C1, -C5, -C1, -C5,
  78.  
  79.  C5, -C1,  C5, -C1,
  80.  C7,  C3,  C7,  C3,
  81.  
  82.  C7, -C5,  C7, -C5,
  83.  C3, -C1,  C3, -C1
  84. };
  85.  
  86. static inline void idct(int16_t *block)
  87. {
  88.         LOCAL_ALIGNED_8(int64_t, align_tmp, [16]);
  89.         int16_t * const temp= (int16_t*)align_tmp;
  90.  
  91.         __asm__ volatile(
  92. #if 0 //Alternative, simpler variant
  93.  
  94. #define ROW_IDCT(src0, src4, src1, src5, dst, rounder, shift) \
  95.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  96.         "movq " #src4 ", %%mm1          \n\t" /* R6     R2      r6      r2 */\
  97.         "movq " #src1 ", %%mm2          \n\t" /* R3     R1      r3      r1 */\
  98.         "movq " #src5 ", %%mm3          \n\t" /* R7     R5      r7      r5 */\
  99.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  100.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  101.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  102.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  103.         "movq 32(%2), %%mm5             \n\t" /* C6     C2      C6      C2 */\
  104.         "pmaddwd %%mm1, %%mm5           \n\t" /* C6R6+C2R2      C6r6+C2r2 */\
  105.         "movq 40(%2), %%mm6             \n\t" /* -C2    C6      -C2     C6 */\
  106.         "pmaddwd %%mm6, %%mm1           \n\t" /* -C2R6+C6R2     -C2r6+C6r2 */\
  107.         "movq 48(%2), %%mm7             \n\t" /* C3     C1      C3      C1 */\
  108.         "pmaddwd %%mm2, %%mm7           \n\t" /* C3R3+C1R1      C3r3+C1r1 */\
  109.         #rounder ", %%mm4               \n\t"\
  110.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  111.         "paddd %%mm5, %%mm4             \n\t" /* A0             a0 */\
  112.         "psubd %%mm5, %%mm6             \n\t" /* A3             a3 */\
  113.         "movq 56(%2), %%mm5             \n\t" /* C7     C5      C7      C5 */\
  114.         "pmaddwd %%mm3, %%mm5           \n\t" /* C7R7+C5R5      C7r7+C5r5 */\
  115.         #rounder ", %%mm0               \n\t"\
  116.         "paddd %%mm0, %%mm1             \n\t" /* A1             a1 */\
  117.         "paddd %%mm0, %%mm0             \n\t" \
  118.         "psubd %%mm1, %%mm0             \n\t" /* A2             a2 */\
  119.         "pmaddwd 64(%2), %%mm2          \n\t" /* -C7R3+C3R1     -C7r3+C3r1 */\
  120.         "paddd %%mm5, %%mm7             \n\t" /* B0             b0 */\
  121.         "movq 72(%2), %%mm5             \n\t" /* -C5    -C1     -C5     -C1 */\
  122.         "pmaddwd %%mm3, %%mm5           \n\t" /* -C5R7-C1R5     -C5r7-C1r5 */\
  123.         "paddd %%mm4, %%mm7             \n\t" /* A0+B0          a0+b0 */\
  124.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  125.         "psubd %%mm7, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  126.         "paddd %%mm2, %%mm5             \n\t" /* B1             b1 */\
  127.         "psrad $" #shift ", %%mm7       \n\t"\
  128.         "psrad $" #shift ", %%mm4       \n\t"\
  129.         "movq %%mm1, %%mm2              \n\t" /* A1             a1 */\
  130.         "paddd %%mm5, %%mm1             \n\t" /* A1+B1          a1+b1 */\
  131.         "psubd %%mm5, %%mm2             \n\t" /* A1-B1          a1-b1 */\
  132.         "psrad $" #shift ", %%mm1       \n\t"\
  133.         "psrad $" #shift ", %%mm2       \n\t"\
  134.         "packssdw %%mm1, %%mm7          \n\t" /* A1+B1  a1+b1   A0+B0   a0+b0 */\
  135.         "packssdw %%mm4, %%mm2          \n\t" /* A0-B0  a0-b0   A1-B1   a1-b1 */\
  136.         "movq %%mm7, " #dst "           \n\t"\
  137.         "movq " #src1 ", %%mm1          \n\t" /* R3     R1      r3      r1 */\
  138.         "movq 80(%2), %%mm4             \n\t" /* -C1    C5      -C1     C5 */\
  139.         "movq %%mm2, 24+" #dst "        \n\t"\
  140.         "pmaddwd %%mm1, %%mm4           \n\t" /* -C1R3+C5R1     -C1r3+C5r1 */\
  141.         "movq 88(%2), %%mm7             \n\t" /* C3     C7      C3      C7 */\
  142.         "pmaddwd 96(%2), %%mm1          \n\t" /* -C5R3+C7R1     -C5r3+C7r1 */\
  143.         "pmaddwd %%mm3, %%mm7           \n\t" /* C3R7+C7R5      C3r7+C7r5 */\
  144.         "movq %%mm0, %%mm2              \n\t" /* A2             a2 */\
  145.         "pmaddwd 104(%2), %%mm3         \n\t" /* -C1R7+C3R5     -C1r7+C3r5 */\
  146.         "paddd %%mm7, %%mm4             \n\t" /* B2             b2 */\
  147.         "paddd %%mm4, %%mm2             \n\t" /* A2+B2          a2+b2 */\
  148.         "psubd %%mm4, %%mm0             \n\t" /* a2-B2          a2-b2 */\
  149.         "psrad $" #shift ", %%mm2       \n\t"\
  150.         "psrad $" #shift ", %%mm0       \n\t"\
  151.         "movq %%mm6, %%mm4              \n\t" /* A3             a3 */\
  152.         "paddd %%mm1, %%mm3             \n\t" /* B3             b3 */\
  153.         "paddd %%mm3, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  154.         "psubd %%mm3, %%mm4             \n\t" /* a3-B3          a3-b3 */\
  155.         "psrad $" #shift ", %%mm6       \n\t"\
  156.         "packssdw %%mm6, %%mm2          \n\t" /* A3+B3  a3+b3   A2+B2   a2+b2 */\
  157.         "movq %%mm2, 8+" #dst "         \n\t"\
  158.         "psrad $" #shift ", %%mm4       \n\t"\
  159.         "packssdw %%mm0, %%mm4          \n\t" /* A2-B2  a2-b2   A3-B3   a3-b3 */\
  160.         "movq %%mm4, 16+" #dst "        \n\t"\
  161.  
  162. #define COL_IDCT(src0, src4, src1, src5, dst, shift) \
  163.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  164.         "movq " #src4 ", %%mm1          \n\t" /* R6     R2      r6      r2 */\
  165.         "movq " #src1 ", %%mm2          \n\t" /* R3     R1      r3      r1 */\
  166.         "movq " #src5 ", %%mm3          \n\t" /* R7     R5      r7      r5 */\
  167.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  168.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  169.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  170.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  171.         "movq 32(%2), %%mm5             \n\t" /* C6     C2      C6      C2 */\
  172.         "pmaddwd %%mm1, %%mm5           \n\t" /* C6R6+C2R2      C6r6+C2r2 */\
  173.         "movq 40(%2), %%mm6             \n\t" /* -C2    C6      -C2     C6 */\
  174.         "pmaddwd %%mm6, %%mm1           \n\t" /* -C2R6+C6R2     -C2r6+C6r2 */\
  175.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  176.         "movq 48(%2), %%mm7             \n\t" /* C3     C1      C3      C1 */\
  177.         "pmaddwd %%mm2, %%mm7           \n\t" /* C3R3+C1R1      C3r3+C1r1 */\
  178.         "paddd %%mm5, %%mm4             \n\t" /* A0             a0 */\
  179.         "psubd %%mm5, %%mm6             \n\t" /* A3             a3 */\
  180.         "movq %%mm0, %%mm5              \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  181.         "paddd %%mm1, %%mm0             \n\t" /* A1             a1 */\
  182.         "psubd %%mm1, %%mm5             \n\t" /* A2             a2 */\
  183.         "movq 56(%2), %%mm1             \n\t" /* C7     C5      C7      C5 */\
  184.         "pmaddwd %%mm3, %%mm1           \n\t" /* C7R7+C5R5      C7r7+C5r5 */\
  185.         "pmaddwd 64(%2), %%mm2          \n\t" /* -C7R3+C3R1     -C7r3+C3r1 */\
  186.         "paddd %%mm1, %%mm7             \n\t" /* B0             b0 */\
  187.         "movq 72(%2), %%mm1             \n\t" /* -C5    -C1     -C5     -C1 */\
  188.         "pmaddwd %%mm3, %%mm1           \n\t" /* -C5R7-C1R5     -C5r7-C1r5 */\
  189.         "paddd %%mm4, %%mm7             \n\t" /* A0+B0          a0+b0 */\
  190.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  191.         "psubd %%mm7, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  192.         "paddd %%mm2, %%mm1             \n\t" /* B1             b1 */\
  193.         "psrad $" #shift ", %%mm7       \n\t"\
  194.         "psrad $" #shift ", %%mm4       \n\t"\
  195.         "movq %%mm0, %%mm2              \n\t" /* A1             a1 */\
  196.         "paddd %%mm1, %%mm0             \n\t" /* A1+B1          a1+b1 */\
  197.         "psubd %%mm1, %%mm2             \n\t" /* A1-B1          a1-b1 */\
  198.         "psrad $" #shift ", %%mm0       \n\t"\
  199.         "psrad $" #shift ", %%mm2       \n\t"\
  200.         "packssdw %%mm7, %%mm7          \n\t" /* A0+B0  a0+b0 */\
  201.         "movd %%mm7, " #dst "           \n\t"\
  202.         "packssdw %%mm0, %%mm0          \n\t" /* A1+B1  a1+b1 */\
  203.         "movd %%mm0, 16+" #dst "        \n\t"\
  204.         "packssdw %%mm2, %%mm2          \n\t" /* A1-B1  a1-b1 */\
  205.         "movd %%mm2, 96+" #dst "        \n\t"\
  206.         "packssdw %%mm4, %%mm4          \n\t" /* A0-B0  a0-b0 */\
  207.         "movd %%mm4, 112+" #dst "       \n\t"\
  208.         "movq " #src1 ", %%mm0          \n\t" /* R3     R1      r3      r1 */\
  209.         "movq 80(%2), %%mm4             \n\t" /* -C1    C5      -C1     C5 */\
  210.         "pmaddwd %%mm0, %%mm4           \n\t" /* -C1R3+C5R1     -C1r3+C5r1 */\
  211.         "movq 88(%2), %%mm7             \n\t" /* C3     C7      C3      C7 */\
  212.         "pmaddwd 96(%2), %%mm0          \n\t" /* -C5R3+C7R1     -C5r3+C7r1 */\
  213.         "pmaddwd %%mm3, %%mm7           \n\t" /* C3R7+C7R5      C3r7+C7r5 */\
  214.         "movq %%mm5, %%mm2              \n\t" /* A2             a2 */\
  215.         "pmaddwd 104(%2), %%mm3         \n\t" /* -C1R7+C3R5     -C1r7+C3r5 */\
  216.         "paddd %%mm7, %%mm4             \n\t" /* B2             b2 */\
  217.         "paddd %%mm4, %%mm2             \n\t" /* A2+B2          a2+b2 */\
  218.         "psubd %%mm4, %%mm5             \n\t" /* a2-B2          a2-b2 */\
  219.         "psrad $" #shift ", %%mm2       \n\t"\
  220.         "psrad $" #shift ", %%mm5       \n\t"\
  221.         "movq %%mm6, %%mm4              \n\t" /* A3             a3 */\
  222.         "paddd %%mm0, %%mm3             \n\t" /* B3             b3 */\
  223.         "paddd %%mm3, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  224.         "psubd %%mm3, %%mm4             \n\t" /* a3-B3          a3-b3 */\
  225.         "psrad $" #shift ", %%mm6       \n\t"\
  226.         "psrad $" #shift ", %%mm4       \n\t"\
  227.         "packssdw %%mm2, %%mm2          \n\t" /* A2+B2  a2+b2 */\
  228.         "packssdw %%mm6, %%mm6          \n\t" /* A3+B3  a3+b3 */\
  229.         "movd %%mm2, 32+" #dst "        \n\t"\
  230.         "packssdw %%mm4, %%mm4          \n\t" /* A3-B3  a3-b3 */\
  231.         "packssdw %%mm5, %%mm5          \n\t" /* A2-B2  a2-b2 */\
  232.         "movd %%mm6, 48+" #dst "        \n\t"\
  233.         "movd %%mm4, 64+" #dst "        \n\t"\
  234.         "movd %%mm5, 80+" #dst "        \n\t"\
  235.  
  236.  
  237. #define DC_COND_ROW_IDCT(src0, src4, src1, src5, dst, rounder, shift) \
  238.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  239.         "movq " #src4 ", %%mm1          \n\t" /* R6     R2      r6      r2 */\
  240.         "movq " #src1 ", %%mm2          \n\t" /* R3     R1      r3      r1 */\
  241.         "movq " #src5 ", %%mm3          \n\t" /* R7     R5      r7      r5 */\
  242.         "movq "MANGLE(wm1010)", %%mm4   \n\t"\
  243.         "pand %%mm0, %%mm4              \n\t"\
  244.         "por %%mm1, %%mm4               \n\t"\
  245.         "por %%mm2, %%mm4               \n\t"\
  246.         "por %%mm3, %%mm4               \n\t"\
  247.         "packssdw %%mm4,%%mm4           \n\t"\
  248.         "movd %%mm4, %%eax              \n\t"\
  249.         "orl %%eax, %%eax               \n\t"\
  250.         "jz 1f                          \n\t"\
  251.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  252.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  253.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  254.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  255.         "movq 32(%2), %%mm5             \n\t" /* C6     C2      C6      C2 */\
  256.         "pmaddwd %%mm1, %%mm5           \n\t" /* C6R6+C2R2      C6r6+C2r2 */\
  257.         "movq 40(%2), %%mm6             \n\t" /* -C2    C6      -C2     C6 */\
  258.         "pmaddwd %%mm6, %%mm1           \n\t" /* -C2R6+C6R2     -C2r6+C6r2 */\
  259.         "movq 48(%2), %%mm7             \n\t" /* C3     C1      C3      C1 */\
  260.         "pmaddwd %%mm2, %%mm7           \n\t" /* C3R3+C1R1      C3r3+C1r1 */\
  261.         #rounder ", %%mm4               \n\t"\
  262.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  263.         "paddd %%mm5, %%mm4             \n\t" /* A0             a0 */\
  264.         "psubd %%mm5, %%mm6             \n\t" /* A3             a3 */\
  265.         "movq 56(%2), %%mm5             \n\t" /* C7     C5      C7      C5 */\
  266.         "pmaddwd %%mm3, %%mm5           \n\t" /* C7R7+C5R5      C7r7+C5r5 */\
  267.         #rounder ", %%mm0               \n\t"\
  268.         "paddd %%mm0, %%mm1             \n\t" /* A1             a1 */\
  269.         "paddd %%mm0, %%mm0             \n\t" \
  270.         "psubd %%mm1, %%mm0             \n\t" /* A2             a2 */\
  271.         "pmaddwd 64(%2), %%mm2          \n\t" /* -C7R3+C3R1     -C7r3+C3r1 */\
  272.         "paddd %%mm5, %%mm7             \n\t" /* B0             b0 */\
  273.         "movq 72(%2), %%mm5             \n\t" /* -C5    -C1     -C5     -C1 */\
  274.         "pmaddwd %%mm3, %%mm5           \n\t" /* -C5R7-C1R5     -C5r7-C1r5 */\
  275.         "paddd %%mm4, %%mm7             \n\t" /* A0+B0          a0+b0 */\
  276.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  277.         "psubd %%mm7, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  278.         "paddd %%mm2, %%mm5             \n\t" /* B1             b1 */\
  279.         "psrad $" #shift ", %%mm7       \n\t"\
  280.         "psrad $" #shift ", %%mm4       \n\t"\
  281.         "movq %%mm1, %%mm2              \n\t" /* A1             a1 */\
  282.         "paddd %%mm5, %%mm1             \n\t" /* A1+B1          a1+b1 */\
  283.         "psubd %%mm5, %%mm2             \n\t" /* A1-B1          a1-b1 */\
  284.         "psrad $" #shift ", %%mm1       \n\t"\
  285.         "psrad $" #shift ", %%mm2       \n\t"\
  286.         "packssdw %%mm1, %%mm7          \n\t" /* A1+B1  a1+b1   A0+B0   a0+b0 */\
  287.         "packssdw %%mm4, %%mm2          \n\t" /* A0-B0  a0-b0   A1-B1   a1-b1 */\
  288.         "movq %%mm7, " #dst "           \n\t"\
  289.         "movq " #src1 ", %%mm1          \n\t" /* R3     R1      r3      r1 */\
  290.         "movq 80(%2), %%mm4             \n\t" /* -C1    C5      -C1     C5 */\
  291.         "movq %%mm2, 24+" #dst "        \n\t"\
  292.         "pmaddwd %%mm1, %%mm4           \n\t" /* -C1R3+C5R1     -C1r3+C5r1 */\
  293.         "movq 88(%2), %%mm7             \n\t" /* C3     C7      C3      C7 */\
  294.         "pmaddwd 96(%2), %%mm1          \n\t" /* -C5R3+C7R1     -C5r3+C7r1 */\
  295.         "pmaddwd %%mm3, %%mm7           \n\t" /* C3R7+C7R5      C3r7+C7r5 */\
  296.         "movq %%mm0, %%mm2              \n\t" /* A2             a2 */\
  297.         "pmaddwd 104(%2), %%mm3         \n\t" /* -C1R7+C3R5     -C1r7+C3r5 */\
  298.         "paddd %%mm7, %%mm4             \n\t" /* B2             b2 */\
  299.         "paddd %%mm4, %%mm2             \n\t" /* A2+B2          a2+b2 */\
  300.         "psubd %%mm4, %%mm0             \n\t" /* a2-B2          a2-b2 */\
  301.         "psrad $" #shift ", %%mm2       \n\t"\
  302.         "psrad $" #shift ", %%mm0       \n\t"\
  303.         "movq %%mm6, %%mm4              \n\t" /* A3             a3 */\
  304.         "paddd %%mm1, %%mm3             \n\t" /* B3             b3 */\
  305.         "paddd %%mm3, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  306.         "psubd %%mm3, %%mm4             \n\t" /* a3-B3          a3-b3 */\
  307.         "psrad $" #shift ", %%mm6       \n\t"\
  308.         "packssdw %%mm6, %%mm2          \n\t" /* A3+B3  a3+b3   A2+B2   a2+b2 */\
  309.         "movq %%mm2, 8+" #dst "         \n\t"\
  310.         "psrad $" #shift ", %%mm4       \n\t"\
  311.         "packssdw %%mm0, %%mm4          \n\t" /* A2-B2  a2-b2   A3-B3   a3-b3 */\
  312.         "movq %%mm4, 16+" #dst "        \n\t"\
  313.         "jmp 2f                         \n\t"\
  314.         "1:                             \n\t"\
  315.         "pslld $16, %%mm0               \n\t"\
  316.         "#paddd "MANGLE(d40000)", %%mm0 \n\t"\
  317.         "psrad $13, %%mm0               \n\t"\
  318.         "packssdw %%mm0, %%mm0          \n\t"\
  319.         "movq %%mm0, " #dst "           \n\t"\
  320.         "movq %%mm0, 8+" #dst "         \n\t"\
  321.         "movq %%mm0, 16+" #dst "        \n\t"\
  322.         "movq %%mm0, 24+" #dst "        \n\t"\
  323.         "2:                             \n\t"
  324.  
  325.  
  326. //IDCT(      src0,   src4,   src1,   src5,    dst,    rounder, shift)
  327. ROW_IDCT(    (%0),  8(%0), 16(%0), 24(%0),  0(%1),paddd 8(%2), 11)
  328. /*ROW_IDCT(  32(%0), 40(%0), 48(%0), 56(%0), 32(%1), paddd (%2), 11)
  329. ROW_IDCT(  64(%0), 72(%0), 80(%0), 88(%0), 64(%1), paddd (%2), 11)
  330. ROW_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1), paddd (%2), 11)*/
  331.  
  332. DC_COND_ROW_IDCT(  32(%0), 40(%0), 48(%0), 56(%0), 32(%1),paddd (%2), 11)
  333. DC_COND_ROW_IDCT(  64(%0), 72(%0), 80(%0), 88(%0), 64(%1),paddd (%2), 11)
  334. DC_COND_ROW_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1),paddd (%2), 11)
  335.  
  336.  
  337. //IDCT(      src0,   src4,   src1,    src5,    dst, shift)
  338. COL_IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0), 20)
  339. COL_IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0), 20)
  340. COL_IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0), 20)
  341. COL_IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0), 20)
  342.  
  343. #else
  344.  
  345. #define DC_COND_IDCT(src0, src4, src1, src5, dst, rounder, shift) \
  346.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  347.         "movq " #src4 ", %%mm1          \n\t" /* R6     R2      r6      r2 */\
  348.         "movq " #src1 ", %%mm2          \n\t" /* R3     R1      r3      r1 */\
  349.         "movq " #src5 ", %%mm3          \n\t" /* R7     R5      r7      r5 */\
  350.         "movq "MANGLE(wm1010)", %%mm4   \n\t"\
  351.         "pand %%mm0, %%mm4              \n\t"\
  352.         "por %%mm1, %%mm4               \n\t"\
  353.         "por %%mm2, %%mm4               \n\t"\
  354.         "por %%mm3, %%mm4               \n\t"\
  355.         "packssdw %%mm4,%%mm4           \n\t"\
  356.         "movd %%mm4, %%eax              \n\t"\
  357.         "orl %%eax, %%eax               \n\t"\
  358.         "jz 1f                          \n\t"\
  359.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  360.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  361.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  362.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  363.         "movq 32(%2), %%mm5             \n\t" /* C6     C2      C6      C2 */\
  364.         "pmaddwd %%mm1, %%mm5           \n\t" /* C6R6+C2R2      C6r6+C2r2 */\
  365.         "movq 40(%2), %%mm6             \n\t" /* -C2    C6      -C2     C6 */\
  366.         "pmaddwd %%mm6, %%mm1           \n\t" /* -C2R6+C6R2     -C2r6+C6r2 */\
  367.         "movq 48(%2), %%mm7             \n\t" /* C3     C1      C3      C1 */\
  368.         "pmaddwd %%mm2, %%mm7           \n\t" /* C3R3+C1R1      C3r3+C1r1 */\
  369.         #rounder ", %%mm4               \n\t"\
  370.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  371.         "paddd %%mm5, %%mm4             \n\t" /* A0             a0 */\
  372.         "psubd %%mm5, %%mm6             \n\t" /* A3             a3 */\
  373.         "movq 56(%2), %%mm5             \n\t" /* C7     C5      C7      C5 */\
  374.         "pmaddwd %%mm3, %%mm5           \n\t" /* C7R7+C5R5      C7r7+C5r5 */\
  375.         #rounder ", %%mm0               \n\t"\
  376.         "paddd %%mm0, %%mm1             \n\t" /* A1             a1 */\
  377.         "paddd %%mm0, %%mm0             \n\t" \
  378.         "psubd %%mm1, %%mm0             \n\t" /* A2             a2 */\
  379.         "pmaddwd 64(%2), %%mm2          \n\t" /* -C7R3+C3R1     -C7r3+C3r1 */\
  380.         "paddd %%mm5, %%mm7             \n\t" /* B0             b0 */\
  381.         "movq 72(%2), %%mm5             \n\t" /* -C5    -C1     -C5     -C1 */\
  382.         "pmaddwd %%mm3, %%mm5           \n\t" /* -C5R7-C1R5     -C5r7-C1r5 */\
  383.         "paddd %%mm4, %%mm7             \n\t" /* A0+B0          a0+b0 */\
  384.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  385.         "psubd %%mm7, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  386.         "paddd %%mm2, %%mm5             \n\t" /* B1             b1 */\
  387.         "psrad $" #shift ", %%mm7       \n\t"\
  388.         "psrad $" #shift ", %%mm4       \n\t"\
  389.         "movq %%mm1, %%mm2              \n\t" /* A1             a1 */\
  390.         "paddd %%mm5, %%mm1             \n\t" /* A1+B1          a1+b1 */\
  391.         "psubd %%mm5, %%mm2             \n\t" /* A1-B1          a1-b1 */\
  392.         "psrad $" #shift ", %%mm1       \n\t"\
  393.         "psrad $" #shift ", %%mm2       \n\t"\
  394.         "packssdw %%mm1, %%mm7          \n\t" /* A1+B1  a1+b1   A0+B0   a0+b0 */\
  395.         "packssdw %%mm4, %%mm2          \n\t" /* A0-B0  a0-b0   A1-B1   a1-b1 */\
  396.         "movq %%mm7, " #dst "           \n\t"\
  397.         "movq " #src1 ", %%mm1          \n\t" /* R3     R1      r3      r1 */\
  398.         "movq 80(%2), %%mm4             \n\t" /* -C1    C5      -C1     C5 */\
  399.         "movq %%mm2, 24+" #dst "        \n\t"\
  400.         "pmaddwd %%mm1, %%mm4           \n\t" /* -C1R3+C5R1     -C1r3+C5r1 */\
  401.         "movq 88(%2), %%mm7             \n\t" /* C3     C7      C3      C7 */\
  402.         "pmaddwd 96(%2), %%mm1          \n\t" /* -C5R3+C7R1     -C5r3+C7r1 */\
  403.         "pmaddwd %%mm3, %%mm7           \n\t" /* C3R7+C7R5      C3r7+C7r5 */\
  404.         "movq %%mm0, %%mm2              \n\t" /* A2             a2 */\
  405.         "pmaddwd 104(%2), %%mm3         \n\t" /* -C1R7+C3R5     -C1r7+C3r5 */\
  406.         "paddd %%mm7, %%mm4             \n\t" /* B2             b2 */\
  407.         "paddd %%mm4, %%mm2             \n\t" /* A2+B2          a2+b2 */\
  408.         "psubd %%mm4, %%mm0             \n\t" /* a2-B2          a2-b2 */\
  409.         "psrad $" #shift ", %%mm2       \n\t"\
  410.         "psrad $" #shift ", %%mm0       \n\t"\
  411.         "movq %%mm6, %%mm4              \n\t" /* A3             a3 */\
  412.         "paddd %%mm1, %%mm3             \n\t" /* B3             b3 */\
  413.         "paddd %%mm3, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  414.         "psubd %%mm3, %%mm4             \n\t" /* a3-B3          a3-b3 */\
  415.         "psrad $" #shift ", %%mm6       \n\t"\
  416.         "packssdw %%mm6, %%mm2          \n\t" /* A3+B3  a3+b3   A2+B2   a2+b2 */\
  417.         "movq %%mm2, 8+" #dst "         \n\t"\
  418.         "psrad $" #shift ", %%mm4       \n\t"\
  419.         "packssdw %%mm0, %%mm4          \n\t" /* A2-B2  a2-b2   A3-B3   a3-b3 */\
  420.         "movq %%mm4, 16+" #dst "        \n\t"\
  421.         "jmp 2f                         \n\t"\
  422.         "1:                             \n\t"\
  423.         "pslld $16, %%mm0               \n\t"\
  424.         "paddd "MANGLE(d40000)", %%mm0  \n\t"\
  425.         "psrad $13, %%mm0               \n\t"\
  426.         "packssdw %%mm0, %%mm0          \n\t"\
  427.         "movq %%mm0, " #dst "           \n\t"\
  428.         "movq %%mm0, 8+" #dst "         \n\t"\
  429.         "movq %%mm0, 16+" #dst "        \n\t"\
  430.         "movq %%mm0, 24+" #dst "        \n\t"\
  431.         "2:                             \n\t"
  432.  
  433. #define Z_COND_IDCT(src0, src4, src1, src5, dst, rounder, shift, bt) \
  434.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  435.         "movq " #src4 ", %%mm1          \n\t" /* R6     R2      r6      r2 */\
  436.         "movq " #src1 ", %%mm2          \n\t" /* R3     R1      r3      r1 */\
  437.         "movq " #src5 ", %%mm3          \n\t" /* R7     R5      r7      r5 */\
  438.         "movq %%mm0, %%mm4              \n\t"\
  439.         "por %%mm1, %%mm4               \n\t"\
  440.         "por %%mm2, %%mm4               \n\t"\
  441.         "por %%mm3, %%mm4               \n\t"\
  442.         "packssdw %%mm4,%%mm4           \n\t"\
  443.         "movd %%mm4, %%eax              \n\t"\
  444.         "orl %%eax, %%eax               \n\t"\
  445.         "jz " #bt "                     \n\t"\
  446.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  447.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  448.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  449.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  450.         "movq 32(%2), %%mm5             \n\t" /* C6     C2      C6      C2 */\
  451.         "pmaddwd %%mm1, %%mm5           \n\t" /* C6R6+C2R2      C6r6+C2r2 */\
  452.         "movq 40(%2), %%mm6             \n\t" /* -C2    C6      -C2     C6 */\
  453.         "pmaddwd %%mm6, %%mm1           \n\t" /* -C2R6+C6R2     -C2r6+C6r2 */\
  454.         "movq 48(%2), %%mm7             \n\t" /* C3     C1      C3      C1 */\
  455.         "pmaddwd %%mm2, %%mm7           \n\t" /* C3R3+C1R1      C3r3+C1r1 */\
  456.         #rounder ", %%mm4               \n\t"\
  457.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  458.         "paddd %%mm5, %%mm4             \n\t" /* A0             a0 */\
  459.         "psubd %%mm5, %%mm6             \n\t" /* A3             a3 */\
  460.         "movq 56(%2), %%mm5             \n\t" /* C7     C5      C7      C5 */\
  461.         "pmaddwd %%mm3, %%mm5           \n\t" /* C7R7+C5R5      C7r7+C5r5 */\
  462.         #rounder ", %%mm0               \n\t"\
  463.         "paddd %%mm0, %%mm1             \n\t" /* A1             a1 */\
  464.         "paddd %%mm0, %%mm0             \n\t" \
  465.         "psubd %%mm1, %%mm0             \n\t" /* A2             a2 */\
  466.         "pmaddwd 64(%2), %%mm2          \n\t" /* -C7R3+C3R1     -C7r3+C3r1 */\
  467.         "paddd %%mm5, %%mm7             \n\t" /* B0             b0 */\
  468.         "movq 72(%2), %%mm5             \n\t" /* -C5    -C1     -C5     -C1 */\
  469.         "pmaddwd %%mm3, %%mm5           \n\t" /* -C5R7-C1R5     -C5r7-C1r5 */\
  470.         "paddd %%mm4, %%mm7             \n\t" /* A0+B0          a0+b0 */\
  471.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  472.         "psubd %%mm7, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  473.         "paddd %%mm2, %%mm5             \n\t" /* B1             b1 */\
  474.         "psrad $" #shift ", %%mm7       \n\t"\
  475.         "psrad $" #shift ", %%mm4       \n\t"\
  476.         "movq %%mm1, %%mm2              \n\t" /* A1             a1 */\
  477.         "paddd %%mm5, %%mm1             \n\t" /* A1+B1          a1+b1 */\
  478.         "psubd %%mm5, %%mm2             \n\t" /* A1-B1          a1-b1 */\
  479.         "psrad $" #shift ", %%mm1       \n\t"\
  480.         "psrad $" #shift ", %%mm2       \n\t"\
  481.         "packssdw %%mm1, %%mm7          \n\t" /* A1+B1  a1+b1   A0+B0   a0+b0 */\
  482.         "packssdw %%mm4, %%mm2          \n\t" /* A0-B0  a0-b0   A1-B1   a1-b1 */\
  483.         "movq %%mm7, " #dst "           \n\t"\
  484.         "movq " #src1 ", %%mm1          \n\t" /* R3     R1      r3      r1 */\
  485.         "movq 80(%2), %%mm4             \n\t" /* -C1    C5      -C1     C5 */\
  486.         "movq %%mm2, 24+" #dst "        \n\t"\
  487.         "pmaddwd %%mm1, %%mm4           \n\t" /* -C1R3+C5R1     -C1r3+C5r1 */\
  488.         "movq 88(%2), %%mm7             \n\t" /* C3     C7      C3      C7 */\
  489.         "pmaddwd 96(%2), %%mm1          \n\t" /* -C5R3+C7R1     -C5r3+C7r1 */\
  490.         "pmaddwd %%mm3, %%mm7           \n\t" /* C3R7+C7R5      C3r7+C7r5 */\
  491.         "movq %%mm0, %%mm2              \n\t" /* A2             a2 */\
  492.         "pmaddwd 104(%2), %%mm3         \n\t" /* -C1R7+C3R5     -C1r7+C3r5 */\
  493.         "paddd %%mm7, %%mm4             \n\t" /* B2             b2 */\
  494.         "paddd %%mm4, %%mm2             \n\t" /* A2+B2          a2+b2 */\
  495.         "psubd %%mm4, %%mm0             \n\t" /* a2-B2          a2-b2 */\
  496.         "psrad $" #shift ", %%mm2       \n\t"\
  497.         "psrad $" #shift ", %%mm0       \n\t"\
  498.         "movq %%mm6, %%mm4              \n\t" /* A3             a3 */\
  499.         "paddd %%mm1, %%mm3             \n\t" /* B3             b3 */\
  500.         "paddd %%mm3, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  501.         "psubd %%mm3, %%mm4             \n\t" /* a3-B3          a3-b3 */\
  502.         "psrad $" #shift ", %%mm6       \n\t"\
  503.         "packssdw %%mm6, %%mm2          \n\t" /* A3+B3  a3+b3   A2+B2   a2+b2 */\
  504.         "movq %%mm2, 8+" #dst "         \n\t"\
  505.         "psrad $" #shift ", %%mm4       \n\t"\
  506.         "packssdw %%mm0, %%mm4          \n\t" /* A2-B2  a2-b2   A3-B3   a3-b3 */\
  507.         "movq %%mm4, 16+" #dst "        \n\t"\
  508.  
  509. #define ROW_IDCT(src0, src4, src1, src5, dst, rounder, shift) \
  510.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  511.         "movq " #src4 ", %%mm1          \n\t" /* R6     R2      r6      r2 */\
  512.         "movq " #src1 ", %%mm2          \n\t" /* R3     R1      r3      r1 */\
  513.         "movq " #src5 ", %%mm3          \n\t" /* R7     R5      r7      r5 */\
  514.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  515.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  516.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  517.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  518.         "movq 32(%2), %%mm5             \n\t" /* C6     C2      C6      C2 */\
  519.         "pmaddwd %%mm1, %%mm5           \n\t" /* C6R6+C2R2      C6r6+C2r2 */\
  520.         "movq 40(%2), %%mm6             \n\t" /* -C2    C6      -C2     C6 */\
  521.         "pmaddwd %%mm6, %%mm1           \n\t" /* -C2R6+C6R2     -C2r6+C6r2 */\
  522.         "movq 48(%2), %%mm7             \n\t" /* C3     C1      C3      C1 */\
  523.         "pmaddwd %%mm2, %%mm7           \n\t" /* C3R3+C1R1      C3r3+C1r1 */\
  524.         #rounder ", %%mm4               \n\t"\
  525.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  526.         "paddd %%mm5, %%mm4             \n\t" /* A0             a0 */\
  527.         "psubd %%mm5, %%mm6             \n\t" /* A3             a3 */\
  528.         "movq 56(%2), %%mm5             \n\t" /* C7     C5      C7      C5 */\
  529.         "pmaddwd %%mm3, %%mm5           \n\t" /* C7R7+C5R5      C7r7+C5r5 */\
  530.         #rounder ", %%mm0               \n\t"\
  531.         "paddd %%mm0, %%mm1             \n\t" /* A1             a1 */\
  532.         "paddd %%mm0, %%mm0             \n\t" \
  533.         "psubd %%mm1, %%mm0             \n\t" /* A2             a2 */\
  534.         "pmaddwd 64(%2), %%mm2          \n\t" /* -C7R3+C3R1     -C7r3+C3r1 */\
  535.         "paddd %%mm5, %%mm7             \n\t" /* B0             b0 */\
  536.         "movq 72(%2), %%mm5             \n\t" /* -C5    -C1     -C5     -C1 */\
  537.         "pmaddwd %%mm3, %%mm5           \n\t" /* -C5R7-C1R5     -C5r7-C1r5 */\
  538.         "paddd %%mm4, %%mm7             \n\t" /* A0+B0          a0+b0 */\
  539.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  540.         "psubd %%mm7, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  541.         "paddd %%mm2, %%mm5             \n\t" /* B1             b1 */\
  542.         "psrad $" #shift ", %%mm7       \n\t"\
  543.         "psrad $" #shift ", %%mm4       \n\t"\
  544.         "movq %%mm1, %%mm2              \n\t" /* A1             a1 */\
  545.         "paddd %%mm5, %%mm1             \n\t" /* A1+B1          a1+b1 */\
  546.         "psubd %%mm5, %%mm2             \n\t" /* A1-B1          a1-b1 */\
  547.         "psrad $" #shift ", %%mm1       \n\t"\
  548.         "psrad $" #shift ", %%mm2       \n\t"\
  549.         "packssdw %%mm1, %%mm7          \n\t" /* A1+B1  a1+b1   A0+B0   a0+b0 */\
  550.         "packssdw %%mm4, %%mm2          \n\t" /* A0-B0  a0-b0   A1-B1   a1-b1 */\
  551.         "movq %%mm7, " #dst "           \n\t"\
  552.         "movq " #src1 ", %%mm1          \n\t" /* R3     R1      r3      r1 */\
  553.         "movq 80(%2), %%mm4             \n\t" /* -C1    C5      -C1     C5 */\
  554.         "movq %%mm2, 24+" #dst "        \n\t"\
  555.         "pmaddwd %%mm1, %%mm4           \n\t" /* -C1R3+C5R1     -C1r3+C5r1 */\
  556.         "movq 88(%2), %%mm7             \n\t" /* C3     C7      C3      C7 */\
  557.         "pmaddwd 96(%2), %%mm1          \n\t" /* -C5R3+C7R1     -C5r3+C7r1 */\
  558.         "pmaddwd %%mm3, %%mm7           \n\t" /* C3R7+C7R5      C3r7+C7r5 */\
  559.         "movq %%mm0, %%mm2              \n\t" /* A2             a2 */\
  560.         "pmaddwd 104(%2), %%mm3         \n\t" /* -C1R7+C3R5     -C1r7+C3r5 */\
  561.         "paddd %%mm7, %%mm4             \n\t" /* B2             b2 */\
  562.         "paddd %%mm4, %%mm2             \n\t" /* A2+B2          a2+b2 */\
  563.         "psubd %%mm4, %%mm0             \n\t" /* a2-B2          a2-b2 */\
  564.         "psrad $" #shift ", %%mm2       \n\t"\
  565.         "psrad $" #shift ", %%mm0       \n\t"\
  566.         "movq %%mm6, %%mm4              \n\t" /* A3             a3 */\
  567.         "paddd %%mm1, %%mm3             \n\t" /* B3             b3 */\
  568.         "paddd %%mm3, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  569.         "psubd %%mm3, %%mm4             \n\t" /* a3-B3          a3-b3 */\
  570.         "psrad $" #shift ", %%mm6       \n\t"\
  571.         "packssdw %%mm6, %%mm2          \n\t" /* A3+B3  a3+b3   A2+B2   a2+b2 */\
  572.         "movq %%mm2, 8+" #dst "         \n\t"\
  573.         "psrad $" #shift ", %%mm4       \n\t"\
  574.         "packssdw %%mm0, %%mm4          \n\t" /* A2-B2  a2-b2   A3-B3   a3-b3 */\
  575.         "movq %%mm4, 16+" #dst "        \n\t"\
  576.  
  577. //IDCT(         src0,   src4,   src1,   src5,    dst,   rounder, shift)
  578. DC_COND_IDCT(  0(%0),  8(%0), 16(%0), 24(%0),  0(%1),paddd 8(%2), 11)
  579. Z_COND_IDCT(  32(%0), 40(%0), 48(%0), 56(%0), 32(%1),paddd (%2), 11, 4f)
  580. Z_COND_IDCT(  64(%0), 72(%0), 80(%0), 88(%0), 64(%1),paddd (%2), 11, 2f)
  581. Z_COND_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1),paddd (%2), 11, 1f)
  582.  
  583. #undef IDCT
  584. #define IDCT(src0, src4, src1, src5, dst, shift) \
  585.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  586.         "movq " #src4 ", %%mm1          \n\t" /* R6     R2      r6      r2 */\
  587.         "movq " #src1 ", %%mm2          \n\t" /* R3     R1      r3      r1 */\
  588.         "movq " #src5 ", %%mm3          \n\t" /* R7     R5      r7      r5 */\
  589.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  590.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  591.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  592.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  593.         "movq 32(%2), %%mm5             \n\t" /* C6     C2      C6      C2 */\
  594.         "pmaddwd %%mm1, %%mm5           \n\t" /* C6R6+C2R2      C6r6+C2r2 */\
  595.         "movq 40(%2), %%mm6             \n\t" /* -C2    C6      -C2     C6 */\
  596.         "pmaddwd %%mm6, %%mm1           \n\t" /* -C2R6+C6R2     -C2r6+C6r2 */\
  597.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  598.         "movq 48(%2), %%mm7             \n\t" /* C3     C1      C3      C1 */\
  599.         "pmaddwd %%mm2, %%mm7           \n\t" /* C3R3+C1R1      C3r3+C1r1 */\
  600.         "paddd %%mm5, %%mm4             \n\t" /* A0             a0 */\
  601.         "psubd %%mm5, %%mm6             \n\t" /* A3             a3 */\
  602.         "movq %%mm0, %%mm5              \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  603.         "paddd %%mm1, %%mm0             \n\t" /* A1             a1 */\
  604.         "psubd %%mm1, %%mm5             \n\t" /* A2             a2 */\
  605.         "movq 56(%2), %%mm1             \n\t" /* C7     C5      C7      C5 */\
  606.         "pmaddwd %%mm3, %%mm1           \n\t" /* C7R7+C5R5      C7r7+C5r5 */\
  607.         "pmaddwd 64(%2), %%mm2          \n\t" /* -C7R3+C3R1     -C7r3+C3r1 */\
  608.         "paddd %%mm1, %%mm7             \n\t" /* B0             b0 */\
  609.         "movq 72(%2), %%mm1             \n\t" /* -C5    -C1     -C5     -C1 */\
  610.         "pmaddwd %%mm3, %%mm1           \n\t" /* -C5R7-C1R5     -C5r7-C1r5 */\
  611.         "paddd %%mm4, %%mm7             \n\t" /* A0+B0          a0+b0 */\
  612.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  613.         "psubd %%mm7, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  614.         "paddd %%mm2, %%mm1             \n\t" /* B1             b1 */\
  615.         "psrad $" #shift ", %%mm7       \n\t"\
  616.         "psrad $" #shift ", %%mm4       \n\t"\
  617.         "movq %%mm0, %%mm2              \n\t" /* A1             a1 */\
  618.         "paddd %%mm1, %%mm0             \n\t" /* A1+B1          a1+b1 */\
  619.         "psubd %%mm1, %%mm2             \n\t" /* A1-B1          a1-b1 */\
  620.         "psrad $" #shift ", %%mm0       \n\t"\
  621.         "psrad $" #shift ", %%mm2       \n\t"\
  622.         "packssdw %%mm7, %%mm7          \n\t" /* A0+B0  a0+b0 */\
  623.         "movd %%mm7, " #dst "           \n\t"\
  624.         "packssdw %%mm0, %%mm0          \n\t" /* A1+B1  a1+b1 */\
  625.         "movd %%mm0, 16+" #dst "        \n\t"\
  626.         "packssdw %%mm2, %%mm2          \n\t" /* A1-B1  a1-b1 */\
  627.         "movd %%mm2, 96+" #dst "        \n\t"\
  628.         "packssdw %%mm4, %%mm4          \n\t" /* A0-B0  a0-b0 */\
  629.         "movd %%mm4, 112+" #dst "       \n\t"\
  630.         "movq " #src1 ", %%mm0          \n\t" /* R3     R1      r3      r1 */\
  631.         "movq 80(%2), %%mm4             \n\t" /* -C1    C5      -C1     C5 */\
  632.         "pmaddwd %%mm0, %%mm4           \n\t" /* -C1R3+C5R1     -C1r3+C5r1 */\
  633.         "movq 88(%2), %%mm7             \n\t" /* C3     C7      C3      C7 */\
  634.         "pmaddwd 96(%2), %%mm0          \n\t" /* -C5R3+C7R1     -C5r3+C7r1 */\
  635.         "pmaddwd %%mm3, %%mm7           \n\t" /* C3R7+C7R5      C3r7+C7r5 */\
  636.         "movq %%mm5, %%mm2              \n\t" /* A2             a2 */\
  637.         "pmaddwd 104(%2), %%mm3         \n\t" /* -C1R7+C3R5     -C1r7+C3r5 */\
  638.         "paddd %%mm7, %%mm4             \n\t" /* B2             b2 */\
  639.         "paddd %%mm4, %%mm2             \n\t" /* A2+B2          a2+b2 */\
  640.         "psubd %%mm4, %%mm5             \n\t" /* a2-B2          a2-b2 */\
  641.         "psrad $" #shift ", %%mm2       \n\t"\
  642.         "psrad $" #shift ", %%mm5       \n\t"\
  643.         "movq %%mm6, %%mm4              \n\t" /* A3             a3 */\
  644.         "paddd %%mm0, %%mm3             \n\t" /* B3             b3 */\
  645.         "paddd %%mm3, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  646.         "psubd %%mm3, %%mm4             \n\t" /* a3-B3          a3-b3 */\
  647.         "psrad $" #shift ", %%mm6       \n\t"\
  648.         "psrad $" #shift ", %%mm4       \n\t"\
  649.         "packssdw %%mm2, %%mm2          \n\t" /* A2+B2  a2+b2 */\
  650.         "packssdw %%mm6, %%mm6          \n\t" /* A3+B3  a3+b3 */\
  651.         "movd %%mm2, 32+" #dst "        \n\t"\
  652.         "packssdw %%mm4, %%mm4          \n\t" /* A3-B3  a3-b3 */\
  653.         "packssdw %%mm5, %%mm5          \n\t" /* A2-B2  a2-b2 */\
  654.         "movd %%mm6, 48+" #dst "        \n\t"\
  655.         "movd %%mm4, 64+" #dst "        \n\t"\
  656.         "movd %%mm5, 80+" #dst "        \n\t"
  657.  
  658.  
  659. //IDCT(  src0,   src4,   src1,    src5,    dst, shift)
  660. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0), 20)
  661. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0), 20)
  662. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0), 20)
  663. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0), 20)
  664.         "jmp 9f                         \n\t"
  665.  
  666.         "# .p2align 4                   \n\t"\
  667.         "4:                             \n\t"
  668. Z_COND_IDCT(  64(%0), 72(%0), 80(%0), 88(%0), 64(%1),paddd (%2), 11, 6f)
  669. Z_COND_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1),paddd (%2), 11, 5f)
  670.  
  671. #undef IDCT
  672. #define IDCT(src0, src4, src1, src5, dst, shift) \
  673.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  674.         "movq " #src4 ", %%mm1          \n\t" /* R6     R2      r6      r2 */\
  675.         "movq " #src5 ", %%mm3          \n\t" /* R7     R5      r7      r5 */\
  676.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  677.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  678.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  679.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  680.         "movq 32(%2), %%mm5             \n\t" /* C6     C2      C6      C2 */\
  681.         "pmaddwd %%mm1, %%mm5           \n\t" /* C6R6+C2R2      C6r6+C2r2 */\
  682.         "movq 40(%2), %%mm6             \n\t" /* -C2    C6      -C2     C6 */\
  683.         "pmaddwd %%mm6, %%mm1           \n\t" /* -C2R6+C6R2     -C2r6+C6r2 */\
  684.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  685.         "paddd %%mm5, %%mm4             \n\t" /* A0             a0 */\
  686.         "psubd %%mm5, %%mm6             \n\t" /* A3             a3 */\
  687.         "movq %%mm0, %%mm5              \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  688.         "paddd %%mm1, %%mm0             \n\t" /* A1             a1 */\
  689.         "psubd %%mm1, %%mm5             \n\t" /* A2             a2 */\
  690.         "movq 56(%2), %%mm1             \n\t" /* C7     C5      C7      C5 */\
  691.         "pmaddwd %%mm3, %%mm1           \n\t" /* C7R7+C5R5      C7r7+C5r5 */\
  692.         "movq 72(%2), %%mm7             \n\t" /* -C5    -C1     -C5     -C1 */\
  693.         "pmaddwd %%mm3, %%mm7           \n\t" /* -C5R7-C1R5     -C5r7-C1r5 */\
  694.         "paddd %%mm4, %%mm1             \n\t" /* A0+B0          a0+b0 */\
  695.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  696.         "psubd %%mm1, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  697.         "psrad $" #shift ", %%mm1       \n\t"\
  698.         "psrad $" #shift ", %%mm4       \n\t"\
  699.         "movq %%mm0, %%mm2              \n\t" /* A1             a1 */\
  700.         "paddd %%mm7, %%mm0             \n\t" /* A1+B1          a1+b1 */\
  701.         "psubd %%mm7, %%mm2             \n\t" /* A1-B1          a1-b1 */\
  702.         "psrad $" #shift ", %%mm0       \n\t"\
  703.         "psrad $" #shift ", %%mm2       \n\t"\
  704.         "packssdw %%mm1, %%mm1          \n\t" /* A0+B0  a0+b0 */\
  705.         "movd %%mm1, " #dst "           \n\t"\
  706.         "packssdw %%mm0, %%mm0          \n\t" /* A1+B1  a1+b1 */\
  707.         "movd %%mm0, 16+" #dst "        \n\t"\
  708.         "packssdw %%mm2, %%mm2          \n\t" /* A1-B1  a1-b1 */\
  709.         "movd %%mm2, 96+" #dst "        \n\t"\
  710.         "packssdw %%mm4, %%mm4          \n\t" /* A0-B0  a0-b0 */\
  711.         "movd %%mm4, 112+" #dst "       \n\t"\
  712.         "movq 88(%2), %%mm1             \n\t" /* C3     C7      C3      C7 */\
  713.         "pmaddwd %%mm3, %%mm1           \n\t" /* C3R7+C7R5      C3r7+C7r5 */\
  714.         "movq %%mm5, %%mm2              \n\t" /* A2             a2 */\
  715.         "pmaddwd 104(%2), %%mm3         \n\t" /* -C1R7+C3R5     -C1r7+C3r5 */\
  716.         "paddd %%mm1, %%mm2             \n\t" /* A2+B2          a2+b2 */\
  717.         "psubd %%mm1, %%mm5             \n\t" /* a2-B2          a2-b2 */\
  718.         "psrad $" #shift ", %%mm2       \n\t"\
  719.         "psrad $" #shift ", %%mm5       \n\t"\
  720.         "movq %%mm6, %%mm1              \n\t" /* A3             a3 */\
  721.         "paddd %%mm3, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  722.         "psubd %%mm3, %%mm1             \n\t" /* a3-B3          a3-b3 */\
  723.         "psrad $" #shift ", %%mm6       \n\t"\
  724.         "psrad $" #shift ", %%mm1       \n\t"\
  725.         "packssdw %%mm2, %%mm2          \n\t" /* A2+B2  a2+b2 */\
  726.         "packssdw %%mm6, %%mm6          \n\t" /* A3+B3  a3+b3 */\
  727.         "movd %%mm2, 32+" #dst "        \n\t"\
  728.         "packssdw %%mm1, %%mm1          \n\t" /* A3-B3  a3-b3 */\
  729.         "packssdw %%mm5, %%mm5          \n\t" /* A2-B2  a2-b2 */\
  730.         "movd %%mm6, 48+" #dst "        \n\t"\
  731.         "movd %%mm1, 64+" #dst "        \n\t"\
  732.         "movd %%mm5, 80+" #dst "        \n\t"
  733.  
  734. //IDCT(  src0,   src4,   src1,    src5,    dst, shift)
  735. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0), 20)
  736. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0), 20)
  737. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0), 20)
  738. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0), 20)
  739.         "jmp 9f                         \n\t"
  740.  
  741.         "# .p2align 4                   \n\t"\
  742.         "6:                             \n\t"
  743. Z_COND_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1),paddd (%2), 11, 7f)
  744.  
  745. #undef IDCT
  746. #define IDCT(src0, src4, src1, src5, dst, shift) \
  747.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  748.         "movq " #src5 ", %%mm3          \n\t" /* R7     R5      r7      r5 */\
  749.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  750.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  751.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  752.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  753.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  754.         "movq %%mm0, %%mm5              \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  755.         "movq 56(%2), %%mm1             \n\t" /* C7     C5      C7      C5 */\
  756.         "pmaddwd %%mm3, %%mm1           \n\t" /* C7R7+C5R5      C7r7+C5r5 */\
  757.         "movq 72(%2), %%mm7             \n\t" /* -C5    -C1     -C5     -C1 */\
  758.         "pmaddwd %%mm3, %%mm7           \n\t" /* -C5R7-C1R5     -C5r7-C1r5 */\
  759.         "paddd %%mm4, %%mm1             \n\t" /* A0+B0          a0+b0 */\
  760.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  761.         "psubd %%mm1, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  762.         "psrad $" #shift ", %%mm1       \n\t"\
  763.         "psrad $" #shift ", %%mm4       \n\t"\
  764.         "movq %%mm0, %%mm2              \n\t" /* A1             a1 */\
  765.         "paddd %%mm7, %%mm0             \n\t" /* A1+B1          a1+b1 */\
  766.         "psubd %%mm7, %%mm2             \n\t" /* A1-B1          a1-b1 */\
  767.         "psrad $" #shift ", %%mm0       \n\t"\
  768.         "psrad $" #shift ", %%mm2       \n\t"\
  769.         "packssdw %%mm1, %%mm1          \n\t" /* A0+B0  a0+b0 */\
  770.         "movd %%mm1, " #dst "           \n\t"\
  771.         "packssdw %%mm0, %%mm0          \n\t" /* A1+B1  a1+b1 */\
  772.         "movd %%mm0, 16+" #dst "        \n\t"\
  773.         "packssdw %%mm2, %%mm2          \n\t" /* A1-B1  a1-b1 */\
  774.         "movd %%mm2, 96+" #dst "        \n\t"\
  775.         "packssdw %%mm4, %%mm4          \n\t" /* A0-B0  a0-b0 */\
  776.         "movd %%mm4, 112+" #dst "       \n\t"\
  777.         "movq 88(%2), %%mm1             \n\t" /* C3     C7      C3      C7 */\
  778.         "pmaddwd %%mm3, %%mm1           \n\t" /* C3R7+C7R5      C3r7+C7r5 */\
  779.         "movq %%mm5, %%mm2              \n\t" /* A2             a2 */\
  780.         "pmaddwd 104(%2), %%mm3         \n\t" /* -C1R7+C3R5     -C1r7+C3r5 */\
  781.         "paddd %%mm1, %%mm2             \n\t" /* A2+B2          a2+b2 */\
  782.         "psubd %%mm1, %%mm5             \n\t" /* a2-B2          a2-b2 */\
  783.         "psrad $" #shift ", %%mm2       \n\t"\
  784.         "psrad $" #shift ", %%mm5       \n\t"\
  785.         "movq %%mm6, %%mm1              \n\t" /* A3             a3 */\
  786.         "paddd %%mm3, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  787.         "psubd %%mm3, %%mm1             \n\t" /* a3-B3          a3-b3 */\
  788.         "psrad $" #shift ", %%mm6       \n\t"\
  789.         "psrad $" #shift ", %%mm1       \n\t"\
  790.         "packssdw %%mm2, %%mm2          \n\t" /* A2+B2  a2+b2 */\
  791.         "packssdw %%mm6, %%mm6          \n\t" /* A3+B3  a3+b3 */\
  792.         "movd %%mm2, 32+" #dst "        \n\t"\
  793.         "packssdw %%mm1, %%mm1          \n\t" /* A3-B3  a3-b3 */\
  794.         "packssdw %%mm5, %%mm5          \n\t" /* A2-B2  a2-b2 */\
  795.         "movd %%mm6, 48+" #dst "        \n\t"\
  796.         "movd %%mm1, 64+" #dst "        \n\t"\
  797.         "movd %%mm5, 80+" #dst "        \n\t"
  798.  
  799.  
  800. //IDCT(  src0,   src4,   src1,    src5,    dst, shift)
  801. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0), 20)
  802. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0), 20)
  803. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0), 20)
  804. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0), 20)
  805.         "jmp 9f                         \n\t"
  806.  
  807.         "# .p2align 4                   \n\t"\
  808.         "2:                             \n\t"
  809. Z_COND_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1),paddd (%2), 11, 3f)
  810.  
  811. #undef IDCT
  812. #define IDCT(src0, src4, src1, src5, dst, shift) \
  813.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  814.         "movq " #src1 ", %%mm2          \n\t" /* R3     R1      r3      r1 */\
  815.         "movq " #src5 ", %%mm3          \n\t" /* R7     R5      r7      r5 */\
  816.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  817.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  818.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  819.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  820.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  821.         "movq 48(%2), %%mm7             \n\t" /* C3     C1      C3      C1 */\
  822.         "pmaddwd %%mm2, %%mm7           \n\t" /* C3R3+C1R1      C3r3+C1r1 */\
  823.         "movq %%mm0, %%mm5              \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  824.         "movq 56(%2), %%mm1             \n\t" /* C7     C5      C7      C5 */\
  825.         "pmaddwd %%mm3, %%mm1           \n\t" /* C7R7+C5R5      C7r7+C5r5 */\
  826.         "pmaddwd 64(%2), %%mm2          \n\t" /* -C7R3+C3R1     -C7r3+C3r1 */\
  827.         "paddd %%mm1, %%mm7             \n\t" /* B0             b0 */\
  828.         "movq 72(%2), %%mm1             \n\t" /* -C5    -C1     -C5     -C1 */\
  829.         "pmaddwd %%mm3, %%mm1           \n\t" /* -C5R7-C1R5     -C5r7-C1r5 */\
  830.         "paddd %%mm4, %%mm7             \n\t" /* A0+B0          a0+b0 */\
  831.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  832.         "psubd %%mm7, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  833.         "paddd %%mm2, %%mm1             \n\t" /* B1             b1 */\
  834.         "psrad $" #shift ", %%mm7       \n\t"\
  835.         "psrad $" #shift ", %%mm4       \n\t"\
  836.         "movq %%mm0, %%mm2              \n\t" /* A1             a1 */\
  837.         "paddd %%mm1, %%mm0             \n\t" /* A1+B1          a1+b1 */\
  838.         "psubd %%mm1, %%mm2             \n\t" /* A1-B1          a1-b1 */\
  839.         "psrad $" #shift ", %%mm0       \n\t"\
  840.         "psrad $" #shift ", %%mm2       \n\t"\
  841.         "packssdw %%mm7, %%mm7          \n\t" /* A0+B0  a0+b0 */\
  842.         "movd %%mm7, " #dst "           \n\t"\
  843.         "packssdw %%mm0, %%mm0          \n\t" /* A1+B1  a1+b1 */\
  844.         "movd %%mm0, 16+" #dst "        \n\t"\
  845.         "packssdw %%mm2, %%mm2          \n\t" /* A1-B1  a1-b1 */\
  846.         "movd %%mm2, 96+" #dst "        \n\t"\
  847.         "packssdw %%mm4, %%mm4          \n\t" /* A0-B0  a0-b0 */\
  848.         "movd %%mm4, 112+" #dst "       \n\t"\
  849.         "movq " #src1 ", %%mm0          \n\t" /* R3     R1      r3      r1 */\
  850.         "movq 80(%2), %%mm4             \n\t" /* -C1    C5      -C1     C5 */\
  851.         "pmaddwd %%mm0, %%mm4           \n\t" /* -C1R3+C5R1     -C1r3+C5r1 */\
  852.         "movq 88(%2), %%mm7             \n\t" /* C3     C7      C3      C7 */\
  853.         "pmaddwd 96(%2), %%mm0          \n\t" /* -C5R3+C7R1     -C5r3+C7r1 */\
  854.         "pmaddwd %%mm3, %%mm7           \n\t" /* C3R7+C7R5      C3r7+C7r5 */\
  855.         "movq %%mm5, %%mm2              \n\t" /* A2             a2 */\
  856.         "pmaddwd 104(%2), %%mm3         \n\t" /* -C1R7+C3R5     -C1r7+C3r5 */\
  857.         "paddd %%mm7, %%mm4             \n\t" /* B2             b2 */\
  858.         "paddd %%mm4, %%mm2             \n\t" /* A2+B2          a2+b2 */\
  859.         "psubd %%mm4, %%mm5             \n\t" /* a2-B2          a2-b2 */\
  860.         "psrad $" #shift ", %%mm2       \n\t"\
  861.         "psrad $" #shift ", %%mm5       \n\t"\
  862.         "movq %%mm6, %%mm4              \n\t" /* A3             a3 */\
  863.         "paddd %%mm0, %%mm3             \n\t" /* B3             b3 */\
  864.         "paddd %%mm3, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  865.         "psubd %%mm3, %%mm4             \n\t" /* a3-B3          a3-b3 */\
  866.         "psrad $" #shift ", %%mm6       \n\t"\
  867.         "psrad $" #shift ", %%mm4       \n\t"\
  868.         "packssdw %%mm2, %%mm2          \n\t" /* A2+B2  a2+b2 */\
  869.         "packssdw %%mm6, %%mm6          \n\t" /* A3+B3  a3+b3 */\
  870.         "movd %%mm2, 32+" #dst "        \n\t"\
  871.         "packssdw %%mm4, %%mm4          \n\t" /* A3-B3  a3-b3 */\
  872.         "packssdw %%mm5, %%mm5          \n\t" /* A2-B2  a2-b2 */\
  873.         "movd %%mm6, 48+" #dst "        \n\t"\
  874.         "movd %%mm4, 64+" #dst "        \n\t"\
  875.         "movd %%mm5, 80+" #dst "        \n\t"
  876.  
  877. //IDCT(  src0,   src4,   src1,    src5,    dst, shift)
  878. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0), 20)
  879. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0), 20)
  880. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0), 20)
  881. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0), 20)
  882.         "jmp 9f                         \n\t"
  883.  
  884.         "# .p2align 4                   \n\t"\
  885.         "3:                             \n\t"
  886. #undef IDCT
  887. #define IDCT(src0, src4, src1, src5, dst, shift) \
  888.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  889.         "movq " #src1 ", %%mm2          \n\t" /* R3     R1      r3      r1 */\
  890.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  891.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  892.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  893.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  894.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  895.         "movq 48(%2), %%mm7             \n\t" /* C3     C1      C3      C1 */\
  896.         "pmaddwd %%mm2, %%mm7           \n\t" /* C3R3+C1R1      C3r3+C1r1 */\
  897.         "movq %%mm0, %%mm5              \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  898.         "movq 64(%2), %%mm3             \n\t"\
  899.         "pmaddwd %%mm2, %%mm3           \n\t" /* -C7R3+C3R1     -C7r3+C3r1 */\
  900.         "paddd %%mm4, %%mm7             \n\t" /* A0+B0          a0+b0 */\
  901.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  902.         "psubd %%mm7, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  903.         "psrad $" #shift ", %%mm7       \n\t"\
  904.         "psrad $" #shift ", %%mm4       \n\t"\
  905.         "movq %%mm0, %%mm1              \n\t" /* A1             a1 */\
  906.         "paddd %%mm3, %%mm0             \n\t" /* A1+B1          a1+b1 */\
  907.         "psubd %%mm3, %%mm1             \n\t" /* A1-B1          a1-b1 */\
  908.         "psrad $" #shift ", %%mm0       \n\t"\
  909.         "psrad $" #shift ", %%mm1       \n\t"\
  910.         "packssdw %%mm7, %%mm7          \n\t" /* A0+B0  a0+b0 */\
  911.         "movd %%mm7, " #dst "           \n\t"\
  912.         "packssdw %%mm0, %%mm0          \n\t" /* A1+B1  a1+b1 */\
  913.         "movd %%mm0, 16+" #dst "        \n\t"\
  914.         "packssdw %%mm1, %%mm1          \n\t" /* A1-B1  a1-b1 */\
  915.         "movd %%mm1, 96+" #dst "        \n\t"\
  916.         "packssdw %%mm4, %%mm4          \n\t" /* A0-B0  a0-b0 */\
  917.         "movd %%mm4, 112+" #dst "       \n\t"\
  918.         "movq 80(%2), %%mm4             \n\t" /* -C1    C5      -C1     C5 */\
  919.         "pmaddwd %%mm2, %%mm4           \n\t" /* -C1R3+C5R1     -C1r3+C5r1 */\
  920.         "pmaddwd 96(%2), %%mm2          \n\t" /* -C5R3+C7R1     -C5r3+C7r1 */\
  921.         "movq %%mm5, %%mm1              \n\t" /* A2             a2 */\
  922.         "paddd %%mm4, %%mm1             \n\t" /* A2+B2          a2+b2 */\
  923.         "psubd %%mm4, %%mm5             \n\t" /* a2-B2          a2-b2 */\
  924.         "psrad $" #shift ", %%mm1       \n\t"\
  925.         "psrad $" #shift ", %%mm5       \n\t"\
  926.         "movq %%mm6, %%mm4              \n\t" /* A3             a3 */\
  927.         "paddd %%mm2, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  928.         "psubd %%mm2, %%mm4             \n\t" /* a3-B3          a3-b3 */\
  929.         "psrad $" #shift ", %%mm6       \n\t"\
  930.         "psrad $" #shift ", %%mm4       \n\t"\
  931.         "packssdw %%mm1, %%mm1          \n\t" /* A2+B2  a2+b2 */\
  932.         "packssdw %%mm6, %%mm6          \n\t" /* A3+B3  a3+b3 */\
  933.         "movd %%mm1, 32+" #dst "        \n\t"\
  934.         "packssdw %%mm4, %%mm4          \n\t" /* A3-B3  a3-b3 */\
  935.         "packssdw %%mm5, %%mm5          \n\t" /* A2-B2  a2-b2 */\
  936.         "movd %%mm6, 48+" #dst "        \n\t"\
  937.         "movd %%mm4, 64+" #dst "        \n\t"\
  938.         "movd %%mm5, 80+" #dst "        \n\t"
  939.  
  940.  
  941. //IDCT(  src0,   src4,   src1,    src5,    dst, shift)
  942. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0), 20)
  943. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0), 20)
  944. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0), 20)
  945. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0), 20)
  946.         "jmp 9f                         \n\t"
  947.  
  948.         "# .p2align 4                   \n\t"\
  949.         "5:                             \n\t"
  950. #undef IDCT
  951. #define IDCT(src0, src4, src1, src5, dst, shift) \
  952.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  953.         "movq " #src4 ", %%mm1          \n\t" /* R6     R2      r6      r2 */\
  954.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  955.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  956.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  957.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  958.         "movq 32(%2), %%mm5             \n\t" /* C6     C2      C6      C2 */\
  959.         "pmaddwd %%mm1, %%mm5           \n\t" /* C6R6+C2R2      C6r6+C2r2 */\
  960.         "movq 40(%2), %%mm6             \n\t" /* -C2    C6      -C2     C6 */\
  961.         "pmaddwd %%mm6, %%mm1           \n\t" /* -C2R6+C6R2     -C2r6+C6r2 */\
  962.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  963.         "paddd %%mm5, %%mm4             \n\t" /* A0             a0 */\
  964.         "psubd %%mm5, %%mm6             \n\t" /* A3             a3 */\
  965.         "movq %%mm0, %%mm5              \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  966.         "paddd %%mm1, %%mm0             \n\t" /* A1             a1 */\
  967.         "psubd %%mm1, %%mm5             \n\t" /* A2             a2 */\
  968.         "movq 8+" #src0 ", %%mm2        \n\t" /* R4     R0      r4      r0 */\
  969.         "movq 8+" #src4 ", %%mm3        \n\t" /* R6     R2      r6      r2 */\
  970.         "movq 16(%2), %%mm1             \n\t" /* C4     C4      C4      C4 */\
  971.         "pmaddwd %%mm2, %%mm1           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  972.         "movq 24(%2), %%mm7             \n\t" /* -C4    C4      -C4     C4 */\
  973.         "pmaddwd %%mm7, %%mm2           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  974.         "movq 32(%2), %%mm7             \n\t" /* C6     C2      C6      C2 */\
  975.         "pmaddwd %%mm3, %%mm7           \n\t" /* C6R6+C2R2      C6r6+C2r2 */\
  976.         "pmaddwd 40(%2), %%mm3          \n\t" /* -C2R6+C6R2     -C2r6+C6r2 */\
  977.         "paddd %%mm1, %%mm7             \n\t" /* A0             a0 */\
  978.         "paddd %%mm1, %%mm1             \n\t" /* 2C0            2c0 */\
  979.         "psubd %%mm7, %%mm1             \n\t" /* A3             a3 */\
  980.         "paddd %%mm2, %%mm3             \n\t" /* A1             a1 */\
  981.         "paddd %%mm2, %%mm2             \n\t" /* 2C1            2c1 */\
  982.         "psubd %%mm3, %%mm2             \n\t" /* A2             a2 */\
  983.         "psrad $" #shift ", %%mm4       \n\t"\
  984.         "psrad $" #shift ", %%mm7       \n\t"\
  985.         "psrad $" #shift ", %%mm3       \n\t"\
  986.         "packssdw %%mm7, %%mm4          \n\t" /* A0     a0 */\
  987.         "movq %%mm4, " #dst "           \n\t"\
  988.         "psrad $" #shift ", %%mm0       \n\t"\
  989.         "packssdw %%mm3, %%mm0          \n\t" /* A1     a1 */\
  990.         "movq %%mm0, 16+" #dst "        \n\t"\
  991.         "movq %%mm0, 96+" #dst "        \n\t"\
  992.         "movq %%mm4, 112+" #dst "       \n\t"\
  993.         "psrad $" #shift ", %%mm5       \n\t"\
  994.         "psrad $" #shift ", %%mm6       \n\t"\
  995.         "psrad $" #shift ", %%mm2       \n\t"\
  996.         "packssdw %%mm2, %%mm5          \n\t" /* A2-B2  a2-b2 */\
  997.         "movq %%mm5, 32+" #dst "        \n\t"\
  998.         "psrad $" #shift ", %%mm1       \n\t"\
  999.         "packssdw %%mm1, %%mm6          \n\t" /* A3+B3  a3+b3 */\
  1000.         "movq %%mm6, 48+" #dst "        \n\t"\
  1001.         "movq %%mm6, 64+" #dst "        \n\t"\
  1002.         "movq %%mm5, 80+" #dst "        \n\t"
  1003.  
  1004.  
  1005. //IDCT(  src0,   src4,   src1,    src5,    dst, shift)
  1006. IDCT(    0(%1), 64(%1), 32(%1),  96(%1),  0(%0), 20)
  1007. //IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0), 20)
  1008. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0), 20)
  1009. //IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0), 20)
  1010.         "jmp 9f                         \n\t"
  1011.  
  1012.  
  1013.         "# .p2align 4                   \n\t"\
  1014.         "1:                             \n\t"
  1015. #undef IDCT
  1016. #define IDCT(src0, src4, src1, src5, dst, shift) \
  1017.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  1018.         "movq " #src4 ", %%mm1          \n\t" /* R6     R2      r6      r2 */\
  1019.         "movq " #src1 ", %%mm2          \n\t" /* R3     R1      r3      r1 */\
  1020.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  1021.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  1022.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  1023.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  1024.         "movq 32(%2), %%mm5             \n\t" /* C6     C2      C6      C2 */\
  1025.         "pmaddwd %%mm1, %%mm5           \n\t" /* C6R6+C2R2      C6r6+C2r2 */\
  1026.         "movq 40(%2), %%mm6             \n\t" /* -C2    C6      -C2     C6 */\
  1027.         "pmaddwd %%mm6, %%mm1           \n\t" /* -C2R6+C6R2     -C2r6+C6r2 */\
  1028.         "movq %%mm4, %%mm6              \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  1029.         "movq 48(%2), %%mm7             \n\t" /* C3     C1      C3      C1 */\
  1030.         "pmaddwd %%mm2, %%mm7           \n\t" /* C3R3+C1R1      C3r3+C1r1 */\
  1031.         "paddd %%mm5, %%mm4             \n\t" /* A0             a0 */\
  1032.         "psubd %%mm5, %%mm6             \n\t" /* A3             a3 */\
  1033.         "movq %%mm0, %%mm5              \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  1034.         "paddd %%mm1, %%mm0             \n\t" /* A1             a1 */\
  1035.         "psubd %%mm1, %%mm5             \n\t" /* A2             a2 */\
  1036.         "movq 64(%2), %%mm1             \n\t"\
  1037.         "pmaddwd %%mm2, %%mm1           \n\t" /* -C7R3+C3R1     -C7r3+C3r1 */\
  1038.         "paddd %%mm4, %%mm7             \n\t" /* A0+B0          a0+b0 */\
  1039.         "paddd %%mm4, %%mm4             \n\t" /* 2A0            2a0 */\
  1040.         "psubd %%mm7, %%mm4             \n\t" /* A0-B0          a0-b0 */\
  1041.         "psrad $" #shift ", %%mm7       \n\t"\
  1042.         "psrad $" #shift ", %%mm4       \n\t"\
  1043.         "movq %%mm0, %%mm3              \n\t" /* A1             a1 */\
  1044.         "paddd %%mm1, %%mm0             \n\t" /* A1+B1          a1+b1 */\
  1045.         "psubd %%mm1, %%mm3             \n\t" /* A1-B1          a1-b1 */\
  1046.         "psrad $" #shift ", %%mm0       \n\t"\
  1047.         "psrad $" #shift ", %%mm3       \n\t"\
  1048.         "packssdw %%mm7, %%mm7          \n\t" /* A0+B0  a0+b0 */\
  1049.         "movd %%mm7, " #dst "           \n\t"\
  1050.         "packssdw %%mm0, %%mm0          \n\t" /* A1+B1  a1+b1 */\
  1051.         "movd %%mm0, 16+" #dst "        \n\t"\
  1052.         "packssdw %%mm3, %%mm3          \n\t" /* A1-B1  a1-b1 */\
  1053.         "movd %%mm3, 96+" #dst "        \n\t"\
  1054.         "packssdw %%mm4, %%mm4          \n\t" /* A0-B0  a0-b0 */\
  1055.         "movd %%mm4, 112+" #dst "       \n\t"\
  1056.         "movq 80(%2), %%mm4             \n\t" /* -C1    C5      -C1     C5 */\
  1057.         "pmaddwd %%mm2, %%mm4           \n\t" /* -C1R3+C5R1     -C1r3+C5r1 */\
  1058.         "pmaddwd 96(%2), %%mm2          \n\t" /* -C5R3+C7R1     -C5r3+C7r1 */\
  1059.         "movq %%mm5, %%mm3              \n\t" /* A2             a2 */\
  1060.         "paddd %%mm4, %%mm3             \n\t" /* A2+B2          a2+b2 */\
  1061.         "psubd %%mm4, %%mm5             \n\t" /* a2-B2          a2-b2 */\
  1062.         "psrad $" #shift ", %%mm3       \n\t"\
  1063.         "psrad $" #shift ", %%mm5       \n\t"\
  1064.         "movq %%mm6, %%mm4              \n\t" /* A3             a3 */\
  1065.         "paddd %%mm2, %%mm6             \n\t" /* A3+B3          a3+b3 */\
  1066.         "psubd %%mm2, %%mm4             \n\t" /* a3-B3          a3-b3 */\
  1067.         "psrad $" #shift ", %%mm6       \n\t"\
  1068.         "packssdw %%mm3, %%mm3          \n\t" /* A2+B2  a2+b2 */\
  1069.         "movd %%mm3, 32+" #dst "        \n\t"\
  1070.         "psrad $" #shift ", %%mm4       \n\t"\
  1071.         "packssdw %%mm6, %%mm6          \n\t" /* A3+B3  a3+b3 */\
  1072.         "movd %%mm6, 48+" #dst "        \n\t"\
  1073.         "packssdw %%mm4, %%mm4          \n\t" /* A3-B3  a3-b3 */\
  1074.         "packssdw %%mm5, %%mm5          \n\t" /* A2-B2  a2-b2 */\
  1075.         "movd %%mm4, 64+" #dst "        \n\t"\
  1076.         "movd %%mm5, 80+" #dst "        \n\t"
  1077.  
  1078.  
  1079. //IDCT(  src0,   src4,   src1,    src5,    dst, shift)
  1080. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0), 20)
  1081. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0), 20)
  1082. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0), 20)
  1083. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0), 20)
  1084.         "jmp 9f                         \n\t"
  1085.  
  1086.  
  1087.         "# .p2align 4                   \n\t"
  1088.         "7:                             \n\t"
  1089. #undef IDCT
  1090. #define IDCT(src0, src4, src1, src5, dst, shift) \
  1091.         "movq " #src0 ", %%mm0          \n\t" /* R4     R0      r4      r0 */\
  1092.         "movq 16(%2), %%mm4             \n\t" /* C4     C4      C4      C4 */\
  1093.         "pmaddwd %%mm0, %%mm4           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  1094.         "movq 24(%2), %%mm5             \n\t" /* -C4    C4      -C4     C4 */\
  1095.         "pmaddwd %%mm5, %%mm0           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  1096.         "psrad $" #shift ", %%mm4       \n\t"\
  1097.         "psrad $" #shift ", %%mm0       \n\t"\
  1098.         "movq 8+" #src0 ", %%mm2        \n\t" /* R4     R0      r4      r0 */\
  1099.         "movq 16(%2), %%mm1             \n\t" /* C4     C4      C4      C4 */\
  1100.         "pmaddwd %%mm2, %%mm1           \n\t" /* C4R4+C4R0      C4r4+C4r0 */\
  1101.         "movq 24(%2), %%mm7             \n\t" /* -C4    C4      -C4     C4 */\
  1102.         "pmaddwd %%mm7, %%mm2           \n\t" /* -C4R4+C4R0     -C4r4+C4r0 */\
  1103.         "movq 32(%2), %%mm7             \n\t" /* C6     C2      C6      C2 */\
  1104.         "psrad $" #shift ", %%mm1       \n\t"\
  1105.         "packssdw %%mm1, %%mm4          \n\t" /* A0     a0 */\
  1106.         "movq %%mm4, " #dst "           \n\t"\
  1107.         "psrad $" #shift ", %%mm2       \n\t"\
  1108.         "packssdw %%mm2, %%mm0          \n\t" /* A1     a1 */\
  1109.         "movq %%mm0, 16+" #dst "        \n\t"\
  1110.         "movq %%mm0, 96+" #dst "        \n\t"\
  1111.         "movq %%mm4, 112+" #dst "       \n\t"\
  1112.         "movq %%mm0, 32+" #dst "        \n\t"\
  1113.         "movq %%mm4, 48+" #dst "        \n\t"\
  1114.         "movq %%mm4, 64+" #dst "        \n\t"\
  1115.         "movq %%mm0, 80+" #dst "        \n\t"
  1116.  
  1117. //IDCT(  src0,   src4,   src1,    src5,    dst, shift)
  1118. IDCT(   0(%1), 64(%1), 32(%1),  96(%1),  0(%0), 20)
  1119. //IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0), 20)
  1120. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0), 20)
  1121. //IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0), 20)
  1122.  
  1123.  
  1124. #endif
  1125.  
  1126. /*
  1127. Input
  1128.  00 40 04 44 20 60 24 64
  1129.  10 30 14 34 50 70 54 74
  1130.  01 41 03 43 21 61 23 63
  1131.  11 31 13 33 51 71 53 73
  1132.  02 42 06 46 22 62 26 66
  1133.  12 32 16 36 52 72 56 76
  1134.  05 45 07 47 25 65 27 67
  1135.  15 35 17 37 55 75 57 77
  1136.  
  1137. Temp
  1138.  00 04 10 14 20 24 30 34
  1139.  40 44 50 54 60 64 70 74
  1140.  01 03 11 13 21 23 31 33
  1141.  41 43 51 53 61 63 71 73
  1142.  02 06 12 16 22 26 32 36
  1143.  42 46 52 56 62 66 72 76
  1144.  05 07 15 17 25 27 35 37
  1145.  45 47 55 57 65 67 75 77
  1146. */
  1147.  
  1148. "9: \n\t"
  1149.                 :: "r" (block), "r" (temp), "r" (coeffs)
  1150.                    NAMED_CONSTRAINTS_ADD(wm1010,d40000)
  1151.                 : "%eax"
  1152.         );
  1153. }
  1154.  
  1155. void ff_simple_idct_mmx(int16_t *block)
  1156. {
  1157.     idct(block);
  1158. }
  1159.  
  1160. //FIXME merge add/put into the idct
  1161.  
  1162. void ff_simple_idct_put_mmx(uint8_t *dest, int line_size, int16_t *block)
  1163. {
  1164.     idct(block);
  1165.     ff_put_pixels_clamped(block, dest, line_size);
  1166. }
  1167. void ff_simple_idct_add_mmx(uint8_t *dest, int line_size, int16_t *block)
  1168. {
  1169.     idct(block);
  1170.     ff_add_pixels_clamped(block, dest, line_size);
  1171. }
  1172.  
  1173. #endif /* HAVE_INLINE_ASM */
  1174.