[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 1730 - (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 :     %macro ACC_ROW 1
46 :     movq %1,[ecx]
47 :     psadbw %1,mm0
48 :     add ecx, edx
49 :     %endmacro
50 :    
51 :     ;load a dq from mem to a xmm reg
52 :     %macro LOAD_XMM 2
53 :     movdqu %1,[%2]
54 :     ;movhps %1,[%2+8]
55 :     %endmacro
56 :    
57 :     %macro WRITE_XMM 2
58 :     ;movlps [%1],%2
59 :     ;movhps [%1+8],%2
60 :     movdqu [%1],%2
61 :     %endmacro
62 :    
63 :     %macro CONSIM_1x8_SSE2 0
64 :     LOAD_XMM xmm0,ecx
65 :     LOAD_XMM xmm1,edx
66 :     pxor xmm2,xmm2
67 :    
68 :     ;unpack to words
69 :     punpcklbw xmm0,xmm2
70 :     punpcklbw xmm1,xmm2
71 :    
72 :     ;devo
73 :     psubw xmm0,xmm6
74 :     movaps xmm2,xmm0
75 :     pmaddwd xmm2,xmm0
76 :     paddd xmm3,xmm2
77 :    
78 :     ;devc
79 :     psubw xmm1,xmm7
80 :     movaps xmm2,xmm1
81 :     pmaddwd xmm2,xmm1
82 :     paddd xmm4,xmm2
83 :    
84 :     ;corr
85 :     pmaddwd xmm1,xmm0
86 :     paddd xmm5,xmm1
87 :     %endmacro
88 :    
89 :    
90 :     %macro CONSIM_1x8_MMX 0
91 :     movq mm0,[ecx];orig
92 :     movq mm1,[edx];comp
93 :     pxor mm2,mm2;null vector
94 :    
95 :     ;unpack low half of qw to words
96 :     punpcklbw mm0,mm2
97 :     punpcklbw mm1,mm2
98 :    
99 :     ;devo
100 :     psubw mm0,mm6
101 :     movq mm2,mm0
102 :     pmaddwd mm2,mm0
103 :     paddd mm3,mm2;
104 :    
105 :     ;devc
106 :     psubw mm1,mm7
107 :     movq mm2,mm1
108 :     pmaddwd mm2,mm1
109 :     paddd mm4,mm2
110 :    
111 :     ;corr
112 :     pmaddwd mm1,mm0
113 :     paddd mm5,mm1
114 :    
115 :     movq mm0,[ecx]
116 :     movq mm1,[edx]
117 :     pxor mm2,mm2;null vector
118 :    
119 :     ;unpack high half of qw to words
120 :     punpckhbw mm0,mm2
121 :     punpckhbw mm1,mm2
122 :    
123 :     ;devo
124 :     psubw mm0,mm6
125 :     movq mm2,mm0
126 :     pmaddwd mm2,mm0
127 :     paddd mm3,mm2;
128 :    
129 :     ;devc
130 :     psubw mm1,mm7
131 :     movq mm2,mm1
132 :     pmaddwd mm2,mm1
133 :     paddd mm4,mm2
134 :    
135 :     ;corr
136 :     pmaddwd mm1,mm0
137 :     paddd mm5,mm1
138 :     %endmacro
139 :    
140 :    
141 :    
142 :     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 :     ACC_ROW mm1
158 :     ACC_ROW mm2
159 :     paddw mm1 ,mm2
160 :    
161 :     ACC_ROW mm3
162 :     ACC_ROW mm4
163 :     paddw mm3 ,mm4
164 :    
165 :     ACC_ROW mm5
166 :     ACC_ROW mm6
167 :     paddw mm5, mm6
168 :    
169 :     ACC_ROW mm7
170 :     ACC_ROW mm4
171 :     paddw mm7, mm4
172 :    
173 :     paddw mm1, mm3
174 :     paddw mm5, mm7
175 :     paddw mm1, mm5
176 :    
177 :     movd eax,mm1
178 :     emms
179 :     ret
180 :     .endfunc
181 :    
182 :     ALIGN 16
183 :     consim_mmx:
184 :     mov ecx,[esp+4] ;ptro
185 :     pxor mm6,mm6;
186 :    
187 :     mov edx,[esp+8] ;ptrc
188 :     pxor mm3,mm3;devo
189 :     pxor mm4,mm4;devc
190 :     movd mm6,[esp + 16];lumo
191 :     pxor mm7,mm7
192 :     mov eax,[esp+12];stride
193 :     movd mm7,[esp + 20];lumc
194 :     pshufw mm6,mm6,00000000b
195 :     pxor mm5,mm5;corr
196 :     pshufw mm7,mm7,00000000b
197 :    
198 :     CONSIM_1x8_MMX
199 :     add ecx,eax
200 :     add edx,eax
201 :     CONSIM_1x8_MMX
202 :     add ecx,eax
203 :     add edx,eax
204 :     CONSIM_1x8_MMX
205 :     add ecx,eax
206 :     add edx,eax
207 :     CONSIM_1x8_MMX
208 :     add ecx,eax
209 :     add edx,eax
210 :     CONSIM_1x8_MMX
211 :     add ecx,eax
212 :     add edx,eax
213 :     CONSIM_1x8_MMX
214 :     add ecx,eax
215 :     add edx,eax
216 :     CONSIM_1x8_MMX
217 :     add ecx,eax
218 :     add edx,eax
219 :     CONSIM_1x8_MMX
220 :    
221 :     pshufw mm0,mm3,01001110b
222 :     paddd mm3,mm0
223 :     pshufw mm1,mm4,01001110b
224 :     paddd mm4,mm1
225 :     pshufw mm2,mm5,01001110b
226 :     paddd mm5,mm2
227 :    
228 :     ;load target pointer
229 :     mov ecx,[esp + 24]; pdevo
230 :     movd [ecx],mm3
231 :     mov edx,[esp + 28]; pdevc
232 :     movd [edx],mm4
233 :     mov eax,[esp + 32]; corr
234 :     movd [eax],mm5
235 :     emms
236 :     ret
237 :     .endfunc
238 :    
239 :     consim_sse2:
240 :     mov ecx,[esp+4] ;ptro
241 :     pxor xmm6,xmm6;
242 :     mov edx,[esp+8] ;ptrc
243 :     pxor xmm3,xmm3;devo
244 :     pxor xmm4,xmm4;devc
245 :     movd xmm6,[esp + 16];lumo
246 :     pxor xmm7,xmm7
247 :     mov eax,[esp+12];stride
248 :     movd xmm7,[esp + 20];lumc
249 :     pxor xmm5,xmm5;corr
250 :    
251 :     ;broadcast lumo/c
252 :     ;punpcklbw xmm6,xmm6
253 :     punpcklwd xmm6,xmm6
254 :     pshufd xmm6,xmm6,00000000b;or shufps
255 :     ;punpcklbw xmm7,xmm7
256 :     punpcklwd xmm7,xmm7
257 :     pshufd xmm7,xmm7,00000000b
258 :    
259 :     CONSIM_1x8_SSE2
260 :     add ecx,eax
261 :     add edx,eax
262 :     CONSIM_1x8_SSE2
263 :     add ecx,eax
264 :     add edx,eax
265 :     CONSIM_1x8_SSE2
266 :     add ecx,eax
267 :     add edx,eax
268 :     CONSIM_1x8_SSE2
269 :     add ecx,eax
270 :     add edx,eax
271 :     CONSIM_1x8_SSE2
272 :     add ecx,eax
273 :     add edx,eax
274 :     CONSIM_1x8_SSE2
275 :     add ecx,eax
276 :     add edx,eax
277 :     CONSIM_1x8_SSE2
278 :     add ecx,eax
279 :     add edx,eax
280 :     CONSIM_1x8_SSE2
281 :    
282 :     ;accumulate xmm3-5
283 :     pshufd xmm0, xmm3, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)
284 :     paddd xmm3, xmm0 ; Sums are in 2 dwords
285 :     pshufd xmm0, xmm3, 01H ; Get bit 32-63 from xmm0
286 :     paddd xmm3, xmm0 ; Sum is in one dword
287 :    
288 :     pshufd xmm1, xmm4, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)
289 :     paddd xmm4, xmm1 ; Sums are in 2 dwords
290 :     pshufd xmm1, xmm4, 01H ; Get bit 32-63 from xmm0
291 :     paddd xmm4, xmm1 ; Sum is in one dword
292 :    
293 :     pshufd xmm2, xmm5, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)
294 :     paddd xmm5, xmm2 ; Sums are in 2 dwords
295 :     pshufd xmm2, xmm5, 01H ; Get bit 32-63 from xmm0
296 :     paddd xmm5, xmm2 ; Sum is in one dword
297 :    
298 :    
299 :     ;load target pointer
300 :     mov ecx,[esp + 24]; pdevo
301 :     movd [ecx],xmm3
302 :     mov edx,[esp + 28]; pdevc
303 :     movd [edx],xmm4
304 :     mov eax,[esp + 32]; corr
305 :     movd [eax],xmm5
306 :     ret
307 :     .endfunc

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