[svn] / trunk / xvidcore / src / plugins / x86_asm / plugin_ssim-a.asm Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/plugins/x86_asm/plugin_ssim-a.asm

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

revision 1740, Thu Oct 26 16:34:32 2006 UTC revision 1743, Mon Oct 30 11:21:42 2006 UTC
# Line 51  Line 51 
51          paddw  %1, %2          paddw  %1, %2
52  %endmacro  %endmacro
53    
         ;load a dq from mem to a xmm reg  
 %macro LOAD_XMM 2  
         movdqu %1,[%2]  
         ;movhps %1,[%2+8]  
 %endmacro  
   
 %macro WRITE_XMM 2  
         ;movlps [%1],%2  
         ;movhps [%1+8],%2  
         movdqu [%1],%2  
 %endmacro  
   
54  %macro CONSIM_1x8_SSE2 0  %macro CONSIM_1x8_SSE2 0
55          LOAD_XMM xmm0,ecx          movdqu xmm0,[ecx]
56          LOAD_XMM xmm1,edx          movdqu xmm1,[edx]
         pxor xmm2,xmm2  
57    
58          ;unpack to words          ;unpack to words
59          punpcklbw xmm0,xmm2          punpcklbw xmm0,xmm2
60          punpcklbw xmm1,xmm2          punpcklbw xmm1,xmm2
61    
62          ;devo          movaps xmm3,xmm0
63          psubw xmm0,xmm6          movaps xmm4,xmm1
         movaps xmm2,xmm0  
         pmaddwd xmm2,xmm0  
         paddd xmm3,xmm2  
   
         ;devc  
         psubw xmm1,xmm7  
         movaps xmm2,xmm1  
         pmaddwd xmm2,xmm1  
         paddd xmm4,xmm2  
   
         ;corr  
         pmaddwd xmm1,xmm0  
         paddd xmm5,xmm1  
 %endmacro  
64    
65            pmaddwd xmm0,xmm0;orig
66            pmaddwd xmm1,xmm1;comp
67            pmaddwd xmm3,xmm4;corr
68    
69            paddd xmm5,xmm0
70            paddd xmm6,xmm1
71            paddd xmm7,xmm3
72    %endmacro
73    
74  %macro CONSIM_1x8_MMX 0  %macro CONSIM_1x8_MMX 0
75          movq mm0,[ecx];orig          movq mm0,[ecx];orig
76          movq mm1,[edx];comp          movq mm1,[edx];comp
         pxor mm2,mm2;null vector  
77    
78          ;unpack low half of qw to words          ;unpack low half of qw to words
79          punpcklbw mm0,mm2          punpcklbw mm0,mm2
80          punpcklbw mm1,mm2          punpcklbw mm1,mm2
81    
82          ;devo          movq mm3,mm0
83          psubw mm0,mm6          pmaddwd mm3,mm0
84          movq mm2,mm0          paddd mm5,mm3;
85          pmaddwd mm2,mm0  
86          paddd mm3,mm2;          movq mm4,mm1
87            pmaddwd mm4,mm1
88          ;devc          paddd mm6,mm4;
         psubw mm1,mm7  
         movq mm2,mm1  
         pmaddwd mm2,mm1  
         paddd mm4,mm2  
89    
         ;corr  
90          pmaddwd mm1,mm0          pmaddwd mm1,mm0
91          paddd mm5,mm1          paddd mm7,mm1
92    
93          movq mm0,[ecx]          movq mm0,[ecx];orig
94          movq mm1,[edx]          movq mm1,[edx];comp
         pxor mm2,mm2;null vector  
95    
96          ;unpack high half of qw to words          ;unpack high half of qw to words
97          punpckhbw mm0,mm2          punpckhbw mm0,mm2
98          punpckhbw mm1,mm2          punpckhbw mm1,mm2
99    
100          ;devo          movq mm3,mm0
101          psubw mm0,mm6          pmaddwd mm3,mm0
102          movq mm2,mm0          paddd mm5,mm3;
103          pmaddwd mm2,mm0  
104          paddd mm3,mm2;          movq mm4,mm1
105            pmaddwd mm4,mm1
106          ;devc          paddd mm6,mm4;
         psubw mm1,mm7  
         movq mm2,mm1  
         pmaddwd mm2,mm1  
         paddd mm4,mm2  
107    
         ;corr  
