Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/*
2
 * Blackfin Pixel Operations
3
 * Copyright (C) 2007 Marc Hoffman 
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21
#include "config_bfin.h"
22
 
23
/*
24
  motion compensation
25
  primitives
26
 
27
     * Halfpel motion compensation with rounding (a+b+1)>>1.
28
     * This is an array[4][4] of motion compensation funcions for 4
29
     * horizontal blocksizes (8,16) and the 4 halfpel positions
30
     * *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ]
31
     * @param block destination where the result is stored
32
     * @param pixels source
33
     * @param line_size number of bytes in a horizontal line of block
34
     * @param h height
35
 
36
*/
37
 
38
DEFUN(put_pixels8uc,mL1,
39
        (uint8_t *block, const uint8_t *s0, const uint8_t *s1,
40
                 int dest_size, int line_size, int h)):
41
        i3=r0;        // dest
42
        i0=r1;        // src0
43
        i1=r2;        // src1
44
        r0=[sp+12];   // dest_size
45
        r2=[sp+16];   // line_size
46
        p0=[sp+20];   // h
47
        [--sp] = (r7:6);
48
        r0+=-4;
49
        m3=r0;
50
        r2+=-8;
51
        m0=r2;
52
        LSETUP(pp8$0,pp8$1) LC0=P0;
53
        DISALGNEXCPT                || R0 = [I0++]  || R2  =[I1++];
54
 
55
pp8$0:  DISALGNEXCPT                || R1 = [I0++]  || R3  =[I1++];
56
        R6 = BYTEOP1P(R1:0,R3:2)    || R0 = [I0++M0]|| R2  =[I1++M0];
57
        R7 = BYTEOP1P(R1:0,R3:2)(R) || R0 = [I0++]  || [I3++] = R6 ;
58
pp8$1:  DISALGNEXCPT                || R2 = [I1++]  || [I3++M3] = R7;
59
 
60
        (r7:6) = [sp++];
61
        RTS;
62
DEFUN_END(put_pixels8uc)
63
 
64
DEFUN(put_pixels16uc,mL1,
65
        (uint8_t *block, const uint8_t *s0, const uint8_t *s1,
66
                 int dest_size, int line_size, int h)):
67
        link 0;
68
        [--sp] = (r7:6);
69
        i3=r0;        // dest
70
        i0=r1;        // src0
71
        i1=r2;        // src1
72
        r0=[fp+20];   // dest_size
73
        r2=[fp+24];   // line_size
74
        p0=[fp+28];   // h
75
 
76
 
77
        r0+=-12;
78
        m3=r0;        // line_size
79
        r2+=-16;
80
        m0=r2;
81
 
82
        LSETUP(pp16$0,pp16$1) LC0=P0;
83
         DISALGNEXCPT                || R0 = [I0++]   || R2  =[I1++];
84
 
85
pp16$0:  DISALGNEXCPT                || R1 = [I0++]   || R3  =[I1++];
86
         R6 = BYTEOP1P(R1:0,R3:2)    || R0 = [I0++]   || R2  =[I1++];
87
         R7 = BYTEOP1P(R1:0,R3:2)(R) || R1 = [I0++]   || R3  =[I1++];
88
         [I3++] = R6;
89
         R6 = BYTEOP1P(R1:0,R3:2)    || R0 = [I0++M0] || R2  =[I1++M0];
90
         R7 = BYTEOP1P(R1:0,R3:2)(R) || R0 = [I0++]   || [I3++] = R7 ;
91
         [I3++] = R6;
92
pp16$1:  DISALGNEXCPT                || R2 = [I1++]   || [I3++M3] = R7;
93
 
94
        (r7:6) = [sp++];
95
        unlink;
96
        RTS;
97
DEFUN_END(put_pixels16uc)
98
 
99
 
100
 
101
 
102
 
103
 
104
DEFUN(put_pixels8uc_nornd,mL1,
105
        (uint8_t *block, const uint8_t *s0, const uint8_t *s1,
106
                 int line_size, int h)):
107
        i3=r0;        // dest
108
        i0=r1;        // src0
109
        i1=r2;        // src1
110
        r2=[sp+12];   // line_size
111
        p0=[sp+16];   // h
112
        [--sp] = (r7:6);
113
        r2+=-4;
114
        m3=r2;
115
        r2+=-4;
116
        m0=r2;
117
        LSETUP(pp8$2,pp8$3) LC0=P0;
118
        DISALGNEXCPT                || R0 = [I0++]  || R2  =[I1++];
119
 
120
pp8$2:  DISALGNEXCPT                || R1 = [I0++]  || R3  =[I1++];
121
        R6 = BYTEOP1P(R1:0,R3:2)(T)  || R0 = [I0++M0]|| R2  =[I1++M0];
