[cvs] / xvidcore / src / dct / x86_asm / simple_idct_mmx.asm Repository:
ViewVC logotype

Annotation of /xvidcore/src/dct/x86_asm/simple_idct_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6 - (view) (download)

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

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