[cvs] / xvidcore / src / quant / x86_asm / quantize_mpeg_mmx.asm Repository:
ViewVC logotype

Diff of /xvidcore/src/quant/x86_asm/quantize_mpeg_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1.2.1, Tue Oct 7 13:02:35 2003 UTC revision 1.1.2.3, Tue Oct 28 22:23:03 2003 UTC
# Line 1  Line 1 
1  ;/******************************************************************************  ;/**************************************************************************
2  ; *                                                                            *  ; *
3  ; *  This file is part of XviD, a free MPEG-4 video encoder/decoder            *  ; *  XVID MPEG-4 VIDEO CODEC
4  ; *                                                                            *  ; *  - 3dne Quantization/Dequantization -
5  ; *  XviD is an implementation of a part of one or more MPEG-4 Video tools     *  ; *
6  ; *  as specified in ISO/IEC 14496-2 standard.  Those intending to use this    *  ; *  Copyright (C) 2002-2003 Peter Ross <pross@xvid.org>
7  ; *  software module in hardware or software products are advised that its     *  ; *                2002-2003 Michael Militzer <isibaar@xvid.org>
8  ; *  use may infringe existing patents or copyrights, and any such use         *  ; *                2002-2003 Pascal Massimino <skal@planet-d.net>
9  ; *  would be at such party's own risk.  The original developer of this        *  ; *
10  ; *  software module and his/her company, and subsequent editors and their     *  ; *  This program is free software ; you can redistribute it and/or modify
11  ; *  companies, will have no liability for use of this software or             *  ; *  it under the terms of the GNU General Public License as published by
12  ; *  modifications or derivatives thereof.                                     *  ; *  the Free Software Foundation ; either version 2 of the License, or
13  ; *                                                                            *  ; *  (at your option) any later version.
14  ; *  XviD is free software; you can redistribute it and/or modify it           *  ; *
15  ; *  under the terms of the GNU General Public License as published by         *  ; *  This program is distributed in the hope that it will be useful,
16  ; *  the Free Software Foundation; either version 2 of the License, or         *  ; *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
17  ; *  (at your option) any later version.                                       *  ; *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  ; *                                                                            *  ; *  GNU General Public License for more details.
19  ; *  XviD is distributed in the hope that it will be useful, but               *  ; *
20  ; *  WITHOUT ANY WARRANTY; without even the implied warranty of                *  ; *  You should have received a copy of the GNU General Public License
21  ; *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *  ; *  along with this program ; if not, write to the Free Software
22  ; *  GNU General Public License for more details.                              *  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  ; *                                                                            *  ; *
24  ; *  You should have received a copy of the GNU General Public License         *  ; * $Id$
25  ; *  along with this program; if not, write to the Free Software               *  ; *
26  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  *  ; *************************************************************************/
 ; *                                                                            *  
 ; ******************************************************************************/  
 ;  
 ;/******************************************************************************  
 ; *                                                                            *  
 ; *  quantize4.asm, MMX optimized MPEG quantization/dequantization             *  
 ; *                                                                            *  
 ; *  Copyright (C) 2002 - Peter Ross <pross@cs.rmit.edu.au>                    *  
 ; *  Copyright (C) 2002 - Michael Militzer <isibaar@xvid.org>                  *  
 ; *                                                                            *  
 ; *  For more information visit the XviD homepage: http://www.xvid.org         *  
 ; *                                                                            *  
 ; ******************************************************************************/  
 ;  
 ;/******************************************************************************  
 ; *                                                                            *  
 ; *  Revision history:                                                         *  
 ; *                                                                            *  
 ; *  14.06.2002  mmx dequant4_* funcs revamped  -Skal-                         *  
 ; *  22.01.2002 initial version                                                *  
 ; *                                                                            *  
 ; ******************************************************************************/  
   
 ; data/text alignment  
 %define ALIGN 8  
27    
28  %define SATURATE  %define SATURATE
29    
30  bits 32  BITS 32
   
 %ifdef FORMAT_COFF  
 SECTION .data data  
 %else  
 SECTION .data data align=8  
 %endif  
   
31    
32  %macro cglobal 1  %macro cglobal 1
33          %ifdef PREFIX          %ifdef PREFIX
# Line 79  Line 47 
47          %endif          %endif
48  %endmacro  %endmacro
49    
50  mmx_one times 4 dw       1  ;=============================================================================
51    ; Local data (Read Only)
52    ;=============================================================================
53    
54  ;===========================================================================  SECTION .rodata
 ;  
 ; divide by 2Q table  
 ;  
 ;===========================================================================  
55    
56  %macro MMX_DIV  1  mmx_one:
57  times 4 dw  (1 << 17) / (%1 * 2) + 1          times 4 dw       1
 %endmacro  
