[svn] / trunk / xvidcore / src / image / x86_asm / colorspace_mmx.inc Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/image/x86_asm/colorspace_mmx.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1834 - (view) (download)

1 : edgomez 851 ;------------------------------------------------------------------------------
2 :     ;
3 :     ; MAKE_COLORSPACE(NAME,STACK, BYTES,PIXELS,ROWS, FUNC, ARG1)
4 :     ;
5 :     ; This macro provides a assembler width/height scroll loop
6 :     ; NAME function name
7 :     ; STACK additional stack bytes required by FUNC
8 :     ; BYTES bytes-per-pixel for the given colorspace
9 :     ; PIXELS pixels (columns) operated on per FUNC call
10 :     ; VPIXELS vpixels (rows) operated on per FUNC call
11 :     ; FUNC conversion macro name; we expect to find FUNC_INIT and FUNC macros
12 :     ; ARG1 argument passed to FUNC
13 :     ;
14 :     ; throughout the FUNC the registers mean:
15 :     ;------------------------------------------------------------------------------
16 : Isibaar 1795
17 :     %define y_stride _EAX
18 :     %define u_ptr _EBX
19 :     %define v_ptr _ECX
20 :     %define x_stride _EDX
21 :     %define x_stride_d edx
22 :     %define y_ptr _ESI
23 :     %define x_ptr _EDI
24 :     %define width _EBP
25 :    
26 : edgomez 851 %macro MAKE_COLORSPACE 8
27 :     %define NAME %1
28 :     %define STACK %2
29 :     %define BYTES %3
30 :     %define PIXELS %4
31 :     %define VPIXELS %5
32 :     %define FUNC %6
33 :     %define ARG1 %7
34 :     %define ARG2 %8
35 :     ; --- define function global/symbol
36 : Isibaar 1795 ALIGN SECTION_ALIGN
37 : edgomez 851 cglobal NAME
38 : edgomez 1382 NAME:
39 : edgomez 851 ; --- init stack ---
40 :    
41 : Isibaar 1795 push _EBX ; esp + localsize + 16
42 : edgomez 851
43 : Isibaar 1795 %ifdef ARCH_IS_X86_64
44 : edgomez 851
45 : Isibaar 1795 %define localsize 2*PTR_SIZE + STACK
46 :     %ifndef WINDOWS
47 :     %define pushsize 2*PTR_SIZE
48 :     %define shadow 0
49 :     %else
50 :     %define pushsize 4*PTR_SIZE
51 : Isibaar 1803 %define shadow 32 + 2*PTR_SIZE
52 : Isibaar 1795 %endif
53 : edgomez 851
54 : Isibaar 1795 %define prm_vflip dword [_ESP + localsize + pushsize + shadow + 4*PTR_SIZE]
55 :     %define prm_height dword [_ESP + localsize + pushsize + shadow + 3*PTR_SIZE]
56 :     %define prm_width dword [_ESP + localsize + pushsize + shadow + 2*PTR_SIZE]
57 :     %define prm_uv_stride dword [_ESP + localsize + pushsize + shadow + 1*PTR_SIZE]
58 : edgomez 851
59 : Isibaar 1795 %ifdef WINDOWS
60 : Isibaar 1803 %define prm_y_stride dword [_ESP + localsize + pushsize + shadow + 0*PTR_SIZE]
61 :     %define prm_v_ptr [_ESP + localsize + pushsize + shadow - 1*PTR_SIZE]
62 : edgomez 851
63 : Isibaar 1795 push _ESI ; esp + localsize + 8
64 :     push _EDI ; esp + localsize + 4
65 :    
66 :     %else
67 :     %define prm_y_stride prm6d
68 :     %define prm_v_ptr prm5
69 :     %endif
70 :    
71 :     %define prm_u_ptr prm4
72 :     %define prm_y_ptr prm3
73 :     %define prm_x_stride prm2d
74 :     %define prm_x_ptr prm1
75 :     %define _ip _ESP + localsize + pushsize + 0
76 :    
77 :     %define x_dif TMP0
78 :    
79 :     %else
80 :    
81 :     %define localsize 5*PTR_SIZE + STACK
82 :     %define pushsize 4*PTR_SIZE
83 :    
84 :     %define prm_vflip [_ESP + localsize + pushsize + 10*PTR_SIZE]
85 :     %define prm_height [_ESP + localsize + pushsize + 9*PTR_SIZE]
86 :     %define prm_width [_ESP + localsize + pushsize + 8*PTR_SIZE]
87 :     %define prm_uv_stride [_ESP + localsize + pushsize + 7*PTR_SIZE]
88 :     %define prm_y_stride [_ESP + localsize + pushsize + 6*PTR_SIZE]
89 :     %define prm_v_ptr [_ESP + localsize + pushsize + 5*PTR_SIZE]
90 :     %define prm_u_ptr [_ESP + localsize + pushsize + 4*PTR_SIZE]
91 :     %define prm_y_ptr [_ESP + localsize + pushsize + 3*PTR_SIZE]
92 :     %define prm_x_stride [_ESP + localsize + pushsize + 2*PTR_SIZE]
93 :     %define prm_x_ptr [_ESP + localsize + pushsize + 1*PTR_SIZE]
94 :     %define _ip _ESP + localsize + pushsize + 0
95 :    
96 :     %define x_dif dword [_ESP + localsize - 5*4]
97 :    
98 :     push _ESI ; esp + localsize + 8
99 :     push _EDI ; esp + localsize + 4
100 :    
101 :     %endif
102 :    
103 :     push _EBP ; esp + localsize + 0
104 :    
105 :     %define y_dif dword [_ESP + localsize - 1*4]
106 :     %define uv_dif dword [_ESP + localsize - 2*4]
107 :     %define fixed_width dword [_ESP + localsize - 3*4]
108 :     %define tmp_height dword [_ESP + localsize - 4*4]
109 :    
110 :     sub _ESP, localsize
111 :    
112 : edgomez 1382 ; --- init varibles ---
113 :    
114 : Isibaar 1795 mov eax, prm_width ; fixed width
115 :     add eax, 15 ;
116 :     and eax, ~15 ;
117 :     mov fixed_width, eax ;
118 : edgomez 851
119 : Isibaar 1795 mov ebx, prm_x_stride ;
120 : edgomez 851 %rep BYTES
121 : Isibaar 1795 sub _EBX, _EAX ;
122 : edgomez 851 %endrep
123 : Isibaar 1795 mov x_dif, _EBX ; x_dif = x_stride - BYTES*fixed_width
124 : edgomez 851
125 : Isibaar 1795 mov ebx, prm_y_stride ;
126 :     sub ebx, eax ;
127 :     mov y_dif, ebx ; y_dif = y_stride - fixed_width
128 : edgomez 851
129 : Isibaar 1795 mov ebx, prm_uv_stride ;
130 :     mov TMP1, _EAX ;
131 :     shr TMP1, 1 ;
132 :     sub _EBX, TMP1 ;
133 :     mov uv_dif, ebx ; uv_dif = uv_stride - fixed_width/2
134 : edgomez 851
135 : Isibaar 1795 %ifdef ARCH_IS_X86_64
136 :     %ifndef WINDOWS
137 :     mov TMP1d, prm_x_stride
138 :     mov _ESI, prm_y_ptr
139 :     mov _EDX, TMP1
140 :     %else
141 :     mov _ESI, prm_y_ptr
142 :     mov _EDI, prm_x_ptr
143 :     %endif
144 :     %else
145 :     mov _ESI, prm_y_ptr ; $esi$ = y_ptr
146 :     mov _EDI, prm_x_ptr ; $edi$ = x_ptr
147 :     mov edx, prm_x_stride ; $edx$ = x_stride
148 :     %endif
149 : edgomez 851
150 : Isibaar 1795 mov ebp, prm_height ; $ebp$ = height
151 : edgomez 851
152 : Isibaar 1795 mov ebx, prm_vflip
153 :     or _EBX, _EBX
154 : edgomez 1382 jz .dont_flip
155 : edgomez 851
156 : edgomez 1382 ; --- do flipping ---
157 : edgomez 851
158 : Isibaar 1795 xor _EBX,_EBX
159 : edgomez 851 %rep BYTES
160 : Isibaar 1795 sub _EBX, _EAX
161 : edgomez 851 %endrep
162 : Isibaar 1795 sub _EBX, _EDX
163 :     mov x_dif, _EBX ; x_dif = -BYTES*fixed_width - x_stride
164 : edgomez 851
165 : Isibaar 1834 lea _EAX, [_EBP-1]
166 :    
167 : Isibaar 1795 %ifdef ARCH_IS_X86_64
168 :     mov TMP1, _EDX
169 :     mul edx
170 :     mov _EDX, TMP1
171 :     %else
172 :     push _EDX
173 :     mul edx
174 :     pop _EDX
175 :     %endif
176 :     add _EDI, _EAX ; $edi$ += (height-1) * x_stride
177 : edgomez 851
178 : Isibaar 1795 neg _EDX ; x_stride = -x_stride
179 : edgomez 851
180 : Isibaar 1793 .dont_flip:
181 : edgomez 851
182 : edgomez 1382 ; --- begin loop ---
183 : edgomez 851
184 : Isibaar 1795 mov eax, prm_y_stride ; $eax$ = y_stride
185 :     mov _EBX, prm_u_ptr ; $ebx$ = u_ptr
186 :     mov _ECX, prm_v_ptr ; $ecx$ = v_ptr
187 : edgomez 851
188 : Isibaar 1795 FUNC %+ _INIT ARG1, ARG2 ; call FUNC_INIT
189 : edgomez 851
190 : Isibaar 1793 .y_loop:
191 : Isibaar 1795 mov tmp_height, ebp
192 :     mov ebp, fixed_width
193 : edgomez 851
194 : Isibaar 1793 .x_loop:
195 : Isibaar 1795 FUNC ARG1, ARG2 ; call FUNC
196 : edgomez 851
197 : Isibaar 1795 add _EDI, BYTES*PIXELS ; x_ptr += BYTES*PIXELS
198 :     add _ESI, PIXELS ; y_ptr += PIXELS
199 :     add _EBX, PIXELS/2 ; u_ptr += PIXELS/2
200 :     add _ECX, PIXELS/2 ; v_ptr += PIXELS/2
201 : edgomez 1382
202 : Isibaar 1795 sub _EBP, PIXELS ; $ebp$ -= PIXELS
203 :     jg .x_loop ; if ($ebp$ > 0) goto .x_loop
204 : edgomez 851
205 : Isibaar 1795 mov ebp, tmp_height
206 :     add _EDI, x_dif ; x_ptr += x_dif + (VPIXELS-1)*x_stride
207 :     %ifdef ARCH_IS_X86_64
208 :     mov TMP1d, y_dif
209 :     add _ESI, TMP1 ; y_ptr += y_dif + (VPIXELS-1)*y_stride
210 :     %else
211 :     add _ESI, y_dif ; y_ptr += y_dif + (VPIXELS-1)*y_stride
212 :     %endif
213 :    
214 : edgomez 851 %rep VPIXELS-1
215 : Isibaar 1795 add _EDI, _EDX
216 :     add _ESI, _EAX
217 : edgomez 851 %endrep
218 :    
219 : Isibaar 1795 %ifdef ARCH_IS_X86_64
220 :     mov TMP1d, uv_dif
221 :     add _EBX, TMP1 ; u_ptr += uv_dif + ((VPIXELS/2)-1)*uv_stride
222 :     add _ECX, TMP1 ; v_ptr += uv_dif + ((VPIXELS/2)-1)*uv_stride
223 :     %else
224 :     add _EBX, uv_dif ; u_ptr += uv_dif + ((VPIXELS/2)-1)*uv_stride
225 :     add _ECX, uv_dif ; v_ptr += uv_dif + ((VPIXELS/2)-1)*uv_stride
226 :     %endif
227 :    
228 : edgomez 851 %rep (VPIXELS/2)-1
229 : Isibaar 1795 %ifdef ARCH_IS_X86_64
230 :     mov TMP1d, prm_uv_stride
231 :     add _EBX, TMP1
232 :     add _ECX, TMP1
233 :     %else
234 :     add _EBX, prm_uv_stride
235 :     add _ECX, prm_uv_stride
236 :     %endif
237 : edgomez 851 %endrep
238 :    
239 : Isibaar 1795 sub _EBP, VPIXELS ; $ebp$ -= VPIXELS
240 :     jg .y_loop ; if ($ebp$ > 0) goto .y_loop
241 : edgomez 851
242 : edgomez 1382 ; cleanup stack & undef everything
243 : edgomez 851
244 : Isibaar 1795 add _ESP, localsize
245 : edgomez 851
246 : Isibaar 1795 pop _EBP
247 :     %ifndef ARCH_IS_X86_64
248 :     pop _EDI
249 :     pop _ESI
250 :     %else
251 :     %ifdef WINDOWS
252 :     pop _EDI
253 :     pop _ESI
254 :     %endif
255 :     %endif
256 :     pop _EBX
257 :    
258 :     %undef prm_vflip
259 :     %undef prm_height
260 :     %undef prm_width
261 :     %undef prm_uv_stride
262 :     %undef prm_y_stride
263 :     %undef prm_v_ptr
264 :     %undef prm_u_ptr
265 :     %undef prm_y_ptr
266 :     %undef prm_x_stride
267 :     %undef prm_x_ptr
268 : edgomez 851 %undef _ip
269 :     %undef x_dif
270 :     %undef y_dif
271 :     %undef uv_dif
272 :     %undef fixed_width
273 :     %undef tmp_height
274 : edgomez 1382 ret
275 : Isibaar 1793 ENDFUNC
276 : edgomez 851 %undef NAME
277 :     %undef STACK
278 :     %undef BYTES
279 :     %undef PIXELS
280 :     %undef VPIXELS
281 :     %undef FUNC
282 :     %undef ARG1
283 :     %endmacro
284 :     ;------------------------------------------------------------------------------

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