[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 1793 - (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 : Isibaar 1793 %define ENDFUNC .endfunc
33 : Skal 1730 %else
34 :     global _%1
35 :     %define %1 _%1
36 : Isibaar 1793 %define ENDFUNC
37 : Skal 1730 %endif
38 :     %else
39 :     %ifdef MARK_FUNCS
40 :     global %1:function %1.endfunc-%1
41 : Isibaar 1793 %define ENDFUNC .endfunc
42 : Skal 1730 %else
43 :     global %1
44 : Isibaar 1793 %define ENDFUNC
45 : Skal 1730 %endif
46 :     %endif
47 :     %endmacro
48 :    
49 : Skal 1740 %macro ACC_ROW 2
50 :     movq %1,[ ecx]
51 :     movq %2,[ecx+edx]
52 : Skal 1730 psadbw %1,mm0
53 : Skal 1740 psadbw %2,mm0
54 :     lea ecx, [ecx+2*edx]
55 :     paddw %1, %2
56 : Skal 1730 %endmacro
57 :    
58 :     %macro CONSIM_1x8_SSE2 0
59 : Skal 1743 movdqu xmm0,[ecx]
60 :     movdqu xmm1,[edx]
61 : Skal 1730
62 :     ;unpack to words
63 :     punpcklbw xmm0,xmm2
64 :     punpcklbw xmm1,xmm2
65 :    
66 : Skal 1743 movaps xmm3,xmm0
67 :     movaps xmm4,xmm1
68 : Skal 1730
69 : Skal 1743 pmaddwd xmm0,xmm0;orig
70 :     pmaddwd xmm1,xmm1;comp
71 :     pmaddwd xmm3,xmm4;corr
72 : Skal 1730
73 : Skal 1743 paddd xmm5,xmm0
74 :     paddd xmm6,xmm1
75 :     paddd xmm7,xmm3
76 : Skal 1730 %endmacro
77 :    
78 :     %macro CONSIM_1x8_MMX 0
79 : Skal 1743 movq mm0,[ecx];orig
80 :     movq mm1,[edx];comp
81 : Skal 1730
82 : Skal 1743 ;unpack low half of qw to words
83 :     punpcklbw mm0,mm2
84 :     punpcklbw mm1,mm2
85 : Skal 1730
86 : Skal 1743 movq mm3,mm0
87 :     pmaddwd mm3,mm0
88 :     paddd mm5,mm3;
89 : Skal 1730
90 : Skal 1743 movq mm4,mm1
91 :     pmaddwd mm4,mm1
92 :     paddd mm6,mm4;
93 :    
94 : Skal 1730 pmaddwd mm1,mm0
95 : Skal 1743 paddd mm7,mm1
96 : Skal 1730
97 : Skal 1743 movq mm0,[ecx];orig
98 :     movq mm1,[edx];comp
99 : Skal 1730
100 : Skal 1743 ;unpack high half of qw to words
101 :     punpckhbw mm0,mm2
102 :     punpckhbw mm1,mm2
103 : Skal 1730
104 : Skal 1743 movq mm3,mm0
105 :     pmaddwd mm3,mm0
106 :     paddd mm5,mm3;
107 : Skal 1730
108 : Skal 1743 movq mm4,mm1
109 :     pmaddwd mm4,mm1
110 :     paddd mm6,mm4;
111 :    
112 : Skal 1730 pmaddwd mm1,mm0
113 : Skal 1743 paddd mm7,mm1
114 : Skal 1730 %endmacro
115 :    
116 : Skal 1743 %macro CONSIM_WRITEOUT 3
117 :     mov eax,[esp + 16];lumo
118 :     mul eax; lumo^2
119 : Skal 1744 add eax, 32
120 : Skal 1743 shr eax,6; 64*lum0^2
121 :     movd ecx,%1
122 :     sub ecx,eax
123 : Skal 1730
124 : Skal 1743 mov edx,[esp + 24]; pdevo
125 :     mov [edx],ecx
126 : Skal 1730
127 : Skal 1743 mov eax,[esp + 20];lumc
128 :     mul eax; lumc^2
129 : Skal 1744 add eax, 32
130 : Skal 1743 shr eax,6; 64*lumc^2
131 :     movd ecx,%2
132 :     sub ecx,eax
133 :    
134 :     mov edx,[esp + 28]; pdevc
135 :     mov [edx],ecx
136 :    
137 :     mov eax,[esp + 16];lumo
138 :     mul dword [esp + 20]; lumo*lumc, should fit in eax
139 : Skal 1744 add eax, 32
140 : Skal 1743 shr eax,6; 64*lumo*lumc
141 :     movd ecx,%3
142 :     sub ecx,eax
143 :    
144 :     mov edx,[esp + 32]; pcorr
145 :     mov [edx],ecx
146 :     %endmacro
147 :    
148 :    
149 : Skal 1730 SECTION .text
150 :    
151 :     cglobal lum_8x8_mmx
152 :     cglobal consim_sse2
153 :     cglobal consim_mmx
154 :    
155 :     ;int lum_8x8_c(uint8_t* ptr, uint32_t stride)
156 :    
157 :     ALIGN 16
158 :     lum_8x8_mmx:
159 :     mov ecx, [esp + 4] ;ptr
160 :     mov edx, [esp + 8];stride
161 :    
162 :     pxor mm0,mm0
163 :    
164 : Skal 1740 ACC_ROW mm1, mm2
165 : Skal 1730
166 : Skal 1740 ACC_ROW mm3, mm4
167 : Skal 1730
168 : Skal 1740 ACC_ROW mm5, mm6
169 : Skal 1730
170 : Skal 1740 ACC_ROW mm7, mm4
171 : Skal 1730
172 :     paddw mm1, mm3
173 :     paddw mm5, mm7
174 :     paddw mm1, mm5
175 :    
176 :     movd eax,mm1
177 :     ret
178 : Isibaar 1793 ENDFUNC
179 : Skal 1730
180 :     ALIGN 16
181 : Skal 1743 consim_sse2:
182 : Skal 1730 mov ecx,[esp+4] ;ptro
183 :     mov edx,[esp+8] ;ptrc
184 :     mov eax,[esp+12];stride
185 :    
186 : Skal 1743 pxor xmm2,xmm2;null vektor
187 :     pxor xmm5,xmm5;devo
188 :     pxor xmm6,xmm6;devc
189 :     pxor xmm7,xmm7;corr
190 :    
191 :     ;broadcast lumo/c
192 :     punpcklbw xmm6,xmm6
193 :     punpcklwd xmm6,xmm6
194 :     pshufd xmm6,xmm6,00000000b;or shufps
195 :     punpcklbw xmm7,xmm7
196 :     punpcklwd xmm7,xmm7
197 :     pshufd xmm7,xmm7,00000000b
198 :    
199 :     CONSIM_1x8_SSE2
200 : Skal 1730 add ecx,eax
201 :     add edx,eax
202 : Skal 1743 CONSIM_1x8_SSE2
203 : Skal 1730 add ecx,eax
204 :     add edx,eax
205 : Skal 1743 CONSIM_1x8_SSE2
206 : Skal 1730 add ecx,eax
207 :     add edx,eax
208 : Skal 1743 CONSIM_1x8_SSE2
209 : Skal 1730 add ecx,eax
210 :     add edx,eax
211 : Skal 1743 CONSIM_1x8_SSE2
212 : Skal 1730 add ecx,eax
213 :     add edx,eax
214 : Skal 1743 CONSIM_1x8_SSE2
215 : Skal 1730 add ecx,eax
216 :     add edx,eax
217 : Skal 1743 CONSIM_1x8_SSE2
218 : Skal 1730 add ecx,eax
219 :     add edx,eax
220 : Skal 1743 CONSIM_1x8_SSE2
221 : Skal 1730
222 : Skal 1743 ;accumulate xmm5-7
223 : chl 1745 pshufd xmm0, xmm5, 0x0E
224 : Skal 1743 paddd xmm5, xmm0
225 : chl 1745 pshufd xmm0, xmm5, 0x01
226 : Skal 1743 paddd xmm5, xmm0
227 : Skal 1730
228 : chl 1745 pshufd xmm1, xmm6, 0x0E
229 : Skal 1743 paddd xmm6, xmm1
230 : chl 1745 pshufd xmm1, xmm6, 0x01
231 : Skal 1743 paddd xmm6, xmm1
232 :    
233 : chl 1745 pshufd xmm2, xmm7, 0x0E
234 : Skal 1743 paddd xmm7, xmm2
235 : chl 1745 pshufd xmm2, xmm7, 0x01
236 : Skal 1743 paddd xmm7, xmm2
237 :    
238 :     CONSIM_WRITEOUT xmm5,xmm6,xmm7
239 : Skal 1730 ret
240 : Isibaar 1793 ENDFUNC
241 : Skal 1730
242 : Skal 1743
243 :    
244 :    
245 :    
246 :     ALIGN 16
247 :     consim_mmx:
248 : Skal 1730 mov ecx,[esp+4] ;ptro
249 :     mov edx,[esp+8] ;ptrc
250 :     mov eax,[esp+12];stride
251 : Skal 1743 pxor mm2,mm2;null
252 :     pxor mm5,mm5;devo
253 :     pxor mm6,mm6;devc
254 :     pxor mm7,mm7;corr
255 : Skal 1730
256 : Skal 1743 CONSIM_1x8_MMX
257 : Skal 1730 add ecx,eax
258 :     add edx,eax
259 : Skal 1743 CONSIM_1x8_MMX
260 : Skal 1730 add ecx,eax
261 :     add edx,eax
262 : Skal 1743 CONSIM_1x8_MMX
263 : Skal 1730 add ecx,eax
264 :     add edx,eax
265 : Skal 1743 CONSIM_1x8_MMX
266 : Skal 1730 add ecx,eax
267 :     add edx,eax
268 : Skal 1743 CONSIM_1x8_MMX
269 : Skal 1730 add ecx,eax
270 :     add edx,eax
271 : Skal 1743 CONSIM_1x8_MMX
272 : Skal 1730 add ecx,eax
273 :     add edx,eax
274 : Skal 1743 CONSIM_1x8_MMX
275 : Skal 1730 add ecx,eax
276 :     add edx,eax
277 : Skal 1743 CONSIM_1x8_MMX
278 : Skal 1730
279 : Skal 1743 movq mm0,mm5
280 :     psrlq mm0,32
281 :     paddd mm5,mm0
282 :     movq mm1,mm6
283 :     psrlq mm1,32
284 :     paddd mm6,mm1
285 :     movq mm2,mm7
286 :     psrlq mm2,32
287 :     paddd mm7,mm2
288 : Skal 1730
289 : Skal 1743 CONSIM_WRITEOUT mm5,mm6,mm7
290 : Skal 1730 ret
291 : Isibaar 1793 ENDFUNC
292 : Isibaar 1790
293 :     %ifidn __OUTPUT_FORMAT__,elf
294 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
295 :     %endif

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