1434 lines
78 KiB
C
1434 lines
78 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2018 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*****************************************************************************
|
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
|
*/
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* File name : ia_basic_ops32.h */
|
|
/* */
|
|
/* Description : this file has 32bit basic operations */
|
|
/* */
|
|
/* List of functions: 1. min32 */
|
|
/* 2. max32 */
|
|
/* 3. mult16x16in32 */
|
|
/* 4. mult16x16in32_shl */
|
|
/* 5. mult16x16in32_shl_sat */
|
|
/* 6. shl32 */
|
|
/* 7. shl32_sat */
|
|
/* 8. shl32_dir */
|
|
/* 9. shl32_dir_sat */
|
|
/* 10. shr32 */
|
|
/* 11. shr32_dir */
|
|
/* 12. shr32_dir_sat */
|
|
/* 13. add32 */
|
|
/* 14. sub32 */
|
|
/* 15. add32_sat */
|
|
/* 16. sub32_sat */
|
|
/* 17. norm32 */
|
|
/* 18. bin_expo32 */
|
|
/* 19. abs32 */
|
|
/* 20. abs32_sat */
|
|
/* 21. negate32 */
|
|
/* 22. negate32_sat */
|
|
/* 23. div32 */
|
|
/* 24. mac16x16in32 */
|
|
/* 25. mac16x16in32_shl */
|
|
/* 26. mac16x16in32_shl_sat */
|
|
/* 27. msu16x16in32 */
|
|
/* 28. msu16x16in32_shl */
|
|
/* 29. msu16x16in32_shl_sat */
|
|
/* 30. add32_shr */
|
|
/* 31. sub32_shr */
|
|
/* */
|
|
/* Issues / problems: none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
/*****************************************************************************/
|
|
/* File includes */
|
|
/* ia_type_def.h */
|
|
/* ia_constants.h */
|
|
/*****************************************************************************/
|
|
|
|
#ifndef __IA_BASIC_OPS32_H__
|
|
#define __IA_BASIC_OPS32_H__
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : min32 */
|
|
/* */
|
|
/* Description : returns the minima of 2 32 bit variables */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD32 b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : minimum of 2 inputs */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 min_val - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 min32(WORD32 a, WORD32 b)
|
|
{
|
|
WORD32 min_val;
|
|
|
|
min_val = (a < b) ? a : b;
|
|
|
|
return min_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : max32 */
|
|
/* */
|
|
/* Description : returns the maxima of 2 32 bit variables */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD32 b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : maximum of 2 inputs */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 max_val - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 max32(WORD32 a, WORD32 b)
|
|
{
|
|
WORD32 max_val;
|
|
|
|
max_val = (a > b) ? a : b;
|
|
|
|
return max_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : shl32 */
|
|
/* */
|
|
/* Description : shifts a 32-bit value left by specificed bits */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : shift a by b */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 out_val - 32 bit signed value */
|
|
/* */
|
|
/* assumptions : 0 <= b <= 31 */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
static PLATFORM_INLINE WORD32 shl32(WORD32 a, WORD b)
|
|
{
|
|
WORD32 out_val;
|
|
|
|
if(b > 31)
|
|
out_val = 0;
|
|
else
|
|
out_val = (WORD32)a << b;
|
|
|
|
return out_val;
|
|
}
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : shr32 */
|
|
/* */
|
|
/* Description : shifts a 32-bit value right by specificed bits */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : shift right a by b */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 out_val - 32 bit signed value */
|
|
/* */
|
|
/* assumptions : 0 <= b <= 31 */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 shr32(WORD32 a, WORD b)
|
|
{
|
|
WORD32 out_val;
|
|
|
|
if(b > 31)
|
|
{
|
|
if(a < 0)
|
|
out_val = -1;
|
|
else
|
|
out_val = 0;
|
|
}
|
|
else
|
|
{
|
|
out_val = (WORD32)a >> b;
|
|
}
|
|
|
|
return out_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : shl32_sat */
|
|
/* */
|
|
/* Description : shifts a 32-bit value left by specificed bits and */
|
|
/* saturates it to 32 bits */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : shift a by 1 b times if crosses 32_bits saturate */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 out_val - 32 bit signed value */
|
|
/* */
|
|
/* assumptions : 0 <= b <= 31 */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 shl32_sat(WORD32 a, WORD b)
|
|
{
|
|
WORD32 out_val = a;
|
|
/*clip the max shift value to avoid unnecessary looping*/
|
|
if(b > (WORD)((sizeof(WORD32) * 8)))
|
|
b = (sizeof(WORD32) * 8);
|
|
for(; b > 0; b--)
|
|
{
|
|
if(a > (WORD32)0X3fffffffL)
|
|
{
|
|
out_val = MAX_32;
|
|
break;
|
|
}
|
|
else if(a < (WORD32)0xc0000000L)
|
|
{
|
|
out_val = MIN_32;
|
|
break;
|
|
}
|
|
|
|
a = shl32(a, 1);
|
|
out_val = a;
|
|
}
|
|
return (out_val);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : shl32_dir */
|
|
/* */
|
|
/* Description : shifts a 32-bit value left by specificed bits, shifts */
|
|
/* it right if specified no. of bits is negative */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : if b -ve shift right else shift left */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 out_val - 32 bit signed value */
|
|
/* */
|
|
/* assumptions : -31 <= b <= 31 */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 shl32_dir(WORD32 a, WORD b)
|
|
{
|
|
WORD32 out_val;
|
|
|
|
if(b < 0)
|
|
{
|
|
out_val = shr32(a, -b);
|
|
}
|
|
else
|
|
{
|
|
out_val = shl32(a, b);
|
|
}
|
|
|
|
return out_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : shl32_dir_sat */
|
|
/* */
|
|
/* Description : shifts a 32-bit value left by specificed bits with sat, */
|
|
/* shifts it right if specified no. of bits is negative */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : if b -ve shift right else shift left with sat */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 out_val - 32 bit signed value */
|
|
/* */
|
|
/* assumptions : -31 <= b <= 31 */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 shl32_dir_sat(WORD32 a, WORD b)
|
|
{
|
|
WORD32 out_val;
|
|
|
|
if(b < 0)
|
|
{
|
|
out_val = shr32(a, -b);
|
|
}
|
|
else
|
|
{
|
|
out_val = shl32_sat(a, b);
|
|
}
|
|
|
|
return out_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : shr32_dir */
|
|
/* */
|
|
/* Description : shifts a 32-bit value right by specificed bits, shifts */
|
|
/* it left if specified no. of bits is negative */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : if b +ve shift right else shift left */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 out_val - 32 bit signed value */
|
|
/* */
|
|
/* assumptions : -31 <= b <= 31 */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 shr32_dir(WORD32 a, WORD b)
|
|
{
|
|
WORD32 out_val;
|
|
|
|
if(b < 0)
|
|
{
|
|
out_val = shl32(a, -b);
|
|
}
|
|
else
|
|
{
|
|
out_val = shr32(a, b);
|
|
}
|
|
|
|
return out_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : shr32_dir_sat */
|
|
/* */
|
|
/* Description : shifts a 32-bit value right by specificed bits, shifts */
|
|
/* it left with sat if specified no. of bits is negative */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : if b +ve shift right else shift left with sat */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 out_val - 32 bit signed value */
|
|
/* */
|
|
/* assumptions : -31 <= b <= 31 */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 shr32_dir_sat(WORD32 a, WORD b)
|
|
{
|
|
WORD32 out_val;
|
|
|
|
if(b < 0)
|
|
{
|
|
out_val = shl32_sat(a, -b);
|
|
}
|
|
else
|
|
{
|
|
out_val = shr32(a, b);
|
|
}
|
|
|
|
return out_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : mult16x16in32 */
|
|
/* */
|
|
/* Description : multiplies two 16 bit numbers and returns their 32-bit */
|
|
/* result */
|
|
/* */
|
|
/* Inputs : WORD16 a, WORD16 b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : multiply 2 inputs */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 product - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mult16x16in32(WORD16 a, WORD16 b)
|
|
{
|
|
WORD32 product;
|
|
|
|
product = (WORD32)a * (WORD32)b;
|
|
|
|
return product;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : mult16x16in32_shl */
|
|
/* */
|
|
/* Description : multiplies two 16 bit numbers and returns their 32-bit */
|
|
/* result after removing 1 redundant sign bit. no sat */
|
|
/* */
|
|
/* Inputs : WORD16 a, WORD16 b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : multiply 2 inputs, shift left by 1 */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 product - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mult16x16in32_shl(WORD16 a, WORD16 b)
|
|
{
|
|
WORD32 product;
|
|
|
|
product = shl32(mult16x16in32(a, b), 1);
|
|
|
|
return product;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : mult16x16in32_shl_sat */
|
|
/* */
|
|
/* Description : multiplies two 16 bit numbers and returns their 32-bit */
|
|
/* result after removing 1 redundant sign bit with sat */
|
|
/* */
|
|
/* Inputs : WORD16 a, WORD16 b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : if inputs mi_ns return MAX32 else */
|
|
/* multiply 2 inputs shift left by 1 */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 product - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mult16x16in32_shl_sat(WORD16 a, WORD16 b)
|
|
{
|
|
WORD32 product;
|
|
product = (WORD32)a * (WORD32)b;
|
|
if(product != (WORD32)0x40000000L)
|
|
{
|
|
product = shl32(product, 1);
|
|
}
|
|
else
|
|
{
|
|
product = MAX_32;
|
|
}
|
|
return product;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : add32 */
|
|
/* */
|
|
/* Description : adds 2 32 bit variables without sat */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD32 b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : add 2 inputs */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 sum - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 add32(WORD32 a, WORD32 b)
|
|
{
|
|
WORD32 sum;
|
|
|
|
sum = (WORD32)a + (WORD32)b;
|
|
|
|
return sum;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : sub32 */
|
|
/* */
|
|
/* Description : subs 2 32 bit variables without sat */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD32 b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : sub 2 inputs */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 diff - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 sub32(WORD32 a, WORD32 b)
|
|
{
|
|
WORD32 diff;
|
|
|
|
diff = (WORD32)a - (WORD32)b;
|
|
|
|
return diff;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : add32_sat */
|
|
/* */
|
|
/* Description : adds 2 32 bit variables with sat */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD32 b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : add 2 inputs if overflow saturate */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 sum - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 add32_sat(WORD32 a, WORD32 b)
|
|
{
|
|
WORD32 sum;
|
|
|
|
sum = add32(a, b);
|
|
|
|
if((((WORD32)a ^ (WORD32)b) & (WORD32)MIN_32) == 0)
|
|
{
|
|
if(((WORD32)sum ^ (WORD32)a) & (WORD32)MIN_32)
|
|
{
|
|
sum = (a < 0) ? MIN_32 : MAX_32;
|
|
}
|
|
}
|
|
|
|
return sum;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : sub32_sat */
|
|
/* */
|
|
/* Description : subs 2 32 bit variables with sat */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD32 b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : sub 2 inputs, if overflow saturate */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 diff - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 sub32_sat(WORD32 a, WORD32 b)
|
|
{
|
|
WORD32 diff;
|
|
|
|
diff = sub32(a, b);
|
|
|
|
if((((WORD32)a ^ (WORD32)b) & (WORD32)MIN_32) != 0)
|
|
{
|
|
if(((WORD32)diff ^ (WORD32)a) & (WORD32)MIN_32)
|
|
{
|
|
diff = (a < 0L) ? MIN_32 : MAX_32;
|
|
}
|
|
}
|
|
|
|
return (diff);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : norm32 */
|
|
/* */
|
|
/* Description : returns number of redundant sign bits in a */
|
|
/* 32-bit value. for a value of 0, returns 0 */
|
|
/* */
|
|
/* Inputs : WORD32 a */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : abs input, left shift till reaches 0x40000000 */
|
|
/* return no. of left shifts */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD norm_val - 0 <= norm_val < 32 */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD norm32(WORD32 a)
|
|
{
|
|
WORD norm_val;
|
|
|
|
if(a == 0)
|
|
{
|
|
norm_val = 31;
|
|
}
|
|
else
|
|
{
|
|
if(a == (WORD32)0xffffffffL)
|
|
{
|
|
norm_val = 31;
|
|
}
|
|
else
|
|
{
|
|
if(a < 0)
|
|
{
|
|
a = ~a;
|
|
}
|
|
for(norm_val = 0; a < (WORD32)0x40000000L; norm_val++)
|
|
{
|
|
a <<= 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return norm_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : bin_expo32 */
|
|
/* */
|
|
/* Description : returns the position of the most significant bit. */
|
|
/* for negative numbers, it ignores leading zeros to */
|
|
/* determine the position of most significant bit. */
|
|
/* note: for a value of zero returns 31 */
|
|
/* */
|
|
/* Inputs : WORD32 a */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : substract 31 from norm_val */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD bin_expo_val - 0 <= val < 32 */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD bin_expo32(WORD32 a)
|
|
{
|
|
WORD bin_expo_val;
|
|
|
|
bin_expo_val = 31 - norm32(a);
|
|
|
|
return bin_expo_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : abs32 */
|
|
/* */
|
|
/* Description : returns the value of 32-bit number without sat. */
|
|
/* */
|
|
/* Inputs : WORD32 a */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : if -ve then negate */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 abs_val - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 abs32(WORD32 a)
|
|
{
|
|
WORD32 abs_val;
|
|
|
|
abs_val = a;
|
|
|
|
if(a < 0)
|
|
{
|
|
abs_val = -a;
|
|
}
|
|
|
|
return abs_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : abs32_sat */
|
|
/* */
|
|
/* Description : returns the value of 32-bit number with sat. */
|
|
/* */
|
|
/* Inputs : WORD32 a */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : if -ve then negate, abs(-32768) is 32767 */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 abs_val - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 abs32_sat(WORD32 a)
|
|
{
|
|
WORD32 abs_val;
|
|
|
|
abs_val = a;
|
|
|
|
if(a == (WORD32)MIN_32)
|
|
{
|
|
abs_val = MAX_32;
|
|
}
|
|
else if(a < 0)
|
|
{
|
|
abs_val = -a;
|
|
}
|
|
|
|
return abs_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : negate32 */
|
|
/* */
|
|
/* Description : returns the negated value of 32-bit number without sat. */
|
|
/* */
|
|
/* Inputs : WORD32 a */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : negate input */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 neg_val - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 negate32(WORD32 a)
|
|
{
|
|
WORD32 neg_val;
|
|
|
|
neg_val = -a;
|
|
|
|
return neg_val;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : negate32 */
|
|
/* */
|
|
/* Description : returns the negated value of 32-bit number with sat. */
|
|
/* */
|
|
/* Inputs : WORD32 a */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : negate input, if -32768 then 32767 */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 neg_val - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 negate32_sat(WORD32 a)
|
|
{
|
|
WORD32 neg_val;
|
|
|
|
neg_val = -a;
|
|
if(a == (WORD32)MIN_32)
|
|
{
|
|
neg_val = MAX_32;
|
|
}
|
|
|
|
return neg_val;
|
|
}
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : subc_32 */
|
|
/* */
|
|
/* Description : implemnets the subc operation c64x . */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD32 b */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : implemnets the subc operation c64x */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 neg_val - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 Mudit Mehrotra created */
|
|
/* */
|
|
/*****************************************************************************/
|
|
static PLATFORM_INLINE UWORD32 subc_32(UWORD32 nr, UWORD32 dr)
|
|
{
|
|
UWORD32 result;
|
|
if(nr >= dr)
|
|
{
|
|
result = (((nr - dr) << 1) + 1);
|
|
}
|
|
else
|
|
{
|
|
result = (UWORD32)nr << 1;
|
|
}
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : div32 */
|
|
/* */
|
|
/* Description : divides 2 32 bit variables and returns the quotient */
|
|
/* the q-format of the result is modified */
|
|
/* ( a/b to Q30 precision) */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD32 b, WORD16 *q_format */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : non-restoration algo(shift & substract) */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 quotient - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
static PLATFORM_INLINE WORD32 div32(WORD32 a, WORD32 b, WORD *q_format)
|
|
{
|
|
WORD32 quotient;
|
|
UWORD32 mantissa_nr, mantissa_dr;
|
|
WORD sign = 0;
|
|
|
|
LOOPINDEX i;
|
|
WORD q_nr, q_dr;
|
|
|
|
mantissa_nr = a;
|
|
mantissa_dr = b;
|
|
quotient = 0;
|
|
|
|
if((a < 0) && (0 != b))
|
|
{
|
|
a = -a;
|
|
sign = (WORD)(sign ^ -1);
|
|
}
|
|
|
|
if(b < 0)
|
|
{
|
|
b = -b;
|
|
sign = (WORD)(sign ^ -1);
|
|
}
|
|
|
|
if(0 == b)
|
|
{
|
|
*q_format = 0;
|
|
return (a);
|
|
}
|
|
|
|
quotient = 0;
|
|
|
|
q_nr = norm32(a);
|
|
mantissa_nr = (UWORD32)a << (q_nr);
|
|
q_dr = norm32(b);
|
|
mantissa_dr = (UWORD32)b << (q_dr);
|
|
*q_format = (WORD)(30 + q_nr - q_dr);
|
|
|
|
for(i = 0; i < 31; i++)
|
|
{
|
|
/* quotient = quotient << 1; */
|
|
WORD32 bit;
|
|
|
|
/*if(mantissa_nr >= mantissa_dr)
|
|
{
|
|
|
|
mantissa_nr = (((mantissa_nr - mantissa_dr) << 1) + 1);
|
|
}
|
|
else
|
|
{
|
|
mantissa_nr = (UWORD32)mantissa_nr << 1;
|
|
}
|
|
*/
|
|
mantissa_nr = subc_32(mantissa_nr, mantissa_dr);
|
|
bit = (mantissa_nr & 0x00000001);
|
|
mantissa_nr = mantissa_nr & 0xfffffffe;
|
|
quotient = (quotient << 1) + bit;
|
|
}
|
|
|
|
if(sign < 0)
|
|
{
|
|
quotient = -quotient;
|
|
}
|
|
|
|
return quotient;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : mac16x16in32 */
|
|
/* */
|
|
/* Description : multiplies two 16 bit numbers and accumulates their */
|
|
/* result in a 32 bit variable without sat */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD32 b, WORD16 c */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : multiply & add */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 acc - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac16x16in32(WORD32 a, WORD16 b, WORD16 c)
|
|
{
|
|
WORD32 acc;
|
|
|
|
acc = mult16x16in32(b, c);
|
|
|
|
acc = add32(a, acc);
|
|
|
|
return acc;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : mac16x16in32_shl */
|
|
/* */
|
|
/* Description : multiplies two 16 bit numbers and accumulates their */
|
|
/* result in a 32 bit variable without sat */
|
|
/* after removing a redundant sign bit in the product */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD16 b, WORD16 c */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : multiply, shift left by 1 & add */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 acc - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac16x16in32_shl(WORD32 a, WORD16 b, WORD16 c)
|
|
{
|
|
WORD32 acc;
|
|
|
|
acc = mult16x16in32_shl(b, c);
|
|
|
|
acc = add32(a, acc);
|
|
|
|
return acc;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : mac16x16in32_shlsat */
|
|
/* */
|
|
/* Description : multiplies two 16 bit numbers and accumulates their */
|
|
/* result in a 32 bit variable with sat */
|
|
/* after removing a redundant sign bit in the product */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD16 b, WORD16 c */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : multiply, shift left by 1 & add with sat */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 acc - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac16x16in32_shl_sat(WORD32 a, WORD16 b, WORD16 c)
|
|
{
|
|
WORD32 acc;
|
|
|
|
acc = mult16x16in32_shl_sat(b, c);
|
|
|
|
acc = add32_sat(a, acc);
|
|
|
|
return acc;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : msu16x16in32 */
|
|
/* */
|
|
/* Description : multiplies two 16 bit numbers and substracts their */
|
|
/* result from a 32 bit variable without sat */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD32 b, WORD16 c */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : multiply & sub */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 acc - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 msu16x16in32(WORD32 a, WORD16 b, WORD16 c)
|
|
{
|
|
WORD32 acc;
|
|
|
|
acc = mult16x16in32(b, c);
|
|
|
|
acc = sub32(a, acc);
|
|
|
|
return acc;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : msu16x16in32_shl */
|
|
/* */
|
|
/* Description : multiplies two 16 bit numbers and substracts their */
|
|
/* result from a 32 bit variable without sat */
|
|
/* after removing a redundant sign bit in the product */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD16 b, WORD16 c */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : multiply, shift left by 1 & sub */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 acc - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 msu16x16in32_shl(WORD32 a, WORD16 b, WORD16 c)
|
|
{
|
|
WORD32 acc;
|
|
|
|
acc = mult16x16in32_shl(b, c);
|
|
|
|
acc = sub32(a, acc);
|
|
|
|
return acc;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : msu16x16in32_shlsat */
|
|
/* */
|
|
/* Description : multiplies two 16 bit numbers and substracts their */
|
|
/* result from a 32 bit variable with sat */
|
|
/* after removing a redundant sign bit in the product */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD16 b, WORD16 c */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : multiply, shift left by 1 & sub with sat */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 acc - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 msu16x16in32_shl_sat(WORD32 a, WORD16 b, WORD16 c)
|
|
{
|
|
WORD32 acc;
|
|
|
|
acc = mult16x16in32_shl_sat(b, c);
|
|
|
|
acc = sub32_sat(a, acc);
|
|
|
|
return acc;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : add32_shr */
|
|
/* */
|
|
/* Description : adding two 32 bit numbers and taking care of overflow */
|
|
/* by downshifting both numbers before addition */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD16 b, WORD16 c */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : shift right inputs by 1 & add */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 sum 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 add32_shr(WORD32 a, WORD32 b)
|
|
{
|
|
WORD32 sum;
|
|
|
|
a = shr32(a, 1);
|
|
b = shr32(b, 1);
|
|
|
|
sum = add32(a, b);
|
|
|
|
return sum;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function name : sub32_shr */
|
|
/* */
|
|
/* Description : substracting two 32 bit numbers and taking care of */
|
|
/* overflow by downshifting both numbers before addition */
|
|
/* */
|
|
/* Inputs : WORD32 a, WORD16 b, WORD16 c */
|
|
/* */
|
|
/* Globals : none */
|
|
/* */
|
|
/* Processing : shift right inputs by 1 & sub */
|
|
/* */
|
|
/* Outputs : none */
|
|
/* */
|
|
/* Returns : WORD32 diff - 32 bit signed value */
|
|
/* */
|
|
/* Issues : none */
|
|
/* */
|
|
/* Revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 20 11 2003 aadithya kamath created */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 sub32_shr(WORD32 a, WORD32 b)
|
|
{
|
|
WORD32 diff;
|
|
|
|
a = shr32(a, 1);
|
|
b = shr32(b, 1);
|
|
|
|
diff = sub32(a, b);
|
|
|
|
return diff;
|
|
}
|
|
#endif /* __IA_BASIC_OPS32_H__ */
|