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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1745 - (view) (download)

1 : Skal 1730 ;/****************************************************************************
2 :     ; *
3 :     ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - optimized SSIM routines -
5 :     ; *
6 :     ; * Copyright(C) 2006 Johannes Reinhardt <johannes.reinhardt@gmx.de>
7 :     ; *
8 :     ; * This program is free software; you can redistribute it and/or modify it
9 :     ; * under the terms of the GNU General Public License as published by
10 :     ; * the Free Software Foundation; either version 2 of the License, or
11 :     ; * (at your option) any later version.
12 :     ; *
13 :     ; * This program is distributed in the hope that it will be useful,
14 :     ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 :     ; * GNU General Public License for more details.
17 :     ; *
18 :     ; * You should have received a copy of the GNU General Public License
19 :     ; * along with this program; if not, write to the Free Software
20 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 :     ; *
22 :     ; *
23 :     ; ***************************************************************************/
24 :    
25 :     BITS 32
26 :    
27 :     %macro cglobal 1
28 :     %ifdef PREFIX
29 :     %ifdef MARK_FUNCS
30 :     global _%1:function %1.endfunc-%1
31 :     %define %1 _%1:function %1.endfunc-%1
32 :     %else
33 :     global _%1
34 :     %define %1 _%1
35 :     %endif
36 :     %else
37 :     %ifdef MARK_FUNCS
38 :     global %1:function %1.endfunc-%1
39 :     %else
40 :     global %1
41 :     %endif
42 :     %endif
43 :     %endmacro
44 :    
45 : Skal 1740 %macro ACC_ROW 2
46 :     movq %1,[ ecx]
47 :     movq %2,[ecx+edx]
48 : Skal 1730 psadbw %1,mm0
49 : Skal 1740 psadbw %2,mm0
50 :     lea ecx, [ecx+2*edx]
51 :     paddw %1, %2
52 : Skal 1730 %endmacro
53 :    
54 :     %macro CONSIM_1x8_SSE2 0
55 : Skal 1743 movdqu xmm0,[ecx]
56 :     movdqu xmm1,[edx]
57 : Skal 1730
58 :     ;unpack to words
59 :     punpcklbw xmm0,xmm2
60 :     punpcklbw xmm1,xmm2
61 :    
62 : Skal 1743 movaps xmm3,xmm0
63 :     movaps xmm4,xmm1
64 : Skal 1730
65 : Skal 1743 pmaddwd xmm0,xmm0;orig
66 :     pmaddwd xmm1,xmm1;comp
67 :     pmaddwd xmm3,xmm4;corr
68 : Skal 1730
69 : Skal 1743 paddd xmm5,xmm0
70 :     paddd xmm6,xmm1
71 :     paddd xmm7,xmm3
72 : Skal 1730 %endmacro
73 :    
74 :     %macro CONSIM_1x8_MMX 0
75 : Skal 1743 movq mm0,[ecx];orig
76 :     movq mm1,[edx];comp
77 : Skal 1730
78 : Skal 1743 ;unpack low half of qw to words
79 :     punpcklbw mm0,mm2
80 :     punpcklbw mm1,mm2
81 : Skal 1730
82 : Skal 1743 movq mm3,mm0
83 :     pmaddwd mm3,mm0
84 :     paddd mm5,mm3;
85 : Skal 1730
86 : Skal 1743 movq mm4,mm1
87 :     pmaddwd mm4,mm1
88 :     paddd mm6,mm4;
89 :    
90 : Skal 1730 pmaddwd mm1,mm0
91 : Skal 1743 paddd mm7,mm1
92 : Skal 1730
93 : Skal 1743 movq mm0,[ecx];orig
94 :     movq mm1,[edx];comp
95 : Skal 1730
96 : Skal 1743 ;unpack high half of qw to words
97 :     punpckhbw mm0,mm2
98 :     punpckhbw mm1,mm2
99 : Skal 1730
100 : Skal 1743 movq mm3,mm0
101 :     pmaddwd mm3,mm0
102 :     paddd mm5,mm3;
103 : Skal 1730
104 : Skal 1743 movq mm4,mm1
105 :     pmaddwd mm4,mm1
106 :     paddd mm6,mm4;
107 :    
108 : Skal 1730 pmaddwd mm1,mm0
109 : Skal 1743 paddd mm7,mm1
110 : Skal 1730 %endmacro
111 :    
112 : Skal 1743 %macro CONSIM_WRITEOUT 3
113 :     mov eax,[esp + 16];lumo
114 :     mul eax; lumo^2
115 : Skal 1744 add eax, 32
116 : Skal 1743 shr eax,6; 64*lum0^2
117 :     movd ecx,%1
118 :     sub ecx,eax
119 : Skal 1730
120 : Skal 1743 mov edx,[esp + 24]; pdevo
121 :     mov [edx],ecx
122 : Skal 1730
123 : Skal 1743 mov eax,[esp + 20];lumc
124 :     mul eax; lumc^2
125 : Skal 1744 add eax, 32
126 : Skal 1743 shr eax,6; 64*lumc^2
127 :     movd ecx,%2
128 :     sub ecx,eax
129 :    
130 :     mov edx,[esp + 28]; pdevc
131 :     mov [edx],ecx
132 :    
133 :     mov eax,[esp + 16];lumo
134 :     mul dword [esp + 20]; lumo*lumc, should fit in eax
135 : Skal 1744 add eax, 32
136 : Skal 1743 shr eax,6; 64*lumo*lumc
137 :     movd ecx,%3
138 :     sub ecx,eax
139 :    
140 :     mov edx,[esp + 32]; pcorr
141 :     mov [edx],ecx
142 :     %endmacro
143 :    
144 :    
145 : Skal 1730 SECTION .text
146 :    
147 :     cglobal lum_8x8_mmx
148 :     cglobal consim_sse2
149 :     cglobal consim_mmx
150 :    
151 :     ;int lum_8x8_c(uint8_t* ptr, uint32_t stride)
152 :    
153 :     ALIGN 16
154 :     lum_8x8_mmx:
155 :     mov ecx, [esp + 4] ;ptr
156 :     mov edx, [esp + 8];stride
157 :    
158 :     pxor mm0,mm0
159 :    
160 : Skal 1740 ACC_ROW mm1, mm2
161 : Skal 1730
162 : Skal 1740 ACC_ROW mm3, mm4
163 : Skal 1730
164 : Skal 1740 ACC_ROW mm5, mm6
165 : Skal 1730
166 : Skal 1740 ACC_ROW mm7, mm4
167 : Skal 1730
168 :     paddw mm1, mm3
169 :     paddw mm5, mm7
170 :     paddw mm1, mm5
171 :    
172 :     movd eax,mm1
173 :     ret
174 :     .endfunc
175 :    
176 :     ALIGN 16
177 : Skal 1743 consim_sse2:
178 : Skal 1730 mov ecx,[esp+4] ;ptro
179 :     mov edx,[esp+8] ;ptrc
180 :     mov eax,[esp+12];stride
181 :    
182 : Skal 1743 pxor xmm2,xmm2;null vektor
183 :     pxor xmm5,xmm5;devo
184 :     pxor xmm6,xmm6;devc
185 :     pxor xmm7,xmm7;corr
186 :    
187 :     ;broadcast lumo/c
188 :     punpcklbw xmm6,xmm6
189 :     punpcklwd xmm6,xmm6
190 :     pshufd xmm6,xmm6,00000000b;or shufps
191 :     punpcklbw xmm7,xmm7
192 :     punpcklwd xmm7,xmm7
193 :     pshufd xmm7,xmm7,00000000b
194 :    
195 :     CONSIM_1x8_SSE2
196 : Skal 1730 add ecx,eax
197 :     add edx,eax
198 : Skal 1743 CONSIM_1x8_SSE2
199 : Skal 1730 add ecx,eax
200 :     add edx,eax
201 : Skal 1743 CONSIM_1x8_SSE2
202 : Skal 1730 add ecx,eax
203 :     add edx,eax
204 : Skal 1743 CONSIM_1x8_SSE2
205 : Skal 1730 add ecx,eax
206 :     add edx,eax
207 : Skal 1743 CONSIM_1x8_SSE2
208 : Skal 1730 add ecx,eax
209 :     add edx,eax
210 : Skal 1743 CONSIM_1x8_SSE2
211 : Skal 1730 add ecx,eax
212 :     add edx,eax
213 : Skal 1743 CONSIM_1x8_SSE2
214 : Skal 1730 add ecx,eax
215 :     add edx,eax
216 : Skal 1743 CONSIM_1x8_SSE2
217 : Skal 1730
218 : Skal 1743 ;accumulate xmm5-7
219 : chl 1745 pshufd xmm0, xmm5, 0x0E
220 : Skal 1743 paddd xmm5, xmm0
221 : chl 1745 pshufd xmm0, xmm5, 0x01
222 : Skal 1743 paddd xmm5, xmm0
223 : Skal 1730
224 : chl 1745 pshufd xmm1, xmm6, 0x0E
225 : Skal 1743 paddd xmm6, xmm1
226 : chl 1745 pshufd xmm1, xmm6, 0x01
227 : Skal 1743 paddd xmm6, xmm1
228 :    
229 : chl 1745 pshufd xmm2, xmm7, 0x0E
230 : Skal 1743 paddd xmm7, xmm2
231 : chl 1745 pshufd xmm2, xmm7, 0x01
232 : Skal 1743 paddd xmm7, xmm2
233 :    
234 :     CONSIM_WRITEOUT xmm5,xmm6,xmm7
235 : Skal 1730 ret
236 :     .endfunc
237 :    
238 : Skal 1743
239 :    
240 :    
241 :    
242 :     ALIGN 16
243 :     consim_mmx:
244 : Skal 1730 mov ecx,[esp+4] ;ptro
245 :     mov edx,[esp+8] ;ptrc
246 :     mov eax,[esp+12];stride
247 : Skal 1743 pxor mm2,mm2;null
248 :     pxor mm5,mm5;devo
249 :     pxor mm6,mm6;devc
250 :     pxor mm7,mm7;corr
251 : Skal 1730
252 : Skal 1743 CONSIM_1x8_MMX
253 : Skal 1730 add ecx,eax
254 :     add edx,eax
255 : Skal 1743 CONSIM_1x8_MMX
256 : Skal 1730 add ecx,eax
257 :     add edx,eax
258 : Skal 1743 CONSIM_1x8_MMX
259 : Skal 1730 add ecx,eax
260 :     add edx,eax
261 : Skal 1743 CONSIM_1x8_MMX
262 : Skal 1730 add ecx,eax
263 :     add edx,eax
264 : Skal 1743 CONSIM_1x8_MMX
265 : Skal 1730 add ecx,eax
266 :     add edx,eax
267 : Skal 1743 CONSIM_1x8_MMX
268 : Skal 1730 add ecx,eax
269 :     add edx,eax
270 : Skal 1743 CONSIM_1x8_MMX
271 : Skal 1730 add ecx,eax
272 :     add edx,eax
273 : Skal 1743 CONSIM_1x8_MMX
274 : Skal 1730
275 : Skal 1743 movq mm0,mm5
276 :     psrlq mm0,32
277 :     paddd mm5,mm0
278 :     movq mm1,mm6
279 :     psrlq mm1,32
280 :     paddd mm6,mm1
281 :     movq mm2,mm7
282 :     psrlq mm2,32
283 :     paddd mm7,mm2
284 : Skal 1730
285 : Skal 1743 CONSIM_WRITEOUT mm5,mm6,mm7
286 : Skal 1730 ret
287 : Skal 1743 .endfunc

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