/****************************************************************************** * * * 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 IXHEAAC_BASIC_OPS_H #define IXHEAAC_BASIC_OPS_H #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) static PLATFORM_INLINE WORD16 ixheaac_extract16h(WORD32 var) { WORD16 var_out; var_out = (WORD16)(var >> 16); return (var_out); } static PLATFORM_INLINE WORD16 ixheaac_extract16l(WORD32 var) { WORD16 var_out; var_out = (WORD16)var; return (var_out); } static PLATFORM_INLINE WORD32 ixheaac_deposit16h_in32(WORD16 var) { WORD32 var_out; var_out = (WORD32)var << 16; return (var_out); } static PLATFORM_INLINE WORD32 ixheaac_deposit16l_in32(WORD16 var) { WORD32 var_out; var_out = (WORD32)var; return (var_out); } static PLATFORM_INLINE UWORD32 ixheaac_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 ixheaac_mult32x16h_in32_shl_sat(WORD32 a, WORD32 b) { WORD32 result; if (a == (WORD32)0x80000000 && b == (WORD16)0x8000) { result = (WORD32)0x7fffffff; } else { result = ixheaac_mult32x16in32_shl(a, ixheaac_extract16h(b)); } return (result); } static PLATFORM_INLINE WORD32 ixheaac_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 ixheaac_shr32_dir_sat_limit(WORD32 a, WORD b) { WORD32 out_val; if (b < 0) { out_val = ixheaac_shl32_sat(a, -b); } else { b = ixheaac_min32(b, 31); out_val = ixheaac_shr32(a, b); } return out_val; } static PLATFORM_INLINE WORD32 ixheaac_shl32_dir_sat_limit(WORD32 a, WORD b) { WORD32 out_val; if (b < 0) { b = -b; b = ixheaac_min32(b, 31); out_val = ixheaac_shr32(a, b); } else { out_val = ixheaac_shl32_sat(a, b); } return out_val; } static PLATFORM_INLINE WORD64 ixheaac_mac32x32in64_dual(WORD32 a, WORD32 b, WORD64 c) { WORD64 result; WORD64 temp_result; temp_result = (WORD64)a * (WORD64)b; result = ixheaac_add64_sat(c, temp_result); return (result); } #endif /* IXHEAAC_BASIC_OPS_H */