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 Filename: /audio/gsm_amr/c/include/mpy_32_16.h 32 33 ------------------------------------------------------------------------------ 34 INCLUDE DESCRIPTION 35 36 This file contains all the constant definitions and prototype definitions 37 needed by the Mpy_32_16 function. 38 39 ------------------------------------------------------------------------------ 40 */ 41 42 /*---------------------------------------------------------------------------- 43 ; CONTINUE ONLY IF NOT ALREADY DEFINED 44 ----------------------------------------------------------------------------*/ 45 #ifndef MPY_32_16_H 46 #define MPY_32_16_H 47 48 /*---------------------------------------------------------------------------- 49 ; INCLUDES 50 ----------------------------------------------------------------------------*/ 51 #include "basicop_malloc.h" 52 53 /*--------------------------------------------------------------------------*/ 54 #ifdef __cplusplus 55 extern "C" 56 { 57 #endif 58 59 /*---------------------------------------------------------------------------- 60 ; MACROS 61 ; Define module specific macros here 62 ----------------------------------------------------------------------------*/ 63 64 65 /*---------------------------------------------------------------------------- 66 ; DEFINES 67 ; Include all pre-processor statements here. 68 ----------------------------------------------------------------------------*/ 69 70 /*---------------------------------------------------------------------------- 71 ; EXTERNAL VARIABLES REFERENCES 72 ; Declare variables used in this module but defined elsewhere 73 ----------------------------------------------------------------------------*/ 74 75 /*---------------------------------------------------------------------------- 76 ; SIMPLE TYPEDEF'S 77 ----------------------------------------------------------------------------*/ 78 79 /*---------------------------------------------------------------------------- 80 ; ENUMERATED TYPEDEF'S 81 ----------------------------------------------------------------------------*/ 82 83 /*---------------------------------------------------------------------------- 84 ; STRUCTURES TYPEDEF'S 85 ----------------------------------------------------------------------------*/ 86 87 /*---------------------------------------------------------------------------- 88 ; GLOBAL FUNCTION DEFINITIONS 89 ; Function Prototype declaration 90 ----------------------------------------------------------------------------*/ 91 #if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/ 92 Mpy_32_16(Word16 L_var1_hi,Word16 L_var1_lo,Word16 var2,Flag * pOverflow)93 __inline Word32 Mpy_32_16(Word16 L_var1_hi, 94 Word16 L_var1_lo, 95 Word16 var2, 96 Flag *pOverflow) 97 { 98 99 Word32 L_product; 100 Word32 L_sum; 101 Word32 result; 102 103 OSCL_UNUSED_ARG(pOverflow); 104 105 __asm {SMULBB L_product, L_var1_hi, var2} 106 __asm {QDADD L_product, 0, L_product} 107 __asm {SMULBB result, L_var1_lo, var2} 108 result >>= 15; 109 __asm {QDADD L_sum, L_product, result} 110 return (L_sum); 111 } 112 113 #elif defined(PV_ARM_GCC_V5) /* Instructions for ARM-linux cross-compiler*/ 114 115 static inline Word32 Mpy_32_16(Word16 L_var1_hi, 116 Word16 L_var1_lo, 117 Word16 var2, 118 Flag *pOverflow) 119 { 120 121 register Word32 ra = L_var1_hi; 122 register Word32 rb = L_var1_lo; 123 register Word32 rc = var2; 124 Word32 result, L_product; 125 126 OSCL_UNUSED_ARG(pOverflow); 127 128 asm volatile("smulbb %0, %1, %2" 129 : "=r"(L_product) 130 : "r"(ra), "r"(rc) 131 ); 132 asm volatile("mov %0, #0" 133 : "=r"(result) 134 ); 135 136 asm volatile("qdadd %0, %1, %2" 137 : "=r"(L_product) 138 : "r"(result), "r"(L_product) 139 ); 140 141 asm volatile("smulbb %0, %1, %2" 142 : "=r"(result) 143 : "r"(rb), "r"(rc) 144 ); 145 146 asm volatile("mov %0, %1, ASR #15" 147 : "=r"(ra) 148 : "r"(result) 149 ); 150 asm volatile("qdadd %0, %1, %2" 151 : "=r"(result) 152 : "r"(L_product), "r"(ra) 153 ); 154 155 return (result); 156 } 157 158 #else /* C_EQUIVALENT */ 159 __inline Word32 Mpy_32_16(Word16 L_var1_hi, 160 Word16 L_var1_lo, 161 Word16 var2, 162 Flag *pOverflow) 163 { 164 165 Word32 L_product; 166 Word32 L_sum; 167 Word32 result; 168 L_product = (Word32) L_var1_hi * var2; 169 170 if (L_product != (Word32) 0x40000000L) 171 { 172 L_product <<= 1; 173 } 174 else 175 { 176 *pOverflow = 1; 177 L_product = MAX_32; 178 } 179 180 result = ((Word32)L_var1_lo * var2) >> 15; 181 182 L_sum = L_product + (result << 1); 183 184 if ((L_product ^ result) > 0) 185 { 186 if ((L_sum ^ L_product) < 0) 187 { 188 L_sum = (L_product < 0) ? MIN_32 : MAX_32; 189 *pOverflow = 1; 190 } 191 } 192 return (L_sum); 193 194 } 195 196 #endif 197 /*---------------------------------------------------------------------------- 198 ; END 199 ----------------------------------------------------------------------------*/ 200 #ifdef __cplusplus 201 } 202 #endif 203 204 #endif /* _MPY_32_16_H_ */ 205 206 207