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{
230fa9597bc0007f6a1d6704f047e7d94bb195c8a68Mans Rullgard	return L_var1 >> var2;
231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
232b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2)
234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
235b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
2369da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
237b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"MOV	%[result], %[L_var1], ASL %[var2] \n"
2389da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"TEQ	%[L_var1], %[result], ASR %[var2]\n"
2399da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"EORNE  %[result], %[mask], %[L_var1], ASR #31\n"
240d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=&r"(result)
2419da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[L_var1]"r"(L_var1), [var2]"r"(var2), [mask]"r"(0x7fffffff)
242b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
243b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	return result;
244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
248b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
2499da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"CMP	%[var2], #15\n"
2519da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOVLT	%[result], %[L_var1], ASR %[var2]\n"
2529da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOVGE	%[result], %[L_var1], ASR #15\n"
253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[result]"=r"(result)
254b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		:[L_var1]"r"(L_var1), [var2]"r"(var2)
255b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
256b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	return result;
257b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard}
258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
261813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard#if ARMV6_SAT
262813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard	Word32 result;
263813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard	asm (
264813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		"CMP	%[var2], #16\n"
265813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		"MOVLT  %[result], %[L_var1], ASL %[var2]\n"
266813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		"MOVGE  %[result], %[L_var1], ASL #16\n"
267813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		"SSAT   %[result], #16, %[result]\n"
268813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		:[result]"=r"(result)
269813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		:[L_var1]"r"(L_var1), [var2]"r"(var2)
270813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		);
271813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard	return result;
272813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard#else
273b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
2749da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 tmp;
2759da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
276e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"CMP	%[var2], #16\n"
2779da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOVLT  %[result], %[L_var1], ASL %[var2]\n"
2789da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOVGE  %[result], %[L_var1], ASL #16\n"
2799da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard        "MOV    %[tmp], %[result], ASR #15\n"
2809da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard        "TEQ    %[tmp], %[result], ASR #31 \n"
2819da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard        "EORNE  %[result], %[mask], %[result],ASR #31"
2829da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
2839da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[L_var1]"r"(L_var1), [var2]"r"(var2), [mask]"r"(0x7fff)
284b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
285b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	return result;
286813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard#endif
287b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard}
288e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
290e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________
291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |                                                                           |
292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |   definitions for inline basic arithmetic operators                       |
293e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________|
294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/
295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SATRUATE_IS_INLINE)
296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 saturate(Word32 L_var1)
297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
298813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard#if ARMV6_SAT
299813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard    Word16 result;
300813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard	asm (
301813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		"SSAT %[result], #16, %[L_var1]"
302813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		: [result]"=r"(result)
303813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		: [L_var1]"r"(L_var1)
304813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		);
305813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard	return result;
306813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard#elif ARMV5TE_SAT
307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 result;
3089da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 tmp;
309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	asm volatile (
3109da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOV	%[tmp], %[L_var1],ASR#15\n"
3119da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"TEQ	%[tmp], %[L_var1],ASR#31\n"
3129da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"EORNE	%[result], %[mask],%[L_var1],ASR#31\n"
313d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		"MOVEQ	%[result], %[L_var1]\n"
3149da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
3159da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[L_var1]"r"(L_var1), [mask]"r"(0x7fff)
316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	);
317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
321b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
322e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1));
323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (L_var1 > 0X00007fffL)
325e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
326e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = MAX_16;
327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else if (L_var1 < (Word32) 0xffff8000L)
329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = MIN_16;
331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = extract_l(L_var1);
335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
337e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
339e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short shift left,    1   */
343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SHL_IS_INLINE)
344e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 shl (Word16 var1, Word16 var2)
345e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
346e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_SHL
347e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(var2>=0)
348e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return ASM_shl( var1, var2);
350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	else
352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return ASM_shr( var1, -var2);
354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 result;
358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 < 0)
360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = shr (var1, (Word16)-var2);
362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        result = (Word32) var1 *((Word32) 1 << var2);
366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
369e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
370e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else
372e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            var_out = extract_l(result);
374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
375e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
380e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
381e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short shift right,   1   */
382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SHR_IS_INLINE)
383e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 shr (Word16 var1, Word16 var2)
384e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
385e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_SHR
386e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(var2>=0)
387e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
388e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return  ASM_shr( var1, var2);
389e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
390e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	else
391e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
392e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return  ASM_shl( var1, -var2);
393e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
394e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
395e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
396e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
397e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 < 0)
398e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
399e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = shl (var1, (Word16)-var2);
400e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
401e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
402e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
403e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (var2 >= 15)
404e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
405e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            var_out = (Word16)((var1 < 0) ? -1 : 0);
406e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
407e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else
408e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
409e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if (var1 < 0)
410e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
411e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                var_out = (Word16)(~((~var1) >> var2));
412e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
413e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            else
414e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
415e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                var_out = (Word16)(var1 >> var2);
416e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
417e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
418e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
419e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
420e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
421e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
425e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_MULT_IS_INLINE)
427e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_mult(Word16 var1, Word16 var2)
428e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
429e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_MULT
430b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
4319da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
432b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"SMULBB %[result], %[var1], %[var2] \n"
433b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"QADD %[result], %[result], %[result] \n"
434d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=r"(result)
435e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[var1]"r"(var1), [var2]"r"(var2)
436b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var_out = (Word32) var1 *(Word32) var2;
442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (L_var_out != (Word32) 0x40000000L)
444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var_out <<= 1;
446e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
447e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var_out = MAX_32;
450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
451e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
452e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
453e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
454e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
455e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
456e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_MSU_IS_INLINE)
457e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
458e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
459e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_MSU
460b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
4619da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
462b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"SMULBB %[result], %[var1], %[var2] \n"
463b8576d5ae50294bb1917b84f366054ebff02a3a6Mans Rullgard		"QDSUB %[result], %[L_var3], %[result]\n"
464d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=&r"(result)
465e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
466b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
469e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
470e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_product;
471e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
472e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product = L_mult(var1, var2);
473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var_out = L_sub(L_var3, L_product);
474e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
475e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
476e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
477e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
478e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
479e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SUB_IS_INLINE)
480e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_sub(Word32 L_var1, Word32 L_var2)
481e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
482e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_SUB
483b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
4849da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
485e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"QSUB %[result], %[L_var1], %[L_var2]\n"
486d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=r"(result)
487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
488b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
490e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
491e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
492e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
493e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var_out = L_var1 - L_var2;
494e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
495e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (((L_var1 ^ L_var2) & MIN_32) != 0)
496e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
497e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if ((L_var_out ^ L_var1) & MIN_32)
498e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
499e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
500e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
501e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
502e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
503e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
504e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
505e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
506e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
507e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
508e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SHL_IS_INLINE)
509e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_shl(Word32 L_var1, Word16 var2)
510e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
511e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_SHL
512e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if(var2>=0)
513e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
514e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        return  ASM_L_shl( L_var1, var2);
515e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
516e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
517e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
518e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        return  ASM_L_shr( L_var1, -var2);
519e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
520e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
521e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 <= 0)
522e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
523e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var1 = L_shr(L_var1, (Word16)-var2);
524e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
525e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
526e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
527e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        for (; var2 > 0; var2--)
528e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
529e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if (L_var1 > (Word32) 0X3fffffffL)
530e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
531e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                return MAX_32;
532e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
533e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            else
534e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
535e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                if (L_var1 < (Word32) 0xc0000000L)
536e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                {
537e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                    return MIN_32;
538e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                }
539e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
540e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            L_var1 <<= 1;
541e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
542e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
543e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var1);
544e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
545e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
546e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
547e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
548e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SHR_IS_INLINE)
549e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_shr (Word32 L_var1, Word16 var2)
550e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
551e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_SHR
552e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(var2>=0)
553e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
554e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return ASM_L_shr( L_var1, var2);
555e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
556e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	else
557e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
558e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return ASM_L_shl( L_var1, -var2);
559e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
560e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
561e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
562e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
563e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 < 0)
564e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
565e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var_out = L_shl (L_var1, (Word16)-var2);
566e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
567e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
568e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
569e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (var2 >= 31)
570e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
571e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            L_var_out = (L_var1 < 0L) ? -1 : 0;
572e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
573e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else
574e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
575e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if (L_var1 < 0)
576e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
577e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                L_var_out = ~((~L_var1) >> var2);
578e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
579e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            else
580e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
581e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                L_var_out = L_var1 >> var2;
582e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
583e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
584e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
585e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
586e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
587e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
588e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
589e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
590e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short add,           1   */
591e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (ADD_IS_INLINE)
592e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 add (Word16 var1, Word16 var2)
593e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
594e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_ADD
595b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
5969da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 tmp;
5979da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
598b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"ADD  %[result], %[var1], %[var2] \n"
5999da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOV  %[tmp], %[result], ASR #15 \n"
6009da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"TEQ  %[tmp], %[result], ASR #31 \n"
6019da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"EORNE %[result], %[mask], %[result], ASR #31"
6029da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
6039da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[var1]"r"(var1), [var2]"r"(var2), [mask]"r"(0x7fff)
604b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
605e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
606e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
607e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
608e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_sum;
609e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
610e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_sum = (Word32) var1 + var2;
611e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = saturate(L_sum);
612e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
613e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
614e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
615e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
616e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
617e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
618e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short sub,           1   */
619e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SUB_IS_INLINE)
620e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 sub(Word16 var1, Word16 var2)
621e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
622e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_SUB
623b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
6249da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 tmp;
6259da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
626b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"SUB   %[result], %[var1], %[var2] \n"
6279da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOV   %[tmp], %[var1], ASR #15 \n"
6289da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"TEQ   %[tmp], %[var1], ASR #31 \n"
6299da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"EORNE %[result], %[mask], %[result], ASR #31 \n"
6309da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
6319da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[var1]"r"(var1), [var2]"r"(var2), [mask]"r"(0x7fff)
632b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
633e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
634e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
635e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
636e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_diff;
637e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
638e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_diff = (Word32) var1 - var2;
639e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = saturate(L_diff);
640b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
641e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
642e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
643e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
644e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
645e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
646e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short division,       18  */
647e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (DIV_S_IS_INLINE)
648e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 div_s (Word16 var1, Word16 var2)
649e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
650e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out = 0;
651e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 iteration;
652e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_num;
653e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_denom;
654e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
655e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = MAX_16;
656e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var1!= var2)//var1!= var2
657e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
658e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	var_out = 0;
659e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	L_num = (Word32) var1;
660b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
661e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	L_denom = (Word32) var2;
662b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
663e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		//return (L_num<<15)/var2;
664e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
665e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	for (iteration = 0; iteration < 15; iteration++)
666e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	{
667e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    		var_out <<= 1;
668e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    		L_num <<= 1;
669b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
670e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    		if (L_num >= L_denom)
671e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    		{
672e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    			L_num -= L_denom;
673e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    			var_out++;
674e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    		}
675e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    	}
676e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
677e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
678e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
679e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
680e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
681e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short mult,          1   */
682e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MULT_IS_INLINE)
683e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 mult (Word16 var1, Word16 var2)
684e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
685813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard#if ARMV5TE_MULT && ARMV6_SAT
686813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard	Word32 result;
687813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard	asm (
688813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		"SMULBB %[result], %[var1], %[var2] \n"
689813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		"SSAT   %[result], #16, %[result], ASR #15 \n"
690813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		:[result]"=r"(result)
691813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		:[var1]"r"(var1), [var2]"r"(var2)
692813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard		);
693813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard	return result;
694813eebeb773b1e4c42c2063a7fe37a94514e596aMans Rullgard#elif ARMV5TE_MULT
6959da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 result, tmp;
6969da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
6979da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"SMULBB %[tmp], %[var1], %[var2] \n"
6989da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOV	%[result], %[tmp], ASR #15\n"
6999da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"MOV	%[tmp], %[result], ASR #15\n"
7009da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"TEQ	%[tmp], %[result], ASR #31\n"
7019da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"EORNE  %[result], %[mask], %[result], ASR #31 \n"
7029da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
7039da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[var1]"r"(var1), [var2]"r"(var2), [mask]"r"(0x7fff)
704b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
705e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
706e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
707e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
708e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_product;
709e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
710e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product = (Word32) var1 *(Word32) var2;
711e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product = (L_product & (Word32) 0xffff8000L) >> 15;
712e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (L_product & (Word32) 0x00010000L)
713e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_product = L_product | (Word32) 0xffff0000L;
714e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = saturate(L_product);
715e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
716e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
717e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
718e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
719e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
720e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
721e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
722e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Short norm,           15  */
723e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (NORM_S_IS_INLINE)
724e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 norm_s (Word16 var1)
725e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
726e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_NORM_S
727b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word16 result;
7289da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	Word32 tmp;
7299da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
7309da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"RSBS  %[tmp], %[var1], #0 \n"
7319da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"CLZLT %[result], %[var1]\n"
7329da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"CLZGT %[result], %[tmp]\n"
733e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"SUBNE %[result], %[result], #17\n"
734e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"MOVEQ %[result], #0\n"
7359da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"CMP   %[var1], #-1\n"
736b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"MOVEQ %[result], #15\n"
7379da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[result]"=&r"(result), [tmp]"=&r"(tmp)
738e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[var1]"r"(var1)
739b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
740e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
741e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
742e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
743e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
744e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var1 == 0)
745e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
746e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = 0;
747e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
748e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
749e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
750e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (var1 == -1)
751e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
752e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            var_out = 15;
753e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
754e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else
755e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
756e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if (var1 < 0)
757e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
758e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                var1 = (Word16)~var1;
759e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
760e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            for (var_out = 0; var1 < 0x4000; var_out++)
761e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
762e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                var1 <<= 1;
763e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
764e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
765e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
766e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
767e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
768e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
769e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
770e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
771e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Long norm,            30  */
772e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (NORM_L_IS_INLINE)
773e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 norm_l (Word32 L_var1)
774e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
775e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_NORM_L
776b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word16 result;
777b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	asm volatile(
778e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"CMP    %[L_var1], #0\n"
779e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"CLZNE  %[result], %[L_var1]\n"
780b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"SUBNE  %[result], %[result], #1\n"
781e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"MOVEQ  %[result], #0\n"
782d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=r"(result)
783e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[L_var1]"r"(L_var1)
784b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
785e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
786e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
787e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //Word16 var_out;
788e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
789e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //if (L_var1 == 0)
790e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //{
791e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    var_out = 0;
792e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //}
793e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //else
794e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //{
795e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    if (L_var1 == (Word32) 0xffffffffL)
796e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    {
797e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        var_out = 31;
798e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    }
799e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    else
800e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    {
801e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        if (L_var1 < 0)
802e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        {
803e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //            L_var1 = ~L_var1;
804e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        }
805e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
806e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        {
807e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //            L_var1 <<= 1;
808e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //        }
809e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //    }
810e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //}
811e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    //return (var_out);
812e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  Word16 a16;
813b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  Word16 r = 0 ;
814b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
815e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
816e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  if ( L_var1 < 0 ) {
817b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    L_var1 = ~L_var1;
818e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  }
819e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
820e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  if (0 == (L_var1 & 0x7fff8000)) {
821e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    a16 = extract_l(L_var1);
822e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    r += 16;
823b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
824e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (0 == (a16 & 0x7f80)) {
825e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      r += 8;
826b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
827e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      if (0 == (a16 & 0x0078)) {
828e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        r += 4;
829b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
830e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0006)) {
831e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
832b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
833e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0001)) {
834e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
835e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
836e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
837e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
838b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
839e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0004)) {
840e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
841e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
842e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
843e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
844e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      else {
845b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
846e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0060)) {
847e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
848b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
849e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0010)) {
850e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
851e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
852e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
853e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
854b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
855e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0040)) {
856e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
857e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
858e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
859e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
860b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    }
861b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    else {
862b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
863e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      if (0 == (a16 & 0x7800)) {
864e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        r += 4;
865b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
866e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0600)) {
867e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
868b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
869e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0100)) {
870e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
871e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
872e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
873e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
874b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
875e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0400)) {
876e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
877e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
878e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
879e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
880e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      else {
881b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
882e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x6000)) {
883e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
884b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
885e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x1000)) {
886e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
887e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
888e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
889e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
890b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
891e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x4000)) {
892e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
893e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
894e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
895e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
896e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
897e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  }
898e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  else {
899e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    a16 = extract_h(L_var1);
900b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
901e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (0 == (a16 & 0x7f80)) {
902e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      r += 8;
903b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
904e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      if (0 == (a16 & 0x0078)) {
905e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        r += 4 ;
906b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
907e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0006)) {
908e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
909b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
910e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0001)) {
911e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
912e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
913e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
914e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
915b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
916e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0004)) {
917e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
918e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
919e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
920e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
921e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      else {
922b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
923e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0060)) {
924e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
925b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
926e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0010)) {
927e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
928e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
929e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
930e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
931b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
932e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0040)) {
933e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
934e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
935e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
936e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
937e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
938e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else {
939b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
940e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      if (0 == (a16 & 0x7800)) {
941e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        r += 4;
942b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
943e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x0600)) {
944e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
945b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
946e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0100)) {
947e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
948e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
949e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
950e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
951b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
952e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x0400)) {
953e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
954e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
955e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
956e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
957e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      else {
958b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
959e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (0 == (a16 & 0x6000)) {
960e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          r += 2;
961b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
962e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x1000)) {
963e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            r += 1;
964e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
965e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
966e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        else {
967b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
968e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          if (0 == (a16 & 0x4000)) {
969e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            return 1;
970e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          }
971e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
972e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard      }
973e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
974e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  }
975b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
976e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  return r ;
977e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
978e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
979e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
980e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
981e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Round,               1   */
982e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (ROUND_IS_INLINE)
983e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 round16(Word32 L_var1)
984e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
985e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_ROUND
986b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word16 result;
9879da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
9889da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		"QADD  %[result], %[L_var1], %[bias]\n"
989b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		"MOV   %[result], %[result], ASR #16 \n"
990d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=r"(result)
9919da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard		:[L_var1]"r"(L_var1), [bias]"r"(0x8000)
992b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
993e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
994b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard#else
995e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
996e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_rounded;
997e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
998e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_rounded = L_add (L_var1, (Word32) 0x00008000L);
999e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = extract_h (L_rounded);
1000e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
1001e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1002e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1003e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1004e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1005e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Mac,  1  */
1006e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_MAC_IS_INLINE)
1007e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
1008e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1009e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_MAC
1010b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
10119da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
1012e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"SMULBB %[result], %[var1], %[var2]\n"
1013b8576d5ae50294bb1917b84f366054ebff02a3a6Mans Rullgard		"QDADD  %[result], %[L_var3], %[result]\n"
1014d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=&r"(result)
1015e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		: [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
1016b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
1017e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
1018e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1019e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
1020e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_product;
1021e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1022e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product = L_mult(var1, var2);
1023e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var_out = L_add (L_var3, L_product);
1024e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
1025e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1026e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1027e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1028e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1029e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_ADD_IS_INLINE)
1030e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_add (Word32 L_var1, Word32 L_var2)
1031e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1032e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if ARMV5TE_L_ADD
1033b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Word32 result;
10349da751147af3222258093d9f41cabf0ea1391c04Mans Rullgard	asm (
1035e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		"QADD %[result], %[L_var1], %[L_var2]\n"
1036d2fdc7129d96391d22065866c612d532dfe411b3Mans Rullgard		:[result]"=r"(result)
1037e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
1038b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		);
1039e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return result;
1040e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1041e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
1042e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1043e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var_out = L_var1 + L_var2;
1044e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (((L_var1 ^ L_var2) & MIN_32) == 0)
1045e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
1046e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if ((L_var_out ^ L_var1) & MIN_32)
1047e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
1048e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
1049e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
1050e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
1051e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
1052e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1053e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1054e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1055e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1056e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1057e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1058e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MULT_R_IS_INLINE)
1059e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 mult_r (Word16 var1, Word16 var2)
1060e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1061e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
1062e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_product_arr;
1063e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1064e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product_arr = (Word32)var1 *(Word32)var2;       /* product */
1065e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product_arr += (Word32)0x00004000L;      /* round */
1066e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_product_arr >>= 15;       /* shift */
1067e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1068e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = saturate(L_product_arr);
1069e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1070e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
1071e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1072e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1073e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1074e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (SHR_R_IS_INLINE)
1075e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 shr_r (Word16 var1, Word16 var2)
1076e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1077e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
1078e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1079e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 > 15)
1080e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
1081e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = 0;
1082e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
1083e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
1084e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
1085e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        var_out = shr(var1, var2);
1086e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1087e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (var2 > 0)
1088e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
1089e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
1090e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
1091e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                var_out++;
1092e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
1093e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
1094e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
1095e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1096e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
1097e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1098e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1099e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MAC_R_IS_INLINE)
1101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)
1102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
1104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var3 = L_mac (L_var3, var1, var2);
1106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = (Word16)((L_var3 + 0x8000L) >> 16);
1107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
1109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (MSU_R_IS_INLINE)
1113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
1114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
1116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    L_var3 = L_msu (L_var3, var1, var2);
1118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = (Word16)((L_var3 + 0x8000L) >> 16);
1119b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
1120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
1121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (L_SHR_R_IS_INLINE)
1125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word32 L_shr_r (Word32 L_var1, Word16 var2)
1126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word32 L_var_out;
1128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (var2 > 31)
1130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
1131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var_out = 0;
1132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
1133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    else
1134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    {
1135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        L_var_out = L_shr(L_var1, var2);
1136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (var2 > 0)
1138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        {
1139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
1140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            {
1141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                L_var_out++;
1142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            }
1143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
1144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
1145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (L_var_out);
1147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (EXTRACT_H_IS_INLINE)
1151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 extract_h (Word32 L_var1)
1152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Word16 var_out;
1154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    var_out = (Word16) (L_var1 >> 16);
1156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (var_out);
1158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (EXTRACT_L_IS_INLINE)
1162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard__inline Word16 extract_l(Word32 L_var1)
1163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return (Word16) L_var1;
1165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1168956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
1169