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