[svn] / trunk / xvidcore / src / quant / x86_asm / quantize_h263_mmx.asm Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/quant/x86_asm/quantize_h263_mmx.asm

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

revision 1794, Fri Nov 14 15:43:28 2008 UTC revision 1795, Wed Nov 26 01:04:34 2008 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_h263_mmx.asm,v 1.9 2008-11-11 20:46:24 Isibaar Exp $  ; * $Id: quantize_h263_mmx.asm,v 1.10 2008-11-26 01:04:34 Isibaar Exp $
25  ; *  ; *
26  ; ****************************************************************************/  ; ****************************************************************************/
27    
28  ; enable dequant saturate [-2048,2047], test purposes only.  ; enable dequant saturate [-2048,2047], test purposes only.
29  %define SATURATE  %define SATURATE
30    
31  BITS 32  %include "nasm.inc"
   
 %macro cglobal 1  
         %ifdef PREFIX  
                 %ifdef MARK_FUNCS  
                         global _%1:function %1.endfunc-%1  
                         %define %1 _%1:function %1.endfunc-%1  
                         %define ENDFUNC .endfunc  
                 %else  
                         global _%1  
                         %define %1 _%1  
                         %define ENDFUNC  
                 %endif  
         %else  
                 %ifdef MARK_FUNCS  
                         global %1:function %1.endfunc-%1  
                         %define ENDFUNC .endfunc  
                 %else  
                         global %1  
                         %define ENDFUNC  
                 %endif  
         %endif  
 %endmacro  
32    
33  ;=============================================================================  ;=============================================================================
34  ; Read only Local data  ; Read only Local data
35  ;=============================================================================  ;=============================================================================
36    
37  %ifdef FORMAT_COFF  DATA
 SECTION .rodata  
 %else  
 SECTION .rodata align=16  
 %endif  
38    
39  ALIGN 16  ALIGN SECTION_ALIGN
40  plus_one:  plus_one:
41          times 8 dw 1          times 8 dw 1
42    
# Line 72  Line 46 
46  ;  ;
47  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
48    
49  ALIGN 16  ALIGN SECTION_ALIGN
50  mmx_quant:  mmx_quant:
51  %assign quant 0  %assign quant 0
52  %rep 32  %rep 32
# Line 86  Line 60 
60  ;  ;
61  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
62    
63  ALIGN 16  ALIGN SECTION_ALIGN
64  mmx_sub:  mmx_sub:
65  %assign quant 1  %assign quant 1
66  %rep 31  %rep 31
# Line 104  Line 78 
78  ;  ;
79  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
80    
81  ALIGN 16  ALIGN SECTION_ALIGN
82  mmx_div:  mmx_div:
83  %assign quant 1  %assign quant 1
84  %rep 31  %rep 31
# Line 116  Line 90 
90  ; Code  ; Code
91  ;=============================================================================  ;=============================================================================
92    
93  SECTION .text  SECTION .rotext align=SECTION_ALIGN
94    
95  cglobal quant_h263_intra_mmx  cglobal quant_h263_intra_mmx
96  cglobal quant_h263_intra_sse2  cglobal quant_h263_intra_sse2
# Line 139  Line 113 
113  ;  ;
114  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
115    
116  ALIGN 16  ALIGN SECTION_ALIGN
117  quant_h263_intra_mmx:  quant_h263_intra_mmx:
118    
119    push esi    mov _EAX, prm2     ; data
120      mov TMP0, prm4     ; dcscalar
121    mov esi, [esp + 4 + 8]     ; data    movsx _EAX, word [_EAX]  ; data[0]
122    mov ecx,[esp + 4 + 16]     ; dcscalar  
123    movsx eax, word [esi]      ; data[0]    sar TMP0, 1              ; dcscalar /2
124      mov TMP1, _EAX
125    sar ecx,1                  ; dcscalar /2    sar TMP1, 31             ; sgn(data[0])
126    mov edx,eax    xor TMP0,TMP1            ; *sgn(data[0])
127    sar edx,31                 ; sgn(data[0])    sub _EAX,TMP1
128    xor ecx,edx                ; *sgn(data[0])    add _EAX,TMP0            ; + (dcscalar/2)*sgn(data[0])
   sub eax,edx  
   add eax,ecx                ; + (dcscalar/2)*sgn(data[0])  
