[svn] / branches / release-1_2-branch / xvidcore / src / quant / x86_asm / quantize_h263_mmx.asm Repository:
ViewVC logotype

Diff of /branches/release-1_2-branch/xvidcore/src/quant/x86_asm/quantize_h263_mmx.asm

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

revision 1382, Mon Mar 22 22:36:25 2004 UTC revision 1793, Tue Nov 11 20:46:24 2008 UTC
# Line 5  Line 5 
5  ; *  ; *
6  ; *  Copyright(C) 2001-2003 Peter Ross <pross@xvid.org>  ; *  Copyright(C) 2001-2003 Peter Ross <pross@xvid.org>
7  ; *               2002-2003 Pascal Massimino <skal@planet-d.net>  ; *               2002-2003 Pascal Massimino <skal@planet-d.net>
8    ; *               2004      Jean-Marc Bastide <jmtest@voila.fr>
9  ; *  ; *
10  ; *  This program is free software ; you can redistribute it and/or modify  ; *  This program is free software ; you can redistribute it and/or modify
11  ; *  it under the terms of the GNU General Public License as published by  ; *  it under the terms of the GNU General Public License as published by
# Line 20  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_h263_mmx.asm,v 1.2 2004-03-22 22:36:24 edgomez Exp $  ; * $Id: quantize_h263_mmx.asm,v 1.9 2008-11-11 20:46:24 Isibaar Exp $
25  ; *  ; *
26  ; ****************************************************************************/  ; ****************************************************************************/
27    
# Line 31  Line 32 
32    
33  %macro cglobal 1  %macro cglobal 1
34         %ifdef PREFIX         %ifdef PREFIX
35                    %ifdef MARK_FUNCS
36                            global _%1:function %1.endfunc-%1
37                            %define %1 _%1:function %1.endfunc-%1
38                            %define ENDFUNC .endfunc
39                    %else
40                  global _%1                  global _%1
41                  %define %1 _%1                  %define %1 _%1
42                            %define ENDFUNC
43                    %endif
44            %else
45                    %ifdef MARK_FUNCS
46                            global %1:function %1.endfunc-%1
47                            %define ENDFUNC .endfunc
48          %else          %else
49                  global %1                  global %1
50                            %define ENDFUNC
51                    %endif
52          %endif          %endif
53  %endmacro  %endmacro
54    
# Line 43  Line 57 
57  ;=============================================================================  ;=============================================================================
58    
59  %ifdef FORMAT_COFF  %ifdef FORMAT_COFF
60  SECTION .rodata data  SECTION .rodata
61  %else  %else
62  SECTION .rodata data align=16  SECTION .rodata align=16
63  %endif  %endif
64    
65  ALIGN 16  ALIGN 16
# Line 54  Line 68 
68    
69  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
70  ;  ;
71  ; subtract by Q/2 table  ; quant table
72  ;  ;
73  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
74    
75  ALIGN 16  ALIGN 16
76  mmx_sub:  mmx_quant:
77  %assign quant 1  %assign quant 0
78  %rep 31  %rep 32
79          times 4 dw  quant / 2          times 4 dw quant
80          %assign quant quant+1          %assign quant quant+1
81  %endrep  %endrep
82    
83  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
84  ;  ;
85  ; divide by 2Q table  ; subtract by Q/2 table
 ;  
 ; use a shift of 16 to take full advantage of _pmulhw_  
 ; for q=1, _pmulhw_ will overflow so it is treated seperately  
 ; (3dnow2 provides _pmulhuw_ which wont cause overflow)  
86  ;  ;
87  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
88    
89  ALIGN 16  ALIGN 16
90  mmx_div:  mmx_sub:
91  %assign quant 1  %assign quant 1
92  %rep 31  %rep 31
93          times 4 dw  (1<<16) / (quant*2) + 1          times 4 dw  quant / 2
94          %assign quant quant+1          %assign quant quant+1
95  %endrep  %endrep
96    
97  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
98  ;  ;
99  ; add by (odd(Q) ? Q : Q - 1) table  ; divide by 2Q table
 ;  
 ;-----------------------------------------------------------------------------  
   
 ALIGN 16  
 mmx_add:  
 %assign quant 1  
 %rep 31  
         %if quant % 2 != 0  
         times 4 dw  quant  
         %else  
         times 4 dw quant - 1  
         %endif  
         %assign quant quant+1  
 %endrep  
   
 ;-----------------------------------------------------------------------------  
100  ;  ;
101  ; multiple by 2Q table  ; use a shift of 16 to take full advantage of _pmulhw_
102    ; for q=1, _pmulhw_ will overflow so it is treated seperately
103    ; (3dnow2 provides _pmulhuw_ which wont cause overflow)
104  ;  ;
105  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
106    
107  ALIGN 16  ALIGN 16
108  mmx_mul:  mmx_div:
109  %assign quant 1  %assign quant 1
110  %rep 31  %rep 31
111          times 4 dw  quant*2          times 4 dw  (1<<16) / (quant*2) + 1
112          %assign quant quant+1          %assign quant quant+1
113  %endrep  %endrep
114    
 ;-----------------------------------------------------------------------------  
 ;  
 ; saturation limits  
 ;  
 ;-----------------------------------------------------------------------------  
   
 ALIGN 16  
 sse2_2047:  
         times 8 dw 2047  
   
 ALIGN 16  
 mmx_2047:  
         times 4 dw 2047  
   
 ALIGN 8  
 mmx_32768_minus_2048:  
         times 4 dw (32768-2048)  
   
 mmx_32767_minus_2047:  
         times 4 dw (32767-2047)  
   
   
115  ;=============================================================================  ;=============================================================================
116  ; Code  ; Code
117  ;=============================================================================  ;=============================================================================
# Line 168  Line 142 
142  ALIGN 16  ALIGN 16
143  quant_h263_intra_mmx:  quant_h263_intra_mmx:
144    
   push ecx  
