aosp12/external/libhevc/encoder/ia_basic_ops32.h

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__ */