1 /****************************************************************************** 2 * * 3 * Copyright (C) 2018 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 #ifndef IXHEAACD_BASIC_OPS_H 21 #define IXHEAACD_BASIC_OPS_H 22 23 static PLATFORM_INLINE WORD16 ixheaacd_extract16h(WORD32 var) { 24 WORD16 var_out; 25 26 var_out = (WORD16)(var >> 16); 27 return (var_out); 28 } 29 30 static PLATFORM_INLINE WORD16 ixheaacd_extract16l(WORD32 var) { 31 WORD16 var_out; 32 33 var_out = (WORD16)var; 34 return (var_out); 35 } 36 37 static PLATFORM_INLINE WORD32 ixheaacd_deposit16h_in32(WORD16 var) { 38 WORD32 var_out; 39 40 var_out = (WORD32)var << 16; 41 return (var_out); 42 } 43 44 static PLATFORM_INLINE WORD32 ixheaacd_deposit16l_in32(WORD16 var) { 45 WORD32 var_out; 46 47 var_out = (WORD32)var; 48 return (var_out); 49 } 50 51 static PLATFORM_INLINE UWORD32 ixheaacd_extu(UWORD32 a, WORD32 shift_left, 52 WORD32 shift_right) { 53 UWORD32 x; 54 x = (UWORD32)a << shift_left; 55 x = (UWORD32)x >> shift_right; 56 57 return x; 58 } 59 60 static PLATFORM_INLINE WORD32 ixheaacd_mult32x16h_in32_shl_sat(WORD32 a, 61 WORD32 b) { 62 WORD32 result; 63 64 if (a == (WORD32)0x80000000 && b == (WORD16)0x8000) { 65 result = (WORD32)0x7fffffff; 66 } else { 67 result = ixheaacd_mult32x16in32_shl(a, ixheaacd_extract16h(b)); 68 } 69 70 return (result); 71 } 72 73 static PLATFORM_INLINE WORD32 ixheaacd_div32_pos_normb(WORD32 a, WORD32 b) { 74 WORD32 quotient; 75 UWORD32 mantissa_nr = a; 76 UWORD32 mantissa_dr = b; 77 78 LOOPINDEX i; 79 80 if (a == b) { 81 quotient = MAX_32; 82 } else { 83 quotient = 0; 84 85 for (i = 0; i < 32; i++) { 86 quotient = quotient << 1; 87 88 if (mantissa_nr >= mantissa_dr) { 89 mantissa_nr = mantissa_nr - mantissa_dr; 90 quotient += 1; 91 } 92 93 mantissa_nr = (UWORD32)mantissa_nr << 1; 94 } 95 } 96 97 return quotient; 98 } 99 100 static PLATFORM_INLINE WORD32 ixheaacd_shr32_dir_sat_limit(WORD32 a, WORD b) { 101 WORD32 out_val; 102 103 if (b < 0) { 104 out_val = ixheaacd_shl32_sat(a, -b); 105 } else { 106 b = ixheaacd_min32(b, 31); 107 out_val = ixheaacd_shr32(a, b); 108 } 109 110 return out_val; 111 } 112 113 static PLATFORM_INLINE WORD32 ixheaacd_shl32_dir_sat_limit(WORD32 a, WORD b) { 114 WORD32 out_val; 115 116 if (b < 0) { 117 b = -b; 118 b = ixheaacd_min32(b, 31); 119 out_val = ixheaacd_shr32(a, b); 120 } else { 121 out_val = ixheaacd_shl32_sat(a, b); 122 } 123 124 return out_val; 125 } 126 127 static PLATFORM_INLINE WORD64 ixheaacd_mac32x32in64_dual(WORD32 a, WORD32 b, 128 WORD64 c) { 129 WORD64 result; 130 WORD64 temp_result; 131 132 temp_result = (WORD64)a * (WORD64)b; 133 result = c + (temp_result); 134 return (result); 135 } 136 137 #endif /* IXHEAACD_BASIC_OPS_H */ 138