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

Diff of /branches/dev-api-4/xvidcore/src/quant/x86_asm/quantize_mpeg_mmx.asm

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

revision 1191, Mon Oct 27 01:03:43 2003 UTC revision 1192, Tue Oct 28 22:23:03 2003 UTC
# Line 21  Line 21 
21  ; *  along with this program ; if not, write to the Free Software  ; *  along with this program ; if not, write to the Free Software
22  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  ; *  ; *
24  ; * $Id: quantize_mpeg_mmx.asm,v 1.1.2.2 2003-10-09 18:50:22 edgomez Exp $  ; * $Id: quantize_mpeg_mmx.asm,v 1.1.2.3 2003-10-28 22:23:03 edgomez Exp $
25  ; *  ; *
26  ; *************************************************************************/  ; *************************************************************************/
27    
 ; data/text alignment  
 %define ALIGN 8  
   
28  %define SATURATE  %define SATURATE
29    
30  bits 32  BITS 32
31    
32  %macro cglobal 1  %macro cglobal 1
33          %ifdef PREFIX          %ifdef PREFIX
# Line 50  Line 47 
47          %endif          %endif
48  %endmacro  %endmacro
49    
50  ;***************************************************************************  ;=============================================================================
51  ; Local data  ; Local data (Read Only)
52  ;***************************************************************************  ;=============================================================================
53    
54  %ifdef FORMAT_COFF  SECTION .rodata
 SECTION .data data  
 %else  
 SECTION .data data align=8  
 %endif  
55    
56  mmx_one:  mmx_one:
57          times 4 dw       1          times 4 dw       1
58    
59  ;===========================================================================  ;-----------------------------------------------------------------------------
 ;  
60  ; divide by 2Q table  ; divide by 2Q table
61  ;  ;-----------------------------------------------------------------------------
 ;===========================================================================  
62    
63  align 16  ALIGN 16
64  mmx_div:  mmx_div:
65  %assign quant 1          times 4 dw 65535 ; the div by 2 formula will overflow for the case
66  %rep 31                           ; 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          times 4 dw  (1<<17) / (quant*2) + 1
72          %assign quant quant+1          %assign quant quant+1
73  %endrep  %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 100  Line 91 
91  %define VM18Q 4  %define VM18Q 4
92    
93    
94  ;===========================================================================  ;-----------------------------------------------------------------------------
 ;  
95  ; quantd table  ; quantd table
96  ;  ;-----------------------------------------------------------------------------
 ;===========================================================================  
97    
98  quantd:  quantd:
99  %assign quant 1  %assign quant 1
# Line 113  Line 102 
102          %assign quant quant+1          %assign quant quant+1
103  %endrep  %endrep
104    
105  ;===========================================================================  ;-----------------------------------------------------------------------------
 ;  
106  ; multiple by 2Q table  ; multiple by 2Q table
107  ;  ;-----------------------------------------------------------------------------
 ;===========================================================================  
108    
109  mmx_mul_quant:  mmx_mul_quant:
110  %assign quant 1  %assign quant 1
# Line 126  Line 113 
113          %assign quant quant+1          %assign quant quant+1
114  %endrep  %endrep
115    
116  ;===========================================================================  ;-----------------------------------------------------------------------------
 ;  
117  ; saturation limits  ; saturation limits
118  ;  ;-----------------------------------------------------------------------------
 ;===========================================================================  
119    
120  align 16  ALIGN 16
121    
122  mmx_32767_minus_2047:  mmx_32767_minus_2047:
123          times 4 dw (32767-2047)          times 4 dw (32767-2047)
# Line 145  Line 130 
130  zero:  zero:
131          times 4 dw 0          times 4 dw 0
132    
133  ;***************************************************************************  ;=============================================================================
134  ; Local data  ; 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  ; uint32_t quant_mpeg_intra_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 183  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 237  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 262  Line 240 
240          xor eax, eax                            ; return(0);          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 315  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 368  Line 322 
322          jmp             near .done          jmp             near .done
323    
324    
325  ;===========================================================================  ;-----------------------------------------------------------------------------
326  ;  ;
327  ; uint32_t quant_mpeg_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 400  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 412  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 461  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 514  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 567  Line 491 
491          jmp     .done          jmp     .done
492    
493    
494  ;===========================================================================  ;-----------------------------------------------------------------------------
495  ;  ;
496  ; uint32_t dequant_mpeg_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 615  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 624  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 685  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 700  Line 622 
622          xor             eax, eax          xor             eax, eax
623          ret          ret
624    
625  ;===========================================================================  ;-----------------------------------------------------------------------------
626  ;  ;
627  ; uint32_t dequant_mpeg_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 725  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]

Legend:
Removed from v.1191  
changed lines
  Added in v.1192

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