/****************************************************************************** * * * 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 */ #ifndef IXHEAACD_BASIC_OPS_H #define IXHEAACD_BASIC_OPS_H static PLATFORM_INLINE WORD16 ixheaacd_extract16h(WORD32 var) { WORD16 var_out; var_out = (WORD16)(var >> 16); return (var_out); } static PLATFORM_INLINE WORD16 ixheaacd_extract16l(WORD32 var) { WORD16 var_out; var_out = (WORD16)var; return (var_out); } static PLATFORM_INLINE WORD32 ixheaacd_deposit16h_in32(WORD16 var) { WORD32 var_out; var_out = (WORD32)var << 16; return (var_out); } static PLATFORM_INLINE WORD32 ixheaacd_deposit16l_in32(WORD16 var) { WORD32 var_out; var_out = (WORD32)var; return (var_out); } static PLATFORM_INLINE UWORD32 ixheaacd_extu(UWORD32 a, WORD32 shift_left, WORD32 shift_right) { UWORD32 x; x = (UWORD32)a << shift_left; x = (UWORD32)x >> shift_right; return x; } static PLATFORM_INLINE WORD32 ixheaacd_mult32x16h_in32_shl_sat(WORD32 a, WORD32 b) { WORD32 result; if (a == (WORD32)0x80000000 && b == (WORD16)0x8000) { result = (WORD32)0x7fffffff; } else { result = ixheaacd_mult32x16in32_shl(a, ixheaacd_extract16h(b)); } return (result); } static PLATFORM_INLINE WORD32 ixheaacd_div32_pos_normb(WORD32 a, WORD32 b) { WORD32 quotient; UWORD32 mantissa_nr = a; UWORD32 mantissa_dr = b; LOOPINDEX i; if (a == b) { quotient = MAX_32; } else { quotient = 0; for (i = 0; i < 32; i++) { quotient = quotient << 1; if (mantissa_nr >= mantissa_dr) { mantissa_nr = mantissa_nr - mantissa_dr; quotient += 1; } mantissa_nr = (UWORD32)mantissa_nr << 1; } } return quotient; } static PLATFORM_INLINE WORD32 ixheaacd_shr32_dir_sat_limit(WORD32 a, WORD b) { WORD32 out_val; if (b < 0) { out_val = ixheaacd_shl32_sat(a, -b); } else { b = ixheaacd_min32(b, 31); out_val = ixheaacd_shr32(a, b); } return out_val; } static PLATFORM_INLINE WORD32 ixheaacd_shl32_dir_sat_limit(WORD32 a, WORD b) { WORD32 out_val; if (b < 0) { b = -b; b = ixheaacd_min32(b, 31); out_val = ixheaacd_shr32(a, b); } else { out_val = ixheaacd_shl32_sat(a, b); } return out_val; } static PLATFORM_INLINE WORD64 ixheaacd_mac32x32in64_dual(WORD32 a, WORD32 b, WORD64 c) { WORD64 result; WORD64 temp_result; temp_result = (WORD64)a * (WORD64)b; result = ixheaacd_add64_sat(c, temp_result); return (result); } #endif /* IXHEAACD_BASIC_OPS_H */