122
        R7 = BYTEOP1P(R1:0,R3:2)(T,R) || R0 = [I0++]  || [I3++] = R6 ;
123
pp8$3:  DISALGNEXCPT                || R2 = [I1++]  || [I3++M3] = R7;
124
 
125
        (r7:6) = [sp++];
126
        RTS;
127
DEFUN_END(put_pixels8uc_nornd)
128
 
129
DEFUN(put_pixels16uc_nornd,mL1,
130
        (uint8_t *block, const uint8_t *s0, const uint8_t *s1,
131
                 int line_size, int h)):
132
        i3=r0;        // dest
133
        i0=r1;        // src0
134
        i1=r2;        // src1
135
        r2=[sp+12];   // line_size
136
        p0=[sp+16];   // h
137
 
138
        [--sp] = (r7:6);
139
        r2+=-12;
140
        m3=r2;        // line_size
141
        r2+=-4;
142
        m0=r2;
143
 
144
        LSETUP(pp16$2,pp16$3) LC0=P0;
145
        DISALGNEXCPT                || R0 = [I0++]   || R2  =[I1++];
146
 
147
pp16$2:
148
        DISALGNEXCPT                || R1 = [I0++]   || R3  =[I1++];
149
        R6 = BYTEOP1P(R1:0,R3:2)(T)    || R0 = [I0++]   || R2  =[I1++];
150
        R7 = BYTEOP1P(R1:0,R3:2)(T,R) || R1 = [I0++]   || R3  =[I1++];
151
        [I3++] = R6;
152
 
153
        R6 = BYTEOP1P(R1:0,R3:2)(T)    || R0 = [I0++M0] || R2  =[I1++M0];
154
        R7 = BYTEOP1P(R1:0,R3:2)(T,R) || R0 = [I0++]   || [I3++] = R7 ;
155
        [I3++] = R6;
156
pp16$3: DISALGNEXCPT                || R2 = [I1++]   || [I3++M3] = R7;
157
 
158
        (r7:6) = [sp++];
159
 
160
        RTS;
161
DEFUN_END(put_pixels16uc_nornd)
162
 
163
DEFUN(z_put_pixels16_xy2,mL1,
164
        (uint8_t *block, const uint8_t *s0,
165
                 int dest_size, int line_size, int h)):
166
        link 0;
167
        [--sp] = (r7:4);
168
        i3=r0;        // dest
169
        i0=r1;        // src0--> pixels
170
        i1=r1;        // src1--> pixels + line_size
171
        r2+=-12;
172
        m2=r2;        // m2=dest_width-4
173
        r2=[fp+20];
174
        m3=r2;        // line_size
175
        p0=[fp+24];   // h
176
        r2+=-16;
177
        i1+=m3;       /* src1 + line_size */
178
        m0=r2;        /* line-size - 20 */
179
 
180
        B0 = I0;
181
        B1 = I1;
182
        B3 = I3;
183
 
184
        DISALGNEXCPT                       || R0 = [I0++] || R2  =[I1++];
185
 
186
        LSETUP(LS$16E,LE$16E) LC0=P0;
187
LS$16E: DISALGNEXCPT                       || R1 = [I0++] || R3  =[I1++];
188
        R4 = BYTEOP2P (R3:2,R1:0) (RNDL)   || R0 = [I0++] || R2  =[I1++];
189
        R5 = BYTEOP2P (R3:2,R1:0) (RNDL,R) || R1 = [I0++] || [I3++] = R4 ;
190
        DISALGNEXCPT                       || R3 = [I1++] || [I3++] = R5;
191
        R4 = BYTEOP2P (R3:2,R1:0) (RNDL)   || R0 = [I0++M0]|| R2  = [I1++M0];
192
        R5 = BYTEOP2P (R3:2,R1:0) (RNDL,R) || R0 = [I0++] || [I3++] = R4 ;
193
LE$16E: DISALGNEXCPT                       || R2 = [I1++] || [I3++M2] = R5;
194
 
195
        M1 = 1;
196
        I3 = B3;
197
        I1 = B1;
198
        I0 = B0;
199
 
200
        I0 += M1;
201
        I1 += M1;
202
 
203
        DISALGNEXCPT                       || R0 = [I0++] || R2  =[I1++];
204
        LSETUP(LS$16O,LE$16O) LC0=P0;
205
LS$16O: DISALGNEXCPT                       || R1 = [I0++] || R3  =[I1++];
206
        R4 = BYTEOP2P (R3:2,R1:0) (RNDH)   || R0 = [I0++] || R2  =[I1++];
207
        R5 = BYTEOP2P (R3:2,R1:0) (RNDH,R) || R1 = [I0++] || R6  =[I3++];
208
        R4 = R4 +|+ R6                       || R7 = [I3--];