145    push esi    push esi
   push edi  
   
   mov edi, [esp + 12 + 4]     ; coeff  
   mov esi, [esp + 12 + 8]     ; data  
   mov eax, [esp + 12 + 12]    ; quant  
   
   xor ecx, ecx  
   cmp al, 1  
   jz .q1loop  
   
   movq mm7, [mmx_div + eax * 8 - 8]  
   
 ALIGN 16  
 .loop  
   movq mm0, [esi + 8*ecx]           ; mm0 = [1st]  
   movq mm3, [esi + 8*ecx + 8]  
   pxor mm1, mm1                     ; mm1 = 0  
   pxor mm4, mm4                     ;  
   pcmpgtw mm1, mm0                  ; mm1 = (0 > mm0)  
   pcmpgtw mm4, mm3                  ;  
   pxor mm0, mm1                     ; mm0 = |mm0|  
   pxor mm3, mm4                     ;  
   psubw mm0, mm1                    ; displace  
   psubw mm3, mm4                    ;  
   pmulhw mm0, mm7                   ; mm0 = (mm0 / 2Q) >> 16  
   pmulhw mm3, mm7                   ;  
   pxor mm0, mm1                     ; mm0 *= sign(mm0)  
   pxor mm3, mm4                     ;  
   psubw mm0, mm1                    ; undisplace  
   psubw mm3, mm4                    ;  
   movq [edi + 8*ecx], mm0  
   movq [edi + 8*ecx + 8], mm3  
   
   add ecx, 2  
   cmp ecx, 16  
   jnz .loop  
146    
147  .done    mov esi, [esp + 4 + 8]     ; data
148      mov ecx,[esp + 4 + 16]     ; dcscalar
     ; caclulate  data[0] // (int32_t)dcscalar)  
   mov ecx, [esp + 12 + 16]      ; dcscalar  
   mov edx, ecx  
149    movsx eax, word [esi]         ; data[0]    movsx eax, word [esi]         ; data[0]
   shr edx, 1                    ; edx = dcscalar /2  
   cmp eax, 0  
   jg .gtzero  
150    
151      sar ecx,1                  ; dcscalar /2
152      mov edx,eax
153      sar edx,31                 ; sgn(data[0])
154      xor ecx,edx                ; *sgn(data[0])
155    sub eax, edx    sub eax, edx
156    jmp short .mul    add eax,ecx                ; + (dcscalar/2)*sgn(data[0])
157    
158  .gtzero    mov ecx, [esp + 4 + 12]    ; quant
159    add eax, edx    cdq
160  .mul    idiv dword [esp + 4 + 16]  ; dcscalar
161    cdq ; expand eax -> edx:eax    cmp ecx, 1
162    idiv ecx          ; eax = edx:eax / dcscalar    mov edx, [esp + 4 + 4]     ; coeff
163    mov [edi], ax     ; coeff[0] = ax    je .low
164    
165    xor eax, eax      ; return(0);    movq mm7, [mmx_div+ecx * 8 - 8]
166    pop edi    mov ecx,4
   pop esi  
   pop ecx  
167    
168    ret  .loop:
169      movq mm0, [esi]           ; data
170  ALIGN 16    pxor mm4,mm4
171  .q1loop    movq mm1, [esi + 8]
172    movq mm0, [esi + 8*ecx]           ; mm0 = [1st]    pcmpgtw mm4,mm0           ; (data<0)
173    movq mm3, [esi + 8*ecx + 8]    pxor mm5,mm5
174    pxor mm1, mm1                     ; mm1 = 0    pmulhw mm0,mm7            ; /(2*quant)
175    pxor mm4, mm4                     ;    pcmpgtw mm5,mm1
176    pcmpgtw mm1, mm0                  ; mm1 = (0 > mm0)    movq mm2, [esi+16]
177    pcmpgtw mm4, mm3                  ;    psubw mm0,mm4             ;  +(data<0)
178    pxor mm0, mm1                     ; mm0 = |mm0|    pmulhw mm1,mm7
179    pxor mm3, mm4                     ;    pxor mm4,mm4
180    psubw mm0, mm1                    ; displace    movq mm3,[esi+24]
181    psubw mm3, mm4                    ;    pcmpgtw mm4,mm2
182    psrlw mm0, 1                      ; mm0 >>= 1   (/2)    psubw mm1,mm5
183    psrlw mm3, 1                      ;    pmulhw mm2,mm7
184    pxor mm0, mm1                     ; mm0 *= sign(mm0)    pxor mm5,mm5
185    pxor mm3, mm4    pcmpgtw mm5,mm3
186    psubw mm0, mm1                    ; undisplace    pmulhw mm3,mm7
187    psubw mm3, mm4                    ;    psubw mm2,mm4
188    movq [edi + 8*ecx], mm0    psubw mm3,mm5
189    movq [edi + 8*ecx + 8], mm3    movq [edx], mm0
190      lea esi, [esi+32]
191      movq [edx + 8], mm1
192      movq [edx + 16], mm2
193      movq [edx + 24], mm3
194    
195      dec ecx
196      lea edx, [edx+32]
197      jne .loop
198      jmp .end
199    
200    .low:
201      movd mm7,ecx
202      mov ecx,4
203    .loop_low:
204      movq mm0, [esi]
205      pxor mm4,mm4
206      movq mm1, [esi + 8]
207      pcmpgtw mm4,mm0
208      pxor mm5,mm5
209      psubw mm0,mm4
210      pcmpgtw mm5,mm1
211      psraw mm0,mm7
212      psubw mm1,mm5
213      movq mm2,[esi+16]
214      pxor mm4,mm4
215      psraw mm1,mm7
216      pcmpgtw mm4,mm2
217      pxor mm5,mm5
218      psubw mm2,mm4
219      movq mm3,[esi+24]
220      pcmpgtw mm5,mm3
221      psraw mm2,mm7
222      psubw mm3,mm5
223      movq [edx], mm0
224      psraw mm3,mm7
225      movq [edx + 8], mm1
226      movq [edx+16],mm2
227      lea esi, [esi+32]
228      movq [edx+24],mm3
229    
230      dec ecx
231      lea edx, [edx+32]
232      jne .loop_low
233    
234    add ecx, 2  .end:
235    cmp ecx, 16    mov edx, [esp + 4 + 4]     ; coeff
236    jnz .q1loop    mov [edx],ax
237    jmp short .done    xor eax,eax                ; return 0
238    
239      pop esi
240      ret
241    ENDFUNC
242    
243    
244  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 276  Line 255 
255  quant_h263_intra_sse2:  quant_h263_intra_sse2:
256    
257    push esi    push esi
   push edi  
258    
259    mov edi, [esp + 8 + 4]                ; coeff    mov esi, [esp + 4 + 8]     ; data
   mov esi, [esp + 8 + 8]                ; data  
   mov eax, [esp + 8 + 12]               ; quant  
