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