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_msu.h 31 32 ------------------------------------------------------------------------------ 33 REVISION HISTORY 34 35 Description: Created separate header file for L_msu 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: Providing support for ARM and Linux-ARM assembly instructions. 44 45 Who: Date: 46 Description: 47 48 ------------------------------------------------------------------------------ 49 INCLUDE DESCRIPTION 50 51 This file contains all the constant definitions and prototype definitions 52 needed by the L_msu function. 53 54 ------------------------------------------------------------------------------ 55 */ 56 57 /*---------------------------------------------------------------------------- 58 ; CONTINUE ONLY IF NOT ALREADY DEFINED 59 ----------------------------------------------------------------------------*/ 60 #ifndef L_MSU_H 61 #define L_MSU_H 62 63 /*---------------------------------------------------------------------------- 64 ; INCLUDES 65 ----------------------------------------------------------------------------*/ 66 #include "basicop_malloc.h" 67 #include "l_mult.h" 68 #include "l_sub.h" 69 70 /*--------------------------------------------------------------------------*/ 71 #ifdef __cplusplus 72 extern "C" 73 { 74 #endif 75 76 /*---------------------------------------------------------------------------- 77 ; MACROS 78 ; Define module specific macros here 79 ----------------------------------------------------------------------------*/ 80 81 /*---------------------------------------------------------------------------- 82 ; DEFINES 83 ; Include all pre-processor statements here. 84 ----------------------------------------------------------------------------*/ 85 86 /*---------------------------------------------------------------------------- 87 ; EXTERNAL VARIABLES REFERENCES 88 ; Declare variables used in this module but defined elsewhere 89 ----------------------------------------------------------------------------*/ 90 91 /*---------------------------------------------------------------------------- 92 ; SIMPLE TYPEDEF'S 93 ----------------------------------------------------------------------------*/ 94 95 /*---------------------------------------------------------------------------- 96 ; ENUMERATED TYPEDEF'S 97 ----------------------------------------------------------------------------*/ 98 99 /*---------------------------------------------------------------------------- 100 ; STRUCTURES TYPEDEF'S 101 ----------------------------------------------------------------------------*/ 102 103 /*---------------------------------------------------------------------------- 104 ; GLOBAL FUNCTION DEFINITIONS 105 ; Function Prototype declaration 106 ----------------------------------------------------------------------------*/ 107 #if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/ 108 L_msu(Word32 L_var3,Word16 var1,Word16 var2,Flag * pOverflow)109 __inline Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow) 110 { 111 Word32 product; 112 Word32 result; 113 114 OSCL_UNUSED_ARG(pOverflow); 115 116 __asm 117 { 118 SMULBB product, var1, var2 119 QDSUB result, L_var3, 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_msu(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow) 128 { 129 register Word32 ra = L_var3; 130 register Word32 rb = var1; 131 register Word32 rc = var2; 132 Word32 product; 133 Word32 result; 134 135 OSCL_UNUSED_ARG(pOverflow); 136 137 asm volatile("smulbb %0, %1, %2" 138 : "=r"(product) 139 : "r"(rb), "r"(rc) 140 ); 141 142 asm volatile("qdsub %0, %1, %2" 143 : "=r"(result) 144 : "r"(ra), "r"(product) 145 ); 146 147 return (result); 148 } 149 150 #else /* C EQUIVALENT */ 151 152 static inline Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow) 153 { 154 Word32 result; 155 156 result = L_mult(var1, var2, pOverflow); 157 result = L_sub(L_var3, result, pOverflow); 158 159 return (result); 160 } 161 162 #endif 163 /*---------------------------------------------------------------------------- 164 ; END 165 ----------------------------------------------------------------------------*/ 166 167 #ifdef __cplusplus 168 } 169 #endif 170 171 #endif /* _L_MSU_H_ */ 172