260    
261    xor ecx, ecx    movsx eax, word [esi]      ; data[0]
   cmp al, 1  
   jz near .qas2_q1loop  
262    
263  .qas2_not1    mov ecx,[esp + 4 + 16]     ; dcscalar
264    movq mm7, [mmx_div + eax*8 - 8]    mov edx,eax
265    movq2dq xmm7, mm7    sar ecx,1
266      add eax,ecx
267      sub edx,ecx
268      cmovl eax,edx              ; +/- dcscalar/2
269      mov ecx, [esp + 4 + 12]    ; quant
270      cdq
271      idiv dword [esp + 4 + 16]  ; dcscalar
272      cmp ecx, 1
273      mov edx, [esp + 4 + 4]     ; coeff
274      movq xmm7, [mmx_div+ecx * 8 - 8]
275      je .low
276    
277      mov ecx,2
278    movlhps xmm7, xmm7    movlhps xmm7, xmm7
279    
280  ALIGN 16  .loop:
281  .qas2_loop    movdqa xmm0, [esi]
   movdqa xmm0, [esi + ecx*8]                ; xmm0 = [1st]  
   movdqa xmm3, [esi + ecx*8 + 16]           ; xmm3 = [2nd]  
   pxor xmm1, xmm1  
282    pxor xmm4, xmm4    pxor xmm4, xmm4
283    pcmpgtw xmm1, xmm0    movdqa xmm1, [esi + 16]
284    pcmpgtw xmm4, xmm3    pcmpgtw xmm4,xmm0
285    pxor xmm0, xmm1    pxor xmm5,xmm5
   pxor xmm3, xmm4  
   psubw xmm0, xmm1  
   psubw xmm3, xmm4  
286    pmulhw xmm0, xmm7    pmulhw xmm0, xmm7
287      pcmpgtw xmm5,xmm1
288      movdqa xmm2, [esi+32]
289      psubw xmm0,xmm4
290      pmulhw xmm1,xmm7
291      pxor xmm4,xmm4
292      movdqa xmm3,[esi+48]
293      pcmpgtw xmm4,xmm2
294      psubw xmm1,xmm5
295      pmulhw xmm2,xmm7
296      pxor xmm5,xmm5
297      pcmpgtw xmm5,xmm3
298    pmulhw xmm3, xmm7    pmulhw xmm3, xmm7
299    pxor xmm0, xmm1    psubw xmm2,xmm4
300    pxor xmm3, xmm4    psubw xmm3,xmm5
301    psubw xmm0, xmm1    movdqa [edx], xmm0
302    psubw xmm3, xmm4    lea esi, [esi+64]
303    movdqa [edi + ecx*8], xmm0    movdqa [edx + 16], xmm1
304    movdqa [edi + ecx*8 + 16], xmm3    movdqa [edx + 32], xmm2
305      movdqa [edx + 48], xmm3
306    add ecx, 4  
307    cmp ecx, 16    dec ecx
308    jnz .qas2_loop    lea edx, [edx+64]
309      jne .loop
310  .qas2_done    jmp .end
311    mov ecx, [esp + 8 + 16]   ; dcscalar  
312    mov edx, ecx  .low:
313    movsx eax, word [esi]    movd xmm7,ecx
314    shr edx, 1    mov ecx,2
315    cmp eax, 0  .loop_low:
316    jg .qas2_gtzero    movdqa xmm0, [esi]
317      pxor xmm4,xmm4
318    sub eax, edx    movdqa xmm1, [esi + 16]
319    jmp short .qas2_mul    pcmpgtw xmm4,xmm0
320      pxor xmm5,xmm5
321  .qas2_gtzero    psubw xmm0,xmm4
322    add eax, edx    pcmpgtw xmm5,xmm1
323      psraw xmm0,xmm7
324  .qas2_mul    psubw xmm1,xmm5
325    cdq    movdqa xmm2,[esi+32]
326    idiv ecx    pxor xmm4,xmm4
327      psraw xmm1,xmm7
328      pcmpgtw xmm4,xmm2
329      pxor xmm5,xmm5
330      psubw xmm2,xmm4
331      movdqa xmm3,[esi+48]
332      pcmpgtw xmm5,xmm3
333      psraw xmm2,xmm7
334      psubw xmm3,xmm5
335      movdqa [edx], xmm0
336      psraw xmm3,xmm7
337      movdqa [edx+16], xmm1
338      movdqa [edx+32],xmm2
339      lea esi, [esi+64]
340      movdqa [edx+48],xmm3
341    
342      dec ecx
343      lea edx, [edx+64]
344      jne .loop_low
345    
346    mov [edi], ax  .end:
347      mov edx, [esp + 4 + 4]     ; coeff
348      mov [edx],ax
349      xor eax,eax                ; return 0
350    
   xor eax, eax      ; return(0);  
   pop edi  
351    pop esi    pop esi
   
352    ret    ret
353    ENDFUNC
 ALIGN 16  
 .qas2_q1loop  
   movdqa xmm0, [esi + ecx*8]         ; xmm0 = [1st]  
   movdqa xmm3, [esi + ecx*8 + 16]    ; xmm3 = [2nd]  
   pxor xmm1, xmm1  
   pxor xmm4, xmm4  
   pcmpgtw xmm1, xmm0  
   pcmpgtw xmm4, xmm3  
   pxor xmm0, xmm1  
   pxor xmm3, xmm4  
   psubw xmm0, xmm1  
   psubw xmm3, xmm4  
   psrlw xmm0, 1  
   psrlw xmm3, 1  
   pxor xmm0, xmm1  
   pxor xmm3, xmm4  
   psubw xmm0, xmm1  
   psubw xmm3, xmm4  
   movdqa [edi + ecx*8], xmm0  
   movdqa [edi + ecx*8 + 16], xmm3  
   
   add ecx, 4  
   cmp ecx, 16  
   jnz .qas2_q1loop  
   jmp near .qas2_done  
   
   
