| /* ------------------------------------------------------------------ |
| * Copyright (C) 1998-2009 PacketVideo |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
| * express or implied. |
| * See the License for the specific language governing permissions |
| * and limitations under the License. |
| * ------------------------------------------------------------------- |
| */ |
| /* |
| |
| Filename: pv_normalize.c |
| |
| ------------------------------------------------------------------------------ |
| REVISION HISTORY |
| |
| |
| Who: Date: MM/DD/YYYY |
| Description: |
| |
| ------------------------------------------------------------------------------ |
| INPUT AND OUTPUT DEFINITIONS |
| |
| Input |
| Int32 x 32-bit integer non-zero input |
| Returns |
| Int32 i number of leading zeros on x |
| |
| |
| ------------------------------------------------------------------------------ |
| FUNCTION DESCRIPTION |
| |
| Returns number of leading zeros on the non-zero input |
| |
| ------------------------------------------------------------------------------ |
| REQUIREMENTS |
| |
| |
| ------------------------------------------------------------------------------ |
| REFERENCES |
| |
| ------------------------------------------------------------------------------ |
| PSEUDO-CODE |
| |
| ------------------------------------------------------------------------------ |
| */ |
| |
| |
| /*---------------------------------------------------------------------------- |
| ; INCLUDES |
| ----------------------------------------------------------------------------*/ |
| |
| #include "pv_audio_type_defs.h" |
| #include "pv_normalize.h" |
| |
| /*---------------------------------------------------------------------------- |
| ; MACROS |
| ; Define module specific macros here |
| ----------------------------------------------------------------------------*/ |
| |
| |
| /*---------------------------------------------------------------------------- |
| ; DEFINES |
| ; Include all pre-processor statements here. Include conditional |
| ; compile variables also. |
| ----------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| ; LOCAL FUNCTION DEFINITIONS |
| ; Function Prototype declaration |
| ----------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| ; LOCAL STORE/BUFFER/POINTER DEFINITIONS |
| ; Variable declaration - defined here and used outside this module |
| ----------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| ; EXTERNAL FUNCTION REFERENCES |
| ; Declare functions defined elsewhere and referenced in this module |
| ----------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES |
| ; Declare variables used in this module but defined elsewhere |
| ----------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| ; FUNCTION CODE |
| ----------------------------------------------------------------------------*/ |
| |
| #if defined(_ARM) |
| #elif (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4)) |
| /* function is inlined in header file */ |
| |
| |
| #else |
| |
| Int pv_normalize(Int32 x) |
| { |
| /*---------------------------------------------------------------------------- |
| ; Define all local variables |
| ----------------------------------------------------------------------------*/ |
| Int i; |
| |
| |
| if (x > 0x0FFFFFFF) |
| { |
| i = 0; /* most likely case */ |
| } |
| else if (x > 0x00FFFFFF) |
| { |
| i = 3; /* second most likely case */ |
| } |
| else if (x > 0x0000FFFF) |
| { |
| i = x > 0x000FFFFF ? 7 : 11; |
| } |
| else |
| { |
| if (x > 0x000000FF) |
| { |
| i = x > 0x00000FFF ? 15 : 19; |
| } |
| else |
| { |
| i = x > 0x0000000F ? 23 : 27; |
| } |
| } |
| |
| |
| x <<= i; |
| |
| switch (x & 0x78000000) |
| { |
| case 0x08000000: |
| i += 3; |
| break; |
| |
| case 0x18000000: |
| case 0x10000000: |
| i += 2; |
| break; |
| case 0x28000000: |
| case 0x20000000: |
| case 0x38000000: |
| case 0x30000000: |
| i++; |
| |
| default: |
| ; |
| } |
| |
| return i; |
| |
| } |
| |
| #endif |
| |