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