209
        R5 = R5 +|+ R7                       || [I3++] = R4;
210
        DISALGNEXCPT                       || R3  =[I1++] || [I3++] = R5;
211
        R4 = BYTEOP2P (R3:2,R1:0) (RNDH)   || R0 = [I0++M0]|| R2  = [I1++M0];
212
        R5 = BYTEOP2P (R3:2,R1:0) (RNDH,R) || R0 = [I0++] || R6 = [I3++];
213
        R4 = R4 +|+ R6                       || R7 = [I3--];
214
        R5 = R5 +|+ R7                       || [I3++] = R4;
215
LE$16O: DISALGNEXCPT                       || R2 = [I1++] || [I3++M2] = R5;
216
 
217
        (r7:4) = [sp++];
218
        unlink;
219
        rts;
220
DEFUN_END(z_put_pixels16_xy2)
221
 
222
DEFUN(put_pixels16_xy2_nornd,mL1,
223
        (uint8_t *block, const uint8_t *s0,
224
                 int line_size, int h)):
225
        link 0;
226
        [--sp] = (r7:4);
227
        i3=r0;        // dest
228
        i0=r1;        // src0--> pixels
229
        i1=r1;        // src1--> pixels + line_size
230
        m3=r2;
231
        r2+=-12;
232
        m2=r2;
233
        r2+=-4;
234
        i1+=m3;       /* src1 + line_size */
235
        m0=r2;        /* line-size - 20 */
236
        p0=[fp+20];   // h
237
 
238
        B0=I0;
239
        B1=I1;
240
        B3=I3;
241
 
242
        DISALGNEXCPT                       || R0 = [I0++] || R2  =[I1++];
243
 
244
        LSETUP(LS$16ET,LE$16ET) LC0=P0;
245
LS$16ET:DISALGNEXCPT                       || R1 = [I0++] || R3  =[I1++];
246
        R4 = BYTEOP2P (R3:2,R1:0) (TL)     || R0 = [I0++] || R2  =[I1++];
247
        R5 = BYTEOP2P (R3:2,R1:0) (TL,R)   || R1 = [I0++] || [I3++] = R4 ;
248
        DISALGNEXCPT                       || R3 = [I1++] || [I3++] = R5;
249
        R4 = BYTEOP2P (R3:2,R1:0) (TL)     || R0 = [I0++M0]|| R2  = [I1++M0];
250
        R5 = BYTEOP2P (R3:2,R1:0) (TL,R)   || R0 = [I0++] || [I3++] = R4 ;
251
LE$16ET:DISALGNEXCPT                       || R2 = [I1++] || [I3++M2] = R5;
252
 
253
        M1 = 1;
254
        I3=B3;
255
        I1=B1;
256
        I0=B0;
257
 
258
        I0 += M1;
259
        I1 += M1;
260
 
261
        DISALGNEXCPT                       || R0 = [I0++] || R2  =[I1++];
262
        LSETUP(LS$16OT,LE$16OT) LC0=P0;
263
LS$16OT:DISALGNEXCPT                       || R1 = [I0++] || R3  =[I1++];
264
        R4 = BYTEOP2P (R3:2,R1:0) (TH)     || R0 = [I0++] || R2  =[I1++];
265
        R5 = BYTEOP2P (R3:2,R1:0) (TH,R)   || R1 = [I0++] || R6  =[I3++];
266
        R4 = R4 +|+ R6                                    || R7 = [I3--];
267
        R5 = R5 +|+ R7                                    || [I3++] = R4;
268
        DISALGNEXCPT                       || R3  =[I1++] || [I3++] = R5;
269
        R4 = BYTEOP2P (R3:2,R1:0) (TH)     || R0 = [I0++M0]|| R2  = [I1++M0];
270
        R5 = BYTEOP2P (R3:2,R1:0) (TH,R)   || R0 = [I0++] || R6 = [I3++];
271
        R4 = R4 +|+ R6                                    || R7 = [I3--];
272
        R5 = R5 +|+ R7                                    || [I3++] = R4;
273
LE$16OT:DISALGNEXCPT                       || R2 = [I1++] || [I3++M2] = R5;
274
 
275
        (r7:4) = [sp++];
276
        unlink;
277
        rts;
278
DEFUN_END(put_pixels16_xy2_nornd)
279
 
280
DEFUN(z_put_pixels8_xy2,mL1,
281
        (uint8_t *block, const uint8_t *s0,
282
                 int dest_size, int line_size, int h)):
283
        link 0;
284
        [--sp] = (r7:4);
285
        i3=r0;        // dest
286
        i0=r1;        // src0--> pixels
287
        i1=r1;        // src1--> pixels + line_size
288
        r2+=-4;
289
        m2=r2;        // m2=dest_width-4
290
        r2=[fp+20];
