xref: /OK3568_Linux_fs/external/mpp/osal/mpp_common.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2015 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include "mpp_common.h"
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun static const RK_U8 log2_tab[256] = {
20*4882a593Smuzhiyun     0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
21*4882a593Smuzhiyun     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
22*4882a593Smuzhiyun     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
23*4882a593Smuzhiyun     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
24*4882a593Smuzhiyun     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
25*4882a593Smuzhiyun     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
26*4882a593Smuzhiyun     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
27*4882a593Smuzhiyun     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun 
mpp_log2(RK_U32 v)30*4882a593Smuzhiyun RK_S32 mpp_log2(RK_U32 v)
31*4882a593Smuzhiyun {
32*4882a593Smuzhiyun     RK_S32 n = 0;
33*4882a593Smuzhiyun     if (v & 0xffff0000) {
34*4882a593Smuzhiyun         v >>= 16;
35*4882a593Smuzhiyun         n += 16;
36*4882a593Smuzhiyun     }
37*4882a593Smuzhiyun     if (v & 0xff00) {
38*4882a593Smuzhiyun         v >>= 8;
39*4882a593Smuzhiyun         n += 8;
40*4882a593Smuzhiyun     }
41*4882a593Smuzhiyun     n += log2_tab[v];
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun     return n;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
mpp_log2_16bit(RK_U32 v)46*4882a593Smuzhiyun RK_S32 mpp_log2_16bit(RK_U32 v)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun     RK_S32 n = 0;
49*4882a593Smuzhiyun     if (v & 0xff00) {
50*4882a593Smuzhiyun         v >>= 8;
51*4882a593Smuzhiyun         n += 8;
52*4882a593Smuzhiyun     }
53*4882a593Smuzhiyun     n += log2_tab[v];
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun     return n;
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun 
axb_div_c(RK_S32 a,RK_S32 b,RK_S32 c)58*4882a593Smuzhiyun RK_S32 axb_div_c(RK_S32 a, RK_S32 b, RK_S32 c)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun     RK_U32 left = 32;
61*4882a593Smuzhiyun     RK_U32 right = 0;
62*4882a593Smuzhiyun     RK_U32 shift;
63*4882a593Smuzhiyun     RK_S32 sign = 1;
64*4882a593Smuzhiyun     RK_S32 tmp;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun     if (a == 0 || b == 0)
67*4882a593Smuzhiyun         return 0;
68*4882a593Smuzhiyun     else if ((a * b / b) == a && c != 0)
69*4882a593Smuzhiyun         return (a * b / c);
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun     if (a < 0) {
72*4882a593Smuzhiyun         sign = -1;
73*4882a593Smuzhiyun         a = -a;
74*4882a593Smuzhiyun     }
75*4882a593Smuzhiyun     if (b < 0) {
76*4882a593Smuzhiyun         sign *= -1;
77*4882a593Smuzhiyun         b = -b;
78*4882a593Smuzhiyun     }
79*4882a593Smuzhiyun     if (c < 0) {
80*4882a593Smuzhiyun         sign *= -1;
81*4882a593Smuzhiyun         c = -c;
82*4882a593Smuzhiyun     }
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun     if (c == 0)
85*4882a593Smuzhiyun         return 0x7FFFFFFF * sign;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun     if (b > a) {
88*4882a593Smuzhiyun         tmp = b;
89*4882a593Smuzhiyun         b = a;
90*4882a593Smuzhiyun         a = tmp;
91*4882a593Smuzhiyun     }
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun     for (--left; (((RK_U32)a << left) >> left) != (RK_U32)a; --left)
94*4882a593Smuzhiyun         ;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun     left--;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun     while (((RK_U32)b >> right) > (RK_U32)c)
99*4882a593Smuzhiyun         right++;
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun     if (right > left) {
102*4882a593Smuzhiyun         return 0x7FFFFFFF * sign;
103*4882a593Smuzhiyun     } else {
104*4882a593Smuzhiyun         shift = left - right;
105*4882a593Smuzhiyun         return (RK_S32)((((RK_U32)a << shift) /
106*4882a593Smuzhiyun                          (RK_U32)c * (RK_U32)b) >> shift) * sign;
107*4882a593Smuzhiyun     }
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun 
mpp_align_16(RK_U32 val)110*4882a593Smuzhiyun RK_U32 mpp_align_16(RK_U32 val)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun     return MPP_ALIGN(val, 16);
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun 
mpp_align_64(RK_U32 val)115*4882a593Smuzhiyun RK_U32 mpp_align_64(RK_U32 val)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun     return MPP_ALIGN(val, 64);
118*4882a593Smuzhiyun }
119