[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 1382 - (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 :     ; eax y_stride
16 :     ; ebx u_ptr
17 :     ; ecx v_ptr
18 :     ; edx x_stride
19 :     ; esi y_ptr
20 :     ; edi x_ptr
21 :     ; ebp width
22 :     ;
23 :     ;------------------------------------------------------------------------------
24 :     %macro MAKE_COLORSPACE 8
25 :     %define NAME %1
26 :     %define STACK %2
27 :     %define BYTES %3
28 :     %define PIXELS %4
29 :     %define VPIXELS %5
30 :     %define FUNC %6
31 :     %define ARG1 %7
32 :     %define ARG2 %8
33 :     ; --- define function global/symbol
34 : edgomez 1382 ALIGN 16
35 : edgomez 851 cglobal NAME
36 : edgomez 1382 NAME:
37 : edgomez 851 ; --- init stack ---
38 :    
39 :     %define pushsize 16
40 :     %define localsize 20 + STACK
41 :    
42 : edgomez 1382 %define vflip esp + localsize + pushsize + 40
43 :     %define height esp + localsize + pushsize + 36
44 :     %define width esp + localsize + pushsize + 32
45 :     %define uv_stride esp + localsize + pushsize + 28
46 :     %define y_stride esp + localsize + pushsize + 24
47 :     %define v_ptr esp + localsize + pushsize + 20
48 :     %define u_ptr esp + localsize + pushsize + 16
49 :     %define y_ptr esp + localsize + pushsize + 12
50 :     %define x_stride esp + localsize + pushsize + 8
51 :     %define x_ptr esp + localsize + pushsize + 4
52 :     %define _ip esp + localsize + pushsize + 0
53 : edgomez 851
54 : edgomez 1382 push ebx ; esp + localsize + 16
55 :     push esi ; esp + localsize + 8
56 :     push edi ; esp + localsize + 4
57 :     push ebp ; esp + localsize + 0
58 : edgomez 851
59 : edgomez 1382 %define x_dif esp + localsize - 4
60 :     %define y_dif esp + localsize - 8
61 :     %define uv_dif esp + localsize - 12
62 :     %define fixed_width esp + localsize - 16
63 :     %define tmp_height esp + localsize - 20
64 : edgomez 851
65 : edgomez 1382 sub esp, localsize
66 : edgomez 851
67 : edgomez 1382 ; --- init varibles ---
68 :    
69 :     mov eax, [width] ; fixed width
70 :     add eax, 15 ;
71 :     and eax, ~15 ;
72 :     mov [fixed_width],eax ;
73 : edgomez 851
74 : edgomez 1382 mov ebx, [x_stride] ;
75 : edgomez 851 %rep BYTES
76 : edgomez 1382 sub ebx, eax ;
77 : edgomez 851 %endrep
78 : edgomez 1382 mov [x_dif], ebx ; x_dif = x_stride - BYTES*fixed_width
79 : edgomez 851
80 : edgomez 1382 mov ebx, [y_stride] ;
81 :     sub ebx, eax ;
82 :     mov [y_dif], ebx ; y_dif = y_stride - fixed_width
83 : edgomez 851
84 : edgomez 1382 mov ebx, [uv_stride] ;
85 :     mov ecx, eax ;
86 :     shr ecx, 1 ;
87 :     sub ebx, ecx ;
88 :     mov [uv_dif], ebx ; uv_dif = uv_stride - fixed_width/2
89 : edgomez 851
90 : edgomez 1382 mov esi, [y_ptr] ; $esi$ = y_ptr
91 :     mov edi, [x_ptr] ; $edi$ = x_ptr
92 :     mov edx, [x_stride] ; $edx$ = x_stride
93 :     mov ebp, [height] ; $ebp$ = height
94 : edgomez 851
95 :    
96 : edgomez 1382 mov ebx, [vflip]
97 :     or ebx, ebx
98 :     jz .dont_flip
99 : edgomez 851
100 : edgomez 1382 ; --- do flipping ---
101 : edgomez 851
102 : edgomez 1382 xor ebx,ebx
103 : edgomez 851 %rep BYTES
104 : edgomez 1382 sub ebx, eax
105 : edgomez 851 %endrep
106 : edgomez 1382 sub ebx, edx
107 :     mov [x_dif], ebx ; x_dif = -BYTES*fixed_width - x_stride
108 : edgomez 851
109 : edgomez 1382 mov eax, ebp
110 :     sub eax, 1
111 :     push edx
112 :     mul edx
113 :     pop edx
114 :     add edi, eax ; $edi$ += (height-1) * x_stride
115 : edgomez 851
116 : edgomez 1382 neg edx ; x_stride = -x_stride
117 : edgomez 851
118 :     .dont_flip
119 :    
120 : edgomez 1382 ; --- begin loop ---
121 : edgomez 851
122 : edgomez 1382 mov eax, [y_stride] ; $eax$ = y_stride
123 :     mov ebx, [u_ptr] ; $ebx$ = u_ptr
124 :     mov ecx, [v_ptr] ; $ecx$ = v_ptr
125 : edgomez 851
126 : edgomez 1382 FUNC %+ _INIT ARG1, ARG2 ; call FUNC_INIT
127 : edgomez 851
128 :     .y_loop
129 : edgomez 1382 mov [tmp_height], ebp
130 :     mov ebp, [fixed_width]
131 : edgomez 851
132 :     .x_loop
133 : edgomez 1382 FUNC ARG1, ARG2 ; call FUNC
134 : edgomez 851
135 : edgomez 1382 add edi, BYTES*PIXELS ; x_ptr += BYTES*PIXELS
136 :     add esi, PIXELS ; y_ptr += PIXELS
137 :     add ebx, PIXELS/2 ; u_ptr += PIXELS/2
138 :     add ecx, PIXELS/2 ; v_ptr += PIXELS/2
139 :    
140 :     sub ebp, PIXELS ; $ebp$ -= PIXELS
141 :     jg .x_loop ; if ($ebp$ > 0) goto .x_loop
142 : edgomez 851
143 : edgomez 1382 mov ebp, [tmp_height]
144 :     add edi, [x_dif] ; x_ptr += x_dif + (VPIXELS-1)*x_stride
145 :     add esi, [y_dif] ; y_ptr += y_dif + (VPIXELS-1)*y_stride
146 : edgomez 851 %rep VPIXELS-1
147 : edgomez 1382 add edi, edx
148 :     add esi, eax
149 : edgomez 851 %endrep
150 :    
151 : edgomez 1382 add ebx, [uv_dif] ; u_ptr += uv_dif + ((VPIXELS/2)-1)*uv_stride
152 :     add ecx, [uv_dif] ; v_ptr += uv_dif + ((VPIXELS/2)-1)*uv_stride
153 : edgomez 851 %rep (VPIXELS/2)-1
154 : edgomez 1382 add ebx, [uv_stride]
155 :     add ecx, [uv_stride]
156 : edgomez 851 %endrep
157 :    
158 : edgomez 1382 sub ebp, VPIXELS ; $ebp$ -= VPIXELS
159 :     jg .y_loop ; if ($ebp$ > 0) goto .y_loop
160 : edgomez 851
161 : edgomez 1382 ; cleanup stack & undef everything
162 : edgomez 851
163 : edgomez 1382 add esp, localsize
164 :     pop ebp
165 :     pop edi
166 :     pop esi
167 :     pop ebx
168 : edgomez 851
169 :     %undef vflip
170 :     %undef height
171 :     %undef width
172 :     %undef uv_stride
173 :     %undef y_stride
174 :     %undef v_ptr
175 :     %undef u_ptr
176 :     %undef y_ptr
177 :     %undef x_stride
178 :     %undef x_ptr
179 :     %undef _ip
180 :     %undef x_dif
181 :     %undef y_dif
182 :     %undef uv_dif
183 :     %undef fixed_width
184 :     %undef tmp_height
185 : edgomez 1382 ret
186 : edgomez 851 %undef NAME
187 :     %undef STACK
188 :     %undef BYTES
189 :     %undef PIXELS
190 :     %undef VPIXELS
191 :     %undef FUNC
192 :     %undef ARG1
193 :     %endmacro
194 :     ;------------------------------------------------------------------------------

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