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