58    
59  align ALIGN  ;-----------------------------------------------------------------------------
60  mmx_div  ; divide by 2Q table
61                  MMX_DIV 1  ;-----------------------------------------------------------------------------
                 MMX_DIV 2  
                 MMX_DIV 3  
                 MMX_DIV 4  
                 MMX_DIV 5  
                 MMX_DIV 6  
                 MMX_DIV 7  
                 MMX_DIV 8  
                 MMX_DIV 9  
                 MMX_DIV 10  
                 MMX_DIV 11  
                 MMX_DIV 12  
                 MMX_DIV 13  
                 MMX_DIV 14  
                 MMX_DIV 15  
                 MMX_DIV 16  
                 MMX_DIV 17  
                 MMX_DIV 18  
                 MMX_DIV 19  
                 MMX_DIV 20  
                 MMX_DIV 21  
                 MMX_DIV 22  
                 MMX_DIV 23  
                 MMX_DIV 24  
                 MMX_DIV 25  
                 MMX_DIV 26  
                 MMX_DIV 27  
                 MMX_DIV 28  
                 MMX_DIV 29  
                 MMX_DIV 30  
                 MMX_DIV 31  
62    
63    ALIGN 16
64    mmx_div:
65            times 4 dw 65535 ; the div by 2 formula will overflow for the case
66                             ; quant=1 but we don't care much because quant=1
67                             ; is handled by a different piece of code that
68                             ; doesn't use this table.
69    %assign quant 2
70    %rep 30
71            times 4 dw  (1<<17) / (quant*2) + 1
72            %assign quant quant+1
73    %endrep
74    
75  ;===========================================================================  ;-----------------------------------------------------------------------------
 ;  
76  ; intra matrix  ; intra matrix
77  ;  ;-----------------------------------------------------------------------------
 ;===========================================================================  
78    
79  cextern intra_matrix  cextern intra_matrix
80  cextern intra_matrix_fix  cextern intra_matrix_fix
81    
82  ;===========================================================================  ;-----------------------------------------------------------------------------
 ;  
83  ; inter matrix  ; inter matrix
84  ;  ;-----------------------------------------------------------------------------
 ;===========================================================================  
85    
86  cextern inter_matrix  cextern inter_matrix
87  cextern inter_matrix_fix  cextern inter_matrix_fix
# Line 149  Line 91 
91  %define VM18Q 4  %define VM18Q 4
92    
93    
94  ;===========================================================================  ;-----------------------------------------------------------------------------
 ;  
95  ; quantd table  ; quantd table
96  ;  ;-----------------------------------------------------------------------------
 ;===========================================================================  
   
 %macro MMX_QUANTD  1  
 times 4 dw ((VM18P*%1) + (VM18Q/2)) / VM18Q  
 %endmacro  
97    
98  quantd  quantd:
99                  MMX_QUANTD 1  %assign quant 1
100                  MMX_QUANTD 2  %rep 31
101                  MMX_QUANTD 3          times 4 dw  ((VM18P*quant) + (VM18Q/2)) / VM18Q
102                  MMX_QUANTD 4          %assign quant quant+1
103                  MMX_QUANTD 5  %endrep
                 MMX_QUANTD 6  
                 MMX_QUANTD 7  
                 MMX_QUANTD 8  
                 MMX_QUANTD 9  
                 MMX_QUANTD 10  
                 MMX_QUANTD 11  
                 MMX_QUANTD 12  
                 MMX_QUANTD 13  
                 MMX_QUANTD 14  
                 MMX_QUANTD 15  
                 MMX_QUANTD 16  
                 MMX_QUANTD 17  
                 MMX_QUANTD 18  
                 MMX_QUANTD 19  
                 MMX_QUANTD 20  
                 MMX_QUANTD 21  
                 MMX_QUANTD 22  
                 MMX_QUANTD 23  
                 MMX_QUANTD 24  
                 MMX_QUANTD 25  
                 MMX_QUANTD 26  
                 MMX_QUANTD 27  
                 MMX_QUANTD 28  
                 MMX_QUANTD 29  
                 MMX_QUANTD 30  
                 MMX_QUANTD 31  
104    
105    ;-----------------------------------------------------------------------------
 ;===========================================================================  
 ;  
106  ; multiple by 2Q table  ; multiple by 2Q table
107  ;  ;-----------------------------------------------------------------------------
 ;===========================================================================  
108    
109  %macro MMX_MUL_QUANT  1  mmx_mul_quant:
110  times 4   dw  %1  %assign quant 1
111  %endmacro  %rep 31
112            times 4 dw  quant
113  mmx_mul_quant          %assign quant quant+1
114          MMX_MUL_QUANT 1  %endrep
         MMX_MUL_QUANT 2  
         MMX_MUL_QUANT 3  
         MMX_MUL_QUANT 4  
         MMX_MUL_QUANT 5  
         MMX_MUL_QUANT 6  
         MMX_MUL_QUANT 7  
         MMX_MUL_QUANT 8  
         MMX_MUL_QUANT 9  
         MMX_MUL_QUANT 10  
         MMX_MUL_QUANT 11  
         MMX_MUL_QUANT 12  
         MMX_MUL_QUANT 13  
         MMX_MUL_QUANT 14  
         MMX_MUL_QUANT 15  
         MMX_MUL_QUANT 16  
         MMX_MUL_QUANT 17  
         MMX_MUL_QUANT 18  
         MMX_MUL_QUANT 19  
         MMX_MUL_QUANT 20  
         MMX_MUL_QUANT 21  
         MMX_MUL_QUANT 22  
         MMX_MUL_QUANT 23  
         MMX_MUL_QUANT 24  
         MMX_MUL_QUANT 25  
         MMX_MUL_QUANT 26  
         MMX_MUL_QUANT 27  
         MMX_MUL_QUANT 28  
         MMX_MUL_QUANT 29  
         MMX_MUL_QUANT 30  
         MMX_MUL_QUANT 31  
