basic_op.h revision 9da751147af3222258093d9f41cabf0ea1391c04
1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*******************************************************************************
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	File:		basicop2.h
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Content:	Constants , Globals and Basic arithmetic operators.
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/
22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
23956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#ifndef __BASIC_OP_H
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#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
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define ABS(a)	((a) >= 0) ? (a) : (-(a))
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short abs,           1   */
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define abs_s(x)       ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16))
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 16 bit var1 -> MSB,     2 */
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_deposit_h(x) (((Word32)(x)) << 16)
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 16 bit var1 -> LSB,     2 */
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_deposit_l(x) ((Word32)(x))
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Long abs,              3  */
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32)
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short negate,        1   */
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1))))
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Long negate,     2 */
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1)))
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MULHIGH(A,B) (int)(((Word64)(A)*(Word64)(B)) >> 32)
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define fixmul(a, b) (int)((((Word64)(a)*(Word64)(b)) >> 32) << 1)
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if  (SATRUATE_IS_INLINE)
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 saturate(Word32 L_var1);
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
65e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 saturate(Word32 L_var1);
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short shift left,    1   */
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SHL_IS_INLINE)
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 shl (Word16 var1, Word16 var2);
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
72e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 shl (Word16 var1, Word16 var2);
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short shift right,   1   */
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SHR_IS_INLINE)
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 shr (Word16 var1, Word16 var2);
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
79e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 shr (Word16 var1, Word16 var2);
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_MULT_IS_INLINE)
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_mult(Word16 var1, Word16 var2);
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
85e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_mult(Word16 var1, Word16 var2);
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Msu,  1  */
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_MSU_IS_INLINE)
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
92e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
94b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Long sub,        2 */
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SUB_IS_INLINE)
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_sub(Word32 L_var1, Word32 L_var2);
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
99e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_sub(Word32 L_var1, Word32 L_var2);
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Long shift left, 2 */
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SHL_IS_INLINE)
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_shl (Word32 L_var1, Word16 var2);
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
106e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_shl (Word32 L_var1, Word16 var2);
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Long shift right, 2*/
110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SHR_IS_INLINE)
111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_shr (Word32 L_var1, Word16 var2);
112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
113e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_shr (Word32 L_var1, Word16 var2);
114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short add,           1   */
117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (ADD_IS_INLINE)
118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 add (Word16 var1, Word16 var2);
119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
120e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 add (Word16 var1, Word16 var2);
121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
122b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short sub,           1   */
124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SUB_IS_INLINE)
125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 sub(Word16 var1, Word16 var2);
126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
127e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 sub(Word16 var1, Word16 var2);
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short division,       18  */
131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (DIV_S_IS_INLINE)
132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 div_s (Word16 var1, Word16 var2);
133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
134e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 div_s (Word16 var1, Word16 var2);
135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short mult,          1   */
138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MULT_IS_INLINE)
139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 mult (Word16 var1, Word16 var2);
140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
141e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 mult (Word16 var1, Word16 var2);
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short norm,           15  */
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (NORM_S_IS_INLINE)
146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 norm_s (Word16 var1);
147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
148e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 norm_s (Word16 var1);
149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Long norm,            30  */
152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (NORM_L_IS_INLINE)
153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 norm_l (Word32 L_var1);
154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
155e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 norm_l (Word32 L_var1);
156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Round,               1   */
159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (ROUND_IS_INLINE)
160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 round16(Word32 L_var1);
161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
162e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 round16(Word32 L_var1);
163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Mac,  1  */
166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_MAC_IS_INLINE)
167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);
168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
169e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);
170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_ADD_IS_INLINE)
173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_add (Word32 L_var1, Word32 L_var2);
174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
175e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_add (Word32 L_var1, Word32 L_var2);
176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Extract high,        1   */
179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (EXTRACT_H_IS_INLINE)
180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 extract_h (Word32 L_var1);
181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
182e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 extract_h (Word32 L_var1);
183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Extract low,         1   */
186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (EXTRACT_L_IS_INLINE)
187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 extract_l(Word32 L_var1);
188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
189e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 extract_l(Word32 L_var1);
190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Mult with round, 2 */
193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MULT_R_IS_INLINE)
194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 mult_r(Word16 var1, Word16 var2);
195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
196e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 mult_r(Word16 var1, Word16 var2);
197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Shift right with round, 2           */
200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SHR_R_IS_INLINE)
201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 shr_r (Word16 var1, Word16 var2);
202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
203e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 shr_r (Word16 var1, Word16 var2);
204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Mac with rounding,2 */
207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MAC_R_IS_INLINE)
208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);
209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
210e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);
211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Msu with rounding,2 */
214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MSU_R_IS_INLINE)
215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);
216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
217e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);
218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Long shift right with round,  3             */
221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SHR_R_IS_INLINE)
222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_shr_r (Word32 L_var1, Word16 var2);
223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
224e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_shr_r (Word32 L_var1, Word16 var2);
225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV4_INASM
228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2)
229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
230b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
2319da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
232b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"MOV %[result], %[L_var1], ASR %[var2] \n"
233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[result]"=r"(result)
234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[L_var1]"r"(L_var1), [var2]"r"(var2)
235b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
236b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	return result;
237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
238b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2)
240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
241b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
2429da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
243b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"MOV	%[result], %[L_var1], ASL %[var2] \n"
2449da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"TEQ	%[L_var1], %[result], ASR %[var2]\n"
2459da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"EORNE  %[result], %[mask], %[L_var1], ASR #31\n"
246d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=&r"(result)
2479da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[L_var1]"r"(L_var1), [var2]"r"(var2), [mask]"r"(0x7fffffff)
248b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
249b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	return result;
250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
254b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
2559da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"CMP	%[var2], #15\n"
2579da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOVLT	%[result], %[L_var1], ASR %[var2]\n"
2589da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOVGE	%[result], %[L_var1], ASR #15\n"
259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[result]"=r"(result)
260b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		:[L_var1]"r"(L_var1), [var2]"r"(var2)
261b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
262b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	return result;
263b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard}
264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
267b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
2689da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 tmp;
2699da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"CMP	%[var2], #16\n"
2719da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOVLT  %[result], %[L_var1], ASL %[var2]\n"
2729da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOVGE  %[result], %[L_var1], ASL #16\n"
2739da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard        "MOV    %[tmp], %[result], ASR #15\n"
2749da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard        "TEQ    %[tmp], %[result], ASR #31 \n"
2759da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard        "EORNE  %[result], %[mask], %[result],ASR #31"
2769da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
2779da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[L_var1]"r"(L_var1), [var2]"r"(var2), [mask]"r"(0x7fff)
278b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
279b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	return result;
280b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard}
281e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________
284e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |                                                                           |
285e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |   definitions for inline basic arithmetic operators                       |
286e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________|
287e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/
288e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SATRUATE_IS_INLINE)
289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 saturate(Word32 L_var1)
290e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_SAT
292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 result;
2939da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 tmp;
294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	asm volatile (
2959da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOV	%[tmp], %[L_var1],ASR#15\n"
2969da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"TEQ	%[tmp], %[L_var1],ASR#31\n"
2979da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"EORNE	%[result], %[mask],%[L_var1],ASR#31\n"
298d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		"MOVEQ	%[result], %[L_var1]\n"
2999da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
3009da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[L_var1]"r"(L_var1), [mask]"r"(0x7fff)
301e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	);
302e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
303e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
304e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
306b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1));
308e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (L_var1 > 0X00007fffL)
310e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
311e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = MAX_16;
312e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else if (L_var1 < (Word32) 0xffff8000L)
314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
315e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = MIN_16;
316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = extract_l(L_var1);
320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
322e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
325e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
326e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short shift left,    1   */
328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SHL_IS_INLINE)
329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 shl (Word16 var1, Word16 var2)
330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_SHL
332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(var2>=0)
333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return ASM_shl( var1, var2);
335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	else
337e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return ASM_shr( var1, -var2);
339e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 result;
343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
344e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 < 0)
345e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
346e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = shr (var1, (Word16)-var2);
347e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
348e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        result = (Word32) var1 *((Word32) 1 << var2);
351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else
357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            var_out = extract_l(result);
359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short shift right,   1   */
367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SHR_IS_INLINE)
368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 shr (Word16 var1, Word16 var2)
369e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
370e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_SHR
371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(var2>=0)
372e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return  ASM_shr( var1, var2);
374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
375e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	else
376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return  ASM_shl( var1, -var2);
378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
380e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
381e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 < 0)
383e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
384e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = shl (var1, (Word16)-var2);
385e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
386e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
387e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
388e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (var2 >= 15)
389e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
390e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            var_out = (Word16)((var1 < 0) ? -1 : 0);
391e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
392e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else
393e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
394e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if (var1 < 0)
395e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
396e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                var_out = (Word16)(~((~var1) >> var2));
397e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
398e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            else
399e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
400e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                var_out = (Word16)(var1 >> var2);
401e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
402e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
403e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
404e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
405e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
406e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
407e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
408e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
409e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
410e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
411e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_MULT_IS_INLINE)
412e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_mult(Word16 var1, Word16 var2)
413e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
414e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_MULT
415b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
4169da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
417b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"SMULBB %[result], %[var1], %[var2] \n"
418b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"QADD %[result], %[result], %[result] \n"
419d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=r"(result)
420e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[var1]"r"(var1), [var2]"r"(var2)
421b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
425e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var_out = (Word32) var1 *(Word32) var2;
427e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
428e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (L_var_out != (Word32) 0x40000000L)
429e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
430e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var_out <<= 1;
431e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
432e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
433e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
434e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var_out = MAX_32;
435e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
436e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_MSU_IS_INLINE)
442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_MSU
445b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
4469da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
447b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"SMULBB %[result], %[var1], %[var2] \n"
448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"QADD %[result], %[result], %[result] \n"
449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"QSUB %[result], %[L_var3], %[result]\n"
450d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=&r"(result)
451e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
452b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
453e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
454e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
455e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
456e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_product;
457e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
458e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product = L_mult(var1, var2);
459e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var_out = L_sub(L_var3, L_product);
460e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
461e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
462e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
463e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
464e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
465e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SUB_IS_INLINE)
466e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_sub(Word32 L_var1, Word32 L_var2)
467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_SUB
469b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
4709da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
471e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"QSUB %[result], %[L_var1], %[L_var2]\n"
472d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=r"(result)
473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
474b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
475e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
476e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
477e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
478e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
479e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var_out = L_var1 - L_var2;
480e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
481e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (((L_var1 ^ L_var2) & MIN_32) != 0)
482e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
483e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if ((L_var_out ^ L_var1) & MIN_32)
484e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
485e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
486e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
490e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
491e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
492e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
493e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
494e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SHL_IS_INLINE)
495e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_shl(Word32 L_var1, Word16 var2)
496e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
497e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_SHL
498e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if(var2>=0)
499e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
500e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        return  ASM_L_shl( L_var1, var2);
501e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
502e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
503e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
504e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        return  ASM_L_shr( L_var1, -var2);
505e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
506e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
507e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out = 0L;
508e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
509e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 <= 0)
510e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
511e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var1 = L_shr(L_var1, (Word16)-var2);
512e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
513e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
514e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
515e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        for (; var2 > 0; var2--)
516e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
517e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if (L_var1 > (Word32) 0X3fffffffL)
518e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
519e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                return MAX_32;
520e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
521e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            else
522e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
523e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                if (L_var1 < (Word32) 0xc0000000L)
524e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                {
525e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                    return MIN_32;
526e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                }
527e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
528e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            L_var1 <<= 1;
529e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            L_var_out = L_var1;
530e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
531e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
532e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var1);
533e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
534e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
535e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
536e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
537e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SHR_IS_INLINE)
538e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_shr (Word32 L_var1, Word16 var2)
539e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
540e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_SHR
541e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(var2>=0)
542e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
543e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return ASM_L_shr( L_var1, var2);
544e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
545e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	else
546e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
547e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return ASM_L_shl( L_var1, -var2);
548e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
549e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
550e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
551e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
552e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 < 0)
553e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
554e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var_out = L_shl (L_var1, (Word16)-var2);
555e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
556e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
557e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
558e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (var2 >= 31)
559e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
560e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            L_var_out = (L_var1 < 0L) ? -1 : 0;
561e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
562e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else
563e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
564e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if (L_var1 < 0)
565e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
566e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                L_var_out = ~((~L_var1) >> var2);
567e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
568e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            else
569e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
570e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                L_var_out = L_var1 >> var2;
571e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
572e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
573e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
574e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
575e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
576e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
577e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
578e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
579e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short add,           1   */
580e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (ADD_IS_INLINE)
581e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 add (Word16 var1, Word16 var2)
582e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
583e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_ADD
584b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
5859da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 tmp;
5869da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
587b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"ADD  %[result], %[var1], %[var2] \n"
5889da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOV  %[tmp], %[result], ASR #15 \n"
5899da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"TEQ  %[tmp], %[result], ASR #31 \n"
5909da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"EORNE %[result], %[mask], %[result], ASR #31"
5919da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
5929da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[var1]"r"(var1), [var2]"r"(var2), [mask]"r"(0x7fff)
593b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
594e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
595e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
596e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
597e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_sum;
598e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
599e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_sum = (Word32) var1 + var2;
600e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = saturate(L_sum);
601e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
602e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
603e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
604e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
605e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
606e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
607e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short sub,           1   */
608e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SUB_IS_INLINE)
609e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 sub(Word16 var1, Word16 var2)
610e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
611e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_SUB
612b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
6139da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 tmp;
6149da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
615b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"SUB   %[result], %[var1], %[var2] \n"
6169da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOV   %[tmp], %[var1], ASR #15 \n"
6179da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"TEQ   %[tmp], %[var1], ASR #31 \n"
6189da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"EORNE %[result], %[mask], %[result], ASR #31 \n"
6199da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
6209da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[var1]"r"(var1), [var2]"r"(var2), [mask]"r"(0x7fff)
621b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
622e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
623e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
624e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
625e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_diff;
626e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
627e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_diff = (Word32) var1 - var2;
628e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = saturate(L_diff);
629b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
630e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
631e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
632e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
633e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
634e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
635e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short division,       18  */
636e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (DIV_S_IS_INLINE)
637e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 div_s (Word16 var1, Word16 var2)
638e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
639e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out = 0;
640e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 iteration;
641e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_num;
642e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_denom;
643e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
644e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = MAX_16;
645e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var1!= var2)//var1!= var2
646e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
647e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	var_out = 0;
648e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	L_num = (Word32) var1;
649b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
650e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	L_denom = (Word32) var2;
651b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
652e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		//return (L_num<<15)/var2;
653e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
654e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	for (iteration = 0; iteration < 15; iteration++)
655e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	{
656e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    		var_out <<= 1;
657e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    		L_num <<= 1;
658b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
659e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    		if (L_num >= L_denom)
660e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    		{
661e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    			L_num -= L_denom;
662e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    			var_out++;
663e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    		}
664e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	}
665e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
666e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
667e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
668e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
669e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
670e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short mult,          1   */
671e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MULT_IS_INLINE)
672e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 mult (Word16 var1, Word16 var2)
673e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
674e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_MULT
6759da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 result, tmp;
6769da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
6779da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"SMULBB %[tmp], %[var1], %[var2] \n"
6789da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOV	%[result], %[tmp], ASR #15\n"
6799da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOV	%[tmp], %[result], ASR #15\n"
6809da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"TEQ	%[tmp], %[result], ASR #31\n"
6819da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"EORNE  %[result], %[mask], %[result], ASR #31 \n"
6829da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
6839da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[var1]"r"(var1), [var2]"r"(var2), [mask]"r"(0x7fff)
684b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
685e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
686e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
687e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
688e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_product;
689e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
690e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product = (Word32) var1 *(Word32) var2;
691e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product = (L_product & (Word32) 0xffff8000L) >> 15;
692e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (L_product & (Word32) 0x00010000L)
693e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_product = L_product | (Word32) 0xffff0000L;
694e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = saturate(L_product);
695e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
696e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
697e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
698e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
699e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
700e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
701e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
702e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short norm,           15  */
703e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (NORM_S_IS_INLINE)
704e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 norm_s (Word16 var1)
705e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
706e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_NORM_S
707b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word16 result;
7089da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 tmp;
7099da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
7109da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"RSBS  %[tmp], %[var1], #0 \n"
7119da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"CLZLT %[result], %[var1]\n"
7129da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"CLZGT %[result], %[tmp]\n"
713e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"SUBNE %[result], %[result], #17\n"
714e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"MOVEQ %[result], #0\n"
7159da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"CMP   %[var1], #-1\n"
716b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"MOVEQ %[result], #15\n"
7179da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
718e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[var1]"r"(var1)
719b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
720e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
721e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
722e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
723e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
724e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var1 == 0)
725e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
726e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = 0;
727e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
728e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
729e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
730e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (var1 == -1)
731e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
732e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            var_out = 15;
733e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
734e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else
735e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
736e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if (var1 < 0)
737e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
738e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                var1 = (Word16)~var1;
739e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
740e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            for (var_out = 0; var1 < 0x4000; var_out++)
741e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
742e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                var1 <<= 1;
743e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
744e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
745e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
746e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
747e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
748e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
749e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
750e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
751e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Long norm,            30  */
752e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (NORM_L_IS_INLINE)
753e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 norm_l (Word32 L_var1)
754e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
755e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_NORM_L
756b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word16 result;
757b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	asm volatile(
758e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"CMP    %[L_var1], #0\n"
759e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"CLZNE  %[result], %[L_var1]\n"
760b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"SUBNE  %[result], %[result], #1\n"
761e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"MOVEQ  %[result], #0\n"
762d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=r"(result)
763e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[L_var1]"r"(L_var1)
764b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
765e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
766e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
767e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //Word16 var_out;
768e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
769e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //if (L_var1 == 0)
770e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //{
771e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    var_out = 0;
772e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //}
773e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //else
774e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //{
775e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    if (L_var1 == (Word32) 0xffffffffL)
776e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    {
777e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        var_out = 31;
778e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    }
779e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    else
780e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    {
781e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        if (L_var1 < 0)
782e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        {
783e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //            L_var1 = ~L_var1;
784e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        }
785e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
786e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        {
787e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //            L_var1 <<= 1;
788e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        }
789e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    }
790e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //}
791e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //return (var_out);
792e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  Word16 a16;
793b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  Word16 r = 0 ;
794b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
795e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
796e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  if ( L_var1 < 0 ) {
797b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    L_var1 = ~L_var1;
798e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  }
799e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
800e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  if (0 == (L_var1 & 0x7fff8000)) {
801e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    a16 = extract_l(L_var1);
802e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    r += 16;
803b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
804e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (0 == (a16 & 0x7f80)) {
805e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      r += 8;
806b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
807e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      if (0 == (a16 & 0x0078)) {
808e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        r += 4;
809b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
810e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0006)) {
811e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
812b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
813e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0001)) {
814e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
815e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
816e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
817e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
818b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
819e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0004)) {
820e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
821e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
822e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
823e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
824e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      else {
825b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
826e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0060)) {
827e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
828b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
829e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0010)) {
830e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
831e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
832e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
833e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
834b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
835e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0040)) {
836e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
837e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
838e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
839e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
840b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    }
841b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    else {
842b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
843e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      if (0 == (a16 & 0x7800)) {
844e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        r += 4;
845b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
846e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0600)) {
847e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
848b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
849e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0100)) {
850e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
851e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
852e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
853e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
854b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
855e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0400)) {
856e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
857e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
858e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
859e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
860e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      else {
861b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
862e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x6000)) {
863e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
864b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
865e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x1000)) {
866e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
867e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
868e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
869e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
870b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
871e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x4000)) {
872e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
873e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
874e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
875e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
876e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
877e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  }
878e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  else {
879e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    a16 = extract_h(L_var1);
880b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
881e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (0 == (a16 & 0x7f80)) {
882e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      r += 8;
883b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
884e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      if (0 == (a16 & 0x0078)) {
885e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        r += 4 ;
886b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
887e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0006)) {
888e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
889b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
890e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0001)) {
891e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
892e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
893e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
894e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
895b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
896e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0004)) {
897e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
898e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
899e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
900e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
901e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      else {
902b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
903e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0060)) {
904e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
905b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
906e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0010)) {
907e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
908e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
909e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
910e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
911b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
912e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0040)) {
913e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
914e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
915e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
916e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
917e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
918e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else {
919b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
920e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      if (0 == (a16 & 0x7800)) {
921e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        r += 4;
922b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
923e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0600)) {
924e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
925b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
926e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0100)) {
927e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
928e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
929e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
930e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
931b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
932e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0400)) {
933e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
934e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
935e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
936e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
937e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      else {
938b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
939e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x6000)) {
940e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
941b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
942e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x1000)) {
943e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
944e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
945e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
946e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
947b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
948e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x4000)) {
949e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            return 1;
950e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
951e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
952e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
953e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
954e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  }
955b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
956e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  return r ;
957e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
958e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
959e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
960e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
961e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Round,               1   */
962e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (ROUND_IS_INLINE)
963e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 round16(Word32 L_var1)
964e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
965e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_ROUND
966b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word16 result;
9679da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
9689da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"QADD  %[result], %[L_var1], %[bias]\n"
969b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"MOV   %[result], %[result], ASR #16 \n"
970d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=r"(result)
9719da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[L_var1]"r"(L_var1), [bias]"r"(0x8000)
972b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
973e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
974b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard#else
975e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
976e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_rounded;
977e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
978e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_rounded = L_add (L_var1, (Word32) 0x00008000L);
979e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = extract_h (L_rounded);
980e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
981e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
982e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
983e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
984e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
985e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Mac,  1  */
986e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_MAC_IS_INLINE)
987e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
988e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
989e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_MAC
990b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
9919da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
992e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"SMULBB %[result], %[var1], %[var2]\n"
993e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"QADD	%[result], %[result], %[result]\n"
994e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"QADD   %[result], %[result], %[L_var3]\n"
995d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=&r"(result)
996e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		: [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
997b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
998e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
999e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1000e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
1001e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_product;
1002e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1003e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product = L_mult(var1, var2);
1004e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var_out = L_add (L_var3, L_product);
1005e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
1006e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1007e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1008e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1009e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1010e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_ADD_IS_INLINE)
1011e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_add (Word32 L_var1, Word32 L_var2)
1012e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1013e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_ADD
1014b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
10159da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
1016e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"QADD %[result], %[L_var1], %[L_var2]\n"
1017d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=r"(result)
1018e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
1019b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
1020e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
1021e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1022e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
1023e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1024e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var_out = L_var1 + L_var2;
1025e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (((L_var1 ^ L_var2) & MIN_32) == 0)
1026e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
1027e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if ((L_var_out ^ L_var1) & MIN_32)
1028e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
1029e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
1030e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
1031e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
1032e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
1033e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1034e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1035e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1036e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1037e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1038e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1039e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MULT_R_IS_INLINE)
1040e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 mult_r (Word16 var1, Word16 var2)
1041e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1042e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
1043e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_product_arr;
1044e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1045e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product_arr = (Word32)var1 *(Word32)var2;       /* product */
1046e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product_arr += (Word32)0x00004000L;      /* round */
1047e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product_arr >>= 15;       /* shift */
1048e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1049e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = saturate(L_product_arr);
1050e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1051e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
1052e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1053e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1054e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1055e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SHR_R_IS_INLINE)
1056e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 shr_r (Word16 var1, Word16 var2)
1057e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1058e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
1059e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1060e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 > 15)
1061e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
1062e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = 0;
1063e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
1064e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
1065e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
1066e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = shr(var1, var2);
1067e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1068e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (var2 > 0)
1069e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
1070e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
1071e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
1072e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                var_out++;
1073e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
1074e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
1075e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
1076e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1077e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
1078e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1079e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1080e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1081e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MAC_R_IS_INLINE)
1082e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)
1083e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1084e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
1085e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1086e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var3 = L_mac (L_var3, var1, var2);
1087e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = (Word16)((L_var3 + 0x8000L) >> 16);
1088e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1089e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
1090e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1091e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1092e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1093e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MSU_R_IS_INLINE)
1094e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
1095e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1096e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
1097e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1098e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var3 = L_msu (L_var3, var1, var2);
1099e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = (Word16)((L_var3 + 0x8000L) >> 16);
1100b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
1101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
1102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SHR_R_IS_INLINE)
1106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_shr_r (Word32 L_var1, Word16 var2)
1107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
1109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 > 31)
1111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
1112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var_out = 0;
1113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
1114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
1115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
1116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var_out = L_shr(L_var1, var2);
1117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (var2 > 0)
1119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
1120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
1121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
1122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                L_var_out++;
1123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
1124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
1125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
1126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
1128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (EXTRACT_H_IS_INLINE)
1132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 extract_h (Word32 L_var1)
1133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
1135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = (Word16) (L_var1 >> 16);
1137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
1139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (EXTRACT_L_IS_INLINE)
1143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 extract_l(Word32 L_var1)
1144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return (Word16) L_var1;
1146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1149956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1150