basic_op.h revision 956c553ab0ce72f8074ad0fda2ffd66a0305700c
1956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*
2956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Copyright 2003-2010, VisualOn, Inc.
3956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong **
4956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Licensed under the Apache License, Version 2.0 (the "License");
5956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** you may not use this file except in compliance with the License.
6956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** You may obtain a copy of the License at
7956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong **
8956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong **     http://www.apache.org/licenses/LICENSE-2.0
9956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong **
10956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Unless required by applicable law or agreed to in writing, software
11956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** distributed under the License is distributed on an "AS IS" BASIS,
12956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** See the License for the specific language governing permissions and
14956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** limitations under the License.
15956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong */
16956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*******************************************************************************
17956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	File:		basicop2.h
18956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
19956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Content:	Constants , Globals and Basic arithmetic operators.
20956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/
22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
23956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#ifndef __BASIC_OP_H
24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define __BASIC_OP_H
25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "typedef.h"
27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define MAX_32 (Word32)0x7fffffffL
29956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define MIN_32 (Word32)0x80000000L
30956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define MAX_16 (Word16)0x7fff
32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define MIN_16 (Word16)0x8000
33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define ABS(a)	((a) >= 0) ? (a) : (-(a))
34956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
35956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short abs,           1   */
36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define abs_s(x)       ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16))
37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* 16 bit var1 -> MSB,     2 */
39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define L_deposit_h(x) (((Word32)(x)) << 16)
40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* 16 bit var1 -> LSB,     2 */
43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define L_deposit_l(x) ((Word32)(x))
44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
46956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Long abs,              3  */
47956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32)
48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
49956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
50956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short negate,        1   */
51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1))))
52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
53956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Long negate,     2 */
55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1)))
56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
57956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define MULHIGH(A,B) (int)(((Word64)(A)*(Word64)(B)) >> 32)
59956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define fixmul(a, b) (int)((((Word64)(a)*(Word64)(b)) >> 32) << 1)
60956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
62956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if  (SATRUATE_IS_INLINE)
63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 saturate(Word32 L_var1);
64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
65956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 saturate(Word32 L_var1);
66956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
67956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short shift left,    1   */
69956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (SHL_IS_INLINE)
70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 shl (Word16 var1, Word16 var2);
71956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 shl (Word16 var1, Word16 var2);
73956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short shift right,   1   */
76956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (SHR_IS_INLINE)
77956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 shr (Word16 var1, Word16 var2);
78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 shr (Word16 var1, Word16 var2);
80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
82956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_MULT_IS_INLINE)
83956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_mult(Word16 var1, Word16 var2);
84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord32 L_mult(Word16 var1, Word16 var2);
86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Msu,  1  */
89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_MSU_IS_INLINE)
90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Long sub,        2 */
96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_SUB_IS_INLINE)
97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_sub(Word32 L_var1, Word32 L_var2);
98956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord32 L_sub(Word32 L_var1, Word32 L_var2);
100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Long shift left, 2 */
103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_SHL_IS_INLINE)
104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_shl (Word32 L_var1, Word16 var2);
105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord32 L_shl (Word32 L_var1, Word16 var2);
107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Long shift right, 2*/
110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_SHR_IS_INLINE)
111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_shr (Word32 L_var1, Word16 var2);
112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord32 L_shr (Word32 L_var1, Word16 var2);
114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
116956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short add,           1   */
117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (ADD_IS_INLINE)
118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 add (Word16 var1, Word16 var2);
119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
120956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 add (Word16 var1, Word16 var2);
121956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short sub,           1   */
124956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (SUB_IS_INLINE)
125956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 sub(Word16 var1, Word16 var2);
126956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
127956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 sub(Word16 var1, Word16 var2);
128956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
129956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
130956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short division,       18  */
131956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (DIV_S_IS_INLINE)
132956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 div_s (Word16 var1, Word16 var2);
133956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
134956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 div_s (Word16 var1, Word16 var2);
135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
136956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
137956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short mult,          1   */
138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (MULT_IS_INLINE)
139956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 mult (Word16 var1, Word16 var2);
140956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
141956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 mult (Word16 var1, Word16 var2);
142956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
143956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
144956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short norm,           15  */
145956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (NORM_S_IS_INLINE)
146956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 norm_s (Word16 var1);
147956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
148956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 norm_s (Word16 var1);
149956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
150956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
151956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Long norm,            30  */
152956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (NORM_L_IS_INLINE)
153956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 norm_l (Word32 L_var1);
154956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
155956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 norm_l (Word32 L_var1);
156956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
157956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
158956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Round,               1   */
159956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (ROUND_IS_INLINE)
160956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 round16(Word32 L_var1);
161956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
162956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 round16(Word32 L_var1);
163956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
164956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
165956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Mac,  1  */
166956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_MAC_IS_INLINE)
167956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);
168956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
169956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);
170956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
171956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
172956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_ADD_IS_INLINE)
173956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_add (Word32 L_var1, Word32 L_var2);
174956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
175956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord32 L_add (Word32 L_var1, Word32 L_var2);
176956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
177956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
178956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Extract high,        1   */
179956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (EXTRACT_H_IS_INLINE)
180956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 extract_h (Word32 L_var1);
181956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
182956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 extract_h (Word32 L_var1);
183956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
184956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
185956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Extract low,         1   */
186956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (EXTRACT_L_IS_INLINE)
187956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 extract_l(Word32 L_var1);
188956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
189956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 extract_l(Word32 L_var1);
190956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
191956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
192956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Mult with round, 2 */
193956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (MULT_R_IS_INLINE)
194956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 mult_r(Word16 var1, Word16 var2);
195956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
196956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 mult_r(Word16 var1, Word16 var2);
197956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
198956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
199956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Shift right with round, 2           */
200956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (SHR_R_IS_INLINE)
201956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 shr_r (Word16 var1, Word16 var2);
202956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
203956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 shr_r (Word16 var1, Word16 var2);
204956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
205956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
206956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Mac with rounding,2 */
207956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (MAC_R_IS_INLINE)
208956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);
209956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
210956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);
211956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
212956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
213956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Msu with rounding,2 */
214956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (MSU_R_IS_INLINE)
215956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);
216956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
217956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);
218956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
219956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
220956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Long shift right with round,  3             */
221956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_SHR_R_IS_INLINE)
222956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_shr_r (Word32 L_var1, Word16 var2);
223956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
224956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord32 L_shr_r (Word32 L_var1, Word16 var2);
225956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
226956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
227956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV4_INASM
228956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2)
229956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
230956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
231956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
232956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV %[result], %[L_var1], ASR %[var2] \n"
233956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"=r"(result)
234956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[L_var1]"r"(L_var1), [var2]"r"(var2)
235956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
236956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
237956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
238956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
239956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2)
240956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
241956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
242956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
243956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV	r2, %[L_var1] \n"
244956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV	r3, #0x7fffffff\n"
245956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV	%[result], %[L_var1], ASL %[var2] \n"
246956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"TEQ	r2, %[result], ASR %[var2]\n"
247956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"EORNE  %[result],r3,r2,ASR#31\n"
248956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
249956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[L_var1]"r"(L_var1), [var2]"r"(var2)
250956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:"r2", "r3"
251956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
252956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
253956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
254956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
255956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
256956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
257956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
258956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
259956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"CMP	%[var2], #15\n"
260956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOVGE  %[var2], #15\n"
261956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV	%[result], %[L_var1], ASR %[var2]\n"
262956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"=r"(result)
263956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[L_var1]"r"(L_var1), [var2]"r"(var2)
264956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
265956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
266956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
267956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
268956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
269956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
270956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
271956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
272956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"CMP	%[var2], #16\n"
273956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOVGE  %[var2], #16\n"
274956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV    %[result], %[L_var1], ASL %[var2]\n"
275956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV    r3, #1\n"
276956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        "MOV    r2, %[result], ASR #15\n"
277956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        "RSB    r3,r3,r3,LSL #15 \n"
278956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        "TEQ    r2, %[result], ASR #31 \n"
279956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        "EORNE  %[result], r3, %[result],ASR #31"
280956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
281956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[L_var1]"r"(L_var1), [var2]"r"(var2)
282956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:"r2", "r3"
283956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
284956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
285956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
286956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
287956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
288956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*___________________________________________________________________________
289956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong |                                                                           |
290956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong |   definitions for inline basic arithmetic operators                       |
291956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong |___________________________________________________________________________|
292956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*/
293956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (SATRUATE_IS_INLINE)
294956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 saturate(Word32 L_var1)
295956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
296956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_SAT
297956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 result;
298956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile (
299956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV	%[result], %[L_var1]\n"
300956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV	r3, #1\n"
301956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV	r2,%[L_var1],ASR#15\n"
302956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"RSB	r3, r3, r3, LSL #15\n"
303956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"TEQ	r2,%[L_var1],ASR#31\n"
304956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"EORNE	%[result],r3,%[L_var1],ASR#31\n"
305956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
306956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[L_var1]"r"(L_var1)
307956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:"r2", "r3"
308956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	);
309956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
310956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
311956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
312956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
313956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
314956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1));
315956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
316956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (L_var1 > 0X00007fffL)
317956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
318956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        var_out = MAX_16;
319956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
320956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else if (L_var1 < (Word32) 0xffff8000L)
321956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
322956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        var_out = MIN_16;
323956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
324956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
325956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
326956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        var_out = extract_l(L_var1);
327956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
328956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
329956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
330956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
331956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
332956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
333956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
334956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short shift left,    1   */
335956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (SHL_IS_INLINE)
336956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 shl (Word16 var1, Word16 var2)
337956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
338956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_SHL
339956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	if(var2>=0)
340956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
341956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		return ASM_shl( var1, var2);
342956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
343956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	else
344956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
345956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		return ASM_shr( var1, -var2);
346956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
347956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
348956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
349956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 result;
350956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
351956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (var2 < 0)
352956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
353956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        var_out = shr (var1, (Word16)-var2);
354956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
355956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
356956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
357956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        result = (Word32) var1 *((Word32) 1 << var2);
358956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
359956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
360956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
361956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
362956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
363956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else
364956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
365956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            var_out = extract_l(result);
366956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
367956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
368956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
369956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
370956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
371956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
372956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
373956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short shift right,   1   */
374956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (SHR_IS_INLINE)
375956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 shr (Word16 var1, Word16 var2)
376956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
377956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_SHR
378956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	if(var2>=0)
379956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
380956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		return  ASM_shr( var1, var2);
381956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
382956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	else
383956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
384956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		return  ASM_shl( var1, -var2);
385956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
386956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
387956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
388956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
389956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (var2 < 0)
390956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
391956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        var_out = shl (var1, (Word16)-var2);
392956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
393956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
394956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
395956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (var2 >= 15)
396956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
397956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            var_out = (Word16)((var1 < 0) ? -1 : 0);
398956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
399956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else
400956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
401956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            if (var1 < 0)
402956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            {
403956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                var_out = (Word16)(~((~var1) >> var2));
404956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            }
405956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            else
406956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            {
407956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                var_out = (Word16)(var1 >> var2);
408956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            }
409956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
410956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
411956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
412956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
413956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
414956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
415956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
416956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
417956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
418956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_MULT_IS_INLINE)
419956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_mult(Word16 var1, Word16 var2)
420956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
421956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_L_MULT
422956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
423956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
424956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"SMULBB %[result], %[var1], %[var2] \n"
425956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"QADD %[result], %[result], %[result] \n"
426956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
427956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[var1]"r"(var1), [var2]"r"(var2)
428956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
429956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
430956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
431956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_var_out;
432956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
433956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_var_out = (Word32) var1 *(Word32) var2;
434956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
435956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (L_var_out != (Word32) 0x40000000L)
436956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
437956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        L_var_out <<= 1;
438956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
439956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
440956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
441956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        L_var_out = MAX_32;
442956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
443956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (L_var_out);
444956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
445956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
446956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
447956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
448956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_MSU_IS_INLINE)
449956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
450956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
451956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_L_MSU
452956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
453956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
454956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"SMULBB %[result], %[var1], %[var2] \n"
455956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"QADD %[result], %[result], %[result] \n"
456956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"QSUB %[result], %[L_var3], %[result]\n"
457956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
458956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
459956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
460956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
461956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
462956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_var_out;
463956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_product;
464956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
465956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_product = L_mult(var1, var2);
466956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_var_out = L_sub(L_var3, L_product);
467956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (L_var_out);
468956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
469956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
470956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
471956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
472956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_SUB_IS_INLINE)
473956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_sub(Word32 L_var1, Word32 L_var2)
474956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
475956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_L_SUB
476956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
477956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
478956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"QSUB %[result], %[L_var1], %[L_var2]\n"
479956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
480956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
481956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
482956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
483956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
484956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_var_out;
485956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
486956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_var_out = L_var1 - L_var2;
487956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
488956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (((L_var1 ^ L_var2) & MIN_32) != 0)
489956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
490956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if ((L_var_out ^ L_var1) & MIN_32)
491956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
492956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
493956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
494956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
495956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
496956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (L_var_out);
497956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
498956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
499956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
500956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
501956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_SHL_IS_INLINE)
502956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_shl(Word32 L_var1, Word16 var2)
503956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
504956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_L_SHL
505956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if(var2>=0)
506956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
507956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        return  ASM_L_shl( L_var1, var2);
508956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
509956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
510956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
511956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        return  ASM_L_shr( L_var1, -var2);
512956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
513956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
514956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_var_out = 0L;
515956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
516956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (var2 <= 0)
517956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
518956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        L_var1 = L_shr(L_var1, (Word16)-var2);
519956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
520956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
521956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
522956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        for (; var2 > 0; var2--)
523956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
524956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            if (L_var1 > (Word32) 0X3fffffffL)
525956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            {
526956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                return MAX_32;
527956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            }
528956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            else
529956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            {
530956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                if (L_var1 < (Word32) 0xc0000000L)
531956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                {
532956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    return MIN_32;
533956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                }
534956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            }
535956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            L_var1 <<= 1;
536956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            L_var_out = L_var1;
537956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
538956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
539956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (L_var1);
540956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
541956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
542956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
543956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
544956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_SHR_IS_INLINE)
545956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_shr (Word32 L_var1, Word16 var2)
546956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
547956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_L_SHR
548956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	if(var2>=0)
549956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
550956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		return ASM_L_shr( L_var1, var2);
551956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
552956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	else
553956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
554956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		return ASM_L_shl( L_var1, -var2);
555956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
556956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
557956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_var_out;
558956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
559956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (var2 < 0)
560956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
561956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        L_var_out = L_shl (L_var1, (Word16)-var2);
562956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
563956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
564956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
565956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (var2 >= 31)
566956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
567956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            L_var_out = (L_var1 < 0L) ? -1 : 0;
568956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
569956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else
570956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
571956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            if (L_var1 < 0)
572956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            {
573956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                L_var_out = ~((~L_var1) >> var2);
574956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            }
575956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            else
576956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            {
577956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                L_var_out = L_var1 >> var2;
578956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            }
579956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
580956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
581956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (L_var_out);
582956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
583956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
584956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
585956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
586956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short add,           1   */
587956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (ADD_IS_INLINE)
588956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 add (Word16 var1, Word16 var2)
589956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
590956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_ADD
591956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
592956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
593956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"ADD  %[result], %[var1], %[var2] \n"
594956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV  r3, #0x1\n"
595956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV  r2, %[result], ASR #15\n"
596956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"RSB  r3, r3, r3, LSL, #15\n"
597956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"TEQ  r2, %[result], ASR #31\n"
598956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"EORNE %[result], r3, %[result], ASR #31"
599956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
600956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[var1]"r"(var1), [var2]"r"(var2)
601956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:"r2", "r3"
602956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
603956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
604956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
605956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
606956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_sum;
607956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
608956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_sum = (Word32) var1 + var2;
609956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    var_out = saturate(L_sum);
610956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
611956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
612956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
613956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
614956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
615956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
616956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short sub,           1   */
617956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (SUB_IS_INLINE)
618956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 sub(Word16 var1, Word16 var2)
619956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
620956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_SUB
621956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
622956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
623956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV   r3, #1\n"
624956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"SUB   %[result], %[var1], %[var2] \n"
625956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"RSB   r3,r3,r3,LSL#15\n"
626956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV   r2, %[var1], ASR #15 \n"
627956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"TEQ   r2, %[var1], ASR #31 \n"
628956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"EORNE %[result], r3, %[result], ASR #31 \n"
629956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
630956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[var1]"r"(var1), [var2]"r"(var2)
631956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:"r2", "r3"
632956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
633956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
634956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
635956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
636956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_diff;
637956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
638956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_diff = (Word32) var1 - var2;
639956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    var_out = saturate(L_diff);
640956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
641956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
642956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
643956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
644956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
645956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
646956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short division,       18  */
647956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (DIV_S_IS_INLINE)
648956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 div_s (Word16 var1, Word16 var2)
649956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
650956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out = 0;
651956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 iteration;
652956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_num;
653956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_denom;
654956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
655956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    var_out = MAX_16;
656956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (var1!= var2)//var1!= var2
657956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
658956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    	var_out = 0;
659956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    	L_num = (Word32) var1;
660956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
661956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    	L_denom = (Word32) var2;
662956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
663956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		//return (L_num<<15)/var2;
664956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
665956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    	for (iteration = 0; iteration < 15; iteration++)
666956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    	{
667956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    		var_out <<= 1;
668956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    		L_num <<= 1;
669956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
670956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    		if (L_num >= L_denom)
671956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    		{
672956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    			L_num -= L_denom;
673956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    			var_out++;
674956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    		}
675956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    	}
676956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
677956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
678956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
679956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
680956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
681956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short mult,          1   */
682956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (MULT_IS_INLINE)
683956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 mult (Word16 var1, Word16 var2)
684956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
685956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_MULT
686956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
687956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
688956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"SMULBB r2, %[var1], %[var2] \n"
689956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV	r3, #1\n"
690956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV	%[result], r2, ASR #15\n"
691956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"RSB	r3, r3, r3, LSL #15\n"
692956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV	r2, %[result], ASR #15\n"
693956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"TEQ	r2, %[result], ASR #31\n"
694956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"EORNE  %[result], r3, %[result], ASR #31 \n"
695956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
696956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[var1]"r"(var1), [var2]"r"(var2)
697956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:"r2", "r3"
698956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
699956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
700956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
701956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
702956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_product;
703956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
704956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_product = (Word32) var1 *(Word32) var2;
705956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_product = (L_product & (Word32) 0xffff8000L) >> 15;
706956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (L_product & (Word32) 0x00010000L)
707956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        L_product = L_product | (Word32) 0xffff0000L;
708956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    var_out = saturate(L_product);
709956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
710956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
711956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
712956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
713956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
714956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
715956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
716956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Short norm,           15  */
717956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (NORM_S_IS_INLINE)
718956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 norm_s (Word16 var1)
719956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
720956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_NORM_S
721956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 result;
722956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
723956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV   r2,%[var1] \n"
724956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"CMP   r2, #0\n"
725956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"RSBLT %[var1], %[var1], #0 \n"
726956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"CLZNE %[result], %[var1]\n"
727956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"SUBNE %[result], %[result], #17\n"
728956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOVEQ %[result], #0\n"
729956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"CMP   r2, #-1\n"
730956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOVEQ %[result], #15\n"
731956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
732956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[var1]"r"(var1)
733956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:"r2"
734956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
735956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
736956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
737956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
738956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
739956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (var1 == 0)
740956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
741956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        var_out = 0;
742956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
743956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
744956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
745956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (var1 == -1)
746956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
747956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            var_out = 15;
748956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
749956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else
750956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
751956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            if (var1 < 0)
752956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            {
753956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                var1 = (Word16)~var1;
754956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            }
755956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            for (var_out = 0; var1 < 0x4000; var_out++)
756956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            {
757956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                var1 <<= 1;
758956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            }
759956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
760956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
761956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
762956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
763956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
764956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
765956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
766956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Long norm,            30  */
767956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (NORM_L_IS_INLINE)
768956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 norm_l (Word32 L_var1)
769956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
770956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_NORM_L
771956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 result;
772956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
773956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"CMP    %[L_var1], #0\n"
774956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"CLZNE  %[result], %[L_var1]\n"
775956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"SUBNE  %[result], %[result], #1\n"
776956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOVEQ  %[result], #0\n"
777956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
778956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[L_var1]"r"(L_var1)
779956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
780956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
781956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
782956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //Word16 var_out;
783956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
784956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //if (L_var1 == 0)
785956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //{
786956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //    var_out = 0;
787956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //}
788956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //else
789956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //{
790956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //    if (L_var1 == (Word32) 0xffffffffL)
791956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //    {
792956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //        var_out = 31;
793956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //    }
794956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //    else
795956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //    {
796956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //        if (L_var1 < 0)
797956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //        {
798956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //            L_var1 = ~L_var1;
799956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //        }
800956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //        for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
801956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //        {
802956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //            L_var1 <<= 1;
803956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //        }
804956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //    }
805956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //}
806956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    //return (var_out);
807956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 a16;
808956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 r = 0 ;
809956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
810956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
811956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  if ( L_var1 < 0 ) {
812956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_var1 = ~L_var1;
813956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
814956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
815956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  if (0 == (L_var1 & 0x7fff8000)) {
816956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    a16 = extract_l(L_var1);
817956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    r += 16;
818956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
819956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (0 == (a16 & 0x7f80)) {
820956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      r += 8;
821956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
822956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      if (0 == (a16 & 0x0078)) {
823956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        r += 4;
824956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
825956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (0 == (a16 & 0x0006)) {
826956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          r += 2;
827956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
828956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0001)) {
829956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
830956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
831956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
832956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else {
833956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
834956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0004)) {
835956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
836956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
837956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
838956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
839956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      else {
840956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
841956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (0 == (a16 & 0x0060)) {
842956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          r += 2;
843956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
844956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0010)) {
845956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
846956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
847956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
848956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else {
849956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
850956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0040)) {
851956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
852956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
853956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
854956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
855956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
856956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else {
857956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
858956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      if (0 == (a16 & 0x7800)) {
859956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        r += 4;
860956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
861956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (0 == (a16 & 0x0600)) {
862956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          r += 2;
863956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
864956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0100)) {
865956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
866956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
867956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
868956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else {
869956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
870956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0400)) {
871956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
872956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
873956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
874956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
875956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      else {
876956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
877956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (0 == (a16 & 0x6000)) {
878956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          r += 2;
879956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
880956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x1000)) {
881956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
882956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
883956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
884956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else {
885956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
886956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x4000)) {
887956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
888956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
889956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
890956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
891956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
892956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
893956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  else {
894956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    a16 = extract_h(L_var1);
895956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
896956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (0 == (a16 & 0x7f80)) {
897956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      r += 8;
898956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
899956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      if (0 == (a16 & 0x0078)) {
900956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        r += 4 ;
901956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
902956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (0 == (a16 & 0x0006)) {
903956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          r += 2;
904956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
905956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0001)) {
906956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
907956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
908956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
909956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else {
910956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
911956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0004)) {
912956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
913956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
914956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
915956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
916956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      else {
917956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
918956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (0 == (a16 & 0x0060)) {
919956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          r += 2;
920956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
921956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0010)) {
922956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
923956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
924956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
925956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else {
926956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
927956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0040)) {
928956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
929956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
930956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
931956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
932956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
933956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else {
934956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
935956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      if (0 == (a16 & 0x7800)) {
936956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        r += 4;
937956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
938956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (0 == (a16 & 0x0600)) {
939956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          r += 2;
940956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
941956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0100)) {
942956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
943956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
944956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
945956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else {
946956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
947956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x0400)) {
948956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
949956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
950956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
951956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
952956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      else {
953956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
954956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (0 == (a16 & 0x6000)) {
955956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          r += 2;
956956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
957956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x1000)) {
958956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            r += 1;
959956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
960956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
961956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        else {
962956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
963956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          if (0 == (a16 & 0x4000)) {
964956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            return 1;
965956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          }
966956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
967956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
968956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
969956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
970956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
971956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  return r ;
972956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
973956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
974956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
975956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
976956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Round,               1   */
977956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (ROUND_IS_INLINE)
978956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 round16(Word32 L_var1)
979956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
980956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_ROUND
981956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 result;
982956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
983956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV   r1,#0x00008000\n"
984956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"QADD  %[result], %[L_var1], r1\n"
985956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"MOV   %[result], %[result], ASR #16 \n"
986956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
987956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[L_var1]"r"(L_var1)
988956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:"r1"
989956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
990956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
991956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
992956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
993956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_rounded;
994956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
995956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_rounded = L_add (L_var1, (Word32) 0x00008000L);
996956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    var_out = extract_h (L_rounded);
997956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
998956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
999956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
1000956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1001956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1002956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* Mac,  1  */
1003956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_MAC_IS_INLINE)
1004956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
1005956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
1006956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_L_MAC
1007956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
1008956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
1009956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"SMULBB %[result], %[var1], %[var2]\n"
1010956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"QADD	%[result], %[result], %[result]\n"
1011956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"QADD   %[result], %[result], %[L_var3]\n"
1012956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
1013956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		: [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
1014956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
1015956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
1016956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
1017956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_var_out;
1018956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_product;
1019956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1020956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_product = L_mult(var1, var2);
1021956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_var_out = L_add (L_var3, L_product);
1022956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (L_var_out);
1023956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1024956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
1025956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1026956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1027956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_ADD_IS_INLINE)
1028956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_add (Word32 L_var1, Word32 L_var2)
1029956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
1030956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if ARMV5TE_L_ADD
1031956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 result;
1032956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	asm volatile(
1033956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		"QADD %[result], %[L_var1], %[L_var2]\n"
1034956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[result]"+r"(result)
1035956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
1036956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		);
1037956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return result;
1038956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#else
1039956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_var_out;
1040956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1041956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_var_out = L_var1 + L_var2;
1042956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (((L_var1 ^ L_var2) & MIN_32) == 0)
1043956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
1044956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if ((L_var_out ^ L_var1) & MIN_32)
1045956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
1046956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
1047956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
1048956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
1049956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (L_var_out);
1050956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1051956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
1052956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1053956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1054956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1055956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1056956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (MULT_R_IS_INLINE)
1057956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 mult_r (Word16 var1, Word16 var2)
1058956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
1059956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
1060956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_product_arr;
1061956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1062956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_product_arr = (Word32)var1 *(Word32)var2;       /* product */
1063956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_product_arr += (Word32)0x00004000L;      /* round */
1064956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_product_arr >>= 15;       /* shift */
1065956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1066956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    var_out = saturate(L_product_arr);
1067956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1068956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
1069956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
1070956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1071956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1072956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (SHR_R_IS_INLINE)
1073956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 shr_r (Word16 var1, Word16 var2)
1074956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
1075956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
1076956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1077956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (var2 > 15)
1078956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
1079956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        var_out = 0;
1080956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
1081956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
1082956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
1083956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        var_out = shr(var1, var2);
1084956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1085956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (var2 > 0)
1086956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
1087956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
1088956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            {
1089956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                var_out++;
1090956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            }
1091956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
1092956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
1093956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1094956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
1095956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
1096956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1097956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1098956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (MAC_R_IS_INLINE)
1099956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)
1100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
1101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
1102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_var3 = L_mac (L_var3, var1, var2);
1104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    var_out = (Word16)((L_var3 + 0x8000L) >> 16);
1105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
1107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
1108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (MSU_R_IS_INLINE)
1111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
1112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
1113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
1114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    L_var3 = L_msu (L_var3, var1, var2);
1116956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    var_out = (Word16)((L_var3 + 0x8000L) >> 16);
1117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
1119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
1120956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1121956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (L_SHR_R_IS_INLINE)
1123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word32 L_shr_r (Word32 L_var1, Word16 var2)
1124956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
1125956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 L_var_out;
1126956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1127956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (var2 > 31)
1128956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
1129956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        L_var_out = 0;
1130956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
1131956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
1132956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    {
1133956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        L_var_out = L_shr(L_var1, var2);
1134956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        if (var2 > 0)
1136956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        {
1137956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
1138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            {
1139956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                L_var_out++;
1140956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong            }
1141956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
1142956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
1143956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1144956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (L_var_out);
1145956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
1146956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1147956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1148956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (EXTRACT_H_IS_INLINE)
1149956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 extract_h (Word32 L_var1)
1150956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
1151956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 var_out;
1152956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1153956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    var_out = (Word16) (L_var1 >> 16);
1154956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1155956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    return (var_out);
1156956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
1157956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1158956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1159956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if (EXTRACT_L_IS_INLINE)
1160956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong__inline Word16 extract_l(Word32 L_var1)
1161956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
1162956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return (Word16) L_var1;
1163956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
1164956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1165956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
1166956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1167