115    
116  ;===========================================================================  ;-----------------------------------------------------------------------------
 ;  
117  ; saturation limits  ; saturation limits
118  ;  ;-----------------------------------------------------------------------------
 ;===========================================================================  
119    
120  align 16  ALIGN 16
121    
122  mmx_32767_minus_2047                            times 4 dw (32767-2047)  mmx_32767_minus_2047:
123  mmx_32768_minus_2048                            times 4 dw (32768-2048)          times 4 dw (32767-2047)
124  mmx_2047 times 4 dw 2047  mmx_32768_minus_2048:
125  mmx_minus_2048 times 4 dw (-2048)          times 4 dw (32768-2048)
126  zero times 4 dw 0  mmx_2047:
127            times 4 dw 2047
128    mmx_minus_2048:
129            times 4 dw (-2048)
130    zero:
131            times 4 dw 0
132    
133    ;=============================================================================
134    ; Code
135    ;=============================================================================
136    
137  section .text  SECTION .text
138    
139  ;===========================================================================  cglobal quant_mpeg_intra_mmx
140    cglobal quant_mpeg_inter_mmx
141    cglobal dequant_mpeg_intra_mmx
142    cglobal dequant_mpeg_inter_mmx
143    
144    ;-----------------------------------------------------------------------------
145  ;  ;
146  ; void quant_intra4_mmx(int16_t * coeff,  ; uint32_t quant_mpeg_intra_mmx(int16_t * coeff,
147  ;                                       const int16_t const * data,  ;                                       const int16_t const * data,
148  ;                                       const uint32_t quant,  ;                                       const uint32_t quant,
149  ;                                       const uint32_t dcscalar);  ;                                       const uint32_t dcscalar);
150  ;  ;
151  ;===========================================================================  ;-----------------------------------------------------------------------------
152    
153  align ALIGN  ALIGN 16
 cglobal quant_mpeg_intra_mmx  
154  quant_mpeg_intra_mmx:  quant_mpeg_intra_mmx:
155    
156                  push    ecx                  push    ecx
# Line 284  Line 172 
172    
173                  movq    mm7, [mmx_div + eax * 8 - 8] ; multipliers[quant] -> mm7                  movq    mm7, [mmx_div + eax * 8 - 8] ; multipliers[quant] -> mm7
174    
175  align ALIGN  ALIGN 16
176  .loop  .loop
177                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]
178                  movq    mm3, [esi + 8*ecx + 8]  ;                  movq    mm3, [esi + 8*ecx + 8]  ;
   
179                  pxor    mm1, mm1                ; mm1 = 0                  pxor    mm1, mm1                ; mm1 = 0
180                  pxor    mm4, mm4                  pxor    mm4, mm4
   
181                  pcmpgtw mm1, mm0                ; mm1 = (0 > mm0)                  pcmpgtw mm1, mm0                ; mm1 = (0 > mm0)
182                  pcmpgtw mm4, mm3                  pcmpgtw mm4, mm3
   
183                  pxor    mm0, mm1                ; mm0 = |mm0|                  pxor    mm0, mm1                ; mm0 = |mm0|
184                  pxor    mm3, mm4                ;                  pxor    mm3, mm4                ;
185                  psubw   mm0, mm1                ; displace                  psubw   mm0, mm1                ; displace
186                  psubw   mm3, mm4                ;                  psubw   mm3, mm4                ;
   
187                  psllw   mm0, 4                  ; level << 4                  psllw   mm0, 4                  ; level << 4
188                  psllw   mm3, 4                  ;    psllw mm3, 4
   
189                  movq    mm2, [intra_matrix + 8*ecx]                  movq    mm2, [intra_matrix + 8*ecx]
190                  psrlw   mm2, 1                  ; intra_matrix[i]>>1                  psrlw   mm2, 1                  ; intra_matrix[i]>>1
191                  paddw   mm0, mm2                  paddw   mm0, mm2
   
192                  movq    mm2, [intra_matrix_fix + ecx*8]                  movq    mm2, [intra_matrix_fix + ecx*8]
193                  pmulhw  mm0, mm2                ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]                  pmulhw  mm0, mm2                ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
   
194                  movq    mm2, [intra_matrix + 8*ecx + 8]                  movq    mm2, [intra_matrix + 8*ecx + 8]
195                  psrlw   mm2, 1                  psrlw   mm2, 1
196                  paddw   mm3, mm2                  paddw   mm3, mm2
   
