c6x_intrinsics.h revision 1.1
1279377Simp/* Intrinsics for TI C6X. 2279377Simp 3279377Simp Copyright (C) 2011-2013 Free Software Foundation, Inc. 4279377Simp Contributed by CodeSourcery. 5279377Simp 6279377Simp This file is part of GCC. 7279377Simp 8279377Simp GCC is free software; you can redistribute it and/or modify it 9279377Simp under the terms of the GNU General Public License as published 10279377Simp by the Free Software Foundation; either version 3, or (at your 11279377Simp option) any later version. 12279377Simp 13279377Simp GCC is distributed in the hope that it will be useful, but WITHOUT 14279377Simp ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15279377Simp or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 16279377Simp License for more details. 17279377Simp 18279377Simp Under Section 7 of GPL version 3, you are granted additional 19279377Simp permissions described in the GCC Runtime Library Exception, version 20279377Simp 3.1, as published by the Free Software Foundation. 21279377Simp 22279377Simp You should have received a copy of the GNU General Public License and 23279377Simp a copy of the GCC Runtime Library Exception along with this program; 24279377Simp see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 25279377Simp <http://www.gnu.org/licenses/>. */ 26279377Simp 27279377Simp#ifndef _GCC_C6X_INTRINSICS_H 28279377Simp#define _GCC_C6X_INTRINSICS_H 29279377Simp 30279377Simp#if !defined(__TMS320C6X__) 31279377Simp# error "c6x_intrinsics.h is only supported for C6X targets" 32279377Simp#endif 33279377Simp 34279377Simp#ifdef __cplusplus 35279377Simpextern "C" { 36279377Simp#endif 37279377Simp 38279377Simp#include <stdint.h> 39279377Simp 40279377Simp/* Define vector types. */ 41279377Simptypedef uint8_t __uv4qi __attribute__((vector_size (4))); 42279377Simptypedef int16_t __v2hi __attribute__((vector_size (4))); 43279377Simptypedef int32_t __v2si __attribute__((vector_size (8))); 44279377Simp 45279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 46279377Simp_abs (int src) 47279377Simp{ 48279377Simp return __builtin_c6x_abs (src); 49279377Simp} 50279377Simp 51279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 52279377Simp_abs2 (int src) 53279377Simp{ 54279377Simp return (int)__builtin_c6x_abs2 ((__v2hi)src); 55279377Simp} 56279377Simp 57279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 58279377Simp_sadd (int src1, int src2) 59279377Simp{ 60279377Simp return __builtin_c6x_sadd (src1, src2); 61279377Simp} 62279377Simp 63279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 64279377Simp_ssub (int src1, int src2) 65279377Simp{ 66279377Simp return __builtin_c6x_ssub (src1, src2); 67279377Simp} 68279377Simp 69279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 70279377Simp_add2 (int src1, int src2) 71279377Simp{ 72279377Simp return (int)__builtin_c6x_add2 ((__v2hi)src1, (__v2hi)src2); 73279377Simp} 74279377Simp 75279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 76279377Simp_sub2 (int src1, int src2) 77279377Simp{ 78279377Simp return (int)__builtin_c6x_sub2 ((__v2hi)src1, (__v2hi)src2); 79279377Simp} 80279377Simp 81279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 82279377Simp_add4 (int src1, int src2) 83279377Simp{ 84279377Simp return (int)__builtin_c6x_add4 ((__uv4qi)src1, (__uv4qi)src2); 85279377Simp} 86279377Simp 87279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 88279377Simp_sub4 (int src1, int src2) 89279377Simp{ 90279377Simp return (int)__builtin_c6x_sub4 ((__uv4qi)src1, (__uv4qi)src2); 91279377Simp} 92279377Simp 93279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 94279377Simp_sadd2 (int src1, int src2) 95279377Simp{ 96279377Simp return (int)__builtin_c6x_sadd2 ((__v2hi)src1, (__v2hi)src2); 97279377Simp} 98279377Simp 99279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 100279377Simp_ssub2 (int src1, int src2) 101279377Simp{ 102279377Simp return (int)__builtin_c6x_ssub2 ((__v2hi)src1, (__v2hi)src2); 103279377Simp} 104279377Simp 105279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 106279377Simp_saddu4 (int src1, int src2) 107279377Simp{ 108279377Simp return (int)__builtin_c6x_saddu4 ((__uv4qi)src1, (__uv4qi)src2); 109279377Simp} 110279377Simp 111279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 112279377Simp_smpy (int src1, int src2) 113279377Simp{ 114279377Simp return __builtin_c6x_smpy (src1, src2); 115279377Simp} 116279377Simp 117279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 118279377Simp_smpylh (int src1, int src2) 119279377Simp{ 120279377Simp return __builtin_c6x_smpylh (src1, src2); 121279377Simp} 122279377Simp 123279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 124279377Simp_smpyhl (int src1, int src2) 125279377Simp{ 126279377Simp return __builtin_c6x_smpyhl (src1, src2); 127279377Simp} 128279377Simp 129279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 130279377Simp_smpyh (int src1, int src2) 131279377Simp{ 132279377Simp return __builtin_c6x_smpyh (src1, src2); 133279377Simp} 134279377Simp 135279377Simp__extension__ static __inline long long __attribute__ ((__always_inline__)) 136279377Simp_smpy2ll (int src1, int src2) 137279377Simp{ 138279377Simp return (long long)__builtin_c6x_smpy2 ((__v2hi)src1, (__v2hi)src2); 139279377Simp} 140279377Simp 141279377Simp__extension__ static __inline long long __attribute__ ((__always_inline__)) 142279377Simp_mpy2ll (int src1, int src2) 143279377Simp{ 144279377Simp return (long long)__builtin_c6x_mpy2 ((__v2hi)src1, (__v2hi)src2); 145279377Simp} 146279377Simp 147279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 148279377Simp_extr (int src1, int src2) 149279377Simp{ 150279377Simp return __builtin_c6x_extr (src1, src2); 151279377Simp} 152279377Simp 153279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 154279377Simp_extru (int src1, int src2) 155279377Simp{ 156279377Simp return __builtin_c6x_extru (src1, src2); 157279377Simp} 158279377Simp 159279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 160279377Simp_clrr (int src1, int src2) 161279377Simp{ 162279377Simp return __builtin_c6x_clrr (src1, src2); 163279377Simp} 164279377Simp 165279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 166279377Simp_avg2 (int src1, int src2) 167279377Simp{ 168279377Simp return (int)__builtin_c6x_avg2 ((__v2hi)src1, (__v2hi)src2); 169279377Simp} 170279377Simp 171279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 172279377Simp_avgu4 (int src1, int src2) 173279377Simp{ 174279377Simp return (int)__builtin_c6x_avgu4 ((__uv4qi)src1, (__uv4qi)src2); 175279377Simp} 176279377Simp 177279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 178279377Simp_sshl (int src1, int src2) 179279377Simp{ 180279377Simp return __builtin_c6x_sshl (src1, src2); 181279377Simp} 182279377Simp 183279377Simp__extension__ static __inline int __attribute__ ((__always_inline__)) 184279377Simp_subc (int src1, int src2) 185279377Simp{ 186279377Simp return __builtin_c6x_subc (src1, src2); 187279377Simp} 188279377Simp 189279377Simp 190279377Simp#ifdef __cplusplus 191279377Simp} 192279377Simp#endif 193279377Simp 194279377Simp#endif 195279377Simp