summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/libmpeg3/video/reconmmx.s
Unidiff
Diffstat (limited to 'core/multimedia/opieplayer/libmpeg3/video/reconmmx.s') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmpeg3/video/reconmmx.s301
1 files changed, 301 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/libmpeg3/video/reconmmx.s b/core/multimedia/opieplayer/libmpeg3/video/reconmmx.s
new file mode 100644
index 0000000..1bb98ef
--- a/dev/null
+++ b/core/multimedia/opieplayer/libmpeg3/video/reconmmx.s
@@ -0,0 +1,301 @@
1 ADD_1: dd 01010101h, 01010101h
2 MASK_AND:dd 7f7f7f7fh, 7f7f7f7fh
3 PLUS_384:dd 01800180h, 01800180h
4 PLUS_128:dd 00800080h, 00800080h
5
6%assign LocalFrameSize 0
7%assign RegisterStorageSize 16
8
9; Arguments:
10%assign source LocalFrameSize + RegisterStorageSize + 4
11%assign dest LocalFrameSize + RegisterStorageSize + 8
12%assign lx2 LocalFrameSize + RegisterStorageSize + 12
13%assign h LocalFrameSize + RegisterStorageSize + 16
14
15; Locals (on local stack frame)
16
17
18; extern void C rec_mmx (
19; unsigned char *source,
20; unsigned char *dest,
21; int lx2,
22; int h
23;
24; The local variables are on the stack,
25;
26
27global recva_mmx
28global recvac_mmx
29global rech_mmx
30global rechc_mmx
31global add_block_mmx
32global set_block_mmx
33
34
35 align 16
36rech_mmx:
37 push esi
38 push edi
39 push ecx
40 push ebx
41 mov esi, [esp+source]
42 mov edi, [esp+dest]
43 mov ecx, [esp+h]
44 mov ebx, [esp+lx2]
45 movq mm5, [MASK_AND]
46 movq mm6, [ADD_1]
47.rech1:
48 movq mm0,[esi]
49 movq mm1,[esi+1]
50 movq mm2,[esi+8]
51 movq mm3,[esi+9]
52 psrlw mm0,1
53 psrlw mm1,1
54 psrlw mm2,1
55 psrlw mm3,1
56 pand mm0,mm5
57 pand mm1,mm5
58 pand mm2,mm5
59 pand mm3,mm5
60 paddusb mm0,mm1
61 paddusb mm2,mm3
62 paddusb mm0,mm6
63 paddusb mm2,mm6
64 movq [edi],mm0
65 add esi,ebx
66 movq [edi+8],mm2
67 add edi,ebx
68 dec ecx
69 jnz .rech1
70 emms
71 pop ebx
72 pop ecx
73 pop edi
74 pop esi
75 ret
76
77 align 16
78rechc_mmx:
79 push esi
80 push edi
81 push ecx
82 push ebx
83; sub esp, LocalFrameSize
84 mov esi, [esp+source]
85 mov edi, [esp+dest]
86 mov ecx, [esp+h]
87 mov ebx, [esp+lx2]
88 movq mm5, [MASK_AND]
89 movq mm6, [ADD_1]
90.rechc1:
91 movq mm0,[esi]
92 movq mm1,[esi+1]
93 psrlw mm0,1
94 psrlw mm1,1
95 pand mm0,mm5
96 pand mm1,mm5
97 paddusb mm0,mm1
98 paddusb mm0,mm6
99 movq [edi],mm0
100 add edi,ebx
101 add esi,ebx
102 dec ecx
103 jnz .rechc1
104 emms
105; add esp, LocalFrameSize
106 pop ebx
107 pop ecx
108 pop edi
109 pop esi
110 ret
111
112
113
114%assign RegisterStorageSize 20
115%assign source LocalFrameSize + RegisterStorageSize + 4
116%assign dest LocalFrameSize + RegisterStorageSize + 8
117%assign lx LocalFrameSize + RegisterStorageSize + 12
118%assign lx2 LocalFrameSize + RegisterStorageSize + 16
119%assign h LocalFrameSize + RegisterStorageSize + 20
120
121 align 16
122recva_mmx:
123 push esi
124 push edi
125 push ecx
126 push ebx
127 push edx
128 mov esi, [esp+source]
129 mov edi, [esp+dest]
130 mov ecx, [esp+h]
131 mov ebx, [esp+lx2]
132 mov edx, [esp+lx]
133 movq mm7, [MASK_AND]
134 movq mm6, [ADD_1]
135.recva1:
136 movq mm0,[esi]
137 movq mm1,[esi+edx]
138 movq mm2,[esi+8]
139 movq mm3,[esi+edx+8]
140 movq mm4,[edi]
141 movq mm5,[edi+8]
142 psrlw mm0,1
143 psrlw mm1,1
144 psrlw mm2,1
145 psrlw mm3,1
146 psrlw mm4,1
147 psrlw mm5,1
148 pand mm0,mm7
149 pand mm1,mm7
150 pand mm2,mm7
151 pand mm3,mm7
152 pand mm4,mm7
153 pand mm5,mm7
154 paddusb mm0,mm1
155 paddusb mm2,mm3
156 paddusb mm0,mm6
157 paddusb mm2,mm6
158 psrlw mm0,1
159 psrlw mm2,1
160 pand mm0,mm7
161 pand mm2,mm7
162 paddusb mm4,mm0
163 paddusb mm5,mm2
164 paddusb mm4,mm6
165 paddusb mm5,mm6
166 movq [edi],mm4
167 movq [edi+8],mm5
168 add edi,ebx
169 add esi,ebx
170 dec ecx
171 jnz near .recva1
172 emms
173 pop edx
174 pop ebx
175 pop ecx
176 pop edi
177 pop esi
178 ret
179
180 align 16
181recvac_mmx:
182 push esi
183 push edi
184 push ecx
185 push ebx
186 push edx
187 mov esi, [esp+source]
188 mov edi, [esp+dest]
189 mov ecx, [esp+h]
190 mov ebx, [esp+lx2]
191 mov edx, [esp+lx]
192 movq mm5, [MASK_AND]
193 movq mm6, [ADD_1]
194.recvac1:
195 movq mm0,[esi]
196 movq mm1,[esi+edx]
197 movq mm4,[edi]
198 psrlw mm0,1
199 psrlw mm1,1
200 psrlw mm4,1
201 pand mm0,mm5
202 pand mm1,mm5
203 pand mm4,mm5
204 paddusb mm0,mm1
205 paddusb mm0,mm6
206 psrlw mm0,1
207 pand mm0,mm5
208 paddusb mm4,mm0
209 paddusb mm4,mm6
210 movq [edi],mm4
211 add edi,ebx
212 add esi,ebx
213 dec ecx
214 jnz .recvac1
215 emms
216 pop edx
217 pop ebx
218 pop ecx
219 pop edi
220 pop esi
221 ret
222
223%assign RegisterStorageSize 20
224%assign rfp LocalFrameSize + RegisterStorageSize + 4
225%assign bp LocalFrameSize + RegisterStorageSize + 8
226%assign iincr LocalFrameSize + RegisterStorageSize + 12
227
228; FIXME clipping needs to be done
229
230 align 16
231add_block_mmx:
232 push esi
233 push edi
234 push ecx
235 push ebx
236 push edx
237 mov esi, [esp+bp]
238 mov edi, [esp+rfp]
239 mov ebx, [esp+iincr]
240; movq mm7, [PLUS_384]
241 mov ecx,8
242 pxor mm2,mm2 ; clear
243%rep 8
244 movq mm0, [edi] ; get dest
245 movq mm1,mm0
246 punpcklbw mm0,mm2
247 punpckhbw mm1,mm2
248 paddsw mm0, [esi]
249 paddsw mm1, [esi+8]
250; paddsw mm0, mm7
251; paddsw mm1, mm7
252 packuswb mm0,mm1
253 movq [edi], mm0
254 add edi,ebx
255 add esi,16
256%endrep
257 emms
258 pop edx
259 pop ebx
260 pop ecx
261 pop edi
262 pop esi
263 ret
264
265 align 16
266set_block_mmx:
267 push esi
268 push edi
269 push ecx
270 push ebx
271 push edx
272 mov esi, [esp+bp]
273 mov edi, [esp+rfp]
274 mov ebx, [esp+iincr]
275 movq mm7, [PLUS_128]
276%rep 4
277 movq mm0, [esi]
278 movq mm1, [esi+8]
279 paddsw mm0, mm7
280 movq mm2, [esi+16]
281 paddsw mm1, mm7
282 movq mm3, [esi+24]
283 paddsw mm2, mm7
284 packuswb mm0, mm1
285 paddsw mm3, mm7
286 movq [edi], mm0
287 packuswb mm2, mm3
288 add edi, ebx
289 add esi, 32
290 movq [edi], mm2
291 add edi, ebx
292%endrep
293 emms
294 pop edx
295 pop ebx
296 pop ecx
297 pop edi
298 pop esi
299 ret
300
301