~ubuntu-branches/ubuntu/trusty/gst-libav1.0/trusty-proposed

« back to all changes in this revision

Viewing changes to gst-libs/ext/libav/libavcodec/x86/simple_idct_mmx.c

  • Committer: Package Import Robot
  • Author(s): Sebastian Dröge
  • Date: 2013-09-24 17:07:00 UTC
  • mfrom: (1.1.17) (7.1.9 experimental)
  • Revision ID: package-import@ubuntu.com-20130924170700-4dg62s3pwl0pdakz
Tags: 1.2.0-1
* New upstream stable release:
  + debian/control:
    - Build depend on GStreamer and gst-plugins-base >= 1.2.0.

Show diffs side-by-side

added added

removed removed

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