129    
130    mov ecx, [esp + 4 + 12]    ; quant    mov TMP0, prm3     ; quant
131    cdq    cdq
132    idiv dword [esp + 4 + 16]  ; dcscalar    idiv prm4d         ; dcscalar
133    cmp ecx, 1    lea TMP1, [mmx_div]
134    mov edx, [esp + 4 + 4]     ; coeff    movq mm7, [TMP1+TMP0 * 8 - 8]
135      cmp TMP0, 1
136      mov TMP1, prm1     ; coeff
137    je .low    je .low
138    
139    movq mm7, [mmx_div+ecx * 8 - 8]    mov TMP0, prm2     ; data
140    mov ecx,4    push _EAX          ; DC
141      mov _EAX, TMP0
142    
143      mov TMP0,4
144    
145  .loop:  .loop:
146    movq mm0, [esi]           ; data    movq mm0, [_EAX]           ; data
147    pxor mm4,mm4    pxor mm4,mm4
148    movq mm1, [esi + 8]    movq mm1, [_EAX + 8]
149    pcmpgtw mm4,mm0           ; (data<0)    pcmpgtw mm4,mm0           ; (data<0)
150    pxor mm5,mm5    pxor mm5,mm5
151    pmulhw mm0,mm7            ; /(2*quant)    pmulhw mm0,mm7            ; /(2*quant)
152    pcmpgtw mm5,mm1    pcmpgtw mm5,mm1
153    movq mm2, [esi+16]    movq mm2, [_EAX+16]
154    psubw mm0,mm4             ;  +(data<0)    psubw mm0,mm4             ;  +(data<0)
155    pmulhw mm1,mm7    pmulhw mm1,mm7
156    pxor mm4,mm4    pxor mm4,mm4
157    movq mm3,[esi+24]    movq mm3,[_EAX+24]
158    pcmpgtw mm4,mm2    pcmpgtw mm4,mm2
159    psubw mm1,mm5    psubw mm1,mm5
160    pmulhw mm2,mm7    pmulhw mm2,mm7
# Line 186  Line 163 
163    pmulhw mm3,mm7    pmulhw mm3,mm7
164    psubw mm2,mm4    psubw mm2,mm4
165    psubw mm3,mm5    psubw mm3,mm5
166    movq [edx], mm0    movq [TMP1], mm0
167    lea esi, [esi+32]    lea _EAX, [_EAX+32]
168    movq [edx + 8], mm1    movq [TMP1 + 8], mm1
169    movq [edx + 16], mm2    movq [TMP1 + 16], mm2
170    movq [edx + 24], mm3    movq [TMP1 + 24], mm3
171    
172    dec ecx    dec TMP0
173    lea edx, [edx+32]    lea TMP1, [TMP1+32]
174    jne .loop    jne .loop
175    jmp .end    jmp .end
176    
177  .low:  .low:
178    movd mm7,ecx    movd mm7,TMP0d
179    mov ecx,4  
180      mov TMP0, prm2
181      push _EAX
182      mov _EAX, TMP0
183    
184      mov TMP0,4
185  .loop_low:  .loop_low:
186    movq mm0, [esi]    movq mm0, [_EAX]
187    pxor mm4,mm4    pxor mm4,mm4
188    movq mm1, [esi + 8]    movq mm1, [_EAX + 8]
189    pcmpgtw mm4,mm0    pcmpgtw mm4,mm0
190    pxor mm5,mm5    pxor mm5,mm5
191    psubw mm0,mm4    psubw mm0,mm4
192    pcmpgtw mm5,mm1    pcmpgtw mm5,mm1
193    psraw mm0,mm7    psraw mm0,mm7
194    psubw mm1,mm5    psubw mm1,mm5
195    movq mm2,[esi+16]    movq mm2,[_EAX+16]
196    pxor mm4,mm4    pxor mm4,mm4
197    psraw mm1,mm7    psraw mm1,mm7
198    pcmpgtw mm4,mm2    pcmpgtw mm4,mm2
199    pxor mm5,mm5    pxor mm5,mm5
200    psubw mm2,mm4    psubw mm2,mm4
201    movq mm3,[esi+24]    movq mm3,[_EAX+24]
202    pcmpgtw mm5,mm3    pcmpgtw mm5,mm3
203    psraw mm2,mm7    psraw mm2,mm7
204    psubw mm3,mm5    psubw mm3,mm5
205    movq [edx], mm0    movq [TMP1], mm0
206    psraw mm3,mm7    psraw mm3,mm7
207    movq [edx + 8], mm1    movq [TMP1 + 8], mm1
208    movq [edx+16],mm2    movq [TMP1+16],mm2
209    lea esi, [esi+32]    lea _EAX, [_EAX+32]
210    movq [edx+24],mm3    movq [TMP1+24],mm3
211    
212    dec ecx    dec TMP0
213    lea edx, [edx+32]    lea TMP1, [TMP1+32]
214    jne .loop_low    jne .loop_low
215    
216  .end:  .end:
   mov edx, [esp + 4 + 4]     ; coeff  
   mov [edx],ax  
   xor eax,eax                ; return 0  
217    
218    pop esi    pop _EAX
219    
220      mov TMP1, prm1     ; coeff
221      mov [TMP1],ax
222      xor _EAX,_EAX       ; return 0
223    
224    ret    ret
225  ENDFUNC  ENDFUNC
226    
# Line 251  Line 235 
235  ;  ;
236  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
237    
238  ALIGN 16  ALIGN SECTION_ALIGN
239  quant_h263_intra_sse2:  quant_h263_intra_sse2:
240    
241    push esi    mov _EAX, prm2     ; data
   
   mov esi, [esp + 4 + 8]     ; data  
