/* Intrinsics for TI C6X.

   Copyright (C) 2011-2021 Free Software Foundation, Inc.
   Contributed by CodeSourcery.

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published
   by the Free Software Foundation; either version 3, or (at your
   option) any later version.

   GCC is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef _GCC_C6X_INTRINSICS_H
#define _GCC_C6X_INTRINSICS_H

#if !defined(__TMS320C6X__)
# error "c6x_intrinsics.h is only supported for C6X targets"
#endif

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

/* Define vector types.  */
typedef uint8_t __uv4qi __attribute__((vector_size (4)));
typedef int16_t __v2hi __attribute__((vector_size (4)));
typedef int32_t __v2si __attribute__((vector_size (8)));

__extension__ static __inline int __attribute__ ((__always_inline__))
_abs (int src)
{
  return __builtin_c6x_abs (src);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_abs2 (int src)
{
  return (int)__builtin_c6x_abs2 ((__v2hi)src);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_sadd (int src1, int src2)
{
  return __builtin_c6x_sadd (src1, src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_ssub (int src1, int src2)
{
  return __builtin_c6x_ssub (src1, src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_add2 (int src1, int src2)
{
  return (int)__builtin_c6x_add2 ((__v2hi)src1, (__v2hi)src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_sub2 (int src1, int src2)
{
  return (int)__builtin_c6x_sub2 ((__v2hi)src1, (__v2hi)src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_add4 (int src1, int src2)
{
  return (int)__builtin_c6x_add4 ((__uv4qi)src1, (__uv4qi)src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_sub4 (int src1, int src2)
{
  return (int)__builtin_c6x_sub4 ((__uv4qi)src1, (__uv4qi)src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_sadd2 (int src1, int src2)
{
  return (int)__builtin_c6x_sadd2 ((__v2hi)src1, (__v2hi)src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_ssub2 (int src1, int src2)
{
  return (int)__builtin_c6x_ssub2 ((__v2hi)src1, (__v2hi)src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_saddu4 (int src1, int src2)
{
  return (int)__builtin_c6x_saddu4 ((__uv4qi)src1, (__uv4qi)src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_smpy (int src1, int src2)
{
  return __builtin_c6x_smpy (src1, src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_smpylh (int src1, int src2)
{
  return __builtin_c6x_smpylh (src1, src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_smpyhl (int src1, int src2)
{
  return __builtin_c6x_smpyhl (src1, src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_smpyh (int src1, int src2)
{
  return __builtin_c6x_smpyh (src1, src2);
}

__extension__ static __inline long long __attribute__ ((__always_inline__))
_smpy2ll (int src1, int src2)
{
  return (long long)__builtin_c6x_smpy2 ((__v2hi)src1, (__v2hi)src2);
}

__extension__ static __inline long long __attribute__ ((__always_inline__))
_mpy2ll (int src1, int src2)
{
  return (long long)__builtin_c6x_mpy2 ((__v2hi)src1, (__v2hi)src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_extr (int src1, int src2)
{
  return __builtin_c6x_extr (src1, src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_extru (int src1, int src2)
{
  return __builtin_c6x_extru (src1, src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_clrr (int src1, int src2)
{
  return __builtin_c6x_clrr (src1, src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_avg2 (int src1, int src2)
{
  return (int)__builtin_c6x_avg2 ((__v2hi)src1, (__v2hi)src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_avgu4 (int src1, int src2)
{
  return (int)__builtin_c6x_avgu4 ((__uv4qi)src1, (__uv4qi)src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_sshl (int src1, int src2)
{
  return __builtin_c6x_sshl (src1, src2);
}

__extension__ static __inline int __attribute__ ((__always_inline__))
_subc (int src1, int src2)
{
  return __builtin_c6x_subc (src1, src2);
}


#ifdef __cplusplus
}
#endif

#endif
