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