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

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

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

revision 1519, Sat Jul 24 11:46:08 2004 UTC revision 1728, Fri Sep 22 03:40:11 2006 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.3 2004-07-24 11:46:08 edgomez Exp $  ; * $Id: quantize_mpeg_mmx.asm,v 1.8 2006-09-22 03:40:11 syskin Exp $
25  ; *  ; *
26  ; *************************************************************************/  ; *************************************************************************/
27    
# Line 31  Line 31 
31    
32  %macro cglobal 1  %macro cglobal 1
33          %ifdef PREFIX          %ifdef PREFIX
34                    %ifdef MARK_FUNCS
35                            global _%1:function %1.endfunc-%1
36                            %define %1 _%1:function %1.endfunc-%1
37                    %else
38                  global _%1                  global _%1
39                  %define %1 _%1                  %define %1 _%1
40                    %endif
41            %else
42                    %ifdef MARK_FUNCS
43                            global %1:function %1.endfunc-%1
44          %else          %else
45                  global %1                  global %1
46          %endif          %endif
47            %endif
48  %endmacro  %endmacro
49    
50  %macro cextern 1  %macro cextern 1
# Line 120  Line 129 
129          times 4 dw 0          times 4 dw 0
130    
131  ;=============================================================================  ;=============================================================================
132    ; rounding
133    ;=============================================================================
134    
135    mmx_rounding:
136            dw (1<<13)
137            dw 0
138            dw (1<<13)
139            dw 0
140    
141    ;=============================================================================
142  ; Code  ; Code
143  ;=============================================================================  ;=============================================================================
144    
# Line 130  Line 149 
149  cglobal dequant_mpeg_intra_mmx  cglobal dequant_mpeg_intra_mmx
150  cglobal dequant_mpeg_inter_mmx  cglobal dequant_mpeg_inter_mmx
151    
152    
153    %macro QUANT_MMX        1
154            movq    mm0, [eax + 16*(%1)]                    ; data
155            movq    mm2, [ecx + 16*(%1) + 128]              ; intra_matrix_rec
156            movq    mm4, [eax + 16*(%1) + 8]                ; data
157            movq    mm6, [ecx + 16*(%1) + 128 + 8]  ; intra_matrix_rec
158    
159            movq    mm1, mm0
160            movq    mm5, mm4
161    
162            pmullw  mm0, mm2                                        ; low results
163            pmulhw  mm1, mm2                                        ; high results
164            pmullw  mm4, mm6                                        ; low results
165            pmulhw  mm5, mm6                                        ; high results
166    
167            movq    mm2, mm0
168            movq    mm6, mm4
169    
170            punpckhwd mm0, mm1
171            punpcklwd mm2, mm1
172            punpckhwd mm4, mm5
173            punpcklwd mm6, mm5
174    
175            paddd   mm2, mm7
176            paddd   mm0, mm7
177            paddd   mm6, mm7
178            paddd   mm4, mm7
179    
180            psrad   mm2, 14
181            psrad   mm0, 14
182            psrad   mm6, 14
183            psrad   mm4, 14
184    
185            packssdw mm2, mm0
186            packssdw mm6, mm4
187    
188            movq    [edi + 16*(%1)], mm2
189            movq    [edi + 16*(%1)+8], mm6
190    %endmacro
191    
192  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
193  ;  ;
194  ; uint32_t quant_mpeg_intra_mmx(int16_t * coeff,  ; uint32_t quant_mpeg_intra_mmx(int16_t * coeff,
# Line 143  Line 202 
202  ALIGN 16  ALIGN 16
203  quant_mpeg_intra_mmx:  quant_mpeg_intra_mmx:
204    
   push ecx  
   push esi  
205    push edi    push edi
206    push ebx    movq mm7, [mmx_rounding]
   
   mov edi, [esp + 16 + 4]       ; coeff  
   mov esi, [esp + 16 + 8]       ; data  
   mov eax, [esp + 16 + 12]      ; quant  
   mov ebx, [esp + 16 + 20]              ; mpeg_quant_matrices  
   
   movq mm5, [quantd + eax * 8 - 8] ; quantd -> mm5  
   
   xor ecx, ecx  
   cmp al, 1  
   jz near .q1loop  
   
   cmp al, 2  
   jz near .q2loop  
   
   movq mm7, [mmx_div + eax * 8 - 8] ; multipliers[quant] -> mm7  
   
 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                ;  
   psllw mm0, 4                  ; level << 4  
   psllw mm3, 4  
   movq mm2, [ebx + 8*ecx]  
   psrlw mm2, 1                  ; intra_matrix[i]>>1  
   paddw mm0, mm2  
   movq mm2, [ebx + 256 + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [ebx + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [ebx + 256 + ecx*8 + 8]  
   pmulhw mm3, mm2  
   paddw mm0, mm5                ; + quantd  
   paddw mm3, mm5  
   pmulhw mm0, mm7               ; mm0 = (mm0 / 2Q) >> 16  
   pmulhw mm3, mm7               ;  
   psrlw mm0, 1                  ; additional shift by 1 => 16 + 1 = 17  
   psrlw mm3, 1  
   pxor mm0, mm1                 ; mm0 *= sign(mm0)  
   pxor mm3, mm4                 ;  
   psubw mm0, mm1                ; undisplace  
   psubw mm3, mm4                ;  
207    
208    movq [edi + 8*ecx], mm0    mov eax, [esp + 4 + 8]                ; data
209    movq [edi + 8*ecx + 8], mm3    mov ecx, [esp + 4 + 20]               ; mpeg_quant_matrices
210      mov edi, [esp + 4 + 4]                ; coeff
211    
212      QUANT_MMX(0)
213      QUANT_MMX(1)
214      QUANT_MMX(2)
215      QUANT_MMX(3)
216      QUANT_MMX(4)
217      QUANT_MMX(5)
218      QUANT_MMX(6)
219      QUANT_MMX(7)
220    
221      ; calculate DC
222      movsx eax, word [eax]     ; data[0]
223      mov ecx, [esp + 4 + 16]   ; dcscalar
224      mov edx, eax
225      mov edi, ecx
226      shr ecx, 1                ; ecx = dcscalar/2
227      sar edx, 31               ; edx = sign extend of eax (ready for division too)
228      xor ecx, edx              ; adjust ecx according to the sign of data[0]
229      sub ecx, edx
230      add eax, ecx
231    
232      mov ecx, [esp + 4 + 4]        ; coeff again
233      idiv edi                  ; eax = edx:eax / dcscalar
234      mov [ecx], ax             ; coeff[0] = ax
235    
   add ecx,2  
   cmp ecx,16  
   jnz near .loop  
   
 .done  
   ; caclulate  data[0] // (int32_t)dcscalar)  
   mov ecx, [esp + 16 + 16]  ; dcscalar  
   mov edx, ecx  
   movsx eax, word [esi]     ; data[0]  
   shr edx, 1                ; edx = dcscalar /2  
   cmp eax, 0  
   jg .gtzero  
   
   sub eax, edx  
   jmp short .mul  
 .gtzero  
   add eax, edx  
 .mul  
   cdq                       ; expand eax -> edx:eax  
   idiv ecx                  ; eax = edx:eax / dcscalar  
   
   mov [edi], ax             ; coeff[0] = ax  
   
   pop ebx  
236    pop edi    pop edi
   pop esi  
   pop ecx  
237    
238    xor eax, eax              ; return(0);    xor eax, eax              ; return(0);
239    ret    ret
240    .endfunc
 ALIGN 16  
 .q1loop  
   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                ;  
   psllw mm0, 4  
   psllw mm3, 4  
   movq mm2, [ebx + 8*ecx]  
   psrlw mm2, 1  
   paddw mm0, mm2  
   movq mm2, [ebx + 256 + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [ebx + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [ebx + 256 + ecx*8 + 8]  
   pmulhw mm3, mm2  
   paddw mm0, mm5  
   paddw mm3, mm5  
   psrlw mm0, 1              ; mm0 >>= 1   (/2)  
   psrlw mm3, 1              ;  
   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 near .q1loop  
   jmp near .done  
   
   
 ALIGN 16  
 .q2loop  
   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                ;  
   psllw mm0, 4  
   psllw mm3, 4  
   movq mm2, [ebx + 8*ecx]  
   psrlw mm2, 1  
   paddw mm0, mm2  
   movq mm2, [ebx + 256 + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [ebx + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [ebx + 256 + ecx*8 + 8]  
   pmulhw mm3, mm2  
   paddw mm0, mm5  
   paddw mm3, mm5  
   psrlw mm0, 2                  ; mm0 >>= 1   (/4)  
   psrlw mm3, 2                  ;  
   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 near .q2loop  
   jmp near .done  
241    
242    
243  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 445  Line 370 
370    
371    jmp .done    jmp .done
372    
   
373  ALIGN 16  ALIGN 16
374  .q2loop  .q2loop
375    movq mm0, [esi + 8*ecx]       ; mm0 = [1st]    movq mm0, [esi + 8*ecx]       ; mm0 = [1st]
# Line 486  Line 410 
410    jnz near .q2loop    jnz near .q2loop
411    
412    jmp .done    jmp .done
413    .endfunc
414    
415    
416  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 625  Line 550 
550    pop ebx    pop ebx
551    
552    ret    ret
553    .endfunc
554    
555  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
556  ;  ;
# Line 738  Line 664 
664    pop ebx    pop ebx
665    
666    ret    ret
667    .endfunc
668    

Legend:
Removed from v.1519  
changed lines
  Added in v.1728

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