242    
243    movsx eax, word [esi]      ; data[0]    movsx _EAX, word [_EAX]      ; data[0]
244    
245    mov ecx,[esp + 4 + 16]     ; dcscalar    mov TMP0,prm4     ; dcscalar
246    mov edx,eax    mov TMP1,_EAX
247    sar ecx,1    sar TMP0,1
248    add eax,ecx    add _EAX,TMP0
249    sub edx,ecx    sub TMP1,TMP0
250    cmovl eax,edx              ; +/- dcscalar/2    cmovl _EAX,TMP1              ; +/- dcscalar/2
251    mov ecx, [esp + 4 + 12]    ; quant    mov TMP0, prm3    ; quant
252    cdq    cdq
253    idiv dword [esp + 4 + 16]  ; dcscalar    idiv prm4d  ; dcscalar
254    cmp ecx, 1    cmp TMP0, 1
255    mov edx, [esp + 4 + 4]     ; coeff    lea TMP1, [mmx_div]
256    movq xmm7, [mmx_div+ecx * 8 - 8]    movq xmm7, [TMP1+TMP0 * 8 - 8]
257    je .low    mov TMP1, prm1     ; coeff
258      je near .low
259    
260      mov TMP0, prm2
261      push _EAX ; DC
262      mov _EAX, TMP0
263    
264    mov ecx,2    mov TMP0,2
265    movlhps xmm7,xmm7    movlhps xmm7,xmm7
266    
267  .loop:  .loop:
268    movdqa xmm0, [esi]    movdqa xmm0, [_EAX]
269    pxor xmm4,xmm4    pxor xmm4,xmm4
270    movdqa xmm1, [esi + 16]    movdqa xmm1, [_EAX + 16]
271    pcmpgtw xmm4,xmm0    pcmpgtw xmm4,xmm0
272    pxor xmm5,xmm5    pxor xmm5,xmm5
273    pmulhw xmm0,xmm7    pmulhw xmm0,xmm7
274    pcmpgtw xmm5,xmm1    pcmpgtw xmm5,xmm1
275    movdqa xmm2, [esi+32]    movdqa xmm2, [_EAX+32]
276    psubw xmm0,xmm4    psubw xmm0,xmm4
277    pmulhw xmm1,xmm7    pmulhw xmm1,xmm7
278    pxor xmm4,xmm4    pxor xmm4,xmm4
279    movdqa xmm3,[esi+48]    movdqa xmm3,[_EAX+48]
280    pcmpgtw xmm4,xmm2    pcmpgtw xmm4,xmm2
281    psubw xmm1,xmm5    psubw xmm1,xmm5
282    pmulhw xmm2,xmm7    pmulhw xmm2,xmm7
# Line 298  Line 285 
285    pmulhw xmm3,xmm7    pmulhw xmm3,xmm7
286    psubw xmm2,xmm4    psubw xmm2,xmm4
287    psubw xmm3,xmm5    psubw xmm3,xmm5
288    movdqa [edx], xmm0    movdqa [TMP1], xmm0
289    lea esi, [esi+64]    lea _EAX, [_EAX+64]
290    movdqa [edx + 16], xmm1    movdqa [TMP1 + 16], xmm1
291    movdqa [edx + 32], xmm2    movdqa [TMP1 + 32], xmm2
292    movdqa [edx + 48], xmm3    movdqa [TMP1 + 48], xmm3
293    
294    dec ecx    dec TMP0
295    lea edx, [edx+64]    lea TMP1, [TMP1+64]
296    jne .loop    jne .loop
297    jmp .end    jmp .end
298    
299  .low:  .low:
300    movd xmm7,ecx    movd xmm7,TMP0d
301    mov ecx,2  
302      mov TMP0, prm2
303      push _EAX ; DC
304      mov _EAX, TMP0
305    
306      mov TMP0,2
307  .loop_low:  .loop_low:
308    movdqa xmm0, [esi]    movdqa xmm0, [_EAX]
309    pxor xmm4,xmm4    pxor xmm4,xmm4
310    movdqa xmm1, [esi + 16]    movdqa xmm1, [_EAX + 16]
311    pcmpgtw xmm4,xmm0    pcmpgtw xmm4,xmm0
312    pxor xmm5,xmm5    pxor xmm5,xmm5
313    psubw xmm0,xmm4    psubw xmm0,xmm4
314    pcmpgtw xmm5,xmm1    pcmpgtw xmm5,xmm1
315    psraw xmm0,xmm7    psraw xmm0,xmm7
316    psubw xmm1,xmm5    psubw xmm1,xmm5
317    movdqa xmm2,[esi+32]    movdqa xmm2,[_EAX+32]
318    pxor xmm4,xmm4    pxor xmm4,xmm4
319    psraw xmm1,xmm7    psraw xmm1,xmm7
320    pcmpgtw xmm4,xmm2    pcmpgtw xmm4,xmm2
321    pxor xmm5,xmm5    pxor xmm5,xmm5
322    psubw xmm2,xmm4    psubw xmm2,xmm4
323    movdqa xmm3,[esi+48]    movdqa xmm3,[_EAX+48]
324    pcmpgtw xmm5,xmm3    pcmpgtw xmm5,xmm3
325    psraw xmm2,xmm7    psraw xmm2,xmm7
326    psubw xmm3,xmm5    psubw xmm3,xmm5
327    movdqa [edx], xmm0    movdqa [TMP1], xmm0
328    psraw xmm3,xmm7    psraw xmm3,xmm7
329    movdqa [edx+16], xmm1    movdqa [TMP1+16], xmm1
330    movdqa [edx+32],xmm2    movdqa [TMP1+32],xmm2
331    lea esi, [esi+64]    lea _EAX, [_EAX+64]
332    movdqa [edx+48],xmm3    movdqa [TMP1+48],xmm3
333    
334    dec ecx    dec TMP0
335    lea edx, [edx+64]    lea TMP1, [TMP1+64]
336    jne .loop_low    jne .loop_low
337    
338  .end:  .end:
   mov edx, [esp + 4 + 4]     ; coeff  
   mov [edx],ax  
   xor eax,eax                ; return 0  
339    
340    pop esi    pop _EAX
341    
342      mov TMP1, prm1     ; coeff
343      mov [TMP1],ax
344      xor _EAX,_EAX            ; return 0
345    
346    ret    ret
347  ENDFUNC  ENDFUNC
348    
# Line 361  Line 355 
355  ;  ;
356  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
357    
358  ALIGN 16  ALIGN SECTION_ALIGN
359  quant_h263_inter_mmx:  quant_h263_inter_mmx:
360    
361    push ecx    mov TMP1, prm1           ; coeff
362    push esi    mov _EAX, prm3           ; quant
   push edi  
   
   mov edi, [esp + 12 + 4]           ; coeff  
   mov esi, [esp + 12 + 8]           ; data  
   mov eax, [esp + 12 + 12]          ; quant  
   
   xor ecx, ecx  
