vlc_encode_inline.h revision 59f566c4ec3dfc097ad8163523e522280b27e5c3
1/* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18#ifndef _VLC_ENCODE_INLINE_H_
19#define _VLC_ENCODE_INLINE_H_
20
21#if !defined(PV_ARM_GCC_V5) && !defined(PV_ARM_GCC_V4)
22
23__inline  Int zero_run_search(UInt *bitmapzz, Short *dataBlock, RunLevelBlock *RLB, Int nc)
24{
25    Int idx, run, level, j;
26    UInt end, match;
27
28    idx = 0;
29    j   = 0;
30    run = 0;
31    match = 1 << 31;
32    if (nc > 32)
33        end = 1;
34    else
35        end = 1 << (32 - nc);
36
37    while (match >= end)
38    {
39        if ((match&bitmapzz[0]) == 0)
40        {
41            run++;
42            j++;
43            match >>= 1;
44        }
45        else
46        {
47            match >>= 1;
48            level = dataBlock[j];
49            dataBlock[j] = 0; /* reset output */
50            j++;
51            if (level < 0)
52            {
53                RLB->level[idx] = -level;
54                RLB->s[idx] = 1;
55                RLB->run[idx] = run;
56                run = 0;
57                idx++;
58            }
59            else
60            {
61                RLB->level[idx] = level;
62                RLB->s[idx] = 0;
63                RLB->run[idx] = run;
64                run = 0;
65                idx++;
66            }
67        }
68    }
69    nc -= 32;
70    if (nc > 0)
71    {
72        match = 1 << 31;
73        end = 1 << (32 - nc);
74        while (match >= end)
75        {
76            if ((match&bitmapzz[1]) == 0)
77            {
78                run++;
79                j++;
80                match >>= 1;
81            }
82            else
83            {
84                match >>= 1;
85                level = dataBlock[j];
86                dataBlock[j] = 0; /* reset output */
87                j++;
88                if (level < 0)
89                {
90                    RLB->level[idx] = -level;
91                    RLB->s[idx] = 1;
92                    RLB->run[idx] = run;
93                    run = 0;
94                    idx++;
95                }
96                else
97                {
98                    RLB->level[idx] = level;
99                    RLB->s[idx] = 0;
100                    RLB->run[idx] = run;
101                    run = 0;
102                    idx++;
103                }
104            }
105        }
106    }
107
108    return idx;
109}
110
111#elif defined(__CC_ARM)  /* only work with arm v5 */
112
113__inline  Int zero_run_search(UInt *bitmapzz, Short *dataBlock, RunLevelBlock *RLB, Int nc)
114{
115    OSCL_UNUSED_ARG(nc);
116    Int idx, run, level, j;
117    UInt end, match;
118    Int  zzorder;
119
120    idx = 0;
121    run = 0;
122    j   = -1;
123    __asm
124    {
125        ldr match, [bitmapzz]
126        clz run, match
127    }
128
129    zzorder = 0;
130
131    while (run < 32)
132    {
133        __asm
134        {
135            mov end, #0x80000000
136            mov end, end, lsr run   /* mask*/
137            bic match, match, end       /* remove it from bitmap */
138            mov run, run, lsl #1  /* 05/09/02 */
139            ldrsh level, [dataBlock, run] /*  load data */
140            strh zzorder, [dataBlock, run] /* reset output */
141            add j, j, #1
142            rsb run, j, run, lsr #1 /* delta run */
143            add j, j, run           /* current position */
144        }
145        if (level < 0)
146        {
147            RLB->level[idx] = -level;
148            RLB->s[idx] = 1;
149            RLB->run[idx] = run;
150            run = 0;
151            idx++;
152        }
153        else
154        {
155            RLB->level[idx] = level;
156            RLB->s[idx] = 0;
157            RLB->run[idx] = run;
158            run = 0;
159            idx++;
160        }
161        __asm
162        {
163            clz run, match
164        }
165    }
166    __asm
167    {
168        ldr match, [bitmapzz, #4]
169        clz run, match
170    }
171
172    while (run < 32)
173    {
174        __asm
175        {
176            mov end, #0x80000000
177            mov end, end, lsr run   /* mask*/
178            bic match, match, end       /* remove it from bitmap */
179            add run, run, #32       /* current position */
180            mov run, run, lsl #1    /* 09/02/05 */
181            ldrsh level, [dataBlock, run] /*  load data */
182            strh  zzorder, [dataBlock, run] /* reset output */
183            add j, j, #1
184            rsb run, j, run, lsr #1     /* delta run */
185            add j, j, run           /* current position */
186        }
187        if (level < 0)
188        {
189            RLB->level[idx] = -level;
190            RLB->s[idx] = 1;
191            RLB->run[idx] = run;
192            run = 0;
193            idx++;
194        }
195        else
196        {
197            RLB->level[idx] = level;
198            RLB->s[idx] = 0;
199            RLB->run[idx] = run;
200            run = 0;
201            idx++;
202        }
203        __asm
204        {
205            clz run, match
206        }
207    }
208
209    return idx;
210}
211
212#elif ( defined(PV_ARM_GCC_V4) || defined(PV_ARM_GCC_V5) ) /* ARM GNU COMPILER  */
213
214__inline Int m4v_enc_clz(UInt temp)
215{
216    register Int rb;
217    register UInt ra = (UInt)temp;
218
219    asm volatile("clz   %0, %1"
220             : "=&r"(rb)
221                         : "r"(ra)
222                        );
223
224    return (rb);
225}
226
227__inline  Int zero_run_search(UInt *bitmapzz, Short *dataBlock, RunLevelBlock *RLB, Int nc)
228{
229    OSCL_UNUSED_ARG(nc);
230    Int idx, run, level = 0, j;
231    UInt end = 0, match;
232    Int  zzorder;
233
234    idx = 0;
235    run = 0;
236    j   = -1;
237    match = *bitmapzz;
238    run = m4v_enc_clz(match);
239
240    zzorder = 0;
241
242    while (run < 32)
243    {
244        asm volatile("mov   %0, #0x80000000\n\t"
245                     "mov   %0, %0, lsr %1\n\t"
246                     "bic   %2, %2, %0\n\t"
247                     "mov   %1, %1, lsl #1\n\t"
248                     "ldrsh %3, [%6, %1]\n\t"
249                     "strh  %5, [%6, %1]\n\t"
250                     "add   %4, %4, #1\n\t"
251                     "rsb   %1, %4, %1, lsr #1\n\t"
252                     "add   %4, %4, %1"
253             : "+r"(end), "+r"(run), "+r"(match), "=r"(level), "+r"(j)
254                             : "r"(zzorder), "r"(dataBlock));
255        if (level < 0)
256        {
257            RLB->level[idx] = -level;
258            RLB->s[idx] = 1;
259            RLB->run[idx] = run;
260            run = 0;
261            idx++;
262        }
263        else
264        {
265            RLB->level[idx] = level;
266            RLB->s[idx] = 0;
267            RLB->run[idx] = run;
268            run = 0;
269            idx++;
270        }
271        run = m4v_enc_clz(match);
272    }
273    match = bitmapzz[1];
274    run = m4v_enc_clz(match);
275
276    while (run < 32)
277    {
278        asm volatile("mov   %0, #0x80000000\n\t"
279                     "mov   %0, %0, lsr %1\n\t"
280                     "bic   %2, %2, %0\n\t"
281                     "add   %1, %1, #32\n\t"
282                     "mov   %1, %1, lsl #1\n\t"
283                     "ldrsh %3, [%6, %1]\n\t"
284                     "strh  %5, [%6, %1]\n\t"
285                     "add   %4, %4, #1\n\t"
286                     "rsb   %1, %4, %1, lsr #1\n\t"
287                     "add   %4, %4, %1"
288             : "+r"(end), "+r"(run), "+r"(match), "+r"(level), "+r"(j)
289                             : "r"(zzorder), "r"(dataBlock));
290        if (level < 0)
291        {
292            RLB->level[idx] = -level;
293            RLB->s[idx] = 1;
294            RLB->run[idx] = run;
295            run = 0;
296            idx++;
297        }
298        else
299        {
300            RLB->level[idx] = level;
301            RLB->s[idx] = 0;
302            RLB->run[idx] = run;
303            run = 0;
304            idx++;
305        }
306        run = m4v_enc_clz(match);
307    }
308
309    return idx;
310}
311
312#endif
313
314#endif // _VLC_ENCODE_INLINE_H_
315
316
317