]> git.sur5r.net Git - freertos/blob - Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/CMSIS/Include/core_cm4_simd.h
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / CORTEX_M4_ATSAM4S_Atmel_Studio / src / asf / thirdparty / CMSIS / Include / core_cm4_simd.h
1 /**************************************************************************//**\r
2  * @file     core_cm4_simd.h\r
3  * @brief    CMSIS Cortex-M4 SIMD Header File\r
4  * @version  V2.10\r
5  * @date     19. July 2011\r
6  *\r
7  * @note\r
8  * Copyright (C) 2010-2011 ARM Limited. All rights reserved.\r
9  *\r
10  * @par\r
11  * ARM Limited (ARM) is supplying this software for use with Cortex-M \r
12  * processor based microcontrollers.  This file can be freely distributed \r
13  * within development tools that are supporting such ARM based processors. \r
14  *\r
15  * @par\r
16  * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED\r
17  * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF\r
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.\r
19  * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR\r
20  * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.\r
21  *\r
22  ******************************************************************************/\r
23 \r
24 #ifdef __cplusplus\r
25  extern "C" {\r
26 #endif \r
27 \r
28 #ifndef __CORE_CM4_SIMD_H\r
29 #define __CORE_CM4_SIMD_H\r
30 \r
31 \r
32 /*******************************************************************************\r
33  *                Hardware Abstraction Layer\r
34  ******************************************************************************/\r
35 \r
36 \r
37 /* ###################  Compiler specific Intrinsics  ########################### */\r
38 /** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics\r
39   Access to dedicated SIMD instructions\r
40   @{\r
41 */\r
42 \r
43 #if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/\r
44 /* ARM armcc specific functions */\r
45 \r
46 /*------ CM4 SOMD Intrinsics -----------------------------------------------------*/\r
47 #define __SADD8                           __sadd8\r
48 #define __QADD8                           __qadd8\r
49 #define __SHADD8                          __shadd8\r
50 #define __UADD8                           __uadd8\r
51 #define __UQADD8                          __uqadd8\r
52 #define __UHADD8                          __uhadd8\r
53 #define __SSUB8                           __ssub8\r
54 #define __QSUB8                           __qsub8\r
55 #define __SHSUB8                          __shsub8\r
56 #define __USUB8                           __usub8\r
57 #define __UQSUB8                          __uqsub8\r
58 #define __UHSUB8                          __uhsub8\r
59 #define __SADD16                          __sadd16\r
60 #define __QADD16                          __qadd16\r
61 #define __SHADD16                         __shadd16\r
62 #define __UADD16                          __uadd16\r
63 #define __UQADD16                         __uqadd16\r
64 #define __UHADD16                         __uhadd16\r
65 #define __SSUB16                          __ssub16\r
66 #define __QSUB16                          __qsub16\r
67 #define __SHSUB16                         __shsub16\r
68 #define __USUB16                          __usub16\r
69 #define __UQSUB16                         __uqsub16\r
70 #define __UHSUB16                         __uhsub16\r
71 #define __SASX                            __sasx\r
72 #define __QASX                            __qasx\r
73 #define __SHASX                           __shasx\r
74 #define __UASX                            __uasx\r
75 #define __UQASX                           __uqasx\r
76 #define __UHASX                           __uhasx\r
77 #define __SSAX                            __ssax\r
78 #define __QSAX                            __qsax\r
79 #define __SHSAX                           __shsax\r
80 #define __USAX                            __usax\r
81 #define __UQSAX                           __uqsax\r
82 #define __UHSAX                           __uhsax\r
83 #define __USAD8                           __usad8\r
84 #define __USADA8                          __usada8\r
85 #define __SSAT16                          __ssat16\r
86 #define __USAT16                          __usat16\r
87 #define __UXTB16                          __uxtb16\r
88 #define __UXTAB16                         __uxtab16\r
89 #define __SXTB16                          __sxtb16\r
90 #define __SXTAB16                         __sxtab16\r
91 #define __SMUAD                           __smuad\r
92 #define __SMUADX                          __smuadx\r
93 #define __SMLAD                           __smlad\r
94 #define __SMLADX                          __smladx\r
95 #define __SMLALD                          __smlald\r
96 #define __SMLALDX                         __smlaldx\r
97 #define __SMUSD                           __smusd\r
98 #define __SMUSDX                          __smusdx\r
99 #define __SMLSD                           __smlsd\r
100 #define __SMLSDX                          __smlsdx\r
101 #define __SMLSLD                          __smlsld\r
102 #define __SMLSLDX                         __smlsldx\r
103 #define __SEL                             __sel\r
104 #define __QADD                            __qadd\r
105 #define __QSUB                            __qsub\r
106 \r
107 #define __PKHBT(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0x0000FFFFUL) |  \\r
108                                            ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL)  )\r
109 \r
110 #define __PKHTB(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0xFFFF0000UL) |  \\r
111                                            ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL)  )\r
112 \r
113 \r
114 /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/\r
115 \r
116 \r
117 \r
118 #elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/\r
119 /* IAR iccarm specific functions */\r
120 \r
121 #include <cmsis_iar.h>\r
122 \r
123 /*------ CM4 SIMDDSP Intrinsics -----------------------------------------------------*/\r
124 /* intrinsic __SADD8      see intrinsics.h */\r
125 /* intrinsic __QADD8      see intrinsics.h */\r
126 /* intrinsic __SHADD8     see intrinsics.h */\r
127 /* intrinsic __UADD8      see intrinsics.h */\r
128 /* intrinsic __UQADD8     see intrinsics.h */\r
129 /* intrinsic __UHADD8     see intrinsics.h */\r
130 /* intrinsic __SSUB8      see intrinsics.h */\r
131 /* intrinsic __QSUB8      see intrinsics.h */\r
132 /* intrinsic __SHSUB8     see intrinsics.h */\r
133 /* intrinsic __USUB8      see intrinsics.h */\r
134 /* intrinsic __UQSUB8     see intrinsics.h */\r
135 /* intrinsic __UHSUB8     see intrinsics.h */\r
136 /* intrinsic __SADD16     see intrinsics.h */\r
137 /* intrinsic __QADD16     see intrinsics.h */\r
138 /* intrinsic __SHADD16    see intrinsics.h */\r
139 /* intrinsic __UADD16     see intrinsics.h */\r
140 /* intrinsic __UQADD16    see intrinsics.h */\r
141 /* intrinsic __UHADD16    see intrinsics.h */\r
142 /* intrinsic __SSUB16     see intrinsics.h */\r
143 /* intrinsic __QSUB16     see intrinsics.h */\r
144 /* intrinsic __SHSUB16    see intrinsics.h */\r
145 /* intrinsic __USUB16     see intrinsics.h */\r
146 /* intrinsic __UQSUB16    see intrinsics.h */\r
147 /* intrinsic __UHSUB16    see intrinsics.h */\r
148 /* intrinsic __SASX       see intrinsics.h */\r
149 /* intrinsic __QASX       see intrinsics.h */\r
150 /* intrinsic __SHASX      see intrinsics.h */\r
151 /* intrinsic __UASX       see intrinsics.h */\r
152 /* intrinsic __UQASX      see intrinsics.h */\r
153 /* intrinsic __UHASX      see intrinsics.h */\r
154 /* intrinsic __SSAX       see intrinsics.h */\r
155 /* intrinsic __QSAX       see intrinsics.h */\r
156 /* intrinsic __SHSAX      see intrinsics.h */\r
157 /* intrinsic __USAX       see intrinsics.h */\r
158 /* intrinsic __UQSAX      see intrinsics.h */\r
159 /* intrinsic __UHSAX      see intrinsics.h */\r
160 /* intrinsic __USAD8      see intrinsics.h */\r
161 /* intrinsic __USADA8     see intrinsics.h */\r
162 /* intrinsic __SSAT16     see intrinsics.h */\r
163 /* intrinsic __USAT16     see intrinsics.h */\r
164 /* intrinsic __UXTB16     see intrinsics.h */\r
165 /* intrinsic __SXTB16     see intrinsics.h */\r
166 /* intrinsic __UXTAB16    see intrinsics.h */\r
167 /* intrinsic __SXTAB16    see intrinsics.h */\r
168 /* intrinsic __SMUAD      see intrinsics.h */\r
169 /* intrinsic __SMUADX     see intrinsics.h */\r
170 /* intrinsic __SMLAD      see intrinsics.h */\r
171 /* intrinsic __SMLADX     see intrinsics.h */\r
172 /* intrinsic __SMLALD     see intrinsics.h */\r
173 /* intrinsic __SMLALDX    see intrinsics.h */\r
174 /* intrinsic __SMUSD      see intrinsics.h */\r
175 /* intrinsic __SMUSDX     see intrinsics.h */\r
176 /* intrinsic __SMLSD      see intrinsics.h */\r
177 /* intrinsic __SMLSDX     see intrinsics.h */\r
178 /* intrinsic __SMLSLD     see intrinsics.h */\r
179 /* intrinsic __SMLSLDX    see intrinsics.h */\r
180 /* intrinsic __SEL        see intrinsics.h */\r
181 /* intrinsic __QADD       see intrinsics.h */\r
182 /* intrinsic __QSUB       see intrinsics.h */\r
183 /* intrinsic __PKHBT      see intrinsics.h */\r
184 /* intrinsic __PKHTB      see intrinsics.h */\r
185 \r
186 /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/\r
187 \r
188 \r
189 \r
190 #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/\r
191 /* GNU gcc specific functions */\r
192 \r
193 /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/\r
194 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)\r
195 {\r
196   uint32_t result;\r
197   \r
198   __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
199   return(result);\r
200 }\r
201 \r
202 __attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)\r
203 {\r
204   uint32_t result;\r
205   \r
206   __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
207   return(result);\r
208 }\r
209 \r
210 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)\r
211 {\r
212   uint32_t result;\r
213   \r
214   __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
215   return(result);\r
216 }\r
217 \r
218 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)\r
219 {\r
220   uint32_t result;\r
221   \r
222   __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
223   return(result);\r
224 }\r
225 \r
226 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)\r
227 {\r
228   uint32_t result;\r
229   \r
230   __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
231   return(result);\r
232 }\r
233 \r
234 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)\r
235 {\r
236   uint32_t result;\r
237   \r
238   __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
239   return(result);\r
240 }\r
241 \r
242 \r
243 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)\r
244 {\r
245   uint32_t result;\r
246   \r
247   __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
248   return(result);\r
249 }\r
250 \r
251 __attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)\r
252 {\r
253   uint32_t result;\r
254   \r
255   __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
256   return(result);\r
257 }\r
258 \r
259 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)\r
260 {\r
261   uint32_t result;\r
262   \r
263   __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
264   return(result);\r
265 }\r
266 \r
267 __attribute__( ( always_inline ) ) static __INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)\r
268 {\r
269   uint32_t result;\r
270   \r
271   __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
272   return(result);\r
273 }\r
274 \r
275 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)\r
276 {\r
277   uint32_t result;\r
278   \r
279   __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
280   return(result);\r
281 }\r
282 \r
283 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)\r
284 {\r
285   uint32_t result;\r
286   \r
287   __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
288   return(result);\r
289 }\r
290 \r
291 \r
292 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)\r
293 {\r
294   uint32_t result;\r
295   \r
296   __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
297   return(result);\r
298 }\r
299 \r
300 __attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)\r
301 {\r
302   uint32_t result;\r
303   \r
304   __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
305   return(result);\r
306 }\r
307 \r
308 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)\r
309 {\r
310   uint32_t result;\r
311   \r
312   __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
313   return(result);\r
314 }\r
315 \r
316 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)\r
317 {\r
318   uint32_t result;\r
319   \r
320   __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
321   return(result);\r
322 }\r
323 \r
324 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)\r
325 {\r
326   uint32_t result;\r
327   \r
328   __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
329   return(result);\r
330 }\r
331 \r
332 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)\r
333 {\r
334   uint32_t result;\r
335   \r
336   __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
337   return(result);\r
338 }\r
339 \r
340 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)\r
341 {\r
342   uint32_t result;\r
343   \r
344   __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
345   return(result);\r
346 }\r
347 \r
348 __attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)\r
349 {\r
350   uint32_t result;\r
351   \r
352   __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
353   return(result);\r
354 }\r
355 \r
356 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)\r
357 {\r
358   uint32_t result;\r
359   \r
360   __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
361   return(result);\r
362 }\r
363 \r
364 __attribute__( ( always_inline ) ) static __INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)\r
365 {\r
366   uint32_t result;\r
367   \r
368   __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
369   return(result);\r
370 }\r
371 \r
372 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)\r
373 {\r
374   uint32_t result;\r
375   \r
376   __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
377   return(result);\r
378 }\r
379 \r
380 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)\r
381 {\r
382   uint32_t result;\r
383   \r
384   __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
385   return(result);\r
386 }\r
387 \r
388 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)\r
389 {\r
390   uint32_t result;\r
391   \r
392   __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
393   return(result);\r
394 }\r
395 \r
396 __attribute__( ( always_inline ) ) static __INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)\r
397 {\r
398   uint32_t result;\r
399   \r
400   __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
401   return(result);\r
402 }\r
403 \r
404 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)\r
405 {\r
406   uint32_t result;\r
407   \r
408   __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
409   return(result);\r
410 }\r
411 \r
412 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)\r
413 {\r
414   uint32_t result;\r
415   \r
416   __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
417   return(result);\r
418 }\r
419 \r
420 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)\r
421 {\r
422   uint32_t result;\r
423   \r
424   __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
425   return(result);\r
426 }\r
427 \r
428 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)\r
429 {\r
430   uint32_t result;\r
431   \r
432   __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
433   return(result);\r
434 }\r
435 \r
436 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)\r
437 {\r
438   uint32_t result;\r
439   \r
440   __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
441   return(result);\r
442 }\r
443 \r
444 __attribute__( ( always_inline ) ) static __INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)\r
445 {\r
446   uint32_t result;\r
447   \r
448   __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
449   return(result);\r
450 }\r
451 \r
452 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)\r
453 {\r
454   uint32_t result;\r
455   \r
456   __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
457   return(result);\r
458 }\r
459 \r
460 __attribute__( ( always_inline ) ) static __INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)\r
461 {\r
462   uint32_t result;\r
463   \r
464   __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
465   return(result);\r
466 }\r
467 \r
468 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)\r
469 {\r
470   uint32_t result;\r
471   \r
472   __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
473   return(result);\r
474 }\r
475 \r
476 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)\r
477 {\r
478   uint32_t result;\r
479   \r
480   __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
481   return(result);\r
482 }\r
483 \r
484 __attribute__( ( always_inline ) ) static __INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)\r
485 {\r
486   uint32_t result;\r
487   \r
488   __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
489   return(result);\r
490 }\r
491 \r
492 __attribute__( ( always_inline ) ) static __INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)\r
493 {\r
494   uint32_t result;\r
495   \r
496   __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );\r
497   return(result);\r
498 }\r
499 \r
500 #define __SSAT16(ARG1,ARG2) \\r
501 ({                          \\r
502   uint32_t __RES, __ARG1 = (ARG1); \\r
503   __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \\r
504   __RES; \\r
505  })\r
506   \r
507 #define __USAT16(ARG1,ARG2) \\r
508 ({                          \\r
509   uint32_t __RES, __ARG1 = (ARG1); \\r
510   __ASM ("usat16 %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \\r
511   __RES; \\r
512  })\r
513 \r
514 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UXTB16(uint32_t op1)\r
515 {\r
516   uint32_t result;\r
517   \r
518   __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1));\r
519   return(result);\r
520 }\r
521 \r
522 __attribute__( ( always_inline ) ) static __INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)\r
523 {\r
524   uint32_t result;\r
525   \r
526   __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
527   return(result);\r
528 }\r
529 \r
530 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SXTB16(uint32_t op1)\r
531 {\r
532   uint32_t result;\r
533   \r
534   __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1));\r
535   return(result);\r
536 }\r
537 \r
538 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)\r
539 {\r
540   uint32_t result;\r
541   \r
542   __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
543   return(result);\r
544 }\r
545 \r
546 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUAD  (uint32_t op1, uint32_t op2)\r
547 {\r
548   uint32_t result;\r
549   \r
550   __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
551   return(result);\r
552 }\r
553 \r
554 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)\r
555 {\r
556   uint32_t result;\r
557   \r
558   __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
559   return(result);\r
560 }\r
561 \r
562 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)\r
563 {\r
564   uint32_t result;\r
565   \r
566   __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );\r
567   return(result);\r
568 }\r
569 \r
570 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)\r
571 {\r
572   uint32_t result;\r
573   \r
574   __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );\r
575   return(result);\r
576 }\r
577 \r
578 #define __SMLALD(ARG1,ARG2,ARG3) \\r
579 ({ \\r
580   uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \\r
581   __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \\r
582   (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \\r
583  })\r
584 \r
585 #define __SMLALDX(ARG1,ARG2,ARG3) \\r
586 ({ \\r
587   uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \\r
588   __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \\r
589   (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \\r
590  })\r
591 \r
592 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUSD  (uint32_t op1, uint32_t op2)\r
593 {\r
594   uint32_t result;\r
595   \r
596   __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
597   return(result);\r
598 }\r
599 \r
600 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)\r
601 {\r
602   uint32_t result;\r
603   \r
604   __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
605   return(result);\r
606 }\r
607 \r
608 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)\r
609 {\r
610   uint32_t result;\r
611   \r
612   __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );\r
613   return(result);\r
614 }\r
615 \r
616 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)\r
617 {\r
618   uint32_t result;\r
619   \r
620   __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );\r
621   return(result);\r
622 }\r
623 \r
624 #define __SMLSLD(ARG1,ARG2,ARG3) \\r
625 ({ \\r
626   uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \\r
627   __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \\r
628   (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \\r
629  })\r
630 \r
631 #define __SMLSLDX(ARG1,ARG2,ARG3) \\r
632 ({ \\r
633   uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \\r
634   __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \\r
635   (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \\r
636  })\r
637 \r
638 __attribute__( ( always_inline ) ) static __INLINE uint32_t __SEL  (uint32_t op1, uint32_t op2)\r
639 {\r
640   uint32_t result;\r
641   \r
642   __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
643   return(result);\r
644 }\r
645 \r
646 __attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD(uint32_t op1, uint32_t op2)\r
647 {\r
648   uint32_t result;\r
649 \r
650   __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
651   return(result);\r
652 }\r
653 \r
654 __attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2)\r
655 {\r
656   uint32_t result;\r
657   \r
658   __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
659   return(result);\r
660 }\r
661 \r
662 #define __PKHBT(ARG1,ARG2,ARG3) \\r
663 ({                          \\r
664   uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\r
665   __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2), "I" (ARG3)  ); \\r
666   __RES; \\r
667  })\r
668 \r
669 #define __PKHTB(ARG1,ARG2,ARG3) \\r
670 ({                          \\r
671   uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\r
672   if (ARG3 == 0) \\r
673     __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2)  ); \\r
674   else  \\r
675     __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2), "I" (ARG3)  ); \\r
676   __RES; \\r
677  })\r
678 \r
679 /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/\r
680 \r
681 \r
682 \r
683 #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/\r
684 /* TASKING carm specific functions */\r
685 \r
686 \r
687 /*------ CM4 SIMD Intrinsics -----------------------------------------------------*/\r
688 /* not yet supported */\r
689 /*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/\r
690 \r
691 \r
692 #endif\r
693 \r
694 /*@} end of group CMSIS_SIMD_intrinsics */\r
695 \r
696 \r
697 #endif /* __CORE_CM4_SIMD_H */\r
698 \r
699 #ifdef __cplusplus\r
700 }\r
701 #endif\r