/******************************************************************************
 *                                                                            *
 * 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 = c + (temp_result);
  return (result);
}

#endif /* IXHEAACD_BASIC_OPS_H */