197                  movq    mm2, [intra_matrix_fix + ecx*8 + 8]                  movq    mm2, [intra_matrix_fix + ecx*8 + 8]
198                  pmulhw  mm3, mm2                  pmulhw  mm3, mm2
   
199              paddw   mm0, mm5            ; + quantd              paddw   mm0, mm5            ; + quantd
200                  paddw   mm3, mm5                  paddw   mm3, mm5
   
201                  pmulhw  mm0, mm7                ; mm0 = (mm0 / 2Q) >> 16                  pmulhw  mm0, mm7                ; mm0 = (mm0 / 2Q) >> 16
202                  pmulhw  mm3, mm7                ;                  pmulhw  mm3, mm7                ;
203                  psrlw   mm0, 1                  ; additional shift by 1 => 16 + 1 = 17                  psrlw   mm0, 1                  ; additional shift by 1 => 16 + 1 = 17
204                  psrlw   mm3, 1                  psrlw   mm3, 1
   
205                  pxor    mm0, mm1                ; mm0 *= sign(mm0)                  pxor    mm0, mm1                ; mm0 *= sign(mm0)
206                  pxor    mm3, mm4                ;                  pxor    mm3, mm4                ;
207                  psubw   mm0, mm1                ; undisplace                  psubw   mm0, mm1                ; undisplace
# Line 339  Line 216 
216    
217  .done  .done
218                  ; caclulate  data[0] // (int32_t)dcscalar)                  ; caclulate  data[0] // (int32_t)dcscalar)
   
219                  mov     ecx, [esp + 12 + 16]    ; dcscalar                  mov     ecx, [esp + 12 + 16]    ; dcscalar
220                  mov     edx, ecx                  mov     edx, ecx
221                  movsx   eax, word [esi] ; data[0]                  movsx   eax, word [esi] ; data[0]
# Line 361  Line 237 
237                  pop     esi                  pop     esi
238                  pop     ecx                  pop     ecx
239    
240      xor eax, eax              ; return(0);
241                  ret                  ret
242    
243  align ALIGN  ALIGN 16
244  .q1loop  .q1loop
245                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]
246                  movq    mm3, [esi + 8*ecx + 8]  ;                  movq    mm3, [esi + 8*ecx + 8]  ;
   
247                  pxor    mm1, mm1                ; mm1 = 0                  pxor    mm1, mm1                ; mm1 = 0
248                  pxor    mm4, mm4                ;                  pxor    mm4, mm4                ;
   
249                  pcmpgtw mm1, mm0                ; mm1 = (0 > mm0)                  pcmpgtw mm1, mm0                ; mm1 = (0 > mm0)
250                  pcmpgtw mm4, mm3                ;                  pcmpgtw mm4, mm3                ;
   
251                  pxor    mm0, mm1                ; mm0 = |mm0|                  pxor    mm0, mm1                ; mm0 = |mm0|
252                  pxor    mm3, mm4                ;                  pxor    mm3, mm4                ;
253                  psubw   mm0, mm1                ; displace                  psubw   mm0, mm1                ; displace
254                  psubw   mm3, mm4                ;                  psubw   mm3, mm4                ;
   
255                  psllw   mm0, 4                  psllw   mm0, 4
256                  psllw   mm3, 4                  psllw   mm3, 4
   
257                  movq    mm2, [intra_matrix + 8*ecx]                  movq    mm2, [intra_matrix + 8*ecx]
258                  psrlw   mm2, 1                  psrlw   mm2, 1
259                  paddw   mm0, mm2                  paddw   mm0, mm2
   
260                  movq    mm2, [intra_matrix_fix + ecx*8]                  movq    mm2, [intra_matrix_fix + ecx*8]
261                  pmulhw  mm0, mm2                ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]                  pmulhw  mm0, mm2                ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
   
262                  movq    mm2, [intra_matrix + 8*ecx + 8]                  movq    mm2, [intra_matrix + 8*ecx + 8]
263                  psrlw   mm2, 1                  psrlw   mm2, 1
264                  paddw   mm3, mm2                  paddw   mm3, mm2
   
265                  movq    mm2, [intra_matrix_fix + ecx*8 + 8]                  movq    mm2, [intra_matrix_fix + ecx*8 + 8]
266                  pmulhw  mm3, mm2                  pmulhw  mm3, mm2
   
267          paddw   mm0, mm5          paddw   mm0, mm5
268                  paddw   mm3, mm5                  paddw   mm3, mm5
   
269                  psrlw   mm0, 1                  ; mm0 >>= 1   (/2)                  psrlw   mm0, 1                  ; mm0 >>= 1   (/2)
270                  psrlw   mm3, 1                  ;                  psrlw   mm3, 1                  ;
   
271                  pxor    mm0, mm1                ; mm0 *= sign(mm0)                  pxor    mm0, mm1                ; mm0 *= sign(mm0)
272                  pxor    mm3, mm4        ;                  pxor    mm3, mm4        ;
273                  psubw   mm0, mm1                ; undisplace                  psubw   mm0, mm1                ; undisplace
274                  psubw   mm3, mm4                ;                  psubw   mm3, mm4                ;
   
