[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 1740 - (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 :     ;load a dq from mem to a xmm reg
55 :     %macro LOAD_XMM 2
56 :     movdqu %1,[%2]
57 :     ;movhps %1,[%2+8]
58 :     %endmacro
59 :    
60 :     %macro WRITE_XMM 2
61 :     ;movlps [%1],%2
62 :     ;movhps [%1+8],%2
63 :     movdqu [%1],%2
64 :     %endmacro
65 :    
66 :     %macro CONSIM_1x8_SSE2 0
67 :     LOAD_XMM xmm0,ecx
68 :     LOAD_XMM xmm1,edx
69 :     pxor xmm2,xmm2
70 :    
71 :     ;unpack to words
72 :     punpcklbw xmm0,xmm2
73 :     punpcklbw xmm1,xmm2
74 :    
75 :     ;devo
76 :     psubw xmm0,xmm6
77 :     movaps xmm2,xmm0
78 :     pmaddwd xmm2,xmm0
79 :     paddd xmm3,xmm2
80 :    
81 :     ;devc
82 :     psubw xmm1,xmm7
83 :     movaps xmm2,xmm1
84 :     pmaddwd xmm2,xmm1
85 :     paddd xmm4,xmm2
86 :    
87 :     ;corr
88 :     pmaddwd xmm1,xmm0
89 :     paddd xmm5,xmm1
90 :     %endmacro
91 :    
92 :    
93 :     %macro CONSIM_1x8_MMX 0
94 :     movq mm0,[ecx];orig
95 :     movq mm1,[edx];comp
96 :     pxor mm2,mm2;null vector
97 :    
98 :     ;unpack low half of qw to words
99 :     punpcklbw mm0,mm2
100 :     punpcklbw mm1,mm2
101 :    
102 :     ;devo
103 :     psubw mm0,mm6
104 :     movq mm2,mm0
105 :     pmaddwd mm2,mm0
106 :     paddd mm3,mm2;
107 :    
108 :     ;devc
109 :     psubw mm1,mm7
110 :     movq mm2,mm1
111 :     pmaddwd mm2,mm1
112 :     paddd mm4,mm2
113 :    
114 :     ;corr
115 :     pmaddwd mm1,mm0
116 :     paddd mm5,mm1
117 :    
118 :     movq mm0,[ecx]
119 :     movq mm1,[edx]
120 :     pxor mm2,mm2;null vector
121 :    
122 :     ;unpack high half of qw to words
123 :     punpckhbw mm0,mm2
124 :     punpckhbw mm1,mm2
125 :    
126 :     ;devo
127 :     psubw mm0,mm6
128 :     movq mm2,mm0
129 :     pmaddwd mm2,mm0
130 :     paddd mm3,mm2;
131 :    
132 :     ;devc
133 :     psubw mm1,mm7
134 :     movq mm2,mm1
135 :     pmaddwd mm2,mm1
136 :     paddd mm4,mm2
137 :    
138 :     ;corr
139 :     pmaddwd mm1,mm0
140 :     paddd mm5,mm1
141 :     %endmacro
142 :    
143 :    
144 :    
145 :     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 :     consim_mmx:
178 :     mov ecx,[esp+4] ;ptro
179 :     pxor mm6,mm6;
180 :    
181 :     mov edx,[esp+8] ;ptrc
182 :     pxor mm3,mm3;devo
183 :     pxor mm4,mm4;devc
184 :     movd mm6,[esp + 16];lumo
185 :     pxor mm7,mm7
186 :     mov eax,[esp+12];stride
187 :     movd mm7,[esp + 20];lumc
188 : Skal 1740 pshufw mm6,mm6,00000000b ; TODO: remove later! not MMX, but SSE
189 : Skal 1730 pxor mm5,mm5;corr
190 :     pshufw mm7,mm7,00000000b
191 :    
192 :     CONSIM_1x8_MMX
193 :     add ecx,eax
194 :     add edx,eax
195 :     CONSIM_1x8_MMX
196 :     add ecx,eax
197 :     add edx,eax
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 :    
215 :     pshufw mm0,mm3,01001110b
216 :     paddd mm3,mm0
217 :     pshufw mm1,mm4,01001110b
218 :     paddd mm4,mm1
219 :     pshufw mm2,mm5,01001110b
220 :     paddd mm5,mm2
221 :    
222 :     ;load target pointer
223 :     mov ecx,[esp + 24]; pdevo
224 :     movd [ecx],mm3
225 :     mov edx,[esp + 28]; pdevc
226 :     movd [edx],mm4
227 :     mov eax,[esp + 32]; corr
228 :     movd [eax],mm5
229 :     emms
230 :     ret
231 :     .endfunc
232 :    
233 :     consim_sse2:
234 :     mov ecx,[esp+4] ;ptro
235 :     pxor xmm6,xmm6;
236 :     mov edx,[esp+8] ;ptrc
237 :     pxor xmm3,xmm3;devo
238 :     pxor xmm4,xmm4;devc
239 :     movd xmm6,[esp + 16];lumo
240 :     pxor xmm7,xmm7
241 :     mov eax,[esp+12];stride
242 :     movd xmm7,[esp + 20];lumc
243 :     pxor xmm5,xmm5;corr
244 :    
245 :     ;broadcast lumo/c
246 :     ;punpcklbw xmm6,xmm6
247 :     punpcklwd xmm6,xmm6
248 :     pshufd xmm6,xmm6,00000000b;or shufps
249 :     ;punpcklbw xmm7,xmm7
250 :     punpcklwd xmm7,xmm7
251 :     pshufd xmm7,xmm7,00000000b
252 :    
253 :     CONSIM_1x8_SSE2
254 :     add ecx,eax
255 :     add edx,eax
256 :     CONSIM_1x8_SSE2
257 :     add ecx,eax
258 :     add edx,eax
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 :    
276 :     ;accumulate xmm3-5
277 :     pshufd xmm0, xmm3, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)
278 :     paddd xmm3, xmm0 ; Sums are in 2 dwords
279 :     pshufd xmm0, xmm3, 01H ; Get bit 32-63 from xmm0
280 :     paddd xmm3, xmm0 ; Sum is in one dword
281 :    
282 :     pshufd xmm1, xmm4, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)
283 :     paddd xmm4, xmm1 ; Sums are in 2 dwords
284 :     pshufd xmm1, xmm4, 01H ; Get bit 32-63 from xmm0
285 :     paddd xmm4, xmm1 ; Sum is in one dword
286 :    
287 :     pshufd xmm2, xmm5, 0EH ; Get bit 64-127 from xmm1 (or use movhlps)
288 :     paddd xmm5, xmm2 ; Sums are in 2 dwords
289 :     pshufd xmm2, xmm5, 01H ; Get bit 32-63 from xmm0
290 :     paddd xmm5, xmm2 ; Sum is in one dword
291 :    
292 :    
293 :     ;load target pointer
294 :     mov ecx,[esp + 24]; pdevo
295 :     movd [ecx],xmm3
296 :     mov edx,[esp + 28]; pdevc
297 :     movd [edx],xmm4
298 :     mov eax,[esp + 32]; corr
299 :     movd [eax],xmm5
300 :     ret
301 :     .endfunc

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