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