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 Filename: /audio/gsm_amr/c/include/l_mac.h 31 32 ------------------------------------------------------------------------------ 33 REVISION HISTORY 34 35 Description: Created separate header file for L_mac function. 36 37 Description: Updated function prototype declaration to reflect new interface. 38 A pointer to overflow flag is passed into the function. Updated 39 template. 40 41 Description: Moved _cplusplus #ifdef after Include section. 42 43 Description: 1. Updated the function to include ARM and Linux-ARM assembly 44 instructions. 45 2. Added OSCL_UNUSED_ARG(pOverflow) to remove compiler warnings. 46 47 Description: 48 49 ------------------------------------------------------------------------------ 50 INCLUDE DESCRIPTION 51 52 This file contains all the constant definitions and prototype definitions 53 needed by the L_mac function. 54 55 ------------------------------------------------------------------------------ 56 */ 57 58 /*---------------------------------------------------------------------------- 59 ; CONTINUE ONLY IF NOT ALREADY DEFINED 60 ----------------------------------------------------------------------------*/ 61 #ifndef L_MAC_H 62 #define L_MAC_H 63 64 /*---------------------------------------------------------------------------- 65 ; INCLUDES 66 ----------------------------------------------------------------------------*/ 67 #include "basicop_malloc.h" 68 69 /*--------------------------------------------------------------------------*/ 70 #ifdef __cplusplus 71 extern "C" 72 { 73 #endif 74 75 /*---------------------------------------------------------------------------- 76 ; MACROS 77 ; Define module specific macros here 78 ----------------------------------------------------------------------------*/ 79 80 /*---------------------------------------------------------------------------- 81 ; DEFINES 82 ; Include all pre-processor statements here. 83 ----------------------------------------------------------------------------*/ 84 85 /*---------------------------------------------------------------------------- 86 ; EXTERNAL VARIABLES REFERENCES 87 ; Declare variables used in this module but defined elsewhere 88 ----------------------------------------------------------------------------*/ 89 90 /*---------------------------------------------------------------------------- 91 ; SIMPLE TYPEDEF'S 92 ----------------------------------------------------------------------------*/ 93 94 /*---------------------------------------------------------------------------- 95 ; ENUMERATED TYPEDEF'S 96 ----------------------------------------------------------------------------*/ 97 98 /*---------------------------------------------------------------------------- 99 ; STRUCTURES TYPEDEF'S 100 ----------------------------------------------------------------------------*/ 101 102 /*---------------------------------------------------------------------------- 103 ; GLOBAL FUNCTION DEFINITIONS 104 ; Function Prototype declaration 105 ----------------------------------------------------------------------------*/ 106 #if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/ 107 L_mac(Word32 L_var3,Word16 var1,Word16 var2,Flag * pOverflow)108 __inline Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow) 109 { 110 Word32 result; 111 Word32 L_sum; 112 113 OSCL_UNUSED_ARG(pOverflow); 114 115 __asm {SMULBB result, var1, var2} 116 __asm {QDADD L_sum, L_var3, result} 117 return (L_sum); 118 } 119 120 #elif defined(PV_ARM_GCC_V5) /* Instructions for ARM-linux cross-compiler*/ 121 122 static inline Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow) 123 { 124 register Word32 ra = L_var3; 125 register Word32 rb = var1; 126 register Word32 rc = var2; 127 Word32 result; 128 129 OSCL_UNUSED_ARG(pOverflow); 130 131 asm volatile("smulbb %0, %1, %2" 132 : "=r"(result) 133 : "r"(rb), "r"(rc) 134 ); 135 136 asm volatile("qdadd %0, %1, %2" 137 : "=r"(rc) 138 : "r"(ra), "r"(result) 139 ); 140 141 return (rc); 142 } 143 144 #else /* C_EQUIVALENT */ 145 146 __inline Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow) 147 { 148 Word32 result; 149 Word32 L_sum; 150 result = (Word32) var1 * var2; 151 if (result != (Word32) 0x40000000L) 152 { 153 L_sum = (result << 1) + L_var3; 154 155 /* Check if L_sum and L_var_3 share the same sign */ 156 if ((L_var3 ^ result) > 0) 157 { 158 if ((L_sum ^ L_var3) < 0) 159 { 160 L_sum = (L_var3 < 0) ? MIN_32 : MAX_32; 161 *pOverflow = 1; 162 } 163 } 164 } 165 else 166 { 167 *pOverflow = 1; 168 L_sum = MAX_32; 169 } 170 return (L_sum); 171 } 172 173 #endif 174 /*---------------------------------------------------------------------------- 175 ; END 176 ----------------------------------------------------------------------------*/ 177 #ifdef __cplusplus 178 } 179 #endif 180 181 #endif /* _L_MAC_H_ */ 182 183 184