summaryrefslogtreecommitdiff
path: root/apps/plugins/mpegplayer/libmpeg2/motion_comp_coldfire_s.S
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/mpegplayer/libmpeg2/motion_comp_coldfire_s.S')
-rw-r--r--apps/plugins/mpegplayer/libmpeg2/motion_comp_coldfire_s.S436
1 files changed, 436 insertions, 0 deletions
diff --git a/apps/plugins/mpegplayer/libmpeg2/motion_comp_coldfire_s.S b/apps/plugins/mpegplayer/libmpeg2/motion_comp_coldfire_s.S
new file mode 100644
index 0000000000..55d87cb708
--- /dev/null
+++ b/apps/plugins/mpegplayer/libmpeg2/motion_comp_coldfire_s.S
@@ -0,0 +1,436 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2007 Jens Arnold
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22.macro LEFT8_PW dW1, dW2 | needs %d0 == 24, clobbers %d2
23 lsl.l #8, \dW1 | changes dW1, keeps dW2
24 move.l \dW2, %d2
25 lsr.l %d0, %d2
26 or.l %d2, \dW1
27.endm
28
29.macro LEFT24_PW dW1, dW2 | needs %d0 == 24, clobbers %d2
30 lsl.l %d0, \dW1 | changes dW1, keeps dW2
31 move.l \dW2, %d2
32 lsr.l #8, %d2
33 or.l %d2, \dW1
34.endm
35
36/*****************************************************************************/
37
38 .align 2
39 .global MC_put_o_8
40 .type MC_put_o_8, @function
41
42MC_put_o_8:
43 movem.l (4,%sp), %a0-%a1 | dest, source
44 move.l %a1, %d0
45 and.l #3, %d0
46 sub.l %d0, %a1 | align source
47 jmp.l (2, %pc, %d0.l*4)
48 bra.w .po8_0
49 bra.w .po8_1
50 bra.w .po8_2
51 | last table entry coincides with target
52
53.po8_3:
54 lea.l (-5*4,%sp), %sp
55 movem.l %d2-%d5/%a2, (%sp) | save some registers
56 move.l (5*4+12,%sp), %a2 | stride
57 move.l (5*4+16,%sp), %d1 | height
58 moveq.l #24, %d0 | shift amount
591:
60 movem.l (%a1), %d3-%d5
61 add.l %a2, %a1
62 LEFT24_PW %d3, %d4
63 lsl.l %d0, %d4
64 lsr.l #8, %d5
65 or.l %d5, %d4
66 movem.l %d3-%d4, (%a0)
67 add.l %a2, %a0
68 subq.l #1, %d1
69 bne.s 1b
70 movem.l (%sp), %d2-%d5/%a2
71 lea.l (5*4,%sp), %sp
72 rts
73
74.po8_2:
75 lea.l (-3*4,%sp), %sp
76 movem.l %d2-%d4, (%sp) | save some registers
77 movem.l (3*4+12,%sp), %d0-%d1 | stride, height
781:
79 movem.l (%a1), %d2-%d4
80 add.l %d0, %a1
81 swap %d2
82 swap %d3
83 move.w %d3, %d2
84 swap %d4
85 move.w %d4, %d3
86 movem.l %d2-%d3, (%a0)
87 add.l %d0, %a0
88 subq.l #1, %d1
89 bne.s 1b
90 movem.l (%sp), %d2-%d4
91 lea.l (3*4,%sp), %sp
92 rts
93
94.po8_1:
95 lea.l (-5*4,%sp), %sp
96 movem.l %d2-%d5/%a2, (%sp) | save some registers
97 move.l (5*4+12,%sp), %a2 | stride
98 move.l (5*4+16,%sp), %d1 | height
99 moveq.l #24, %d0 | shift amount
1001:
101 movem.l (%a1), %d3-%d5
102 add.l %a2, %a1
103 LEFT8_PW %d3, %d4
104 lsl.l #8, %d4
105 lsr.l %d0, %d5
106 or.l %d5, %d4
107 movem.l %d3-%d4, (%a0)
108 add.l %a2, %a0
109 subq.l #1, %d1
110 bne.s 1b
111 movem.l (%sp), %d2-%d5/%a2
112 lea.l (5*4,%sp), %sp
113 rts
114
115.po8_0:
116 movem.l (12,%sp), %d0-%d1 | stride, height
117 subq.l #4, %d0 | adjust for increment within the loop
1181:
119 move.l (%a1)+, (%a0)+
120 move.l (%a1), (%a0)
121 add.l %d0, %a0
122 add.l %d0, %a1
123 subq.l #1, %d1
124 bne.s 1b
125 rts
126
127/*****************************************************************************/
128
129 .align 2
130 .global MC_put_o_16
131 .type MC_put_o_16, @function
132
133MC_put_o_16:
134 lea.l (-7*4,%sp), %sp
135 movem.l %d2-%d7/%a2, (%sp) | save some registers
136 movem.l (7*4+4,%sp), %a0-%a2| dest, source, stride
137 move.l (7*4+16,%sp), %d1 | height
138 move.l %a1, %d0
139 and.l #3, %d0
140 sub.l %d0, %a1
141 jmp.l (2, %pc, %d0.l*4)
142 bra.w .po16_0
143 bra.w .po16_1
144 bra.w .po16_2
145 | last table entry coincides with target
146
147.po16_3:
148 moveq.l #24, %d0 | shift amount
1491:
150 movem.l (%a1), %d3-%d7
151 add.l %a2, %a1
152 LEFT24_PW %d3, %d4
153 LEFT24_PW %d4, %d5
154 LEFT24_PW %d5, %d6
155 lsl.l %d0, %d6
156 lsr.l #8, %d7
157 or.l %d7, %d6
158 movem.l %d3-%d6, (%a0)
159 add.l %a2, %a0
160 subq.l #1, %d1
161 bne.s 1b
162 movem.l (%sp), %d2-%d7/%a2
163 lea.l (7*4,%sp), %sp
164 rts
165
166.po16_2:
1671:
168 movem.l (%a1), %d3-%d7
169 add.l %a2, %a1
170 swap %d3
171 swap %d4
172 move.w %d4, %d3
173 swap %d5
174 move.w %d5, %d4
175 swap %d6
176 move.w %d6, %d5
177 swap %d7
178 move.w %d7, %d6
179 movem.l %d3-%d6, (%a0)
180 add.l %a2, %a0
181 subq.l #1, %d1
182 bne.s 1b
183 movem.l (%sp), %d2-%d7/%a2
184 lea.l (7*4,%sp), %sp
185 rts
186
187.po16_1:
188 moveq.l #24, %d0 | shift amount
1891:
190 movem.l (%a1), %d3-%d7
191 add.l %a2, %a1
192 LEFT8_PW %d3, %d4
193 LEFT8_PW %d4, %d5
194 LEFT8_PW %d5, %d6
195 lsl.l #8, %d6
196 lsr.l %d0, %d7
197 or.l %d7, %d6
198 movem.l %d3-%d6, (%a0)
199 add.l %a2, %a0
200 subq.l #1, %d1
201 bne.s 1b
202 movem.l (%sp), %d2-%d7/%a2
203 lea.l (7*4,%sp), %sp
204 rts
205
206.po16_0:
2071:
208 movem.l (%a1), %d3-%d6
209 add.l %a2, %a1
210 movem.l %d3-%d6, (%a0)
211 add.l %a2, %a0
212 subq.l #1, %d1
213 bne.s 1b
214 movem.l (%sp), %d2-%d7/%a2
215 lea.l (7*4,%sp), %sp
216 rts
217
218/*****************************************************************************/
219
220.macro AVG_PW dW1, dW2 | needs %d0 == 24, clobbers %d1, %d2,
221 move.l \dW1, %d1 | changes dW1, keeps dW2
222 lsl.l #8, \dW1
223 move.l \dW2, %d2
224 lsr.l %d0, %d2
225 or.l %d2, \dW1
226 move.l %d1, %d2
227 eor.l \dW1, %d1
228 and.l %d2, \dW1
229 move.l #0xfefefefe, %d2
230 and.l %d1, %d2
231 eor.l %d2, %d1
232 lsr.l #1, %d2
233 add.l %d2, \dW1
234 add.l %d1, \dW1
235.endm
236
237/*****************************************************************************/
238
239 .align 2
240 .global MC_put_x_8
241 .type MC_put_x_8, @function
242
243MC_put_x_8:
244 lea.l (-6*4,%sp), %sp
245 movem.l %d2-%d6/%a2, (%sp) | save some registers
246 movem.l (6*4+4,%sp), %a0-%a2| dest, source, stride
247 move.l (6*4+16,%sp), %d6 | height
248 move.l %a1, %d0
249 and.l #3, %d0
250 sub.l %d0, %a1
251 jmp.l (2, %pc, %d0.l*4)
252 bra.w .px8_0
253 bra.w .px8_1
254 bra.w .px8_2
255 | last table entry coincides with target
256
257.px8_3:
258 moveq.l #24, %d0
2591:
260 movem.l (%a1), %d3-%d5
261 add.l %a2, %a1
262 LEFT24_PW %d3, %d4
263 LEFT24_PW %d4, %d5
264 lsl.l %d0, %d5
265 AVG_PW %d3, %d4
266 AVG_PW %d4, %d5
267 movem.l %d3-%d4, (%a0)
268 add.l %a2, %a0
269 subq.l #1, %d6
270 bne.s 1b
271 movem.l (%sp), %d2-%d6/%a2
272 lea.l (6*4,%sp), %sp
273 rts
274
275.px8_2:
276 moveq.l #24, %d0
2771:
278 movem.l (%a1), %d3-%d5
279 add.l %a2, %a1
280 swap %d3
281 swap %d4
282 move.w %d4, %d3
283 swap %d5
284 move.w %d5, %d4
285 AVG_PW %d3, %d4
286 AVG_PW %d4, %d5
287 movem.l %d3-%d4, (%a0)
288 add.l %a2, %a0
289 subq.l #1, %d6
290 bne.s 1b
291 movem.l (%sp), %d2-%d6/%a2
292 lea.l (6*4,%sp), %sp
293 rts
294
295.px8_1:
296 moveq.l #24, %d0
2971:
298 movem.l (%a1), %d3-%d5
299 add.l %a2, %a1
300 LEFT8_PW %d3, %d4
301 LEFT8_PW %d4, %d5
302 lsl.l #8, %d5
303 AVG_PW %d3, %d4
304 AVG_PW %d4, %d5
305 movem.l %d3-%d4, (%a0)
306 add.l %a2, %a0
307 subq.l #1, %d6
308 bne.s 1b
309 movem.l (%sp), %d2-%d6/%a2
310 lea.l (6*4,%sp), %sp
311 rts
312
313.px8_0:
314 moveq.l #24, %d0
3151:
316 movem.l (%a1), %d3-%d5
317 add.l %a2, %a1
318 AVG_PW %d3, %d4
319 AVG_PW %d4, %d5
320 movem.l %d3-%d4, (%a0)
321 add.l %a2, %a0
322 subq.l #1, %d6
323 bne.s 1b
324 movem.l (%sp), %d2-%d6/%a2
325 lea.l (6*4,%sp), %sp
326 rts
327
328/*****************************************************************************/
329
330 .align 2
331 .global MC_put_x_16
332 .type MC_put_x_16, @function
333
334MC_put_x_16:
335 lea.l (-8*4,%sp), %sp
336 movem.l %d2-%d7/%a2-%a3, (%sp) | save some registers
337 movem.l (8*4+4,%sp), %a0-%a3 | dest, source, stride, height
338 move.l %a1, %d0
339 and.l #3, %d0
340 sub.l %d0, %a1
341 jmp.l (2, %pc, %d0.l*4)
342 bra.w .px16_0
343 bra.w .px16_1
344 bra.w .px16_2
345 | last table entry coincides with target
346
347.px16_3:
348 moveq.l #24, %d0
3491:
350 movem.l (%a1), %d3-%d7
351 add.l %a2, %a1
352 LEFT24_PW %d3, %d4
353 LEFT24_PW %d4, %d5
354 LEFT24_PW %d5, %d6
355 LEFT24_PW %d6, %d7
356 lsl.l %d0, %d7
357 AVG_PW %d3, %d4
358 AVG_PW %d4, %d5
359 AVG_PW %d5, %d6
360 AVG_PW %d6, %d7
361 movem.l %d3-%d6, (%a0)
362 add.l %a2, %a0
363 subq.l #1, %a3
364 tst.l %a3
365 bne.w 1b
366 movem.l (%sp), %d2-%d7/%a2-%a3
367 lea.l (8*4,%sp), %sp
368 rts
369
370.px16_2:
371 moveq.l #24, %d0
3721:
373 movem.l (%a1), %d3-%d7
374 add.l %a2, %a1
375 swap %d3
376 swap %d4
377 move.w %d4, %d3
378 swap %d5
379 move.w %d5, %d4
380 swap %d6
381 move.w %d6, %d5
382 swap %d7
383 move.w %d7, %d6
384 AVG_PW %d3, %d4
385 AVG_PW %d4, %d5
386 AVG_PW %d5, %d6
387 AVG_PW %d6, %d7
388 movem.l %d3-%d6, (%a0)
389 add.l %a2, %a0
390 subq.l #1, %a3
391 tst.l %a3
392 bne.w 1b
393 movem.l (%sp), %d2-%d7/%a2-%a3
394 lea.l (8*4,%sp), %sp
395 rts
396
397.px16_1:
398 moveq.l #24, %d0
3991:
400 movem.l (%a1), %d3-%d7
401 add.l %a2, %a1
402 LEFT8_PW %d3, %d4
403 LEFT8_PW %d4, %d5
404 LEFT8_PW %d5, %d6
405 LEFT8_PW %d6, %d7
406 lsl.l #8, %d7
407 AVG_PW %d3, %d4
408 AVG_PW %d4, %d5
409 AVG_PW %d5, %d6
410 AVG_PW %d6, %d7
411 movem.l %d3-%d6, (%a0)
412 add.l %a2, %a0
413 subq.l #1, %a3
414 tst.l %a3
415 bne.w 1b
416 movem.l (%sp), %d2-%d7/%a2-%a3
417 lea.l (8*4,%sp), %sp
418 rts
419
420.px16_0:
421 moveq.l #24, %d0
4221:
423 movem.l (%a1), %d3-%d7
424 add.l %a2, %a1
425 AVG_PW %d3, %d4
426 AVG_PW %d4, %d5
427 AVG_PW %d5, %d6
428 AVG_PW %d6, %d7
429 movem.l %d3-%d6, (%a0)
430 add.l %a2, %a0
431 subq.l #1, %a3
432 tst.l %a3
433 bne.w 1b
434 movem.l (%sp), %d2-%d7/%a2-%a3
435 lea.l (8*4,%sp), %sp
436 rts