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 /*
19 ------------------------------------------------------------------------------
20 PacketVideo Corp.
21 MP3 Decoder Library
22
23 Filename: pvmp3_normalize.cpp
24
25 Date: 10/02/2007
26
27 ------------------------------------------------------------------------------
28 REVISION HISTORY
29
30
31 Description:
32
33 ------------------------------------------------------------------------------
34 INPUT AND OUTPUT DEFINITIONS
35
36 Input
37 Int32 x 32-bit integer non-zero input
38 Returns
39 Int32 i number of leading zeros on x
40
41
42 ------------------------------------------------------------------------------
43 FUNCTION DESCRIPTION
44
45 Returns number of leading zeros on the non-zero input
46
47 ------------------------------------------------------------------------------
48 REQUIREMENTS
49
50
51 ------------------------------------------------------------------------------
52 REFERENCES
53
54 ------------------------------------------------------------------------------
55 PSEUDO-CODE
56
57 ------------------------------------------------------------------------------
58 */
59
60
61 /*----------------------------------------------------------------------------
62 ; INCLUDES
63 ----------------------------------------------------------------------------*/
64
65 #include "pvmp3_audio_type_defs.h"
66 #include "pvmp3_normalize.h"
67
68 /*----------------------------------------------------------------------------
69 ; MACROS
70 ; Define module specific macros here
71 ----------------------------------------------------------------------------*/
72
73
74 /*----------------------------------------------------------------------------
75 ; DEFINES
76 ; Include all pre-processor statements here. Include conditional
77 ; compile variables also.
78 ----------------------------------------------------------------------------*/
79
80 /*----------------------------------------------------------------------------
81 ; LOCAL FUNCTION DEFINITIONS
82 ; Function Prototype declaration
83 ----------------------------------------------------------------------------*/
84
85 /*----------------------------------------------------------------------------
86 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
87 ; Variable declaration - defined here and used outside this module
88 ----------------------------------------------------------------------------*/
89
90 /*----------------------------------------------------------------------------
91 ; EXTERNAL FUNCTION REFERENCES
92 ; Declare functions defined elsewhere and referenced in this module
93 ----------------------------------------------------------------------------*/
94
95 /*----------------------------------------------------------------------------
96 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
97 ; Declare variables used in this module but defined elsewhere
98 ----------------------------------------------------------------------------*/
99
100 /*----------------------------------------------------------------------------
101 ; FUNCTION CODE
102 ----------------------------------------------------------------------------*/
103
104 #if (defined(PV_ARM_V5)||defined(PV_ARM_V4))
105 #elif (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
106
107
108 /* function is inlined in header file */
109
110
111 #else
112
pvmp3_normalize(int32 x)113 int32 pvmp3_normalize(int32 x)
114 {
115 /*----------------------------------------------------------------------------
116 ; Define all local variables
117 ----------------------------------------------------------------------------*/
118 int32 i;
119
120
121 if (x > 0x0FFFFFFF)
122 {
123 i = 0; /* most likely case */
124 }
125 else if (x > 0x00FFFFFF)
126 {
127 i = 3; /* second most likely case */
128 }
129 else if (x > 0x0000FFFF)
130 {
131 i = x > 0x000FFFFF ? 7 : 11;
132 }
133 else
134 {
135 if (x > 0x000000FF)
136 {
137 i = x > 0x00000FFF ? 15 : 19;
138 }
139 else
140 {
141 i = x > 0x0000000F ? 23 : 27;
142 }
143 }
144
145
146 x <<= i;
147
148 switch (x & 0x78000000)
149 {
150 case 0x08000000:
151 i += 3;
152 break;
153
154 case 0x18000000:
155 case 0x10000000:
156 i += 2;
157 break;
158 case 0x28000000:
159 case 0x20000000:
160 case 0x38000000:
161 case 0x30000000:
162 i++;
163 break;
164
165 default:
166 ;
167 }
168
169 return i;
170
171 }
172
173 #endif
174
175