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/mult.h
32
33------------------------------------------------------------------------------
34 REVISION HISTORY
35
36 Description: Created separate header file for mult function.
37
38 Description: Changed prototype of the mult() function. Instead of using global
39              a pointer to overflow flag is now passed into the function.
40
41 Description: Updated copyright information.
42              Updated variable name from "overflow" to "pOverflow" to match
43              with original function declaration.
44
45 Description: Moved _cplusplus #ifdef after Include section.
46
47 Description: Providing support for ARM and Linux-ARM assembly instructions.
48
49 Who:                       Date:
50 Description:
51
52------------------------------------------------------------------------------
53 INCLUDE DESCRIPTION
54
55 This file contains all the constant definitions and prototype definitions
56 needed by the mult function.
57
58------------------------------------------------------------------------------
59*/
60
61#ifndef MULT_H
62#define MULT_H
63
64/*----------------------------------------------------------------------------
65; INCLUDES
66----------------------------------------------------------------------------*/
67
68#include    "basicop_malloc.h"
69
70/*--------------------------------------------------------------------------*/
71#ifdef __cplusplus
72extern "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)
108
109    __inline Word16 mult(Word16 var1, Word16 var2, Flag *pOverflow)
110    {
111        Word32 product;
112
113        OSCL_UNUSED_ARG(pOverflow);
114
115        __asm
116        {
117            SMULBB product, var1, var2
118            MOV    product, product, ASR #15
119            CMP    product, 0x7FFF
120            MOVGE  product, 0x7FFF
121        }
122
123        return ((Word16) product);
124    }
125
126#elif defined(PV_ARM_GCC_V5)
127
128    __inline Word16 mult(Word16 var1, Word16 var2, Flag *pOverflow)
129    {
130        register Word32 ra = var1;
131        register Word32 rb = var2;
132        Word32 product;
133        Word32 temp = 0x7FFF;
134
135        OSCL_UNUSED_ARG(pOverflow);
136
137        asm volatile("smulbb %0, %1, %2"
138             : "=r"(product)
139                             : "r"(ra), "r"(rb)
140                            );
141        asm volatile("mov %0, %1, ASR #15"
142             : "=r"(product)
143                             : "r"(product)
144                            );
145        asm volatile("cmp %0, %1"
146             : "=r"(product)
147                             : "r"(temp)
148                            );
149        asm volatile("movge %0, %1"
150             : "=r"(product)
151                             : "r"(temp)
152                            );
153
154        return ((Word16) product);
155    }
156
157#else /* C EQUIVALENT */
158
159    static inline Word16 mult(Word16 var1, Word16 var2, Flag *pOverflow)
160    {
161        register Word32 product;
162
163        product = ((Word32) var1 * var2) >> 15;
164
165        /* Saturate result (if necessary). */
166        /* var1 * var2 >0x00007fff is the only case */
167        /* that saturation occurs. */
168
169        if (product > 0x00007fffL)
170        {
171            *pOverflow = 1;
172            product = (Word32) MAX_16;
173        }
174
175
176        /* Return the product as a 16 bit value by type casting Word32 to Word16 */
177
178        return ((Word16) product);
179    }
180
181#endif
182    /*----------------------------------------------------------------------------
183    ; END
184    ----------------------------------------------------------------------------*/
185#ifdef __cplusplus
186}
187#endif
188
189#endif  /* _MULT_H_ */
190
191