354    
355  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
356  ;  ;
# Line 401  Line 383 
383    movq mm7, [mmx_div + eax * 8 - 8] ; divider    movq mm7, [mmx_div + eax * 8 - 8] ; divider
384    
385  ALIGN 8  ALIGN 8
386  .loop  .loop:
387    movq mm0, [esi + 8*ecx]           ; mm0 = [1st]    movq mm0, [esi + 8*ecx]           ; mm0 = [1st]
388    movq mm3, [esi + 8*ecx + 8]    movq mm3, [esi + 8*ecx + 8]
389    pxor mm1, mm1                     ; mm1 = 0    pxor mm1, mm1                     ; mm1 = 0
# Line 429  Line 411 
411    cmp ecx, 16    cmp ecx, 16
412    jnz .loop    jnz .loop
413    
414  .done  .done:
415    pmaddwd mm5, [plus_one]    pmaddwd mm5, [plus_one]
416    movq mm0, mm5    movq mm0, mm5
417    psrlq mm5, 32    psrlq mm5, 32
# Line 443  Line 425 
425    ret    ret
426    
427  ALIGN 8  ALIGN 8
428  .q1loop  .q1loop:
429    movq mm0, [esi + 8*ecx]           ; mm0 = [1st]    movq mm0, [esi + 8*ecx]           ; mm0 = [1st]
430    movq mm3, [esi + 8*ecx+ 8]        ;    movq mm3, [esi + 8*ecx+ 8]        ;
431    pxor mm1, mm1                     ; mm1 = 0    pxor mm1, mm1                     ; mm1 = 0
# Line 472  Line 454 
454    jnz .q1loop    jnz .q1loop
455    
456    jmp .done    jmp .done
457    ENDFUNC
458    
459    
460    
# Line 505  Line 488 
488    cmp al, 1    cmp al, 1
489    jz near .qes2_q1loop    jz near .qes2_q1loop
490    
491  .qes2_not1  .qes2_not1:
492    movq mm0, [mmx_div + eax*8 - 8]           ; divider    movq mm0, [mmx_div + eax*8 - 8]           ; divider
493    movq2dq xmm7, mm0    movq2dq xmm7, mm0
494    movlhps xmm7, xmm7    movlhps xmm7, xmm7
495    
496  ALIGN 16  ALIGN 16
497  .qes2_loop  .qes2_loop:
498    movdqa xmm0, [esi + ecx*8]                ; xmm0 = [1st]    movdqa xmm0, [esi + ecx*8]                ; xmm0 = [1st]
499    movdqa xmm3, [esi + ecx*8 + 16]           ; xmm3 = [2nd]    movdqa xmm3, [esi + ecx*8 + 16]           ; xmm3 = [2nd]
500    pxor xmm1, xmm1    pxor xmm1, xmm1
# Line 539  Line 522 
522    cmp ecx, 16    cmp ecx, 16
523    jnz .qes2_loop    jnz .qes2_loop
524    
525  .qes2_done  .qes2_done:
526    movdqu xmm6, [plus_one]    movdqu xmm6, [plus_one]
527    pmaddwd xmm5, xmm6    pmaddwd xmm5, xmm6
528    movhlps xmm6, xmm5    movhlps xmm6, xmm5
# Line 558  Line 541 
541    ret    ret
542    
543  ALIGN 16  ALIGN 16
544  .qes2_q1loop  .qes2_q1loop:
545    movdqa xmm0, [esi + ecx*8]        ; xmm0 = [1st]    movdqa xmm0, [esi + ecx*8]        ; xmm0 = [1st]
546    movdqa xmm3, [esi + ecx*8 + 16]   ; xmm3 = [2nd]    movdqa xmm3, [esi + ecx*8 + 16]   ; xmm3 = [2nd]
547    pxor xmm1, xmm1    pxor xmm1, xmm1
# Line 586  Line 569 
569    cmp ecx, 16    cmp ecx, 16
570    jnz .qes2_q1loop    jnz .qes2_q1loop
571    jmp .qes2_done    jmp .qes2_done
572    ENDFUNC
573    
574    
575  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 598  Line 582 
582  ;  ;
583  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
584    
   ; note: we only saturate to +2047 *before* restoring the sign.  
   ; Hence, final clamp really is [-2048,2047]  
   
585  ALIGN 16  ALIGN 16
586  dequant_h263_intra_mmx:  dequant_h263_intra_mmx:
587    
588      mov ecx, [esp+12]                 ; quant
589      mov eax, [esp+ 8]                 ; coeff
590      pcmpeqw mm0,mm0
591      movq mm6, [mmx_quant + ecx*8]     ; quant
592      shl ecx,31                        ; quant & 1 ? 0 : - 1
593      movq mm7,mm6
594      movq mm5,mm0
595      movd mm1,ecx
596    mov edx, [esp+ 4]                 ; data    mov edx, [esp+ 4]                 ; data
597    mov ecx, [esp+ 8]                 ; coeff    psllw mm0,mm1
598    mov eax, [esp+12]                 ; quant    paddw mm7,mm7                     ; 2*quant
599    movq mm6, [mmx_add + eax*8 - 8]   ; quant or quant-1    paddw mm6,mm0                     ; quant-1
600    movq mm7, [mmx_mul + eax*8 - 8]   ; 2*quant    psllw mm5,12
601    mov eax, -16    mov ecx,8
602      psrlw mm5,1
603    
604  ALIGN 16  .loop:
605  .loop    movq mm0,[eax]
606    movq mm0, [ecx+8*eax+8*16]        ; c  = coeff[i]    pxor mm2,mm2
   movq mm3, [ecx+8*eax+8*16 + 8]    ; c' = coeff[i+1]  
   pxor mm1, mm1  