108          pmaddwd mm1,mm0          pmaddwd mm1,mm0
109          paddd mm5,mm1          paddd mm7,mm1
110  %endmacro  %endmacro
111    
112    %macro CONSIM_WRITEOUT 3
113            mov eax,[esp + 16];lumo
114            mul eax; lumo^2
115            shr eax,6; 64*lum0^2
116            movd ecx,%1
117            sub ecx,eax
118    
119            mov edx,[esp + 24]; pdevo
120            mov [edx],ecx
121    
122            mov eax,[esp + 20];lumc
123            mul eax; lumc^2
124            shr eax,6; 64*lumc^2
125            movd ecx,%2
126            sub ecx,eax
127    
128            mov edx,[esp + 28]; pdevc
129            mov [edx],ecx
130    
131            mov eax,[esp + 16];lumo
132            mul dword [esp + 20]; lumo*lumc, should fit in eax
133            shr eax,6; 64*lumo*lumc
134            movd ecx,%3
135            sub ecx,eax
136    
137            mov edx,[esp + 32]; pcorr
138            mov [edx],ecx
139    %endmacro
140    
141    
142  SECTION .text  SECTION .text
# Line 174  Line 171 
171  .endfunc  .endfunc
172    
173  ALIGN 16  ALIGN 16
174  consim_mmx:  consim_sse2:
175          mov ecx,[esp+4] ;ptro          mov ecx,[esp+4] ;ptro
         pxor mm6,mm6;  
   
176          mov edx,[esp+8] ;ptrc          mov edx,[esp+8] ;ptrc
         pxor mm3,mm3;devo  
         pxor mm4,mm4;devc  
         movd mm6,[esp + 16];lumo  
         pxor mm7,mm7  
177          mov eax,[esp+12];stride          mov eax,[esp+12];stride
         movd mm7,[esp + 20];lumc  
         pshufw mm6,mm6,00000000b                ; TODO: remove later! not MMX, but SSE  
         pxor mm5,mm5;corr  
         pshufw mm7,mm7,00000000b  
178    
179          CONSIM_1x8_MMX          pxor xmm2,xmm2;null vektor
180            pxor xmm5,xmm5;devo
181            pxor xmm6,xmm6;devc
182            pxor xmm7,xmm7;corr
183    
184            ;broadcast lumo/c
185            punpcklbw xmm6,xmm6
186            punpcklwd xmm6,xmm6
187            pshufd xmm6,xmm6,00000000b;or shufps
188            punpcklbw xmm7,xmm7
189            punpcklwd xmm7,xmm7
190            pshufd xmm7,xmm7,00000000b
191    
192            CONSIM_1x8_SSE2
193          add ecx,eax          add ecx,eax
194          add edx,eax          add edx,eax
195          CONSIM_1x8_MMX          CONSIM_1x8_SSE2
196          add ecx,eax          add ecx,eax
197          add edx,eax          add edx,eax
198          CONSIM_1x8_MMX          CONSIM_1x8_SSE2
199          add ecx,eax          add ecx,eax
200          add edx,eax          add edx,eax
201          CONSIM_1x8_MMX          CONSIM_1x8_SSE2
202          add ecx,eax          add ecx,eax
203          add edx,eax          add edx,eax
204          CONSIM_1x8_MMX          CONSIM_1x8_SSE2
205          add ecx,eax          add ecx,eax
206          add edx,eax          add edx,eax
207          CONSIM_1x8_MMX          CONSIM_1x8_SSE2
208          add ecx,eax          add ecx,eax
209          add edx,eax          add edx,eax
210          CONSIM_1x8_MMX          CONSIM_1x8_SSE2
211          add ecx,eax          add ecx,eax
212          add edx,eax          add edx,eax
213          CONSIM_1x8_MMX          CONSIM_1x8_SSE2
214    
215          pshufw mm0,mm3,01001110b          ;accumulate xmm5-7
216          paddd mm3,mm0          pshufd     xmm0, xmm5, 0EH
217          pshufw mm1,mm4,01001110b          paddd      xmm5, xmm0
218          paddd mm4,mm1          pshufd     xmm0, xmm5, 01H
219          pshufw mm2,mm5,01001110b          paddd      xmm5, xmm0
220          paddd mm5,mm2  
221            pshufd     xmm1, xmm6, 0EH
222            paddd      xmm6, xmm1
223            pshufd     xmm1, xmm6, 01H
224            paddd      xmm6, xmm1
225    
226            pshufd     xmm2, xmm7, 0EH
227            paddd      xmm7, xmm2
228            pshufd     xmm2, xmm7, 01H
229            paddd      xmm7, xmm2
230    
231          ;load target pointer          CONSIM_WRITEOUT xmm5,xmm6,xmm7
         mov ecx,[esp + 24]; pdevo  
         movd [ecx],mm3  
         mov edx,[esp + 28]; pdevc  
         movd [edx],mm4  
         mov eax,[esp + 32]; corr  
         movd [eax],mm5  
         emms  