275                  movq    [edi + 8*ecx], mm0                  movq    [edi + 8*ecx], mm0
276                  movq    [edi + 8*ecx + 8], mm3                  movq    [edi + 8*ecx + 8], mm3
277    
# Line 416  Line 281 
281                  jmp     near .done                  jmp     near .done
282    
283    
284  align ALIGN  ALIGN 16
285  .q2loop  .q2loop
286                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]
287                  movq    mm3, [esi + 8*ecx + 8]  ;                  movq    mm3, [esi + 8*ecx + 8]  ;
   
288                  pxor    mm1, mm1                ; mm1 = 0                  pxor    mm1, mm1                ; mm1 = 0
289                  pxor    mm4, mm4                ;                  pxor    mm4, mm4                ;
   
290                  pcmpgtw mm1, mm0                ; mm1 = (0 > mm0)                  pcmpgtw mm1, mm0                ; mm1 = (0 > mm0)
291                  pcmpgtw mm4, mm3                ;                  pcmpgtw mm4, mm3                ;
   
292                  pxor    mm0, mm1                ; mm0 = |mm0|                  pxor    mm0, mm1                ; mm0 = |mm0|
293                  pxor    mm3, mm4                ;                  pxor    mm3, mm4                ;
294                  psubw   mm0, mm1                ; displace                  psubw   mm0, mm1                ; displace
295                  psubw   mm3, mm4                ;                  psubw   mm3, mm4                ;
   
296                  psllw   mm0, 4                  psllw   mm0, 4
297                  psllw   mm3, 4                  psllw   mm3, 4
   
298                  movq    mm2, [intra_matrix + 8*ecx]                  movq    mm2, [intra_matrix + 8*ecx]
299                  psrlw   mm2, 1                  psrlw   mm2, 1
300                  paddw   mm0, mm2                  paddw   mm0, mm2
   
301                  movq    mm2, [intra_matrix_fix + ecx*8]                  movq    mm2, [intra_matrix_fix + ecx*8]
302                  pmulhw  mm0, mm2                ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]                  pmulhw  mm0, mm2                ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
   
303                  movq    mm2, [intra_matrix + 8*ecx + 8]                  movq    mm2, [intra_matrix + 8*ecx + 8]
304                  psrlw   mm2, 1                  psrlw   mm2, 1
305                  paddw   mm3, mm2                  paddw   mm3, mm2
   
306                  movq    mm2, [intra_matrix_fix + ecx*8 + 8]                  movq    mm2, [intra_matrix_fix + ecx*8 + 8]
307                  pmulhw  mm3, mm2                  pmulhw  mm3, mm2
   
308          paddw   mm0, mm5          paddw   mm0, mm5
309                  paddw   mm3, mm5                  paddw   mm3, mm5
   
310                  psrlw   mm0, 2                  ; mm0 >>= 1   (/4)                  psrlw   mm0, 2                  ; mm0 >>= 1   (/4)
311                  psrlw   mm3, 2                  ;                  psrlw   mm3, 2                  ;
   
312                  pxor    mm0, mm1                ; mm0 *= sign(mm0)                  pxor    mm0, mm1                ; mm0 *= sign(mm0)
313                  pxor    mm3, mm4        ;                  pxor    mm3, mm4        ;
314                  psubw   mm0, mm1                ; undisplace                  psubw   mm0, mm1                ; undisplace
315                  psubw   mm3, mm4                ;                  psubw   mm3, mm4                ;
   
316                  movq    [edi + 8*ecx], mm0                  movq    [edi + 8*ecx], mm0
317                  movq    [edi + 8*ecx + 8], mm3                  movq    [edi + 8*ecx + 8], mm3
318    
# Line 469  Line 322 
322                  jmp     near .done                  jmp     near .done
323    
324    
325  ;===========================================================================  ;-----------------------------------------------------------------------------
326  ;  ;
327  ; uint32_t quant4_inter_mmx(int16_t * coeff,  ; uint32_t quant_mpeg_inter_mmx(int16_t * coeff,
328  ;                                       const int16_t const * data,  ;                                       const int16_t const * data,
329  ;                                       const uint32_t quant);  ;                                       const uint32_t quant);
330  ;  ;
331  ;===========================================================================  ;-----------------------------------------------------------------------------
332    
333  align ALIGN  ALIGN 16
 cglobal quant_mpeg_inter_mmx  
334  quant_mpeg_inter_mmx:  quant_mpeg_inter_mmx:
335    
336                  push    ecx                  push    ecx
# Line 501  Line 353 
353    
354                  movq    mm7, [mmx_div + eax * 8 - 8]    ; divider                  movq    mm7, [mmx_div + eax * 8 - 8]    ; divider
355    
356  align ALIGN  ALIGN 16
357  .loop  .loop
358                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]
359                  movq    mm3, [esi + 8*ecx + 8]  ;                  movq    mm3, [esi + 8*ecx + 8]  ;
# Line 513  Line 365 
365                  pxor    mm3, mm4                ;                  pxor    mm3, mm4                ;
366                  psubw   mm0, mm1                ; displace                  psubw   mm0, mm1                ; displace
367                  psubw   mm3, mm4                ;                  psubw   mm3, mm4                ;
   
