diff options
Diffstat (limited to 'gcc/config/c6x/c6x_intrinsics.h')
-rw-r--r-- | gcc/config/c6x/c6x_intrinsics.h | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/gcc/config/c6x/c6x_intrinsics.h b/gcc/config/c6x/c6x_intrinsics.h new file mode 100644 index 00000000000..2ae7dd5018a --- /dev/null +++ b/gcc/config/c6x/c6x_intrinsics.h @@ -0,0 +1,194 @@ +/* Intrinsics for TI C6X. + + Copyright (C) 2011 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 |