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