232          ret          ret
233  .endfunc  .endfunc
234    
235  consim_sse2:  
236    
237    
238    
239    ALIGN 16
240    consim_mmx:
241          mov ecx,[esp+4] ;ptro          mov ecx,[esp+4] ;ptro
         pxor xmm6,xmm6;  
242          mov edx,[esp+8] ;ptrc          mov edx,[esp+8] ;ptrc
         pxor xmm3,xmm3;devo  
         pxor xmm4,xmm4;devc  
         movd xmm6,[esp + 16];lumo  
         pxor xmm7,xmm7  
243          mov eax,[esp+12];stride          mov eax,[esp+12];stride
244          movd xmm7,[esp + 20];lumc          pxor mm2,mm2;null
245          pxor xmm5,xmm5;corr          pxor mm5,mm5;devo
246            pxor mm6,mm6;devc
247            pxor mm7,mm7;corr
248    
249          ;broadcast lumo/c          CONSIM_1x8_MMX
         ;punpcklbw xmm6,xmm6  
         punpcklwd xmm6,xmm6  
         pshufd xmm6,xmm6,00000000b;or shufps  
         ;punpcklbw xmm7,xmm7  
         punpcklwd xmm7,xmm7  
         pshufd xmm7,xmm7,00000000b  
   
         CONSIM_1x8_SSE2  
250          add ecx,eax          add ecx,eax
251          add edx,eax          add edx,eax
252          CONSIM_1x8_SSE2          CONSIM_1x8_MMX
253          add ecx,eax          add ecx,eax
254          add edx,eax          add edx,eax
255          CONSIM_1x8_SSE2          CONSIM_1x8_MMX
256          add ecx,eax          add ecx,eax
257          add edx,eax          add edx,eax
258          CONSIM_1x8_SSE2          CONSIM_1x8_MMX
259          add ecx,eax          add ecx,eax
260          add edx,eax          add edx,eax
261          CONSIM_1x8_SSE2          CONSIM_1x8_MMX
262          add ecx,eax          add ecx,eax
263          add edx,eax          add edx,eax
264          CONSIM_1x8_SSE2          CONSIM_1x8_MMX
265          add ecx,eax          add ecx,eax
266          add edx,eax          add edx,eax
267          CONSIM_1x8_SSE2          CONSIM_1x8_MMX
268          add ecx,eax          add ecx,eax
269          add edx,eax          add edx,eax
270          CONSIM_1x8_SSE2          CONSIM_1x8_MMX
271    
272  ;accumulate xmm3-5          movq mm0,mm5
273          pshufd     xmm0, xmm3, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)          psrlq mm0,32
274          paddd      xmm3, xmm0      ; Sums are in 2 dwords          paddd mm5,mm0
275          pshufd     xmm0, xmm3, 01H ; Get bit 32-63 from xmm0          movq mm1,mm6
276          paddd      xmm3, xmm0      ; Sum is in one dword          psrlq mm1,32
277            paddd mm6,mm1
278          pshufd     xmm1, xmm4, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)          movq mm2,mm7
279          paddd      xmm4, xmm1      ; Sums are in 2 dwords          psrlq mm2,32
280          pshufd     xmm1, xmm4, 01H ; Get bit 32-63 from xmm0          paddd mm7,mm2
281          paddd      xmm4, xmm1      ; Sum is in one dword  
282            CONSIM_WRITEOUT mm5,mm6,mm7
         pshufd     xmm2, xmm5, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)  
         paddd      xmm5, xmm2      ; Sums are in 2 dwords  
         pshufd     xmm2, xmm5, 01H ; Get bit 32-63 from xmm0  
         paddd      xmm5, xmm2      ; Sum is in one dword  
   
   
         ;load target pointer  
         mov ecx,[esp + 24]; pdevo  
         movd [ecx],xmm3  
         mov edx,[esp + 28]; pdevc  
         movd [edx],xmm4  
         mov eax,[esp + 32]; corr  
         movd [eax],xmm5  
283          ret          ret
284  .endfunc  .endfunc

Legend:
Removed from v.1740  
changed lines
  Added in v.1743

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