368                  psllw   mm0, 4                  psllw   mm0, 4
369                  psllw   mm3, 4                  psllw   mm3, 4
   
370                  movq    mm2, [inter_matrix + 8*ecx]                  movq    mm2, [inter_matrix + 8*ecx]
371                  psrlw   mm2, 1                  psrlw   mm2, 1
372                  paddw   mm0, mm2                  paddw   mm0, mm2
   
373                  movq    mm2, [inter_matrix_fix + ecx*8]                  movq    mm2, [inter_matrix_fix + ecx*8]
374                  pmulhw  mm0, mm2                ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]                  pmulhw  mm0, mm2                ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
   
375                  movq    mm2, [inter_matrix + 8*ecx + 8]                  movq    mm2, [inter_matrix + 8*ecx + 8]
376                  psrlw   mm2, 1                  psrlw   mm2, 1
377                  paddw   mm3, mm2                  paddw   mm3, mm2
   
378                  movq    mm2, [inter_matrix_fix + ecx*8 + 8]                  movq    mm2, [inter_matrix_fix + ecx*8 + 8]
379                  pmulhw  mm3, mm2                  pmulhw  mm3, mm2
   
380                  pmulhw  mm0, mm7                ; mm0 = (mm0 / 2Q) >> 16                  pmulhw  mm0, mm7                ; mm0 = (mm0 / 2Q) >> 16
381                  pmulhw  mm3, mm7                ;                  pmulhw  mm3, mm7                ;
382                  psrlw   mm0, 1                  ; additional shift by 1 => 16 + 1 = 17                  psrlw   mm0, 1                  ; additional shift by 1 => 16 + 1 = 17
383                  psrlw   mm3, 1                  psrlw   mm3, 1
   
384                  paddw   mm5, mm0                ; sum += mm0                  paddw   mm5, mm0                ; sum += mm0
385                  pxor    mm0, mm1                ; mm0 *= sign(mm0)                  pxor    mm0, mm1                ; mm0 *= sign(mm0)
386                  paddw   mm5, mm3                ;                  paddw   mm5, mm3                ;
# Line 562  Line 407 
407    
408                  ret                  ret
409    
410  align ALIGN  ALIGN 16
411  .q1loop  .q1loop
412                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]
413                  movq    mm3, [esi + 8*ecx+ 8]                  movq    mm3, [esi + 8*ecx+ 8]
                                 ;  
414                  pxor    mm1, mm1                ; mm1 = 0                  pxor    mm1, mm1                ; mm1 = 0
415                  pxor    mm4, mm4                ;                  pxor    mm4, mm4                ;
   
416                  pcmpgtw mm1, mm0                ; mm1 = (0 > mm0)                  pcmpgtw mm1, mm0                ; mm1 = (0 > mm0)
417                  pcmpgtw mm4, mm3                ;                  pcmpgtw mm4, mm3                ;
   
418                  pxor    mm0, mm1                ; mm0 = |mm0|                  pxor    mm0, mm1                ; mm0 = |mm0|
419                  pxor    mm3, mm4                ;                  pxor    mm3, mm4                ;
420                  psubw   mm0, mm1                ; displace                  psubw   mm0, mm1                ; displace
421                  psubw   mm3, mm4                ;                  psubw   mm3, mm4                ;
   
422                  psllw   mm0, 4                  psllw   mm0, 4
423                  psllw   mm3, 4                  psllw   mm3, 4
   
424                  movq    mm2, [inter_matrix + 8*ecx]                  movq    mm2, [inter_matrix + 8*ecx]
425                  psrlw   mm2, 1                  psrlw   mm2, 1
426                  paddw   mm0, mm2                  paddw   mm0, mm2
   
427                  movq    mm2, [inter_matrix_fix + ecx*8]                  movq    mm2, [inter_matrix_fix + ecx*8]
428                  pmulhw  mm0, mm2                ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]                  pmulhw  mm0, mm2                ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
   
429                  movq    mm2, [inter_matrix + 8*ecx + 8]                  movq    mm2, [inter_matrix + 8*ecx + 8]
430                  psrlw   mm2, 1                  psrlw   mm2, 1
431                  paddw   mm3, mm2                  paddw   mm3, mm2
   
432                  movq    mm2, [inter_matrix_fix + ecx*8 + 8]                  movq    mm2, [inter_matrix_fix + ecx*8 + 8]
433                  pmulhw  mm3, mm2                  pmulhw  mm3, mm2
   
434                  psrlw   mm0, 1                  ; mm0 >>= 1   (/2)                  psrlw   mm0, 1                  ; mm0 >>= 1   (/2)
435                  psrlw   mm3, 1                  ;                  psrlw   mm3, 1                  ;
   
