[svn] / branches / dev-api-3 / xvidcore / src / image / x86_asm / interpolate8x8_mmx.asm Repository:
ViewVC logotype

Annotation of /branches/dev-api-3/xvidcore/src/image/x86_asm/interpolate8x8_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : Isibaar 262 ;/**************************************************************************
2 :     ; *
3 :     ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * mmx 8x8 block-based halfpel interpolation
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 :     ; * 06.07.2002 mmx cleanup - Isibaar
27 :     ; * 22.12.2001 inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>
28 :     ; *
29 :     ; *************************************************************************/
30 :    
31 :    
32 :     bits 32
33 :    
34 :     %macro cglobal 1
35 :     %ifdef PREFIX
36 :     global _%1
37 :     %define %1 _%1
38 :     %else
39 :     global %1
40 :     %endif
41 :     %endmacro
42 :    
43 :     section .data
44 :    
45 :     align 16
46 :    
47 :     ;===========================================================================
48 :     ; (1 - r) rounding table
49 :     ;===========================================================================
50 :    
51 :     rounding1_mmx
52 :     times 4 dw 1
53 :     times 4 dw 0
54 :    
55 :     ;===========================================================================
56 :     ; (2 - r) rounding table
57 :     ;===========================================================================
58 :    
59 :     rounding2_mmx
60 :     times 4 dw 2
61 :     times 4 dw 1
62 :    
63 :     mmx_one
64 :     times 8 db 1
65 :    
66 :     section .text
67 :    
68 :     %macro CALC_AVG 6
69 :     punpcklbw %3, %6
70 :     punpckhbw %4, %6
71 :    
72 :     paddusw %1, %3 ; mm01 += mm23
73 :     paddusw %2, %4
74 :     paddusw %1, %5 ; mm01 += rounding
75 :     paddusw %2, %5
76 :    
77 :     psrlw %1, 1 ; mm01 >>= 1
78 :     psrlw %2, 1
79 :    
80 :     %endmacro
81 :    
82 :    
83 :     ;===========================================================================
84 :     ;
85 :     ; void interpolate8x8_halfpel_h_mmx(uint8_t * const dst,
86 :     ; const uint8_t * const src,
87 :     ; const uint32_t stride,
88 :     ; const uint32_t rounding);
89 :     ;
90 :     ;===========================================================================
91 :    
92 :     %macro COPY_H_MMX 0
93 :     movq mm0, [esi]
94 :     movq mm2, [esi + 1]
95 :     movq mm1, mm0
96 :     movq mm3, mm2
97 :    
98 :     punpcklbw mm0, mm6 ; mm01 = [src]
99 :     punpckhbw mm1, mm6 ; mm23 = [src + 1]
100 :    
101 :     CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6
102 :    
103 :     packuswb mm0, mm1
104 :     movq [edi], mm0 ; [dst] = mm01
105 :    
106 :     add esi, edx ; src += stride
107 :     add edi, edx ; dst += stride
108 :     %endmacro
109 :    
110 :     align 16
111 :     cglobal interpolate8x8_halfpel_h_mmx
112 :     interpolate8x8_halfpel_h_mmx
113 :    
114 :     push esi
115 :     push edi
116 :    
117 :     mov eax, [esp + 8 + 16] ; rounding
118 :    
119 :     interpolate8x8_halfpel_h_mmx.start
120 :     movq mm7, [rounding1_mmx + eax * 8]
121 :    
122 :     mov edi, [esp + 8 + 4] ; dst
123 :     mov esi, [esp + 8 + 8] ; src
124 :     mov edx, [esp + 8 + 12] ; stride
125 :    
126 :     pxor mm6, mm6 ; zero
127 :    
128 :     COPY_H_MMX
129 :     COPY_H_MMX
130 :     COPY_H_MMX
131 :     COPY_H_MMX
132 :     COPY_H_MMX
133 :     COPY_H_MMX
134 :     COPY_H_MMX
135 :     COPY_H_MMX
136 :    
137 :     pop edi
138 :     pop esi
139 :    
140 :     ret
141 :    
142 :    
143 :     ;===========================================================================
144 :     ;
145 :     ; void interpolate8x8_halfpel_v_mmx(uint8_t * const dst,
146 :     ; const uint8_t * const src,
147 :     ; const uint32_t stride,
148 :     ; const uint32_t rounding);
149 :     ;
150 :     ;===========================================================================
151 :    
152 :     %macro COPY_V_MMX 0
153 :     movq mm0, [esi]
154 :     movq mm2, [esi + edx]
155 :     movq mm1, mm0
156 :     movq mm3, mm2
157 :    
158 :     punpcklbw mm0, mm6 ; mm01 = [src]
159 :     punpckhbw mm1, mm6 ; mm23 = [src + 1]
160 :    
161 :     CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6
162 :    
163 :     packuswb mm0, mm1
164 :     movq [edi], mm0 ; [dst] = mm01
165 :    
166 :     add esi, edx ; src += stride
167 :     add edi, edx ; dst += stride
168 :     %endmacro
169 :    
170 :     align 16
171 :     cglobal interpolate8x8_halfpel_v_mmx
172 :     interpolate8x8_halfpel_v_mmx
173 :    
174 :     push esi
175 :     push edi
176 :    
177 :     mov eax, [esp + 8 + 16] ; rounding
178 :    
179 :     interpolate8x8_halfpel_v_mmx.start
180 :     movq mm7, [rounding1_mmx + eax * 8]
181 :    
182 :     mov edi, [esp + 8 + 4] ; dst
183 :     mov esi, [esp + 8 + 8] ; src
184 :     mov edx, [esp + 8 + 12] ; stride
185 :    
186 :     pxor mm6, mm6 ; zero
187 :    
188 :    
189 :     COPY_V_MMX
190 :     COPY_V_MMX
191 :     COPY_V_MMX
192 :     COPY_V_MMX
193 :     COPY_V_MMX
194 :     COPY_V_MMX
195 :     COPY_V_MMX
196 :     COPY_V_MMX
197 :    
198 :     pop edi
199 :     pop esi
200 :    
201 :     ret
202 :    
203 :    
204 :     ;===========================================================================
205 :     ;
206 :     ; void interpolate8x8_halfpel_hv_mmx(uint8_t * const dst,
207 :     ; const uint8_t * const src,
208 :     ; const uint32_t stride,
209 :     ; const uint32_t rounding);
210 :     ;
211 :     ;
212 :     ;===========================================================================
213 :    
214 :     %macro COPY_HV_MMX 0
215 :     ; current row
216 :    
217 :     movq mm0, [esi]
218 :     movq mm2, [esi + 1]
219 :    
220 :     movq mm1, mm0
221 :     movq mm3, mm2
222 :    
223 :     punpcklbw mm0, mm6 ; mm01 = [src]
224 :     punpcklbw mm2, mm6 ; mm23 = [src + 1]
225 :     punpckhbw mm1, mm6
226 :     punpckhbw mm3, mm6
227 :    
228 :     paddusw mm0, mm2 ; mm01 += mm23
229 :     paddusw mm1, mm3
230 :    
231 :     ; next row
232 :    
233 :     movq mm4, [esi + edx]
234 :     movq mm2, [esi + edx + 1]
235 :    
236 :     movq mm5, mm4
237 :     movq mm3, mm2
238 :    
239 :     punpcklbw mm4, mm6 ; mm45 = [src + stride]
240 :     punpcklbw mm2, mm6 ; mm23 = [src + stride + 1]
241 :     punpckhbw mm5, mm6
242 :     punpckhbw mm3, mm6
243 :    
244 :     paddusw mm4, mm2 ; mm45 += mm23
245 :     paddusw mm5, mm3
246 :    
247 :     ; add current + next row
248 :    
249 :     paddusw mm0, mm4 ; mm01 += mm45
250 :     paddusw mm1, mm5
251 :     paddusw mm0, mm7 ; mm01 += rounding2
252 :     paddusw mm1, mm7
253 :    
254 :     psrlw mm0, 2 ; mm01 >>= 2
255 :     psrlw mm1, 2
256 :    
257 :     packuswb mm0, mm1
258 :     movq [edi], mm0 ; [dst] = mm01
259 :    
260 :     add esi, edx ; src += stride
261 :     add edi, edx ; dst += stride
262 :     %endmacro
263 :    
264 :     align 16
265 :     cglobal interpolate8x8_halfpel_hv_mmx
266 :     interpolate8x8_halfpel_hv_mmx
267 :    
268 :     push esi
269 :     push edi
270 :    
271 :     mov eax, [esp + 8 + 16] ; rounding
272 :     interpolate8x8_halfpel_hv_mmx.start
273 :    
274 :     movq mm7, [rounding2_mmx + eax * 8]
275 :    
276 :     mov edi, [esp + 8 + 4] ; dst
277 :     mov esi, [esp + 8 + 8] ; src
278 :    
279 :     mov eax, 8
280 :    
281 :     pxor mm6, mm6 ; zero
282 :    
283 :     mov edx, [esp + 8 + 12] ; stride
284 :    
285 :     COPY_HV_MMX
286 :     COPY_HV_MMX
287 :     COPY_HV_MMX
288 :     COPY_HV_MMX
289 :     COPY_HV_MMX
290 :     COPY_HV_MMX
291 :     COPY_HV_MMX
292 :     COPY_HV_MMX
293 :    
294 :     pop edi
295 :     pop esi
296 :    
297 :     ret

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