607    pxor mm4, mm4    pxor mm4, mm4
608    pcmpgtw mm1, mm0                  ; sign(c)    pcmpgtw mm2,mm0
609    pcmpgtw mm4, mm3                  ; sign(c')    pcmpeqw mm4,mm0
610      pmullw mm0,mm7      ; * 2 * quant
611      movq mm1,[eax+8]
612      psubw mm0,mm2
613      pxor mm2,mm6
614      pxor mm3,mm3
615      pandn mm4,mm2
616    pxor mm2, mm2    pxor mm2, mm2
617    pxor mm5, mm5    pcmpgtw mm3,mm1
618    pcmpeqw mm2, mm0                  ; c is zero    pcmpeqw mm2,mm1
619    pcmpeqw mm5, mm3                  ; c' is zero    pmullw mm1,mm7
620    pandn mm2, mm6                    ; offset = isZero ? 0 : quant_add    paddw mm0,mm4
621    pandn mm5, mm6    psubw mm1,mm3
622    pxor mm0, mm1                     ; negate if negative    pxor mm3,mm6
623    pxor mm3, mm4                     ; negate if negative    pandn mm2,mm3
624    psubw mm0, mm1    paddsw mm0, mm5        ; saturate
625    psubw mm3, mm4    paddw mm1,mm2
626    pmullw mm0, mm7                   ; *= 2Q  
627    pmullw mm3, mm7                   ; *= 2Q    paddsw mm1, mm5
628    paddw mm0, mm2                    ; + offset    psubsw mm0, mm5
629    paddw mm3, mm5                    ; + offset    psubsw mm1, mm5
630    paddw mm0, mm1                    ; negate back    psubsw mm0, mm5
631    paddw mm3, mm4                    ; negate back    psubsw mm1, mm5
632      paddsw mm0, mm5
633    ; saturates to +2047    paddsw mm1, mm5
634    movq mm2, [mmx_32767_minus_2047]  
635    add eax, 2    movq [edx],mm0
636    paddsw mm0, mm2    lea eax,[eax+16]
637    paddsw mm3, mm2    movq [edx+8],mm1
638    psubsw mm0, mm2  
639    psubsw mm3, mm2    dec ecx
640      lea edx,[edx+16]
641    pxor mm0, mm1    jne .loop
   pxor mm3, mm4  
   movq [edx + 8*eax + 8*16   - 2*8], mm0  
   movq [edx + 8*eax + 8*16+8 - 2*8], mm3  
   jnz near .loop  
642    
643   ; deal with DC   ; deal with DC
644    movd mm0, [ecx]    mov eax, [esp+ 8]                ; coeff
645    pmullw mm0, [esp+16]          ; dcscalar    movd mm1,[esp+16]                ; dcscalar
646    movq mm2, [mmx_32767_minus_2047]    movd mm0,[eax]                   ; coeff[0]
647    paddsw mm0, mm2    pmullw mm0,mm1                   ; * dcscalar
648    psubsw mm0, mm2    mov edx, [esp+ 4]                ; data
649    movq mm3, [mmx_32768_minus_2048]    paddsw mm0, mm5                  ; saturate +
650    psubsw mm0, mm3    psubsw mm0, mm5
651    paddsw mm0, mm3    psubsw mm0, mm5                  ; saturate -
652      paddsw mm0, mm5
653    movd eax, mm0    movd eax, mm0
654    mov [edx], ax    mov [edx], ax
655    
656    xor eax, eax              ; return(0);    xor eax, eax                    ; return 0
657    ret    ret
658    ENDFUNC
659    
660  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
661  ;  ;
# Line 675  Line 667 
667  ;  ;
668  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
669    
   ; this is the same as dequant_inter_mmx, except that we're  
   ; saturating using 'pminsw' (saves 2 cycles/loop => ~5% faster)  
670    
671  ALIGN 16  ALIGN 16
672  dequant_h263_intra_xmm:  dequant_h263_intra_xmm:
673    
674      mov ecx, [esp+12]                 ; quant
675      mov eax, [esp+ 8]                 ; coeff
676    
677      movd mm6,ecx                      ; quant
678      pcmpeqw mm0,mm0
679      pshufw mm6,mm6,0                  ; all quant
680      shl ecx,31
681      movq mm5,mm0
682      movq mm7,mm6
683      movd mm1,ecx
684    mov edx, [esp+ 4]                 ; data    mov edx, [esp+ 4]                 ; data
685    mov ecx, [esp+ 8]                 ; coeff    psllw mm0,mm1                     ; quant & 1 ? 0 : - 1
686    mov eax, [esp+12]                 ; quant    movq mm4,mm5
687    movq mm6, [mmx_add + eax*8 - 8]   ; quant or quant-1    paddw mm7,mm7                     ; quant*2
688    movq mm7, [mmx_mul + eax*8 - 8]   ; 2*quant    paddw mm6,mm0                     ; quant-1
689    mov eax, -16    psrlw mm4,5                       ; mm4=2047
690      mov ecx,8
691      pxor mm5,mm4                      ; mm5=-2048
692    
693  ALIGN 16  .loop:
694  .loop    movq mm0,[eax]
   movq mm0, [ecx+8*eax+8*16]        ; c  = coeff[i]  
   movq mm3, [ecx+8*eax+8*16 + 8]    ; c' = coeff[i+1]  
   pxor mm1, mm1  
   pxor mm4, mm4  
   pcmpgtw mm1, mm0                  ; sign(c)  
   pcmpgtw mm4, mm3                  ; sign(c')  
695    pxor mm2, mm2    pxor mm2, mm2
696    pxor mm5, mm5    pxor mm3,mm3
697    pcmpeqw mm2, mm0                  ; c is zero  
698    pcmpeqw mm5, mm3                  ; c' is zero    pcmpgtw mm2,mm0
699    pandn mm2, mm6                    ; offset = isZero ? 0 : quant_add    pcmpeqw mm3,mm0     ; if coeff==0...
700    pandn mm5, mm6    pmullw mm0,mm7      ; * 2 * quant
701    pxor mm0, mm1                     ; negate if negative    movq mm1,[eax+8]
702    pxor mm3, mm4                     ; negate if negative  
703    psubw mm0, mm1    psubw mm0,mm2
704    psubw mm3, mm4    pxor mm2,mm6
705    pmullw mm0, mm7                   ; *= 2Q    pandn mm3,mm2       ; ...then data=0
706    pmullw mm3, mm7                   ; *= 2Q    pxor mm2,mm2
707    paddw mm0, mm2                    ; + offset    paddw mm0,mm3
708    paddw mm3, mm5                    ; + offset    pxor mm3,mm3
709    paddw mm0, mm1                    ; negate back    pcmpeqw mm2,mm1
710    paddw mm3, mm4                    ; negate back    pcmpgtw mm3,mm1
711      pmullw mm1,mm7
712     ; saturates to +2047  
713    movq mm2, [mmx_2047]    pminsw mm0,mm4
714    pminsw mm0, mm2    psubw mm1,mm3
715    add eax, 2    pxor mm3,mm6
716    pminsw mm3, mm2    pandn mm2,mm3
717      paddw mm1,mm2
718    pxor mm0, mm1  
719    pxor mm3, mm4    pmaxsw mm0,mm5
720    movq [edx + 8*eax + 8*16   - 2*8], mm0    pminsw mm1,mm4
721    movq [edx + 8*eax + 8*16+8 - 2*8], mm3    movq [edx],mm0
722    jnz near .loop    pmaxsw mm1,mm5
723      lea eax,[eax+16]
724      movq [edx+8],mm1
725    
726      dec ecx
727      lea edx,[edx+16]
728      jne .loop
729    
730      ; deal with DC      ; deal with DC
731    movd mm0, [ecx]    mov eax, [esp+ 8]                 ; coeff
732    pmullw mm0, [esp+16]    ; dcscalar    movd mm1,[esp+16]                 ; dcscalar
733    movq mm2, [mmx_32767_minus_2047]    movd mm0, [eax]
734    paddsw mm0, mm2    pmullw mm0, mm1
735    psubsw mm0, mm2    mov edx, [esp+ 4]                 ; data
736    movq mm2, [mmx_32768_minus_2048]    pminsw mm0,mm4
737    psubsw mm0, mm2    pmaxsw mm0,mm5
   paddsw mm0, mm2  
738    movd eax, mm0    movd eax, mm0
739    mov [edx], ax    mov [edx], ax
740    
741    xor eax, eax    xor eax, eax                      ; return 0
742    ret    ret
743    ENDFUNC
744    
745    
746  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 753  Line 755 
755    
756  ALIGN 16  ALIGN 16
757  dequant_h263_intra_sse2:  dequant_h263_intra_sse2:
758    
759      mov ecx, [esp+12]                 ; quant
760      mov eax, [esp+ 8]                 ; coeff
761    
762      movd xmm6,ecx                     ; quant
763    
764      shl ecx,31
765      pshuflw xmm6,xmm6,0
766      pcmpeqw xmm0,xmm0
767      movlhps xmm6,xmm6                 ; all quant
768      movd xmm1,ecx
769      movdqa xmm5,xmm0
770      movdqa xmm7,xmm6
771    mov edx, [esp+ 4]        ; data    mov edx, [esp+ 4]        ; data
772    mov ecx, [esp+ 8]        ; coeff    paddw xmm7,xmm7                   ; quant *2
773    mov eax, [esp+12]        ; quant    psllw xmm0,xmm1                   ; quant & 1 ? 0 : - 1
774    movq mm6, [mmx_add + eax * 8 - 8]    movdqa xmm4,xmm5
775    movq mm7, [mmx_mul + eax * 8 - 8]    paddw xmm6,xmm0                   ; quant-1
776    movq2dq xmm6, mm6    psrlw xmm4,5                      ; 2047
777    movq2dq xmm7, mm7    mov ecx,4
778    movlhps xmm6, xmm6    pxor xmm5,xmm4                    ; mm5=-2048
   movlhps xmm7, xmm7  
   mov eax, -16  
779    
780  ALIGN 16  .loop:
781  .loop    movdqa xmm0,[eax]
   movdqa xmm0, [ecx + 8*16 + 8*eax]      ; c  = coeff[i]  
   movdqa xmm3, [ecx + 8*16 + 8*eax+ 16]  
   pxor xmm1, xmm1  
   pxor xmm4, xmm4  
   pcmpgtw xmm1, xmm0    ; sign(c)  
   pcmpgtw xmm4, xmm3  
782    pxor xmm2, xmm2    pxor xmm2, xmm2
783    pxor xmm5, xmm5    pxor xmm3,xmm3
   pcmpeqw xmm2, xmm0    ; c is zero  
   pcmpeqw xmm5, xmm3  
   pandn xmm2, xmm6      ; offset = isZero ? 0 : quant_add  
   pandn xmm5, xmm6  
   pxor xmm0, xmm1       ; negate if negative  
   pxor xmm3, xmm4  
   psubw xmm0, xmm1  
   psubw xmm3, xmm4  
   pmullw xmm0, xmm7     ; *= 2Q  
   pmullw xmm3, xmm7  
   paddw xmm0, xmm2      ; + offset  
   paddw xmm3, xmm5  
   paddw xmm0, xmm1      ; negate back  
   paddw xmm3, xmm4  
   
     ; saturates to +2047  
   movdqa xmm2, [sse2_2047]  
   pminsw xmm0, xmm2  
   add eax, 4  
   pminsw xmm3, xmm2  
784    
785    pxor xmm0, xmm1    pcmpgtw xmm2,xmm0
786    pxor xmm3, xmm4    pcmpeqw xmm3,xmm0
787    movdqa [edx + 8*16 - 8*4 + 8*eax], xmm0    pmullw xmm0,xmm7      ; * 2 * quant
788    movdqa [edx + 8*16 - 8*4 + 8*eax + 16], xmm3    movdqa xmm1,[eax+16]
789    jnz near .loop  
790      psubw xmm0,xmm2
791      pxor xmm2,xmm6
792      pandn xmm3,xmm2
793      pxor xmm2,xmm2
794      paddw xmm0,xmm3
795      pxor xmm3,xmm3
796      pcmpeqw xmm2,xmm1
797      pcmpgtw xmm3,xmm1
798      pmullw xmm1,xmm7
799    
800      pminsw xmm0,xmm4
801      psubw xmm1,xmm3
802      pxor xmm3,xmm6
803      pandn xmm2,xmm3
804      paddw xmm1,xmm2
805    
806      pmaxsw xmm0,xmm5
807      pminsw xmm1,xmm4
808      movdqa [edx],xmm0
809      pmaxsw xmm1,xmm5
810      lea eax,[eax+32]
811      movdqa [edx+16],xmm1
812    
813      dec ecx
814      lea edx,[edx+32]
815      jne .loop
816    
817   ; deal with DC   ; deal with DC
818    movd mm0, [ecx]  
819    pmullw mm0, [esp+16]    ; dcscalar    mov eax, [esp+ 8]             ; coeff
820    movq mm2, [mmx_32767_minus_2047]    movsx eax,word [eax]
821    paddsw mm0, mm2    imul dword [esp+16]           ; dcscalar
822    psubsw mm0, mm2    mov edx, [esp+ 4]             ; data
823    movq mm2, [mmx_32768_minus_2048]    movd xmm0,eax
824    psubsw mm0, mm2    pminsw xmm0,xmm4
825    paddsw mm0, mm2    pmaxsw xmm0,xmm5
826    movd eax, mm0    movd eax,xmm0
827    
828    mov [edx], ax    mov [edx], ax
829    
830    xor eax, eax    xor eax, eax                  ; return 0
831    ret    ret
832    ENDFUNC
833    
834  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
835  ;  ;
# Line 828  Line 843 
843  ALIGN 16  ALIGN 16
844  dequant_h263_inter_mmx:  dequant_h263_inter_mmx:
845    
846      mov ecx, [esp+12]                 ; quant
847      mov eax, [esp+ 8]                 ; coeff
848      pcmpeqw mm0,mm0
849      movq mm6, [mmx_quant + ecx*8]     ; quant
850      shl ecx,31                        ; odd/even
851      movq mm7,mm6
852      movd mm1,ecx
853    mov edx, [esp+ 4]        ; data    mov edx, [esp+ 4]        ; data
854    mov ecx, [esp+ 8]        ; coeff    movq mm5,mm0
855    mov eax, [esp+12]        ; quant    psllw mm0,mm1                     ; quant & 1 ? 0 : - 1
856    movq mm6, [mmx_add + eax*8 - 8]  ; quant or quant-1    paddw mm7,mm7                     ; quant*2
857    movq mm7, [mmx_mul + eax*8 - 8]  ; 2*quant    paddw mm6,mm0                     ; quant & 1 ? quant : quant - 1
858    mov eax, -16    psllw mm5,12
859      mov ecx,8
860      psrlw mm5,1                       ; 32767-2047 (32768-2048)
861    
862  ALIGN 16  .loop:
863  .loop    movq mm0,[eax]
   movq mm0, [ecx+8*eax+8*16]      ; c  = coeff[i]  
   movq mm3, [ecx+8*eax+8*16 + 8]  ; c' = coeff[i+1]  
   pxor mm1, mm1  
864    pxor mm4, mm4    pxor mm4, mm4
   pcmpgtw mm1, mm0  ; sign(c)  
   pcmpgtw mm4, mm3  ; sign(c')  
865    pxor mm2, mm2    pxor mm2, mm2
866    pxor mm5, mm5    pcmpeqw mm4,mm0     ; if coeff==0...
867    pcmpeqw mm2, mm0  ; c is zero    pcmpgtw mm2,mm0
868    pcmpeqw mm5, mm3  ; c' is zero    pmullw mm0,mm7      ; * 2 * quant
869    pandn mm2, mm6    ; offset = isZero ? 0 : quant_add    pxor mm3,mm3
870    pandn mm5, mm6    psubw mm0,mm2
871    pxor mm0, mm1     ; negate if negative    movq mm1,[eax+8]
872    pxor mm3, mm4     ; negate if negative    pxor mm2,mm6
873    psubw mm0, mm1    pcmpgtw mm3,mm1
874    psubw mm3, mm4    pandn mm4,mm2      ; ... then data==0
875    pmullw mm0, mm7   ; *= 2Q    pmullw mm1,mm7
876    pmullw mm3, mm7   ; *= 2Q    pxor mm2,mm2
877    paddw mm0, mm2    ; + offset    pcmpeqw mm2,mm1
878    paddw mm3, mm5    ; + offset    psubw mm1,mm3
879    paddw mm0, mm1    ; negate back    pxor mm3,mm6
880    paddw mm3, mm4    ; negate back    pandn mm2,mm3
881    ; saturates to +2047    paddw mm0,mm4
882    movq mm2, [mmx_32767_minus_2047]    paddw mm1,mm2
883    add eax, 2  
884    paddsw mm0, mm2    paddsw mm0, mm5        ; saturate
885    paddsw mm3, mm2    paddsw mm1, mm5
886    psubsw mm0, mm2    psubsw mm0, mm5
887    psubsw mm3, mm2    psubsw mm1, mm5
888      psubsw mm0, mm5
889    pxor mm0, mm1    psubsw mm1, mm5
890    pxor mm3, mm4    paddsw mm0, mm5
891    movq [edx + 8*eax + 8*16   - 2*8], mm0    paddsw mm1, mm5
892    movq [edx + 8*eax + 8*16+8 - 2*8], mm3  
893    jnz near .loop    movq [edx],mm0
894      lea eax,[eax+16]
895      movq [edx+8],mm1
896    
897      dec ecx
898      lea edx,[edx+16]
899      jne .loop
900    
901    xor eax, eax    xor eax, eax              ; return 0
902    ret    ret
903    ENDFUNC
904    
905    
906  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
907  ;  ;
# Line 884  Line 911 
911  ;                                 const uint16_t *mpeg_matrices);  ;                                 const uint16_t *mpeg_matrices);
912  ;  ;
913  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
   
   ; this is the same as dequant_inter_mmx,  
   ; except that we're saturating using 'pminsw' (saves 2 cycles/loop)  
   
914  ALIGN 16  ALIGN 16
915  dequant_h263_inter_xmm:  dequant_h263_inter_xmm:
916    
917      mov ecx, [esp+12]                 ; quant
918      mov eax, [esp+ 8]                 ; coeff
919      pcmpeqw mm0,mm0
920      movq mm6, [mmx_quant + ecx*8]     ; quant
921      shl ecx,31
922      movq mm5,mm0
923      movd mm1,ecx
924      movq mm7,mm6
925      psllw mm0,mm1
926    mov edx, [esp+ 4]        ; data    mov edx, [esp+ 4]        ; data
927    mov ecx, [esp+ 8]        ; coeff    movq mm4,mm5
928    mov eax, [esp+12]        ; quant    paddw mm7,mm7
929    movq mm6, [mmx_add + eax*8 - 8]  ; quant or quant-1    paddw mm6,mm0                     ; quant-1
930    movq mm7, [mmx_mul + eax*8 - 8]  ; 2*quant  
931    mov eax, -16    psrlw mm4,5
932      mov ecx,8
933  ALIGN 16    pxor mm5,mm4                      ; mm5=-2048
934  .loop  
935    movq mm0, [ecx+8*eax+8*16]      ; c  = coeff[i]  .loop:
936    movq mm3, [ecx+8*eax+8*16 + 8]  ; c' = coeff[i+1]    movq mm0,[eax]
937    pxor mm1, mm1    pxor mm3,mm3
   pxor mm4, mm4  
   pcmpgtw mm1, mm0  ; sign(c)  
   pcmpgtw mm4, mm3  ; sign(c')  
938    pxor mm2, mm2    pxor mm2, mm2
939    pxor mm5, mm5    pcmpeqw mm3,mm0
940    pcmpeqw mm2, mm0  ; c is zero    pcmpgtw mm2,mm0
941    pcmpeqw mm5, mm3  ; c' is zero    pmullw mm0,mm7                    ; * 2 * quant
942    pandn mm2, mm6    ; offset = isZero ? 0 : quant_add    pandn mm3,mm6
943    pandn mm5, mm6    movq mm1,[eax+8]
944    pxor mm0, mm1     ; negate if negative    psubw mm0,mm2
945    pxor mm3, mm4     ; negate if negative    pxor mm2,mm3
946    psubw mm0, mm1    pxor mm3,mm3
947    psubw mm3, mm4    paddw mm0,mm2
948    pmullw mm0, mm7   ; *= 2Q    pxor mm2,mm2
949    pmullw mm3, mm7   ; *= 2Q    pcmpgtw mm3,mm1
950    paddw mm0, mm2    ; + offset    pcmpeqw mm2,mm1
951    paddw mm3, mm5    ; + offset    pmullw mm1,mm7
952    paddw mm0, mm1    ; start restoring sign    pandn mm2,mm6
953    paddw mm3, mm4    ; start restoring sign    psubw mm1,mm3
954                              ; saturates to +2047    pxor mm3,mm2
955    movq mm2, [mmx_2047]    paddw mm1,mm3
956    pminsw mm0, mm2  
957    add eax, 2    pminsw mm0,mm4
958    pminsw mm3, mm2    pminsw mm1,mm4
959      pmaxsw mm0,mm5
960    pxor mm0, mm1 ; finish restoring sign    pmaxsw mm1,mm5
961    pxor mm3, mm4 ; finish restoring sign  
962    movq [edx + 8*eax + 8*16   - 2*8], mm0    movq [edx],mm0
963    movq [edx + 8*eax + 8*16+8 - 2*8], mm3    lea eax,[eax+16]
964    jnz near .loop    movq [edx+8],mm1
965    
966      dec ecx
967      lea edx,[edx+16]
968      jne .loop
969    
970    xor eax, eax    xor eax, eax              ; return 0
971    ret    ret
972    ENDFUNC
973    
974    
975  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
976  ;  ;
# Line 948  Line 983 
983    
984  ALIGN 16  ALIGN 16
985  dequant_h263_inter_sse2:  dequant_h263_inter_sse2:
   mov edx, [esp + 4]    ; data  
   mov ecx, [esp + 8]    ; coeff  
   mov eax, [esp + 12]   ; quant  
   movq mm6, [mmx_add + eax * 8 - 8]  
   movq mm7, [mmx_mul + eax * 8 - 8]  
   movq2dq xmm6, mm6  
   movq2dq xmm7, mm7  
   movlhps xmm6, xmm6  
   movlhps xmm7, xmm7  
   mov eax, -16  
986    
987  ALIGN 16    mov ecx, [esp+12]                 ; quant
988  .loop    mov eax, [esp+ 8]                 ; coeff
   movdqa xmm0, [ecx + 8*16 + 8*eax]  ; c  = coeff[i]  
   movdqa xmm3, [ecx + 8*16 + 8*eax + 16]  
989    
990    pxor xmm1, xmm1    movq xmm6, [mmx_quant + ecx*8]    ; quant
991    pxor xmm4, xmm4    inc ecx
992    pcmpgtw xmm1, xmm0    ; sign(c)    pcmpeqw xmm5,xmm5
993    pcmpgtw xmm4, xmm3    and ecx,1
994      movlhps xmm6,xmm6
995      movd xmm0,ecx
996      movdqa xmm7,xmm6
997      pshuflw xmm0,xmm0,0
998      movdqa xmm4,xmm5
999      mov edx, [esp+ 4]                 ; data
1000      movlhps xmm0,xmm0
1001      paddw xmm7,xmm7
1002      psubw xmm6,xmm0
1003      psrlw xmm4,5   ; 2047
1004      mov ecx,4
1005      pxor xmm5,xmm4 ; mm5=-2048
1006    
1007    .loop:
1008      movdqa xmm0,[eax]
1009      pxor xmm3,xmm3
1010    pxor xmm2, xmm2    pxor xmm2, xmm2
1011    pxor xmm5, xmm5    pcmpeqw xmm3,xmm0
1012    pcmpeqw xmm2, xmm0    ; c is zero    pcmpgtw xmm2,xmm0
1013    pcmpeqw xmm5, xmm3    pmullw xmm0,xmm7      ; * 2 * quant
1014      pandn xmm3,xmm6
1015      movdqa xmm1,[eax+16]
1016      psubw xmm0,xmm2
1017      pxor xmm2,xmm3
1018      pxor xmm3,xmm3
1019      paddw xmm0,xmm2
1020      pxor xmm2,xmm2
1021      pcmpgtw xmm3,xmm1
1022      pcmpeqw xmm2,xmm1
1023      pmullw xmm1,xmm7
1024    pandn xmm2, xmm6    pandn xmm2, xmm6
1025    pandn xmm5, xmm6    psubw xmm1,xmm3
1026    pxor xmm0, xmm1       ; negate if negative    pxor xmm3,xmm2
1027    pxor xmm3, xmm4    paddw xmm1,xmm3
1028    psubw xmm0, xmm1  
1029    psubw xmm3, xmm4    pminsw xmm0,xmm4
1030    pmullw xmm0, xmm7     ; *= 2Q    pminsw xmm1,xmm4
1031    pmullw xmm3, xmm7    pmaxsw xmm0,xmm5
1032    paddw xmm0, xmm2      ; + offset    pmaxsw xmm1,xmm5
1033    paddw xmm3, xmm5  
1034      movdqa [edx],xmm0
1035    paddw xmm0, xmm1      ; start restoring sign    lea eax,[eax+32]
1036    paddw xmm3, xmm4    movdqa [edx+16],xmm1
1037    
1038   ; saturates to +2047    dec ecx
1039    movdqa xmm2, [sse2_2047]    lea edx,[edx+32]
1040    pminsw xmm0, xmm2    jne .loop
   add eax, 4  
   pminsw xmm3, xmm2  
   
   pxor xmm0, xmm1 ; finish restoring sign  
   pxor xmm3, xmm4  
   movdqa [edx + 8*16 - 8*4 + 8*eax], xmm0  
   movdqa [edx + 8*16 - 8*4 + 8*eax + 16], xmm3  
   jnz near .loop  
1041    
1042    xor eax, eax    xor eax, eax              ; return 0
1043    ret    ret
1044    ENDFUNC
1045    
1046    
1047    %ifidn __OUTPUT_FORMAT__,elf
1048    section ".note.GNU-stack" noalloc noexec nowrite progbits
1049    %endif
1050    

Legend:
Removed from v.1382  
changed lines
  Added in v.1793

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