[svn] / branches / dev-api-4 / xvidcore / src / dct / x86_asm / simple_idct_mmx.asm Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/dct/x86_asm/simple_idct_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1198 - (view) (download)

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

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4