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/****************************************************************************************
19Portions 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)
26Permission to distribute, modify and use this file under the standard license
27terms 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
71extern "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
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