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/l_mult.h 32 33 ------------------------------------------------------------------------------ 34 REVISION HISTORY 35 36 Description: Created separate header file for L_mult function. 37 38 Description: Updated function prototype declaration to reflect new interface. 39 A pointer to overflow flag is passed into the function. Updated 40 template. 41 42 Description: Moved _cplusplus #ifdef after Include section. 43 44 Description: Providing support for ARM and Linux-ARM assembly instructions. 45 46 Who: Date: 47 Description: 48 49 ------------------------------------------------------------------------------ 50 INCLUDE DESCRIPTION 51 52 This file contains all the constant definitions and prototype definitions 53 needed by the L_mult function. 54 55 ------------------------------------------------------------------------------ 56 */ 57 58 /*---------------------------------------------------------------------------- 59 ; CONTINUE ONLY IF NOT ALREADY DEFINED 60 ----------------------------------------------------------------------------*/ 61 #ifndef L_MULT_H 62 #define L_MULT_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 107 #if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/ 108 L_mult(Word16 var1,Word16 var2,Flag * pOverflow)109 __inline Word32 L_mult(Word16 var1, Word16 var2, Flag *pOverflow) 110 { 111 Word32 result; 112 Word32 product; 113 114 OSCL_UNUSED_ARG(pOverflow); 115 116 __asm 117 { 118 SMULBB product, var1, var2 119 QADD result, product, product 120 } 121 122 return (result); 123 } 124 125 #elif defined(PV_ARM_GCC_V5) /* Instructions for ARM-linux cross-compiler*/ 126 127 __inline Word32 L_mult(Word16 var1, Word16 var2, Flag *pOverflow) 128 { 129 register Word32 ra = var1; 130 register Word32 rb = var2; 131 Word32 result; 132 Word32 product; 133 134 OSCL_UNUSED_ARG(pOverflow); 135 136 asm volatile("smulbb %0, %1, %2" 137 : "=r"(product) 138 : "r"(ra), "r"(rb) 139 ); 140 141 asm volatile("qadd %0, %1, %2" 142 : "=r"(result) 143 : "r"(product), "r"(product) 144 ); 145 146 return(result); 147 } 148 149 #else /* C EQUIVALENT */ 150 151 static inline Word32 L_mult(Word16 var1, Word16 var2, Flag *pOverflow) 152 { 153 register Word32 L_product; 154 155 L_product = (Word32) var1 * var2; 156 157 if (L_product != (Word32) 0x40000000L) 158 { 159 L_product <<= 1; /* Multiply by 2 */ 160 } 161 else 162 { 163 *pOverflow = 1; 164 L_product = MAX_32; 165 } 166 167 return (L_product); 168 } 169 #endif 170 /*---------------------------------------------------------------------------- 171 ; END 172 ----------------------------------------------------------------------------*/ 173 #ifdef __cplusplus 174 } 175 #endif 176 177 #endif /* _L_MULT_H */ 178 179