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