[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 1743 - (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 :     shr eax,6; 64*lum0^2
116 :     movd ecx,%1
117 :     sub ecx,eax
118 : Skal 1730
119 : Skal 1743 mov edx,[esp + 24]; pdevo
120 :     mov [edx],ecx
121 : Skal 1730
122 : Skal 1743 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 : Skal 1730 SECTION .text
143 :    
144 :     cglobal lum_8x8_mmx
145 :     cglobal consim_sse2
146 :     cglobal consim_mmx
147 :    
148 :     ;int lum_8x8_c(uint8_t* ptr, uint32_t stride)
149 :    
150 :     ALIGN 16
151 :     lum_8x8_mmx:
152 :     mov ecx, [esp + 4] ;ptr
153 :     mov edx, [esp + 8];stride
154 :    
155 :     pxor mm0,mm0
156 :    
157 : Skal 1740 ACC_ROW mm1, mm2
158 : Skal 1730
159 : Skal 1740 ACC_ROW mm3, mm4
160 : Skal 1730
161 : Skal 1740 ACC_ROW mm5, mm6
162 : Skal 1730
163 : Skal 1740 ACC_ROW mm7, mm4
164 : Skal 1730
165 :     paddw mm1, mm3
166 :     paddw mm5, mm7
167 :     paddw mm1, mm5
168 :    
169 :     movd eax,mm1
170 :     ret
171 :     .endfunc
172 :    
173 :     ALIGN 16
174 : Skal 1743 consim_sse2:
175 : Skal 1730 mov ecx,[esp+4] ;ptro
176 :     mov edx,[esp+8] ;ptrc
177 :     mov eax,[esp+12];stride
178 :    
179 : Skal 1743 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 : Skal 1730 add ecx,eax
194 :     add edx,eax
195 : Skal 1743 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
215 : Skal 1743 ;accumulate xmm5-7
216 :     pshufd xmm0, xmm5, 0EH
217 :     paddd xmm5, xmm0
218 :     pshufd xmm0, xmm5, 01H
219 :     paddd xmm5, xmm0
220 : Skal 1730
221 : Skal 1743 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 :     CONSIM_WRITEOUT xmm5,xmm6,xmm7
232 : Skal 1730 ret
233 :     .endfunc
234 :    
235 : Skal 1743
236 :    
237 :    
238 :    
239 :     ALIGN 16
240 :     consim_mmx:
241 : Skal 1730 mov ecx,[esp+4] ;ptro
242 :     mov edx,[esp+8] ;ptrc
243 :     mov eax,[esp+12];stride
244 : Skal 1743 pxor mm2,mm2;null
245 :     pxor mm5,mm5;devo
246 :     pxor mm6,mm6;devc
247 :     pxor mm7,mm7;corr
248 : Skal 1730
249 : Skal 1743 CONSIM_1x8_MMX
250 : Skal 1730 add ecx,eax
251 :     add edx,eax
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
272 : Skal 1743 movq mm0,mm5
273 :     psrlq mm0,32
274 :     paddd mm5,mm0
275 :     movq mm1,mm6
276 :     psrlq mm1,32
277 :     paddd mm6,mm1
278 :     movq mm2,mm7
279 :     psrlq mm2,32
280 :     paddd mm7,mm2
281 : Skal 1730
282 : Skal 1743 CONSIM_WRITEOUT mm5,mm6,mm7
283 : Skal 1730 ret
284 : Skal 1743 .endfunc

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