363    
364    pxor mm5, mm5                     ; sum    pxor mm5, mm5                     ; sum
365    movq mm6, [mmx_sub + eax * 8 - 8] ; sub    lea TMP0, [mmx_sub]
366      movq mm6, [TMP0 + _EAX * 8 - 8] ; sub
367    
368    cmp al, 1    cmp al, 1
369    jz .q1loop    jz near .q1routine
370    
371      lea TMP0, [mmx_div]
372      movq mm7, [TMP0 + _EAX * 8 - 8] ; divider
373    
374    movq mm7, [mmx_div + eax * 8 - 8] ; divider    xor TMP0, TMP0
375      mov _EAX, prm2           ; data
376    
377  ALIGN 8  ALIGN SECTION_ALIGN
378  .loop:  .loop:
379    movq mm0, [esi + 8*ecx]           ; mm0 = [1st]    movq mm0, [_EAX + 8*TMP0]           ; mm0 = [1st]
380    movq mm3, [esi + 8*ecx + 8]    movq mm3, [_EAX + 8*TMP0 + 8]
381    pxor mm1, mm1                     ; mm1 = 0    pxor mm1, mm1                     ; mm1 = 0
382    pxor mm4, mm4                     ;    pxor mm4, mm4                     ;
383    pcmpgtw mm1, mm0                  ; mm1 = (0 > mm0)    pcmpgtw mm1, mm0                  ; mm1 = (0 > mm0)
# Line 404  Line 396 
396    pxor mm3, mm4                     ;    pxor mm3, mm4                     ;
397    psubw mm0, mm1                    ; undisplace    psubw mm0, mm1                    ; undisplace
398    psubw mm3, mm4    psubw mm3, mm4
399    movq [edi + 8*ecx], mm0    movq [TMP1 + 8*TMP0], mm0
400    movq [edi + 8*ecx + 8], mm3    movq [TMP1 + 8*TMP0 + 8], mm3
401    
402    add ecx, 2    add TMP0, 2
403    cmp ecx, 16    cmp TMP0, 16
404    jnz .loop    jnz .loop
405    
406  .done:  .done:
# Line 418  Line 410 
410    paddd mm0, mm5    paddd mm0, mm5
411    
412    movd eax, mm0     ; return sum    movd eax, mm0     ; return sum
   pop edi  
   pop esi  
   pop ecx  
413    
414    ret    ret
415    
416  ALIGN 8  .q1routine:
417      xor TMP0, TMP0
418      mov _EAX, prm2           ; data
419    
420    ALIGN SECTION_ALIGN
421  .q1loop:  .q1loop:
422    movq mm0, [esi + 8*ecx]           ; mm0 = [1st]    movq mm0, [_EAX + 8*TMP0]           ; mm0 = [1st]
423    movq mm3, [esi + 8*ecx+ 8]        ;    movq mm3, [_EAX + 8*TMP0+ 8]        ;
424    pxor mm1, mm1                     ; mm1 = 0    pxor mm1, mm1                     ; mm1 = 0
425    pxor mm4, mm4                     ;    pxor mm4, mm4                     ;
426    pcmpgtw mm1, mm0                  ; mm1 = (0 > mm0)    pcmpgtw mm1, mm0                  ; mm1 = (0 > mm0)
# Line 446  Line 439 
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 [TMP1 + 8*TMP0], mm0
443    movq [edi + 8*ecx + 8], mm3    movq [TMP1 + 8*TMP0 + 8], mm3
444    
445    add ecx, 2    add TMP0, 2
446    cmp ecx, 16    cmp TMP0, 16
447    jnz .q1loop    jnz .q1loop
448    
449    jmp .done    jmp .done
# Line 467  Line 460 
460  ;  ;
461  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
462    
463  ALIGN 16  ALIGN SECTION_ALIGN
464  quant_h263_inter_sse2:  quant_h263_inter_sse2:
465    
466    push esi    mov TMP1, prm1      ; coeff
467    push edi    mov _EAX, prm3      ; quant
   
   mov edi, [esp + 8 + 4]      ; coeff  
   mov esi, [esp + 8 + 8]      ; data  
   mov eax, [esp + 8 + 12]     ; quant  
   
   xor ecx, ecx  
468    
469    pxor xmm5, xmm5                           ; sum    pxor xmm5, xmm5                           ; sum
470    
471    movq mm0, [mmx_sub + eax*8 - 8]           ; sub    lea TMP0, [mmx_sub]
472      movq mm0, [TMP0 + _EAX*8 - 8]             ; sub
473    movq2dq xmm6, mm0                         ; load into low 8 bytes    movq2dq xmm6, mm0                         ; load into low 8 bytes
474    movlhps xmm6, xmm6                        ; duplicate into high 8 bytes    movlhps xmm6, xmm6                        ; duplicate into high 8 bytes
475    
476    cmp al, 1    cmp al, 1
477    jz near .qes2_q1loop    jz near .qes2_q1_routine
478    
479  .qes2_not1:  .qes2_not1:
480    movq mm0, [mmx_div + eax*8 - 8]           ; divider    lea TMP0, [mmx_div]
481      movq mm0, [TMP0 + _EAX*8 - 8]          ; divider
482    
483      xor TMP0, TMP0
484      mov _EAX, prm2      ; data
485    
486    movq2dq xmm7, mm0    movq2dq xmm7, mm0
487    movlhps xmm7, xmm7    movlhps xmm7, xmm7
488    
489  ALIGN 16  ALIGN SECTION_ALIGN
490  .qes2_loop:  .qes2_loop:
491    movdqa xmm0, [esi + ecx*8]                ; xmm0 = [1st]    movdqa xmm0, [_EAX + TMP0*8]               ; xmm0 = [1st]
492    movdqa xmm3, [esi + ecx*8 + 16]           ; xmm3 = [2nd]    movdqa xmm3, [_EAX + TMP0*8 + 16]          ; xmm3 = [2nd]
493    pxor xmm1, xmm1    pxor xmm1, xmm1
494    pxor xmm4, xmm4    pxor xmm4, xmm4
495    pcmpgtw xmm1, xmm0    pcmpgtw xmm1, xmm0
# Line 515  Line 508 
508    pxor xmm3, xmm4    pxor xmm3, xmm4
509    psubw xmm0, xmm1    psubw xmm0, xmm1
510    psubw xmm3, xmm4    psubw xmm3, xmm4
511    movdqa [edi + ecx*8], xmm0    movdqa [TMP1 + TMP0*8], xmm0
512    movdqa [edi + ecx*8 + 16], xmm3    movdqa [TMP1 + TMP0*8 + 16], xmm3
513    
514    add ecx, 4    add TMP0, 4
515    cmp ecx, 16    cmp TMP0, 16
516    jnz .qes2_loop    jnz .qes2_loop
517    
518  .qes2_done:  .qes2_done:
# Line 535  Line 528 
528    
529    movd eax, mm0         ; return sum    movd eax, mm0         ; return sum
530    
   pop edi  
   pop esi  
   