436                  paddw   mm5, mm0                ; sum += mm0                  paddw   mm5, mm0                ; sum += mm0
437                  pxor    mm0, mm1                ; mm0 *= sign(mm0)                  pxor    mm0, mm1                ; mm0 *= sign(mm0)
438                  paddw   mm5, mm3                ;                  paddw   mm5, mm3                ;
439                  pxor    mm3, mm4                ;                  pxor    mm3, mm4                ;
440                  psubw   mm0, mm1                ; undisplace                  psubw   mm0, mm1                ; undisplace
441                  psubw   mm3, mm4                  psubw   mm3, mm4
   
442                  movq    [edi + 8*ecx], mm0                  movq    [edi + 8*ecx], mm0
443                  movq    [edi + 8*ecx + 8], mm3                  movq    [edi + 8*ecx + 8], mm3
444    
# Line 615  Line 449 
449                  jmp     .done                  jmp     .done
450    
451    
452  align ALIGN  ALIGN 16
453  .q2loop  .q2loop
454                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]                  movq    mm0, [esi + 8*ecx]              ; mm0 = [1st]
455                  movq    mm3, [esi + 8*ecx+ 8]                  movq    mm3, [esi + 8*ecx+ 8]
                                 ;  
456                  pxor    mm1, mm1                ; mm1 = 0                  pxor    mm1, mm1                ; mm1 = 0
457                  pxor    mm4, mm4                ;                  pxor    mm4, mm4                ;
   
458                  pcmpgtw mm1, mm0                ; mm1 = (0 > mm0)                  pcmpgtw mm1, mm0                ; mm1 = (0 > mm0)
459                  pcmpgtw mm4, mm3                ;                  pcmpgtw mm4, mm3                ;
   
460                  pxor    mm0, mm1                ; mm0 = |mm0|                  pxor    mm0, mm1                ; mm0 = |mm0|
461                  pxor    mm3, mm4                ;                  pxor    mm3, mm4                ;
462                  psubw   mm0, mm1                ; displace                  psubw   mm0, mm1                ; displace
463                  psubw   mm3, mm4                ;                  psubw   mm3, mm4                ;
   
464                  psllw   mm0, 4                  psllw   mm0, 4
465                  psllw   mm3, 4                  psllw   mm3, 4
   
466                  movq    mm2, [inter_matrix + 8*ecx]                  movq    mm2, [inter_matrix + 8*ecx]
467                  psrlw   mm2, 1                  psrlw   mm2, 1
468                  paddw   mm0, mm2                  paddw   mm0, mm2
   
469                  movq    mm2, [inter_matrix_fix + ecx*8]                  movq    mm2, [inter_matrix_fix + ecx*8]
470                  pmulhw  mm0, mm2                ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]                  pmulhw  mm0, mm2                ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
   
471                  movq    mm2, [inter_matrix + 8*ecx + 8]                  movq    mm2, [inter_matrix + 8*ecx + 8]
472                  psrlw   mm2, 1                  psrlw   mm2, 1
473                  paddw   mm3, mm2                  paddw   mm3, mm2
   
474                  movq    mm2, [inter_matrix_fix + ecx*8 + 8]                  movq    mm2, [inter_matrix_fix + ecx*8 + 8]
475                  pmulhw  mm3, mm2                  pmulhw  mm3, mm2
   
476                  psrlw   mm0, 2                  ; mm0 >>= 1   (/2)                  psrlw   mm0, 2                  ; mm0 >>= 1   (/2)
477                  psrlw   mm3, 2                  ;                  psrlw   mm3, 2                  ;
   
478                  paddw   mm5, mm0                ; sum += mm0                  paddw   mm5, mm0                ; sum += mm0
479                  pxor    mm0, mm1                ; mm0 *= sign(mm0)                  pxor    mm0, mm1                ; mm0 *= sign(mm0)
480                  paddw   mm5, mm3                ;                  paddw   mm5, mm3                ;
481                  pxor    mm3, mm4                ;                  pxor    mm3, mm4                ;
482                  psubw   mm0, mm1                ; undisplace                  psubw   mm0, mm1                ; undisplace
483                  psubw   mm3, mm4                  psubw   mm3, mm4
   
484                  movq    [edi + 8*ecx], mm0                  movq    [edi + 8*ecx], mm0
485                  movq    [edi + 8*ecx + 8], mm3                  movq    [edi + 8*ecx + 8], mm3
486    
# Line 668  Line 491 
491                  jmp     .done                  jmp     .done
492    
493    
494  ;===========================================================================  ;-----------------------------------------------------------------------------
495  ;  ;
496  ; void dequant4_intra_mmx(int16_t *data,  ; uint32_t dequant_mpeg_intra_mmx(int16_t *data,
497  ;                    const int16_t const *coeff,  ;                    const int16_t const *coeff,
498  ;                    const uint32_t quant,  ;                    const uint32_t quant,
499  ;                    const uint32_t dcscalar);  ;                    const uint32_t dcscalar);
500  ;  ;
501  ;===========================================================================  ;-----------------------------------------------------------------------------
502    
503    ;   Note: in order to saturate 'easily', we pre-shift the quantifier    ;   Note: in order to saturate 'easily', we pre-shift the quantifier
504    ; by 4. Then, the high-word of (coeff[]*matrix[i]*quant) are used to    ; by 4. Then, the high-word of (coeff[]*matrix[i]*quant) are used to
# Line 716  Line 539 
539    
540    ;********************************************************************    ;********************************************************************
541    
542  align 16  ALIGN 16
 cglobal dequant_mpeg_intra_mmx  