291
        m3=r2;        // line_size
292
        p0=[fp+24];   // h
293
        r2+=-8;
294
        i1+=m3;       /* src1 + line_size */
295
        m0=r2;        /* line-size - 20 */
296
 
297
        b0 = I0;
298
        b1 = I1;
299
        b3 = I3;
300
 
301
        LSETUP(LS$8E,LE$8E) LC0=P0;
302
        DISALGNEXCPT                       || R0 = [I0++]   || R2  =[I1++];
303
LS$8E:  DISALGNEXCPT                       || R1 = [I0++]   || R3  =[I1++];
304
        R4 = BYTEOP2P (R3:2,R1:0) (RNDL)   || R0 = [I0++M0] || R2  =[I1++M0];
305
        R5 = BYTEOP2P (R3:2,R1:0) (RNDL,R) || R0 = [I0++]   || [I3++] = R4 ;
306
LE$8E:  DISALGNEXCPT                       || R2 = [I1++]   || [I3++M2] = R5;
307
 
308
        M1 = 1;
309
        I3 = b3;
310
        I1 = b1;
311
        I0 = b0;
312
 
313
        I0 += M1;
314
        I1 += M1;
315
 
316
        LSETUP(LS$8O,LE$8O) LC0=P0;
317
        DISALGNEXCPT                       || R0 = [I0++]   || R2  =[I1++];
318
LS$8O:  DISALGNEXCPT                       || R1 = [I0++]   || R3  =[I1++];
319
        R4 = BYTEOP2P (R3:2,R1:0) (RNDH)   || R0 = [I0++M0] || R2  =[I1++M0];
320
        R5 = BYTEOP2P (R3:2,R1:0) (RNDH,R) || R0 = [I0++]   || R6  =[I3++];
321
        R4 = R4 +|+ R6                                      || R7 = [I3--];
322
        R5 = R5 +|+ R7                                      || [I3++] = R4;
323
LE$8O:  DISALGNEXCPT                       || R2  =[I1++]   || [I3++M2] = R5;
324
 
325
        (r7:4) = [sp++];
326
        unlink;
327
        rts;
328
DEFUN_END(z_put_pixels8_xy2)
329
 
330
DEFUN(put_pixels8_xy2_nornd,mL1,
331
        (uint8_t *block, const uint8_t *s0, int line_size, int h)):
332
        link 0;
333
        [--sp] = (r7:4);
334
        i3=r0;        // dest
335
        i0=r1;        // src0--> pixels
336
        i1=r1;        // src1--> pixels + line_size
337
        m3=r2;
338
        r2+=-4;
339
        m2=r2;
340
        r2+=-4;
341
        i1+=m3;       /* src1 + line_size */
342
        m0=r2;        /* line-size - 20 */
343
        p0=[fp+20];   // h
344
 
345
 
346
        b0 = I0;
347
        b1 = I1;
348
        b3 = I3;
349
 
350
        LSETUP(LS$8ET,LE$8ET) LC0=P0;
351
        DISALGNEXCPT                       || R0 = [I0++]   || R2  =[I1++];
352
 
353
LS$8ET: DISALGNEXCPT                       || R1 = [I0++]   || R3 = [I1++];
354
        R4 = BYTEOP2P (R3:2,R1:0) (TL)     || R0 = [I0++M0] || R2 = [I1++M0];
355
        R5 = BYTEOP2P (R3:2,R1:0) (TL,R)   || R0 = [I0++]   || [I3++] = R4 ;
356
LE$8ET: DISALGNEXCPT                       || R2 = [I1++]   || [I3++M2] = R5;
357
 
358
        M1 = 1;
359
        I3 = b3;
360
        I1 = b1;
361
        I0 = b0;
362
 
363
        I0 += M1;
364
        I1 += M1;
365
 
366
        LSETUP(LS$8OT,LE$8OT) LC0=P0;
367
        DISALGNEXCPT                       || R0 = [I0++]   || R2 = [I1++];
368
 
369
LS$8OT: DISALGNEXCPT                       || R1 = [I0++]   || R3 = [I1++];
370
        R4 = BYTEOP2P (R3:2,R1:0) (TH)     || R0 = [I0++M0] || R2 = [I1++M0];
371
        R5 = BYTEOP2P (R3:2,R1:0) (TH,R)   || R0 = [I0++]   || R6 = [I3++];
372
        R4 = R4 +|+ R6                                      || R7 = [I3--];
373
        R5 = R5 +|+ R7                                      || [I3++] = R4;
374
LE$8OT: DISALGNEXCPT                       || R2  =[I1++]   || [I3++M2] = R5;
375
 
376
        (r7:4) = [sp++];
377
        unlink;
378
        rts;
379
DEFUN_END(put_pixels8_xy2_nornd)