Home | History | Annotate | Download | only in src
      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 Portions of this file are derived from the following 3GPP standard:
     20 
     21     3GPP TS 26.073
     22     ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
     23     Available from http://www.3gpp.org
     24 
     25 (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
     26 Permission to distribute, modify and use this file under the standard license
     27 terms listed above has been obtained from the copyright holder.
     28 ****************************************************************************************/
     29 /*
     30 ------------------------------------------------------------------------------
     31  INPUT AND OUTPUT DEFINITIONS
     32 
     33  Inputs:
     34     hi = 16 bit signed integer (Word16) whose value falls in
     35          the range : 0x8000 <= hi <= 0x7fff.
     36     lo = 16 bit signed integer (Word16) whose value falls in
     37          the range : 0x8000 <= lo <= 0x7fff.
     38 
     39  Outputs:
     40     pOverflow = 1 if overflow happens in a math function called by this function.
     41     L_out = 32-bit result of (hi<<16 + lo<<1).
     42 
     43  Returns:
     44     None
     45 
     46  Local Stores Modified:
     47     None
     48 
     49  Global Stores Modified:
     50         None
     51 
     52 ------------------------------------------------------------------------------
     53  FUNCTION DESCRIPTION
     54 
     55  This function composes a 32 bit integer from two 16 bit double precision
     56  format (DPF) numbers hi and lo by the following operation:
     57  1. Deposit hi into the 16 MS bits of the 32 bit output L_out.
     58  2. Shift lo left by 1.
     59  3. Add results from 1 and 2 with saturation to return the 32 bit result
     60     L_out.
     61 
     62 ------------------------------------------------------------------------------
     63  REQUIREMENTS
     64 
     65  None
     66 
     67 ------------------------------------------------------------------------------
     68  REFERENCES
     69 
     70  [1] oper_32b.c, ETS Version 2.0.0, February 8, 1999
     71 
     72 ------------------------------------------------------------------------------
     73  PSEUDO-CODE
     74 
     75 ------------------------------------------------------------------------------
     76  RESOURCES USED
     77    When the code is written for a specific target processor the
     78      the resources used should be documented below.
     79 
     80  STACK USAGE: [stack count for this module] + [variable to represent
     81           stack usage for each subroutine called]
     82 
     83      where: [stack usage variable] = stack usage for [subroutine
     84          name] (see [filename].ext)
     85 
     86  DATA MEMORY USED: x words
     87 
     88  PROGRAM MEMORY USED: x words
     89 
     90  CLOCK CYCLES: [cycle count equation for this module] + [variable
     91            used to represent cycle count for each subroutine
     92            called]
     93 
     94      where: [cycle count variable] = cycle count for [subroutine
     95         name] (see [filename].ext)
     96 
     97 ------------------------------------------------------------------------------
     98 */
     99 
    100 
    101 /*----------------------------------------------------------------------------
    102 ; INCLUDES
    103 ----------------------------------------------------------------------------*/
    104 #include "typedef.h"
    105 #include "l_comp.h"
    106 #include "basic_op.h"
    107 /*----------------------------------------------------------------------------
    108 ; MACROS
    109 ; Define module specific macros here
    110 ----------------------------------------------------------------------------*/
    111 
    112 /*----------------------------------------------------------------------------
    113 ; DEFINES
    114 ; Include all pre-processor statements here. Include conditional
    115 ; compile variables also.
    116 ----------------------------------------------------------------------------*/
    117 
    118 /*----------------------------------------------------------------------------
    119 ; LOCAL FUNCTION DEFINITIONS
    120 ; Function Prototype declaration
    121 ----------------------------------------------------------------------------*/
    122 
    123 /*----------------------------------------------------------------------------
    124 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    125 ; Variable declaration - defined here and used outside this module
    126 ----------------------------------------------------------------------------*/
    127 
    128 /*----------------------------------------------------------------------------
    129 ; EXTERNAL FUNCTION REFERENCES
    130 ; Declare functions defined elsewhere and referenced in this module
    131 ----------------------------------------------------------------------------*/
    132 
    133 /*----------------------------------------------------------------------------
    134 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    135 ; Declare variables used in this module but defined elsewhere
    136 ----------------------------------------------------------------------------*/
    137 
    138 /*----------------------------------------------------------------------------
    139 ; FUNCTION CODE
    140 ----------------------------------------------------------------------------*/
    141 
    142 Word32 L_Comp(Word16 hi, Word16 lo, Flag *pOverflow)
    143 {
    144 
    145     /*----------------------------------------------------------------------------
    146     ; Define all local variables
    147     ----------------------------------------------------------------------------*/
    148     Word32 L_32;
    149     Word32 temp32;
    150     /*----------------------------------------------------------------------------
    151     ; Function body here
    152     ----------------------------------------------------------------------------*/
    153 
    154     L_32 = L_deposit_h(hi);
    155 
    156     temp32 = L_mac(L_32, lo, 1, pOverflow);
    157     /*----------------------------------------------------------------------------
    158     ; Return nothing or data or data pointer
    159     ----------------------------------------------------------------------------*/
    160 
    161     return (temp32);       /* = hi<<16 + lo<<1 */
    162 }
    163