531    ret    ret
532    
533  ALIGN 16  .qes2_q1_routine:
534      xor TMP0, TMP0
535      mov _EAX, prm2      ; data
536    
537    ALIGN SECTION_ALIGN
538  .qes2_q1loop:  .qes2_q1loop:
539    movdqa xmm0, [esi + ecx*8]        ; xmm0 = [1st]    movdqa xmm0, [_EAX + TMP0*8]        ; xmm0 = [1st]
540    movdqa xmm3, [esi + ecx*8 + 16]   ; xmm3 = [2nd]    movdqa xmm3, [_EAX + TMP0*8 + 16]   ; xmm3 = [2nd]
541    pxor xmm1, xmm1    pxor xmm1, xmm1
542    pxor xmm4, xmm4    pxor xmm4, xmm4
543    pcmpgtw xmm1, xmm0    pcmpgtw xmm1, xmm0
# Line 562  Line 556 
556    pxor xmm3, xmm4    pxor xmm3, xmm4
557    psubw xmm0, xmm1    psubw xmm0, xmm1
558    psubw xmm3, xmm4    psubw xmm3, xmm4
559    movdqa [edi + ecx*8], xmm0    movdqa [TMP1 + TMP0*8], xmm0
560    movdqa [edi + ecx*8 + 16], xmm3    movdqa [TMP1 + TMP0*8 + 16], xmm3
561    
562    add ecx, 4    add TMP0, 4
563    cmp ecx, 16    cmp TMP0, 16
564    jnz .qes2_q1loop    jnz .qes2_q1loop
565    jmp .qes2_done    jmp .qes2_done
566  ENDFUNC  ENDFUNC
# Line 582  Line 576 
576  ;  ;
577  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
578    
579  ALIGN 16  ALIGN SECTION_ALIGN
580  dequant_h263_intra_mmx:  dequant_h263_intra_mmx:
581    
582    mov ecx, [esp+12]                 ; quant    mov TMP0, prm3                 ; quant
583    mov eax, [esp+ 8]                 ; coeff    mov _EAX, prm2                 ; coeff
584    pcmpeqw mm0,mm0    pcmpeqw mm0,mm0
585    movq mm6, [mmx_quant + ecx*8]     ; quant    lea TMP1, [mmx_quant]
586    shl ecx,31                        ; quant & 1 ? 0 : - 1    movq mm6, [TMP1 + TMP0*8] ; quant
587      shl TMP0,31                    ; quant & 1 ? 0 : - 1
588    movq mm7,mm6    movq mm7,mm6
589    movq mm5,mm0    movq mm5,mm0
590    movd mm1,ecx    movd mm1,TMP0d
591    mov edx, [esp+ 4]                 ; data    mov TMP1, prm1                 ; data
592    psllw mm0,mm1    psllw mm0,mm1
593    paddw mm7,mm7                     ; 2*quant    paddw mm7,mm7                     ; 2*quant
594    paddw mm6,mm0                     ; quant-1    paddw mm6,mm0                     ; quant-1
595    psllw mm5,12    psllw mm5,12
596    mov ecx,8    mov TMP0,8
597    psrlw mm5,1    psrlw mm5,1
598    
599  .loop:  .loop:
600    movq mm0,[eax]    movq mm0,[_EAX]
601    pxor mm2,mm2    pxor mm2,mm2
602    pxor mm4,mm4    pxor mm4,mm4
603    pcmpgtw mm2,mm0    pcmpgtw mm2,mm0
604    pcmpeqw mm4,mm0    pcmpeqw mm4,mm0
605    pmullw mm0,mm7      ; * 2 * quant    pmullw mm0,mm7      ; * 2 * quant
606    movq mm1,[eax+8]    movq mm1,[_EAX+8]
607    psubw mm0,mm2    psubw mm0,mm2
608    pxor mm2,mm6    pxor mm2,mm6
609    pxor mm3,mm3    pxor mm3,mm3
# Line 632  Line 627 
627    paddsw mm0, mm5    paddsw mm0, mm5
628    paddsw mm1, mm5    paddsw mm1, mm5
629    
630    movq [edx],mm0    movq [TMP1],mm0
631    lea eax,[eax+16]    lea _EAX,[_EAX+16]
632    movq [edx+8],mm1    movq [TMP1+8],mm1
633    
634    dec ecx    dec TMP0
635    lea edx,[edx+16]    lea TMP1,[TMP1+16]
636    jne .loop    jne .loop
637    
638     ; deal with DC     ; deal with DC
639    mov eax, [esp+ 8]                ; coeff    mov _EAX, prm2               ; coeff
640    movd mm1,[esp+16]                ; dcscalar    movd mm1,prm4d                ; dcscalar
641    movd mm0,[eax]                   ; coeff[0]    movd mm0,[_EAX]                   ; coeff[0]
642    pmullw mm0,mm1                   ; * dcscalar    pmullw mm0,mm1                   ; * dcscalar
643    mov edx, [esp+ 4]                ; data    mov TMP1, prm1               ; data
644    paddsw mm0, mm5                  ; saturate +    paddsw mm0, mm5                  ; saturate +
645    psubsw mm0, mm5    psubsw mm0, mm5
646    psubsw mm0, mm5                  ; saturate -    psubsw mm0, mm5                  ; saturate -
647    paddsw mm0, mm5    paddsw mm0, mm5
648    movd eax,mm0    movd eax,mm0
649    mov [edx], ax    mov [TMP1], ax
650    
651    xor eax, eax                    ; return 0    xor _EAX, _EAX                    ; return 0
652    ret    ret
653  ENDFUNC  ENDFUNC
654    
# Line 668  Line 663 
663  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
664    
665    
666  ALIGN 16  ALIGN SECTION_ALIGN
667  dequant_h263_intra_xmm:  dequant_h263_intra_xmm:
668    
669    mov ecx, [esp+12]                 ; quant    mov TMP0, prm3                 ; quant
670    mov eax, [esp+ 8]                 ; coeff    mov _EAX, prm2                 ; coeff
671    
672    movd mm6,ecx                      ; quant    movd mm6,TMP0d                  ; quant
673    pcmpeqw mm0,mm0    pcmpeqw mm0,mm0
674    pshufw mm6,mm6,0                  ; all quant    pshufw mm6,mm6,0                  ; all quant
675    shl ecx,31    shl TMP0,31
676    movq mm5,mm0    movq mm5,mm0
677    movq mm7,mm6    movq mm7,mm6
678    movd mm1,ecx    movd mm1,TMP0d
679    mov edx, [esp+ 4]                 ; data    mov TMP1, prm1                 ; data
680    psllw mm0,mm1                     ; quant & 1 ? 0 : - 1    psllw mm0,mm1                     ; quant & 1 ? 0 : - 1
681    movq mm4,mm5    movq mm4,mm5
682    paddw mm7,mm7                     ; quant*2    paddw mm7,mm7                     ; quant*2
683    paddw mm6,mm0                     ; quant-1    paddw mm6,mm0                     ; quant-1
684    psrlw mm4,5                       ; mm4=2047    psrlw mm4,5                       ; mm4=2047
685    mov ecx,8    mov TMP0,8
686    pxor mm5,mm4                      ; mm5=-2048    pxor mm5,mm4                      ; mm5=-2048
687    
688  .loop:  .loop:
689    movq mm0,[eax]    movq mm0,[_EAX]
690    pxor mm2,mm2    pxor mm2,mm2
691    pxor mm3,mm3    pxor mm3,mm3
692    
693    pcmpgtw mm2,mm0    pcmpgtw mm2,mm0
694    pcmpeqw mm3,mm0     ; if coeff==0...    pcmpeqw mm3,mm0     ; if coeff==0...
695    pmullw mm0,mm7      ; * 2 * quant    pmullw mm0,mm7      ; * 2 * quant
696    movq mm1,[eax+8]    movq mm1,[_EAX+8]
697    
698    psubw mm0,mm2    psubw mm0,mm2
699    pxor mm2,mm6    pxor mm2,mm6
# Line 718  Line 713 
713    
714    pmaxsw mm0,mm5    pmaxsw mm0,mm5
715    pminsw mm1,mm4    pminsw mm1,mm4
716    movq [edx],mm0    movq [TMP1],mm0
717    pmaxsw mm1,mm5    pmaxsw mm1,mm5
718    lea eax,[eax+16]    lea _EAX,[_EAX+16]
719    movq [edx+8],mm1    movq [TMP1+8],mm1
720    
721    dec ecx    dec TMP0
722    lea edx,[edx+16]    lea TMP1,[TMP1+16]
723    jne .loop    jne .loop
724    
725     ; deal with DC     ; deal with DC
726    mov eax, [esp+ 8]                 ; coeff    mov _EAX, prm2                ; coeff
727    movd mm1,[esp+16]                 ; dcscalar    movd mm1,prm4d                 ; dcscalar
728    movd mm0, [eax]    movd mm0, [_EAX]
729    pmullw mm0, mm1    pmullw mm0, mm1
730    mov edx, [esp+ 4]                 ; data    mov TMP1, prm1                ; data
731    pminsw mm0,mm4    pminsw mm0,mm4
732    pmaxsw mm0,mm5    pmaxsw mm0,mm5
733    movd eax, mm0    movd eax, mm0
734    mov [edx], ax    mov [TMP1], ax
735    
736    xor eax, eax                      ; return 0    xor _EAX, _EAX                ; return 0
737    ret    ret
738  ENDFUNC  ENDFUNC
739    
# Line 753  Line 748 
748  ;  ;
749  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
750    
751  ALIGN 16  ALIGN SECTION_ALIGN
752  dequant_h263_intra_sse2:  dequant_h263_intra_sse2:
753    
754    mov ecx, [esp+12]                 ; quant    mov TMP0, prm3                 ; quant
755    mov eax, [esp+ 8]                 ; coeff    mov _EAX, prm2                 ; coeff
756    
757    movd xmm6,ecx                     ; quant    movd xmm6,TMP0d                     ; quant
758    
759    shl ecx,31    shl TMP0,31
760    pshuflw xmm6,xmm6,0    pshuflw xmm6,xmm6,0
761    pcmpeqw xmm0,xmm0    pcmpeqw xmm0,xmm0
762    movlhps xmm6,xmm6                 ; all quant    movlhps xmm6,xmm6                 ; all quant
763    movd xmm1,ecx    movd xmm1,TMP0d
764    movdqa xmm5,xmm0    movdqa xmm5,xmm0
765    movdqa xmm7,xmm6    movdqa xmm7,xmm6
766    mov edx, [esp+ 4]                 ; data    mov TMP1, prm1                 ; data
767    paddw xmm7,xmm7                   ; quant *2    paddw xmm7,xmm7                   ; quant *2
768    psllw xmm0,xmm1                   ; quant & 1 ? 0 : - 1    psllw xmm0,xmm1                   ; quant & 1 ? 0 : - 1
769    movdqa xmm4,xmm5    movdqa xmm4,xmm5
770    paddw xmm6,xmm0                   ; quant-1    paddw xmm6,xmm0                   ; quant-1
771    psrlw xmm4,5                      ; 2047    psrlw xmm4,5                      ; 2047
772    mov ecx,4    mov TMP0,4
773    pxor xmm5,xmm4                    ; mm5=-2048    pxor xmm5,xmm4                    ; mm5=-2048
774    
775  .loop:  .loop:
776    movdqa xmm0,[eax]    movdqa xmm0,[_EAX]
777    pxor xmm2,xmm2    pxor xmm2,xmm2
778    pxor xmm3,xmm3    pxor xmm3,xmm3
779    
780    pcmpgtw xmm2,xmm0    pcmpgtw xmm2,xmm0
781    pcmpeqw xmm3,xmm0    pcmpeqw xmm3,xmm0
782    pmullw xmm0,xmm7      ; * 2 * quant    pmullw xmm0,xmm7      ; * 2 * quant
783    movdqa xmm1,[eax+16]    movdqa xmm1,[_EAX+16]
784    
785    psubw xmm0,xmm2    psubw xmm0,xmm2
786    pxor xmm2,xmm6    pxor xmm2,xmm6
# Line 805  Line 800 
800    
801    pmaxsw xmm0,xmm5    pmaxsw xmm0,xmm5
802    pminsw xmm1,xmm4    pminsw xmm1,xmm4
803    movdqa [edx],xmm0    movdqa [TMP1],xmm0
804    pmaxsw xmm1,xmm5    pmaxsw xmm1,xmm5
805    lea eax,[eax+32]    lea _EAX,[_EAX+32]
806    movdqa [edx+16],xmm1    movdqa [TMP1+16],xmm1
807    
808    dec ecx    dec TMP0
809    lea edx,[edx+32]    lea TMP1,[TMP1+32]
810    jne .loop    jne .loop
811    
812     ; deal with DC     ; deal with DC
813    
814    mov eax, [esp+ 8]             ; coeff    mov _EAX, prm2             ; coeff
815    movsx eax,word [eax]    movsx _EAX,word [_EAX]
816    imul dword [esp+16]           ; dcscalar    imul prm4d                 ; dcscalar
817    mov edx, [esp+ 4]             ; data    mov TMP1, prm1             ; data
818    movd xmm0,eax    movd xmm0,eax
819    pminsw xmm0,xmm4    pminsw xmm0,xmm4
820    pmaxsw xmm0,xmm5    pmaxsw xmm0,xmm5
821    movd eax,xmm0    movd eax,xmm0
822    
823    mov [edx], ax    mov [TMP1], ax
824    
825    xor eax, eax                  ; return 0    xor _EAX, _EAX                  ; return 0
826    ret    ret
827  ENDFUNC  ENDFUNC
828    
# Line 840  Line 835 
835  ;  ;
836  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
837    
838  ALIGN 16  ALIGN SECTION_ALIGN
839  dequant_h263_inter_mmx:  dequant_h263_inter_mmx:
840    
841    mov ecx, [esp+12]                 ; quant    mov TMP0, prm3                 ; quant
842    mov eax, [esp+ 8]                 ; coeff    mov _EAX, prm2                 ; coeff
843    pcmpeqw mm0,mm0    pcmpeqw mm0,mm0
844    movq mm6, [mmx_quant + ecx*8]     ; quant    lea TMP1, [mmx_quant]
845    shl ecx,31                        ; odd/even    movq mm6, [TMP1 + TMP0*8]      ; quant
846      shl TMP0,31                    ; odd/even
847    movq mm7,mm6    movq mm7,mm6
848    movd mm1,ecx    movd mm1,TMP0d
849    mov edx, [esp+ 4]                 ; data    mov TMP1, prm1                 ; data
850    movq mm5,mm0    movq mm5,mm0
851    psllw mm0,mm1                     ; quant & 1 ? 0 : - 1    psllw mm0,mm1                     ; quant & 1 ? 0 : - 1
852    paddw mm7,mm7                     ; quant*2    paddw mm7,mm7                     ; quant*2
853    paddw mm6,mm0                     ; quant & 1 ? quant : quant - 1    paddw mm6,mm0                     ; quant & 1 ? quant : quant - 1
854    psllw mm5,12    psllw mm5,12
855    mov ecx,8    mov TMP0,8
856    psrlw mm5,1                       ; 32767-2047 (32768-2048)    psrlw mm5,1                       ; 32767-2047 (32768-2048)
857    
858  .loop:  .loop:
859    movq mm0,[eax]    movq mm0,[_EAX]
860    pxor mm4,mm4    pxor mm4,mm4
861    pxor mm2,mm2    pxor mm2,mm2
862    pcmpeqw mm4,mm0     ; if coeff==0...    pcmpeqw mm4,mm0     ; if coeff==0...
# Line 868  Line 864 
864    pmullw mm0,mm7      ; * 2 * quant    pmullw mm0,mm7      ; * 2 * quant
865    pxor mm3,mm3    pxor mm3,mm3
866    psubw mm0,mm2    psubw mm0,mm2
867    movq mm1,[eax+8]    movq mm1,[_EAX+8]
868    pxor mm2,mm6    pxor mm2,mm6
869    pcmpgtw mm3,mm1    pcmpgtw mm3,mm1
870    pandn mm4,mm2      ; ... then data==0    pandn mm4,mm2      ; ... then data==0
# Line 890  Line 886 
886    paddsw mm0, mm5    paddsw mm0, mm5
887    paddsw mm1, mm5    paddsw mm1, mm5
888    
889    movq [edx],mm0    movq [TMP1],mm0
890    lea eax,[eax+16]    lea _EAX,[_EAX+16]
891    movq [edx+8],mm1    movq [TMP1+8],mm1
892    
893    dec ecx    dec TMP0
894    lea edx,[edx+16]    lea TMP1,[TMP1+16]
895    jne .loop    jne .loop
896    
897    xor eax, eax              ; return 0    xor _EAX, _EAX              ; return 0
898    ret    ret
899  ENDFUNC  ENDFUNC
900    
# Line 911  Line 907 
907  ;                                 const uint16_t *mpeg_matrices);  ;                                 const uint16_t *mpeg_matrices);
908  ;  ;
909  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
910  ALIGN 16  ALIGN SECTION_ALIGN
911  dequant_h263_inter_xmm:  dequant_h263_inter_xmm:
912    
913    mov ecx, [esp+12]                 ; quant    mov TMP0, prm3                 ; quant
914    mov eax, [esp+ 8]                 ; coeff    mov _EAX, prm2                 ; coeff
915    pcmpeqw mm0,mm0    pcmpeqw mm0,mm0
916    movq mm6, [mmx_quant + ecx*8]     ; quant    lea TMP1, [mmx_quant]
917    shl ecx,31    movq mm6, [TMP1 + TMP0*8]      ; quant
918      shl TMP0,31
919    movq mm5,mm0    movq mm5,mm0
920    movd mm1,ecx    movd mm1,TMP0d
921    movq mm7,mm6    movq mm7,mm6
922    psllw mm0,mm1    psllw mm0,mm1
923    mov edx, [esp+ 4]                 ; data    mov TMP1, prm1                 ; data
924    movq mm4,mm5    movq mm4,mm5
925    paddw mm7,mm7    paddw mm7,mm7
926    paddw mm6,mm0                     ; quant-1    paddw mm6,mm0                     ; quant-1
927    
928    psrlw mm4,5    psrlw mm4,5
929    mov ecx,8    mov TMP0,8
930    pxor mm5,mm4                      ; mm5=-2048    pxor mm5,mm4                      ; mm5=-2048
931    
932  .loop:  .loop:
933    movq mm0,[eax]    movq mm0,[_EAX]
934    pxor mm3,mm3    pxor mm3,mm3
935    pxor mm2,mm2    pxor mm2,mm2
936    pcmpeqw mm3,mm0    pcmpeqw mm3,mm0
937    pcmpgtw mm2,mm0    pcmpgtw mm2,mm0
938    pmullw mm0,mm7                    ; * 2 * quant    pmullw mm0,mm7                    ; * 2 * quant
939    pandn mm3,mm6    pandn mm3,mm6
940    movq mm1,[eax+8]    movq mm1,[_EAX+8]
941    psubw mm0,mm2    psubw mm0,mm2
942    pxor mm2,mm3    pxor mm2,mm3
943    pxor mm3,mm3    pxor mm3,mm3
# Line 959  Line 956 
956    pmaxsw mm0,mm5    pmaxsw mm0,mm5
957    pmaxsw mm1,mm5    pmaxsw mm1,mm5
958    
959    movq [edx],mm0    movq [TMP1],mm0
960    lea eax,[eax+16]    lea _EAX,[_EAX+16]
961    movq [edx+8],mm1    movq [TMP1+8],mm1
962    
963    dec ecx    dec TMP0
964    lea edx,[edx+16]    lea TMP1,[TMP1+16]
965    jne .loop    jne .loop
966    
967    xor eax, eax              ; return 0    xor _EAX, _EAX              ; return 0
968    ret    ret
969  ENDFUNC  ENDFUNC
970    
# Line 981  Line 978 
978  ;  ;
979  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
980    
981  ALIGN 16  ALIGN SECTION_ALIGN
982  dequant_h263_inter_sse2:  dequant_h263_inter_sse2:
983    
984    mov ecx, [esp+12]                 ; quant    mov TMP0, prm3                 ; quant
985    mov eax, [esp+ 8]                 ; coeff    mov _EAX, prm2                 ; coeff
986    
987    movq xmm6, [mmx_quant + ecx*8]    ; quant    lea TMP1, [mmx_quant]
988    inc ecx    movq xmm6, [TMP1 + TMP0*8]    ; quant
989      inc TMP0
990    pcmpeqw xmm5,xmm5    pcmpeqw xmm5,xmm5
991    and ecx,1    and TMP0,1
992    movlhps xmm6,xmm6    movlhps xmm6,xmm6
993    movd xmm0,ecx    movd xmm0,TMP0d
994    movdqa xmm7,xmm6    movdqa xmm7,xmm6
995    pshuflw xmm0,xmm0,0    pshuflw xmm0,xmm0,0
996    movdqa xmm4,xmm5    movdqa xmm4,xmm5
997    mov edx, [esp+ 4]                 ; data    mov TMP1, prm1                 ; data
998    movlhps xmm0,xmm0    movlhps xmm0,xmm0
999    paddw xmm7,xmm7    paddw xmm7,xmm7
1000    psubw xmm6,xmm0    psubw xmm6,xmm0
1001    psrlw xmm4,5   ; 2047    psrlw xmm4,5   ; 2047
1002    mov ecx,4    mov TMP0,4
1003    pxor xmm5,xmm4 ; mm5=-2048    pxor xmm5,xmm4 ; mm5=-2048
1004    
1005  .loop:  .loop:
1006    movdqa xmm0,[eax]    movdqa xmm0,[_EAX]
1007    pxor xmm3,xmm3    pxor xmm3,xmm3
1008    pxor xmm2,xmm2    pxor xmm2,xmm2
1009    pcmpeqw xmm3,xmm0    pcmpeqw xmm3,xmm0
1010    pcmpgtw xmm2,xmm0    pcmpgtw xmm2,xmm0
1011    pmullw xmm0,xmm7      ; * 2 * quant    pmullw xmm0,xmm7      ; * 2 * quant
1012    pandn xmm3,xmm6    pandn xmm3,xmm6
1013    movdqa xmm1,[eax+16]    movdqa xmm1,[_EAX+16]
1014    psubw xmm0,xmm2    psubw xmm0,xmm2
1015    pxor xmm2,xmm3    pxor xmm2,xmm3
1016    pxor xmm3,xmm3    pxor xmm3,xmm3
# Line 1031  Line 1029 
1029    pmaxsw xmm0,xmm5    pmaxsw xmm0,xmm5
1030    pmaxsw xmm1,xmm5    pmaxsw xmm1,xmm5
1031    
1032    movdqa [edx],xmm0    movdqa [TMP1],xmm0
1033    lea eax,[eax+32]    lea _EAX,[_EAX+32]
1034    movdqa [edx+16],xmm1    movdqa [TMP1+16],xmm1
1035    
1036    dec ecx    dec TMP0
1037    lea edx,[edx+32]    lea TMP1,[TMP1+32]
1038    jne .loop    jne .loop
1039    
1040    xor eax, eax              ; return 0    xor _EAX, _EAX              ; return 0
1041    ret    ret
1042  ENDFUNC  ENDFUNC
1043    

Legend:
Removed from v.1794  
changed lines
  Added in v.1795

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