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 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
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) /* Instructions for ARM Assembly on ADS*/
108
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