543  dequant_mpeg_intra_mmx:  dequant_mpeg_intra_mmx:
544    
545    mov edx, [esp+4]  ; data    mov edx, [esp+4]  ; data
# Line 725  Line 547 
547    mov eax, [esp+12] ; quant    mov eax, [esp+12] ; quant
548    
549    movq mm7, [mmx_mul_quant  + eax*8 - 8]    movq mm7, [mmx_mul_quant  + eax*8 - 8]
550    mov eax, -16   ; to keep aligned, we regularly process coeff[0]    mov eax, -16      ; to keep ALIGNed, we regularly process coeff[0]
551    psllw mm7, 2   ; << 2. See comment.    psllw mm7, 2   ; << 2. See comment.
552    pxor mm6, mm6   ; this is a NOP    pxor mm6, mm6   ; this is a NOP
553    
554  align 16  ALIGN 16
555  .loop  .loop
556    movq mm0, [ecx+8*eax + 8*16]   ; mm0 = c  = coeff[i]    movq mm0, [ecx+8*eax + 8*16]   ; mm0 = c  = coeff[i]
557    movq mm3, [ecx+8*eax + 8*16 +8]; mm3 = c' = coeff[i+1]    movq mm3, [ecx+8*eax + 8*16 +8]; mm3 = c' = coeff[i+1]
# Line 786  Line 608 
608    jnz near .loop    jnz near .loop
609    
610      ; deal with DC      ; deal with DC
   
611    movd mm0, [ecx]    movd mm0, [ecx]
612    pmullw mm0, [esp+16]  ; dcscalar    pmullw mm0, [esp+16]  ; dcscalar
613    movq mm2, [mmx_32767_minus_2047]    movq mm2, [mmx_32767_minus_2047]
# Line 798  Line 619 
619    movd eax, mm0    movd eax, mm0
620    mov [edx], ax    mov [edx], ax
621    
622      xor eax, eax
623    ret    ret
624    
625  ;===========================================================================  ;-----------------------------------------------------------------------------
626  ;  ;
627  ; void dequant4_inter_mmx(int16_t * data,  ; uint32_t dequant_mpeg_inter_mmx(int16_t * data,
628  ;                    const int16_t * const coeff,  ;                    const int16_t * const coeff,
629  ;                    const uint32_t quant);  ;                    const uint32_t quant);
630  ;  ;
631  ;===========================================================================  ;-----------------------------------------------------------------------------
632    
633      ; Note:  We use (2*c + sgn(c) - sgn(-c)) as multiplier      ; Note:  We use (2*c + sgn(c) - sgn(-c)) as multiplier
634      ; so we handle the 3 cases: c<0, c==0, and c>0 in one shot.      ; so we handle the 3 cases: c<0, c==0, and c>0 in one shot.
635      ; sgn(x) is the result of 'pcmpgtw 0,x':  0 if x>=0, -1 if x<0.      ; sgn(x) is the result of 'pcmpgtw 0,x':  0 if x>=0, -1 if x<0.
636      ; It's mixed with the extraction of the absolute value.      ; It's mixed with the extraction of the absolute value.
637    
638  align 16  ALIGN 16
 cglobal dequant_mpeg_inter_mmx  
639  dequant_mpeg_inter_mmx:  dequant_mpeg_inter_mmx:
640    
641    mov    edx, [esp+ 4]        ; data    mov    edx, [esp+ 4]        ; data
# Line 825  Line 646 
646    paddw mm7, mm7    ; << 1    paddw mm7, mm7    ; << 1
647    pxor mm6, mm6 ; mismatch sum    pxor mm6, mm6 ; mismatch sum
648    
649  align 16  ALIGN 16
650  .loop  .loop
651    movq mm0, [ecx+8*eax + 8*16   ]   ; mm0 = coeff[i]    movq mm0, [ecx+8*eax + 8*16   ]   ; mm0 = coeff[i]
652    movq mm2, [ecx+8*eax + 8*16 +8]   ; mm2 = coeff[i+1]    movq mm2, [ecx+8*eax + 8*16 +8]   ; mm2 = coeff[i+1]
# Line 903  Line 724 
724    xor eax, 1    xor eax, 1
725    xor word [edx + 2*63], ax    xor word [edx + 2*63], ax
726    
727      xor eax, eax
728    ret    ret
   

Legend:
Removed from v.1.1.2.1  
changed lines
  Added in v.1.1.2.3

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