1 /* Intrinsics for TI C6X.
2 
3    Copyright (C) 2011-2019 Free Software Foundation, Inc.
4    Contributed by CodeSourcery.
5 
6    This file is part of GCC.
7 
8    GCC is free software; you can redistribute it and/or modify it
9    under the terms of the GNU General Public License as published
10    by the Free Software Foundation; either version 3, or (at your
11    option) any later version.
12 
13    GCC is distributed in the hope that it will be useful, but WITHOUT
14    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16    License for more details.
17 
18    Under Section 7 of GPL version 3, you are granted additional
19    permissions described in the GCC Runtime Library Exception, version
20    3.1, as published by the Free Software Foundation.
21 
22    You should have received a copy of the GNU General Public License and
23    a copy of the GCC Runtime Library Exception along with this program;
24    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
25    <http://www.gnu.org/licenses/>.  */
26 
27 #ifndef _GCC_C6X_INTRINSICS_H
28 #define _GCC_C6X_INTRINSICS_H
29 
30 #if !defined(__TMS320C6X__)
31 # error "c6x_intrinsics.h is only supported for C6X targets"
32 #endif
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #include <stdint.h>
39 
40 /* Define vector types.  */
41 typedef uint8_t __uv4qi __attribute__((vector_size (4)));
42 typedef int16_t __v2hi __attribute__((vector_size (4)));
43 typedef int32_t __v2si __attribute__((vector_size (8)));
44 
45 __extension__ static __inline int __attribute__ ((__always_inline__))
_abs(int src)46 _abs (int src)
47 {
48   return __builtin_c6x_abs (src);
49 }
50 
51 __extension__ static __inline int __attribute__ ((__always_inline__))
_abs2(int src)52 _abs2 (int src)
53 {
54   return (int)__builtin_c6x_abs2 ((__v2hi)src);
55 }
56 
57 __extension__ static __inline int __attribute__ ((__always_inline__))
_sadd(int src1,int src2)58 _sadd (int src1, int src2)
59 {
60   return __builtin_c6x_sadd (src1, src2);
61 }
62 
63 __extension__ static __inline int __attribute__ ((__always_inline__))
_ssub(int src1,int src2)64 _ssub (int src1, int src2)
65 {
66   return __builtin_c6x_ssub (src1, src2);
67 }
68 
69 __extension__ static __inline int __attribute__ ((__always_inline__))
_add2(int src1,int src2)70 _add2 (int src1, int src2)
71 {
72   return (int)__builtin_c6x_add2 ((__v2hi)src1, (__v2hi)src2);
73 }
74 
75 __extension__ static __inline int __attribute__ ((__always_inline__))
_sub2(int src1,int src2)76 _sub2 (int src1, int src2)
77 {
78   return (int)__builtin_c6x_sub2 ((__v2hi)src1, (__v2hi)src2);
79 }
80 
81 __extension__ static __inline int __attribute__ ((__always_inline__))
_add4(int src1,int src2)82 _add4 (int src1, int src2)
83 {
84   return (int)__builtin_c6x_add4 ((__uv4qi)src1, (__uv4qi)src2);
85 }
86 
87 __extension__ static __inline int __attribute__ ((__always_inline__))
_sub4(int src1,int src2)88 _sub4 (int src1, int src2)
89 {
90   return (int)__builtin_c6x_sub4 ((__uv4qi)src1, (__uv4qi)src2);
91 }
92 
93 __extension__ static __inline int __attribute__ ((__always_inline__))
_sadd2(int src1,int src2)94 _sadd2 (int src1, int src2)
95 {
96   return (int)__builtin_c6x_sadd2 ((__v2hi)src1, (__v2hi)src2);
97 }
98 
99 __extension__ static __inline int __attribute__ ((__always_inline__))
_ssub2(int src1,int src2)100 _ssub2 (int src1, int src2)
101 {
102   return (int)__builtin_c6x_ssub2 ((__v2hi)src1, (__v2hi)src2);
103 }
104 
105 __extension__ static __inline int __attribute__ ((__always_inline__))
_saddu4(int src1,int src2)106 _saddu4 (int src1, int src2)
107 {
108   return (int)__builtin_c6x_saddu4 ((__uv4qi)src1, (__uv4qi)src2);
109 }
110 
111 __extension__ static __inline int __attribute__ ((__always_inline__))
_smpy(int src1,int src2)112 _smpy (int src1, int src2)
113 {
114   return __builtin_c6x_smpy (src1, src2);
115 }
116 
117 __extension__ static __inline int __attribute__ ((__always_inline__))
_smpylh(int src1,int src2)118 _smpylh (int src1, int src2)
119 {
120   return __builtin_c6x_smpylh (src1, src2);
121 }
122 
123 __extension__ static __inline int __attribute__ ((__always_inline__))
_smpyhl(int src1,int src2)124 _smpyhl (int src1, int src2)
125 {
126   return __builtin_c6x_smpyhl (src1, src2);
127 }
128 
129 __extension__ static __inline int __attribute__ ((__always_inline__))
_smpyh(int src1,int src2)130 _smpyh (int src1, int src2)
131 {
132   return __builtin_c6x_smpyh (src1, src2);
133 }
134 
135 __extension__ static __inline long long __attribute__ ((__always_inline__))
_smpy2ll(int src1,int src2)136 _smpy2ll (int src1, int src2)
137 {
138   return (long long)__builtin_c6x_smpy2 ((__v2hi)src1, (__v2hi)src2);
139 }
140 
141 __extension__ static __inline long long __attribute__ ((__always_inline__))
_mpy2ll(int src1,int src2)142 _mpy2ll (int src1, int src2)
143 {
144   return (long long)__builtin_c6x_mpy2 ((__v2hi)src1, (__v2hi)src2);
145 }
146 
147 __extension__ static __inline int __attribute__ ((__always_inline__))
_extr(int src1,int src2)148 _extr (int src1, int src2)
149 {
150   return __builtin_c6x_extr (src1, src2);
151 }
152 
153 __extension__ static __inline int __attribute__ ((__always_inline__))
_extru(int src1,int src2)154 _extru (int src1, int src2)
155 {
156   return __builtin_c6x_extru (src1, src2);
157 }
158 
159 __extension__ static __inline int __attribute__ ((__always_inline__))
_clrr(int src1,int src2)160 _clrr (int src1, int src2)
161 {
162   return __builtin_c6x_clrr (src1, src2);
163 }
164 
165 __extension__ static __inline int __attribute__ ((__always_inline__))
_avg2(int src1,int src2)166 _avg2 (int src1, int src2)
167 {
168   return (int)__builtin_c6x_avg2 ((__v2hi)src1, (__v2hi)src2);
169 }
170 
171 __extension__ static __inline int __attribute__ ((__always_inline__))
_avgu4(int src1,int src2)172 _avgu4 (int src1, int src2)
173 {
174   return (int)__builtin_c6x_avgu4 ((__uv4qi)src1, (__uv4qi)src2);
175 }
176 
177 __extension__ static __inline int __attribute__ ((__always_inline__))
_sshl(int src1,int src2)178 _sshl (int src1, int src2)
179 {
180   return __builtin_c6x_sshl (src1, src2);
181 }
182 
183 __extension__ static __inline int __attribute__ ((__always_inline__))
_subc(int src1,int src2)184 _subc (int src1, int src2)
185 {
186   return __builtin_c6x_subc (src1, src2);
187 }
188 
189 
190 #ifdef __cplusplus
191 }
192 #endif
193 
194 #endif
195