[svn] / branches / dev-api-4 / xvidcore / src / motion / x86_asm / sad_mmx.asm Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/motion/x86_asm/sad_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 262 - (view) (download)
Original Path: trunk/xvidcore/src/motion/x86_asm/sad_mmx.asm

1 : Isibaar 262 ;/**************************************************************************
2 :     ; *
3 :     ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * mmx sum of absolute difference
5 :     ; *
6 :     ; * This program is free software; you can redistribute it and/or modify
7 :     ; * it under the terms of the GNU General Public License as published by
8 :     ; * the Free Software Foundation; either version 2 of the License, or
9 :     ; * (at your option) any later version.
10 :     ; *
11 :     ; * This program is distributed in the hope that it will be useful,
12 :     ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 :     ; * GNU General Public License for more details.
15 :     ; *
16 :     ; * You should have received a copy of the GNU General Public License
17 :     ; * along with this program; if not, write to the Free Software
18 :     ; * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 :     ; *
20 :     ; *************************************************************************/
21 :    
22 :     ;/**************************************************************************
23 :     ; *
24 :     ; * History:
25 :     ; *
26 :     ; * 23.07.2002 sad[16,8]bi_xmm; <pross@xvid.org>
27 :     ; * 04.06.2002 cleanup -Skal-
28 :     ; * 12.11.2001 inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>
29 :     ; *
30 :     ; *************************************************************************/
31 :    
32 :     bits 32
33 :    
34 :     %macro cglobal 1
35 :     global _%1
36 :     %define %1 _%1
37 :     %else
38 :     global %1
39 :     %endif
40 :     %endmacro
41 :    
42 :     section .data
43 :    
44 :     align 16
45 :     mmx_one times 4 dw 1
46 :    
47 :     section .text
48 :    
49 :     cglobal sad16_mmx
50 :     cglobal sad8_mmx
51 :     cglobal sad16bi_mmx
52 :     cglobal sad8bi_mmx
53 :     cglobal dev16_mmx
54 :    
55 :     ;===========================================================================
56 :     ;
57 :     ; uint32_t sad16_mmx(const uint8_t * const cur,
58 :     ; const uint8_t * const ref,
59 :     ; const uint32_t stride,
60 :     ; (early termination ignore; slows this down)
61 :     ;
62 :     ;===========================================================================
63 :    
64 :     %macro SAD_16x16_MMX 0
65 :     movq mm0, [eax]
66 :     movq mm1, [edx]
67 :    
68 :     movq mm2, [eax+8]
69 :     movq mm3, [edx+8]
70 :    
71 :     movq mm4, mm0
72 :     psubusb mm0, mm1
73 :     lea eax,[eax+ecx]
74 :     movq mm5, mm2
75 :     psubusb mm2, mm3
76 :     lea edx,[edx+ecx]
77 :    
78 :     psubusb mm1, mm4
79 :     por mm0, mm1
80 :     psubusb mm3, mm5
81 :     por mm2, mm3
82 :    
83 :     movq mm1,mm0
84 :     movq mm3,mm2
85 :    
86 :     punpcklbw mm0,mm7
87 :     punpckhbw mm1,mm7
88 :     punpcklbw mm2,mm7
89 :     punpckhbw mm3,mm7
90 :    
91 :     paddusw mm0,mm1
92 :     paddusw mm6,mm0
93 :     paddusw mm2,mm3
94 :     paddusw mm6,mm2
95 :     %endmacro
96 :    
97 :     align 16
98 :     sad16_mmx:
99 :    
100 :     mov eax, [esp+ 4] ; Src1
101 :     mov edx, [esp+ 8] ; Src2
102 :     mov ecx, [esp+12] ; Stride
103 :    
104 :     pxor mm6, mm6 ; accum
105 :     pxor mm7, mm7 ; zero
106 :    
107 :     SAD_16x16_MMX
108 :     SAD_16x16_MMX
109 :     SAD_16x16_MMX
110 :     SAD_16x16_MMX
111 :     SAD_16x16_MMX
112 :     SAD_16x16_MMX
113 :     SAD_16x16_MMX
114 :     SAD_16x16_MMX
115 :    
116 :     SAD_16x16_MMX
117 :     SAD_16x16_MMX
118 :     SAD_16x16_MMX
119 :     SAD_16x16_MMX
120 :     SAD_16x16_MMX
121 :     SAD_16x16_MMX
122 :     SAD_16x16_MMX
123 :     SAD_16x16_MMX
124 :    
125 :     pmaddwd mm6, [mmx_one] ; collapse
126 :     movq mm7, mm6
127 :     psrlq mm7, 32
128 :     paddd mm6, mm7
129 :    
130 :     movd eax, mm6
131 :    
132 :     ret
133 :    
134 :    
135 :     ;===========================================================================
136 :     ;
137 :     ; uint32_t sad8_mmx(const uint8_t * const cur,
138 :     ; const uint8_t * const ref,
139 :     ; const uint32_t stride);
140 :     ;
141 :     ;===========================================================================
142 :    
143 :     %macro SAD_8x8_MMX 0
144 :     movq mm0, [eax]
145 :     movq mm1, [edx]
146 :    
147 :     movq mm2, [eax+ecx]
148 :     movq mm3, [edx+ecx]
149 :    
150 :     lea eax,[eax+2*ecx]
151 :     lea edx,[edx+2*ecx]
152 :    
153 :     movq mm4, mm0
154 :     psubusb mm0, mm1
155 :     movq mm5, mm2
156 :     psubusb mm2, mm3
157 :    
158 :     psubusb mm1, mm4
159 :     por mm0, mm1
160 :     psubusb mm3, mm5
161 :     por mm2, mm3
162 :    
163 :     movq mm1,mm0
164 :     movq mm3,mm2
165 :    
166 :     punpcklbw mm0,mm7
167 :     punpckhbw mm1,mm7
168 :     punpcklbw mm2,mm7
169 :     punpckhbw mm3,mm7
170 :    
171 :     paddusw mm0,mm1
172 :     paddusw mm6,mm0
173 :     paddusw mm2,mm3
174 :     paddusw mm6,mm2
175 :     %endmacro
176 :    
177 :     align 16
178 :     sad8_mmx:
179 :    
180 :     mov eax, [esp+ 4] ; Src1
181 :     mov edx, [esp+ 8] ; Src2
182 :     mov ecx, [esp+12] ; Stride
183 :    
184 :     pxor mm6, mm6 ; accum
185 :     pxor mm7, mm7 ; zero
186 :    
187 :     SAD_8x8_MMX
188 :     SAD_8x8_MMX
189 :     SAD_8x8_MMX
190 :     SAD_8x8_MMX
191 :    
192 :     pmaddwd mm6, [mmx_one] ; collapse
193 :     movq mm7, mm6
194 :     psrlq mm7, 32
195 :     paddd mm6, mm7
196 :    
197 :     movd eax, mm6
198 :    
199 :     ret
200 :    
201 :    
202 :    
203 :    
204 :    
205 :     ;===========================================================================
206 :     ;
207 :     ; uint32_t sad16bi_mmx(const uint8_t * const cur,
208 :     ; const uint8_t * const ref1,
209 :     movq mm0, [eax]
210 :     movq mm2, [eax+8]
211 :     lea eax,[eax+ecx]
212 :     movq mm1, mm0
213 :     movq mm3, mm2
214 :     punpcklbw mm0,mm7
215 :     punpcklbw mm2,mm7
216 :     punpckhbw mm1,mm7
217 :     punpckhbw mm3,mm7
218 :     paddw mm5, mm0
219 :     paddw mm6, mm1
220 :     paddw mm5, mm2
221 :     paddw mm6, mm3
222 :     %endmacro
223 :    
224 :     %macro ABS_16x16_MMX 0
225 :     movq mm0, [eax]
226 :     movq mm2, [eax+8]
227 :     lea eax,[eax+ecx]
228 :     movq mm1, mm0
229 :     movq mm3, mm2
230 :     punpcklbw mm0, mm7
231 :     punpcklbw mm2, mm7
232 :     punpckhbw mm1, mm7
233 :     punpckhbw mm3, mm7
234 :     movq mm4, mm6
235 :     psubusw mm4, mm0
236 :    
237 :     psubusw mm0, mm6
238 :     por mm0, mm4
239 :     movq mm4, mm6
240 :     psubusw mm4, mm1
241 :     psubusw mm1, mm6
242 :     por mm1, mm4
243 :    
244 :     movq mm4, mm6
245 :     psubusw mm4, mm2
246 :     psubusw mm2, mm6
247 :     por mm2, mm4
248 :     movq mm4, mm6
249 :     psubusw mm4, mm3
250 :     psubusw mm3, mm6
251 :     por mm3, mm4
252 :    
253 :     paddw mm0, mm1
254 :     paddw mm2, mm3
255 :     paddw mm5, mm0
256 :     paddw mm5, mm2
257 :     %endmacro
258 :    
259 :     align 16
260 :     dev16_mmx:
261 :     mov eax, [esp+ 4] ; Src
262 :     mov ecx, [esp+ 8] ; Stride
263 :    
264 :     pxor mm7, mm7 ; zero
265 :     pxor mm5, mm5 ; accum1
266 :     pxor mm6, mm6 ; accum2
267 :    
268 :     MEAN_16x16_MMX
269 :     MEAN_16x16_MMX
270 :     MEAN_16x16_MMX
271 :     MEAN_16x16_MMX
272 :     MEAN_16x16_MMX
273 :     MEAN_16x16_MMX
274 :     MEAN_16x16_MMX
275 :     MEAN_16x16_MMX
276 :    
277 :     MEAN_16x16_MMX
278 :     MEAN_16x16_MMX
279 :     MEAN_16x16_MMX
280 :     MEAN_16x16_MMX
281 :     MEAN_16x16_MMX
282 :     MEAN_16x16_MMX
283 :     MEAN_16x16_MMX
284 :     MEAN_16x16_MMX
285 :    
286 :     paddusw mm6, mm5
287 :     pmaddwd mm6, [mmx_one] ; collapse
288 :     movq mm5, mm6
289 :     psrlq mm5, 32
290 :     paddd mm6, mm5
291 :    
292 :     psllq mm6, 32 ; blank upper dword
293 :     psrlq mm6, 32 + 8 ; /= (16*16)
294 :    
295 :     punpckldq mm6, mm6
296 :     packssdw mm6, mm6
297 :    
298 :     ; mm6 contains the mean
299 :     ; mm5 is the new accum
300 :    
301 :     pxor mm5, mm5
302 :     mov eax, [esp+ 4] ; Src
303 :    
304 :     ABS_16x16_MMX
305 :     ABS_16x16_MMX
306 :     ABS_16x16_MMX
307 :     ABS_16x16_MMX
308 :     ABS_16x16_MMX
309 :     ABS_16x16_MMX
310 :     ABS_16x16_MMX
311 :     ABS_16x16_MMX
312 :    
313 :     ABS_16x16_MMX
314 :     ABS_16x16_MMX
315 :     ABS_16x16_MMX
316 :     ABS_16x16_MMX
317 :     ABS_16x16_MMX
318 :     ABS_16x16_MMX
319 :     ABS_16x16_MMX
320 :     ABS_16x16_MMX
321 :    
322 :     pmaddwd mm5, [mmx_one] ; collapse
323 :     movq mm6, mm5
324 :     psrlq mm6, 32
325 :     paddd mm6, mm5
326 :    
327 :     movd eax, mm6
328 :     ret

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