]> begriffs open source - cmsis/blob - CMSIS/Core/Include/cmsis_armclang.h
Merge branch 'release/5.0.0-Beta4'
[cmsis] / CMSIS / Core / Include / cmsis_armclang.h
1 /**************************************************************************//**\r
2  * @file     cmsis_armclang.h\r
3  * @brief    CMSIS Cortex-M Core Function/Instruction Header File\r
4  * @version  V5.00\r
5  * @date     20. April 2016\r
6  ******************************************************************************/\r
7 /*\r
8  * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\r
9  *\r
10  * SPDX-License-Identifier: Apache-2.0\r
11  *\r
12  * Licensed under the Apache License, Version 2.0 (the License); you may\r
13  * not use this file except in compliance with the License.\r
14  * You may obtain a copy of the License at\r
15  *\r
16  * http://www.apache.org/licenses/LICENSE-2.0\r
17  *\r
18  * Unless required by applicable law or agreed to in writing, software\r
19  * distributed under the License is distributed on an AS IS BASIS, WITHOUT\r
20  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
21  * See the License for the specific language governing permissions and\r
22  * limitations under the License.\r
23  */\r
24 \r
25 #ifndef __CMSIS_ARMCLANG_H\r
26 #define __CMSIS_ARMCLANG_H\r
27 \r
28 \r
29 /* ###########################  Core Function Access  ########################### */\r
30 /** \ingroup  CMSIS_Core_FunctionInterface\r
31     \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions\r
32   @{\r
33  */\r
34 \r
35 /**\r
36   \brief   Enable IRQ Interrupts\r
37   \details Enables IRQ interrupts by clearing the I-bit in the CPSR.\r
38            Can only be executed in Privileged modes.\r
39  */\r
40 __attribute__((always_inline)) __STATIC_INLINE void __enable_irq(void)\r
41 {\r
42   __ASM volatile ("cpsie i" : : : "memory");\r
43 }\r
44 \r
45 \r
46 /**\r
47   \brief   Disable IRQ Interrupts\r
48   \details Disables IRQ interrupts by setting the I-bit in the CPSR.\r
49            Can only be executed in Privileged modes.\r
50  */\r
51 __attribute__((always_inline)) __STATIC_INLINE void __disable_irq(void)\r
52 {\r
53   __ASM volatile ("cpsid i" : : : "memory");\r
54 }\r
55 \r
56 \r
57 /**\r
58   \brief   Get Control Register\r
59   \details Returns the content of the Control Register.\r
60   \return               Control Register value\r
61  */\r
62 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_CONTROL(void)\r
63 {\r
64   uint32_t result;\r
65 \r
66   __ASM volatile ("MRS %0, control" : "=r" (result) );\r
67   return(result);\r
68 }\r
69 \r
70 \r
71 #if  (__ARM_FEATURE_CMSE == 3U)\r
72 /**\r
73   \brief   Get Control Register (non-secure)\r
74   \details Returns the content of the non-secure Control Register when in secure mode.\r
75   \return               non-secure Control Register value\r
76  */\r
77 __attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_CONTROL_NS(void)\r
78 {\r
79   uint32_t result;\r
80 \r
81   __ASM volatile ("MRS %0, control_ns" : "=r" (result) );\r
82   return(result);\r
83 }\r
84 #endif\r
85 \r
86 \r
87 /**\r
88   \brief   Set Control Register\r
89   \details Writes the given value to the Control Register.\r
90   \param [in]    control  Control Register value to set\r
91  */\r
92 __attribute__((always_inline)) __STATIC_INLINE void __set_CONTROL(uint32_t control)\r
93 {\r
94   __ASM volatile ("MSR control, %0" : : "r" (control) : "memory");\r
95 }\r
96 \r
97 \r
98 #if  (__ARM_FEATURE_CMSE == 3U)\r
99 /**\r
100   \brief   Set Control Register (non-secure)\r
101   \details Writes the given value to the non-secure Control Register when in secure state.\r
102   \param [in]    control  Control Register value to set\r
103  */\r
104 __attribute__((always_inline)) __STATIC_INLINE void __TZ_set_CONTROL_NS(uint32_t control)\r
105 {\r
106   __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory");\r
107 }\r
108 #endif\r
109 \r
110 \r
111 /**\r
112   \brief   Get IPSR Register\r
113   \details Returns the content of the IPSR Register.\r
114   \return               IPSR Register value\r
115  */\r
116 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_IPSR(void)\r
117 {\r
118   uint32_t result;\r
119 \r
120   __ASM volatile ("MRS %0, ipsr" : "=r" (result) );\r
121   return(result);\r
122 }\r
123 \r
124 \r
125 /**\r
126   \brief   Get APSR Register\r
127   \details Returns the content of the APSR Register.\r
128   \return               APSR Register value\r
129  */\r
130 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_APSR(void)\r
131 {\r
132   uint32_t result;\r
133 \r
134   __ASM volatile ("MRS %0, apsr" : "=r" (result) );\r
135   return(result);\r
136 }\r
137 \r
138 \r
139 /**\r
140   \brief   Get xPSR Register\r
141   \details Returns the content of the xPSR Register.\r
142   \return               xPSR Register value\r
143  */\r
144 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_xPSR(void)\r
145 {\r
146   uint32_t result;\r
147 \r
148   __ASM volatile ("MRS %0, xpsr" : "=r" (result) );\r
149   return(result);\r
150 }\r
151 \r
152 \r
153 /**\r
154   \brief   Get Process Stack Pointer\r
155   \details Returns the current value of the Process Stack Pointer (PSP).\r
156   \return               PSP Register value\r
157  */\r
158 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void)\r
159 {\r
160   register uint32_t result;\r
161 \r
162   __ASM volatile ("MRS %0, psp"  : "=r" (result) );\r
163   return(result);\r
164 }\r
165 \r
166 \r
167 #if  (__ARM_FEATURE_CMSE == 3U)\r
168 /**\r
169   \brief   Get Process Stack Pointer (non-secure)\r
170   \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state.\r
171   \return               PSP Register value\r
172  */\r
173 __attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSP_NS(void)\r
174 {\r
175   register uint32_t result;\r
176 \r
177   __ASM volatile ("MRS %0, psp_ns"  : "=r" (result) );\r
178   return(result);\r
179 }\r
180 #endif\r
181 \r
182 \r
183 /**\r
184   \brief   Set Process Stack Pointer\r
185   \details Assigns the given value to the Process Stack Pointer (PSP).\r
186   \param [in]    topOfProcStack  Process Stack Pointer value to set\r
187  */\r
188 __attribute__((always_inline)) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)\r
189 {\r
190   __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : "sp");\r
191 }\r
192 \r
193 \r
194 #if  (__ARM_FEATURE_CMSE == 3U)\r
195 /**\r
196   \brief   Set Process Stack Pointer (non-secure)\r
197   \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state.\r
198   \param [in]    topOfProcStack  Process Stack Pointer value to set\r
199  */\r
200 __attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack)\r
201 {\r
202   __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : "sp");\r
203 }\r
204 #endif\r
205 \r
206 \r
207 /**\r
208   \brief   Get Main Stack Pointer\r
209   \details Returns the current value of the Main Stack Pointer (MSP).\r
210   \return               MSP Register value\r
211  */\r
212 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void)\r
213 {\r
214   register uint32_t result;\r
215 \r
216   __ASM volatile ("MRS %0, msp" : "=r" (result) );\r
217   return(result);\r
218 }\r
219 \r
220 \r
221 #if  (__ARM_FEATURE_CMSE == 3U)\r
222 /**\r
223   \brief   Get Main Stack Pointer (non-secure)\r
224   \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state.\r
225   \return               MSP Register value\r
226  */\r
227 __attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSP_NS(void)\r
228 {\r
229   register uint32_t result;\r
230 \r
231   __ASM volatile ("MRS %0, msp_ns" : "=r" (result) );\r
232   return(result);\r
233 }\r
234 #endif\r
235 \r
236 \r
237 /**\r
238   \brief   Set Main Stack Pointer\r
239   \details Assigns the given value to the Main Stack Pointer (MSP).\r
240   \param [in]    topOfMainStack  Main Stack Pointer value to set\r
241  */\r
242 __attribute__((always_inline)) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)\r
243 {\r
244   __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : "sp");\r
245 }\r
246 \r
247 \r
248 #if  (__ARM_FEATURE_CMSE == 3U)\r
249 /**\r
250   \brief   Set Main Stack Pointer (non-secure)\r
251   \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state.\r
252   \param [in]    topOfMainStack  Main Stack Pointer value to set\r
253  */\r
254 __attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack)\r
255 {\r
256   __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : "sp");\r
257 }\r
258 #endif\r
259 \r
260 \r
261 /**\r
262   \brief   Get Priority Mask\r
263   \details Returns the current state of the priority mask bit from the Priority Mask Register.\r
264   \return               Priority Mask value\r
265  */\r
266 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PRIMASK(void)\r
267 {\r
268   uint32_t result;\r
269 \r
270   __ASM volatile ("MRS %0, primask" : "=r" (result) );\r
271   return(result);\r
272 }\r
273 \r
274 \r
275 #if  (__ARM_FEATURE_CMSE == 3U)\r
276 /**\r
277   \brief   Get Priority Mask (non-secure)\r
278   \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state.\r
279   \return               Priority Mask value\r
280  */\r
281 __attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PRIMASK_NS(void)\r
282 {\r
283   uint32_t result;\r
284 \r
285   __ASM volatile ("MRS %0, primask_ns" : "=r" (result) );\r
286   return(result);\r
287 }\r
288 #endif\r
289 \r
290 \r
291 /**\r
292   \brief   Set Priority Mask\r
293   \details Assigns the given value to the Priority Mask Register.\r
294   \param [in]    priMask  Priority Mask\r
295  */\r
296 __attribute__((always_inline)) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)\r
297 {\r
298   __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");\r
299 }\r
300 \r
301 \r
302 #if  (__ARM_FEATURE_CMSE == 3U)\r
303 /**\r
304   \brief   Set Priority Mask (non-secure)\r
305   \details Assigns the given value to the non-secure Priority Mask Register when in secure state.\r
306   \param [in]    priMask  Priority Mask\r
307  */\r
308 __attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PRIMASK_NS(uint32_t priMask)\r
309 {\r
310   __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory");\r
311 }\r
312 #endif\r
313 \r
314 \r
315 #if ((__ARM_ARCH_7M__      == 1U) || \\r
316      (__ARM_ARCH_7EM__     == 1U) || \\r
317      (__ARM_ARCH_8M_MAIN__ == 1U)   )\r
318 /**\r
319   \brief   Enable FIQ\r
320   \details Enables FIQ interrupts by clearing the F-bit in the CPSR.\r
321            Can only be executed in Privileged modes.\r
322  */\r
323 __attribute__((always_inline)) __STATIC_INLINE void __enable_fault_irq(void)\r
324 {\r
325   __ASM volatile ("cpsie f" : : : "memory");\r
326 }\r
327 \r
328 \r
329 /**\r
330   \brief   Disable FIQ\r
331   \details Disables FIQ interrupts by setting the F-bit in the CPSR.\r
332            Can only be executed in Privileged modes.\r
333  */\r
334 __attribute__((always_inline)) __STATIC_INLINE void __disable_fault_irq(void)\r
335 {\r
336   __ASM volatile ("cpsid f" : : : "memory");\r
337 }\r
338 \r
339 \r
340 /**\r
341   \brief   Get Base Priority\r
342   \details Returns the current value of the Base Priority register.\r
343   \return               Base Priority register value\r
344  */\r
345 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_BASEPRI(void)\r
346 {\r
347   uint32_t result;\r
348 \r
349   __ASM volatile ("MRS %0, basepri" : "=r" (result) );\r
350   return(result);\r
351 }\r
352 \r
353 \r
354 #if  (__ARM_FEATURE_CMSE == 3U)\r
355 /**\r
356   \brief   Get Base Priority (non-secure)\r
357   \details Returns the current value of the non-secure Base Priority register when in secure state.\r
358   \return               Base Priority register value\r
359  */\r
360 __attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_BASEPRI_NS(void)\r
361 {\r
362   uint32_t result;\r
363 \r
364   __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) );\r
365   return(result);\r
366 }\r
367 #endif\r
368 \r
369 \r
370 /**\r
371   \brief   Set Base Priority\r
372   \details Assigns the given value to the Base Priority register.\r
373   \param [in]    basePri  Base Priority value to set\r
374  */\r
375 __attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI(uint32_t value)\r
376 {\r
377   __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory");\r
378 }\r
379 \r
380 \r
381 #if  (__ARM_FEATURE_CMSE == 3U)\r
382 /**\r
383   \brief   Set Base Priority (non-secure)\r
384   \details Assigns the given value to the non-secure Base Priority register when in secure state.\r
385   \param [in]    basePri  Base Priority value to set\r
386  */\r
387 __attribute__((always_inline)) __STATIC_INLINE void __TZ_set_BASEPRI_NS(uint32_t value)\r
388 {\r
389   __ASM volatile ("MSR basepri_ns, %0" : : "r" (value) : "memory");\r
390 }\r
391 #endif\r
392 \r
393 \r
394 /**\r
395   \brief   Set Base Priority with condition\r
396   \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,\r
397            or the new value increases the BASEPRI priority level.\r
398   \param [in]    basePri  Base Priority value to set\r
399  */\r
400 __attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t value)\r
401 {\r
402   __ASM volatile ("MSR basepri_max, %0" : : "r" (value) : "memory");\r
403 }\r
404 \r
405 \r
406 /**\r
407   \brief   Get Fault Mask\r
408   \details Returns the current value of the Fault Mask register.\r
409   \return               Fault Mask register value\r
410  */\r
411 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FAULTMASK(void)\r
412 {\r
413   uint32_t result;\r
414 \r
415   __ASM volatile ("MRS %0, faultmask" : "=r" (result) );\r
416   return(result);\r
417 }\r
418 \r
419 \r
420 #if  (__ARM_FEATURE_CMSE == 3U)\r
421 /**\r
422   \brief   Get Fault Mask (non-secure)\r
423   \details Returns the current value of the non-secure Fault Mask register when in secure state.\r
424   \return               Fault Mask register value\r
425  */\r
426 __attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_FAULTMASK_NS(void)\r
427 {\r
428   uint32_t result;\r
429 \r
430   __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) );\r
431   return(result);\r
432 }\r
433 #endif\r
434 \r
435 \r
436 /**\r
437   \brief   Set Fault Mask\r
438   \details Assigns the given value to the Fault Mask register.\r
439   \param [in]    faultMask  Fault Mask value to set\r
440  */\r
441 __attribute__((always_inline)) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)\r
442 {\r
443   __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory");\r
444 }\r
445 \r
446 \r
447 #if  (__ARM_FEATURE_CMSE == 3U)\r
448 /**\r
449   \brief   Set Fault Mask (non-secure)\r
450   \details Assigns the given value to the non-secure Fault Mask register when in secure state.\r
451   \param [in]    faultMask  Fault Mask value to set\r
452  */\r
453 __attribute__((always_inline)) __STATIC_INLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask)\r
454 {\r
455   __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory");\r
456 }\r
457 #endif\r
458 \r
459 #endif /* ((__ARM_ARCH_7M__      == 1U) || \\r
460            (__ARM_ARCH_7EM__     == 1U) || \\r
461            (__ARM_ARCH_8M_MAIN__ == 1U)   )  */\r
462 \r
463 \r
464 #if ((__ARM_ARCH_8M_MAIN__ == 1U) || (__ARM_ARCH_8M_BASE__ == 1U))\r
465 \r
466 /**\r
467   \brief   Get Process Stack Pointer Limit\r
468   \details Returns the current value of the Process Stack Pointer Limit (PSPLIM).\r
469   \return               PSPLIM Register value\r
470  */\r
471 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSPLIM(void)\r
472 {\r
473   register uint32_t result;\r
474 \r
475   __ASM volatile ("MRS %0, psplim"  : "=r" (result) );\r
476   return(result);\r
477 }\r
478 \r
479 \r
480 #if  (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_8M_MAIN__ == 1U)\r
481 /**\r
482   \brief   Get Process Stack Pointer Limit (non-secure)\r
483   \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.\r
484   \return               PSPLIM Register value\r
485  */\r
486 __attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSPLIM_NS(void)\r
487 {\r
488   register uint32_t result;\r
489 \r
490   __ASM volatile ("MRS %0, psplim_ns"  : "=r" (result) );\r
491   return(result);\r
492 }\r
493 #endif\r
494 \r
495 \r
496 /**\r
497   \brief   Set Process Stack Pointer Limit\r
498   \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM).\r
499   \param [in]    ProcStackPtrLimit  Process Stack Pointer Limit value to set\r
500  */\r
501 __attribute__((always_inline)) __STATIC_INLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit)\r
502 {\r
503   __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit));\r
504 }\r
505 \r
506 \r
507 #if  (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_8M_MAIN__ == 1U)\r
508 /**\r
509   \brief   Set Process Stack Pointer (non-secure)\r
510   \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.\r
511   \param [in]    ProcStackPtrLimit  Process Stack Pointer Limit value to set\r
512  */\r
513 __attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit)\r
514 {\r
515   __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit));\r
516 }\r
517 #endif\r
518 \r
519 \r
520 /**\r
521   \brief   Get Main Stack Pointer Limit\r
522   \details Returns the current value of the Main Stack Pointer Limit (MSPLIM).\r
523   \return               MSPLIM Register value\r
524  */\r
525 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSPLIM(void)\r
526 {\r
527   register uint32_t result;\r
528 \r
529   __ASM volatile ("MRS %0, msplim" : "=r" (result) );\r
530 \r
531   return(result);\r
532 }\r
533 \r
534 \r
535 #if  (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_8M_MAIN__ == 1U)\r
536 /**\r
537   \brief   Get Main Stack Pointer Limit (non-secure)\r
538   \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state.\r
539   \return               MSPLIM Register value\r
540  */\r
541 __attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSPLIM_NS(void)\r
542 {\r
543   register uint32_t result;\r
544 \r
545   __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) );\r
546   return(result);\r
547 }\r
548 #endif\r
549 \r
550 \r
551 /**\r
552   \brief   Set Main Stack Pointer Limit\r
553   \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM).\r
554   \param [in]    MainStackPtrLimit  Main Stack Pointer Limit value to set\r
555  */\r
556 __attribute__((always_inline)) __STATIC_INLINE void __set_MSPLIM(uint32_t MainStackPtrLimit)\r
557 {\r
558   __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit));\r
559 }\r
560 \r
561 \r
562 #if  (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_8M_MAIN__ == 1U)\r
563 /**\r
564   \brief   Set Main Stack Pointer Limit (non-secure)\r
565   \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state.\r
566   \param [in]    MainStackPtrLimit  Main Stack Pointer value to set\r
567  */\r
568 __attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit)\r
569 {\r
570   __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit));\r
571 }\r
572 #endif\r
573 \r
574 #endif /* ((__ARM_ARCH_8M_MAIN__ == 1U) || (__ARM_ARCH_8M_BASE__ == 1U)) */\r
575 \r
576 \r
577 #if ((__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M_MAIN__ == 1U))\r
578 \r
579 /**\r
580   \brief   Get FPSCR\r
581   \details Returns the current value of the Floating Point Status/Control register.\r
582   \return               Floating Point Status/Control register value\r
583  */\r
584 /* #define __get_FPSCR      __builtin_arm_get_fpscr */\r
585 __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FPSCR(void)\r
586 {\r
587 #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\r
588      (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\r
589   uint32_t result;\r
590 \r
591   __ASM volatile ("");                                 /* Empty asm statement works as a scheduling barrier */\r
592   __ASM volatile ("VMRS %0, fpscr" : "=r" (result) );\r
593   __ASM volatile ("");\r
594   return(result);\r
595 #else\r
596    return(0U);\r
597 #endif\r
598 }\r
599 \r
600 \r
601 /**\r
602   \brief   Set FPSCR\r
603   \details Assigns the given value to the Floating Point Status/Control register.\r
604   \param [in]    fpscr  Floating Point Status/Control value to set\r
605  */\r
606 /* #define __set_FPSCR      __builtin_arm_set_fpscr */\r
607 __attribute__((always_inline)) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)\r
608 {\r
609 #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\r
610      (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\r
611   __ASM volatile ("");                                 /* Empty asm statement works as a scheduling barrier */\r
612 /*  __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc"); */\r
613   __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) :);\r
614   __ASM volatile ("");\r
615 #endif\r
616 }\r
617 \r
618 #endif /* ((__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M_MAIN__ == 1U)) */\r
619 \r
620 \r
621 \r
622 /*@} end of CMSIS_Core_RegAccFunctions */\r
623 \r
624 \r
625 /* ##########################  Core Instruction Access  ######################### */\r
626 /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface\r
627   Access to dedicated instructions\r
628   @{\r
629 */\r
630 \r
631 /* Define macros for porting to both thumb1 and thumb2.\r
632  * For thumb1, use low register (r0-r7), specified by constraint "l"\r
633  * Otherwise, use general registers, specified by constraint "r" */\r
634 #if defined (__thumb__) && !defined (__thumb2__)\r
635 #define __CMSIS_GCC_OUT_REG(r) "=l" (r)\r
636 #define __CMSIS_GCC_USE_REG(r) "l" (r)\r
637 #else\r
638 #define __CMSIS_GCC_OUT_REG(r) "=r" (r)\r
639 #define __CMSIS_GCC_USE_REG(r) "r" (r)\r
640 #endif\r
641 \r
642 /**\r
643   \brief   No Operation\r
644   \details No Operation does nothing. This instruction can be used for code alignment purposes.\r
645  */\r
646 #define __NOP          __builtin_arm_nop\r
647 \r
648 /**\r
649   \brief   Wait For Interrupt\r
650   \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.\r
651  */\r
652 #define __WFI          __builtin_arm_wfi\r
653 \r
654 \r
655 /**\r
656   \brief   Wait For Event\r
657   \details Wait For Event is a hint instruction that permits the processor to enter\r
658            a low-power state until one of a number of events occurs.\r
659  */\r
660 #define __WFE          __builtin_arm_wfe\r
661 \r
662 \r
663 /**\r
664   \brief   Send Event\r
665   \details Send Event is a hint instruction. It causes an event to be signaled to the CPU.\r
666  */\r
667 #define __SEV          __builtin_arm_sev\r
668 \r
669 \r
670 /**\r
671   \brief   Instruction Synchronization Barrier\r
672   \details Instruction Synchronization Barrier flushes the pipeline in the processor,\r
673            so that all instructions following the ISB are fetched from cache or memory,\r
674            after the instruction has been completed.\r
675  */\r
676 #define __ISB()        __builtin_arm_isb(0xF);\r
677 \r
678 /**\r
679   \brief   Data Synchronization Barrier\r
680   \details Acts as a special kind of Data Memory Barrier.\r
681            It completes when all explicit memory accesses before this instruction complete.\r
682  */\r
683 #define __DSB()        __builtin_arm_dsb(0xF);\r
684 \r
685 \r
686 /**\r
687   \brief   Data Memory Barrier\r
688   \details Ensures the apparent order of the explicit memory operations before\r
689            and after the instruction, without ensuring their completion.\r
690  */\r
691 #define __DMB()        __builtin_arm_dmb(0xF);\r
692 \r
693 \r
694 /**\r
695   \brief   Reverse byte order (32 bit)\r
696   \details Reverses the byte order in integer value.\r
697   \param [in]    value  Value to reverse\r
698   \return               Reversed value\r
699  */\r
700 #define __REV          __builtin_bswap32\r
701 \r
702 \r
703 /**\r
704   \brief   Reverse byte order (16 bit)\r
705   \details Reverses the byte order in two unsigned short values.\r
706   \param [in]    value  Value to reverse\r
707   \return               Reversed value\r
708  */\r
709 #define __REV16          __builtin_bswap16                /* ToDo ARMCLANG: check if __builtin_bswap16 could be used */\r
710 #if 0\r
711 __attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value)\r
712 {\r
713   uint32_t result;\r
714 \r
715   __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\r
716   return(result);\r
717 }\r
718 #endif\r
719 \r
720 \r
721 /**\r
722   \brief   Reverse byte order in signed short value\r
723   \details Reverses the byte order in a signed short value with sign extension to integer.\r
724   \param [in]    value  Value to reverse\r
725   \return               Reversed value\r
726  */\r
727                                                           /* ToDo ARMCLANG: check if __builtin_bswap16 could be used */\r
728 __attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value)\r
729 {\r
730   int32_t result;\r
731 \r
732   __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\r
733   return(result);\r
734 }\r
735 \r
736 \r
737 /**\r
738   \brief   Rotate Right in unsigned value (32 bit)\r
739   \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.\r
740   \param [in]    op1  Value to rotate\r
741   \param [in]    op2  Number of Bits to rotate\r
742   \return               Rotated value\r
743  */\r
744 __attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)\r
745 {\r
746   return (op1 >> op2) | (op1 << (32U - op2));\r
747 }\r
748 \r
749 \r
750 /**\r
751   \brief   Breakpoint\r
752   \details Causes the processor to enter Debug state.\r
753            Debug tools can use this to investigate system state when the instruction at a particular address is reached.\r
754   \param [in]    value  is ignored by the processor.\r
755                  If required, a debugger can use it to store additional information about the breakpoint.\r
756  */\r
757 #define __BKPT(value)                       __ASM volatile ("bkpt "#value)\r
758 \r
759 \r
760 /**\r
761   \brief   Reverse bit order of value\r
762   \details Reverses the bit order of the given value.\r
763   \param [in]    value  Value to reverse\r
764   \return               Reversed value\r
765  */\r
766                                                           /* ToDo ARMCLANG: check if __builtin_arm_rbit is supported */\r
767 __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)\r
768 {\r
769   uint32_t result;\r
770 \r
771 #if ((__ARM_ARCH_7M__       == 1U) || \\r
772      (__ARM_ARCH_7EM__      == 1U) || \\r
773      (__ARM_ARCH_8M_MAIN__  == 1U) )\r
774    __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );\r
775 #else\r
776   int32_t s = 4 /*sizeof(v)*/ * 8 - 1; /* extra shift needed at end */\r
777 \r
778   result = value;                      /* r will be reversed bits of v; first get LSB of v */\r
779   for (value >>= 1U; value; value >>= 1U)\r
780   {\r
781     result <<= 1U;\r
782     result |= value & 1U;\r
783     s--;\r
784   }\r
785   result <<= s;                        /* shift when v's highest bits are zero */\r
786 #endif\r
787   return(result);\r
788 }\r
789 \r
790 \r
791 /**\r
792   \brief   Count leading zeros\r
793   \details Counts the number of leading zeros of a data value.\r
794   \param [in]  value  Value to count the leading zeros\r
795   \return             number of leading zeros in value\r
796  */\r
797 #define __CLZ             __builtin_clz\r
798 \r
799 \r
800 #if ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M_MAIN__ == 1U) || (__ARM_ARCH_8M_BASE__ == 1U))\r
801 \r
802 /**\r
803   \brief   LDR Exclusive (8 bit)\r
804   \details Executes a exclusive LDR instruction for 8 bit value.\r
805   \param [in]    ptr  Pointer to data\r
806   \return             value of type uint8_t at (*ptr)\r
807  */\r
808 #define __LDREXB        (uint8_t)__builtin_arm_ldrex\r
809 \r
810 \r
811 /**\r
812   \brief   LDR Exclusive (16 bit)\r
813   \details Executes a exclusive LDR instruction for 16 bit values.\r
814   \param [in]    ptr  Pointer to data\r
815   \return        value of type uint16_t at (*ptr)\r
816  */\r
817 #define __LDREXH        (uint16_t)__builtin_arm_ldrex\r
818 \r
819 \r
820 /**\r
821   \brief   LDR Exclusive (32 bit)\r
822   \details Executes a exclusive LDR instruction for 32 bit values.\r
823   \param [in]    ptr  Pointer to data\r
824   \return        value of type uint32_t at (*ptr)\r
825  */\r
826 #define __LDREXW        (uint32_t)__builtin_arm_ldrex\r
827 \r
828 \r
829 /**\r
830   \brief   STR Exclusive (8 bit)\r
831   \details Executes a exclusive STR instruction for 8 bit values.\r
832   \param [in]  value  Value to store\r
833   \param [in]    ptr  Pointer to location\r
834   \return          0  Function succeeded\r
835   \return          1  Function failed\r
836  */\r
837 #define __STREXB        (uint32_t)__builtin_arm_strex\r
838 \r
839 \r
840 /**\r
841   \brief   STR Exclusive (16 bit)\r
842   \details Executes a exclusive STR instruction for 16 bit values.\r
843   \param [in]  value  Value to store\r
844   \param [in]    ptr  Pointer to location\r
845   \return          0  Function succeeded\r
846   \return          1  Function failed\r
847  */\r
848 #define __STREXH        (uint32_t)__builtin_arm_strex\r
849 \r
850 \r
851 /**\r
852   \brief   STR Exclusive (32 bit)\r
853   \details Executes a exclusive STR instruction for 32 bit values.\r
854   \param [in]  value  Value to store\r
855   \param [in]    ptr  Pointer to location\r
856   \return          0  Function succeeded\r
857   \return          1  Function failed\r
858  */\r
859 #define __STREXW        (uint32_t)__builtin_arm_strex\r
860 \r
861 \r
862 /**\r
863   \brief   Remove the exclusive lock\r
864   \details Removes the exclusive lock which is created by LDREX.\r
865  */\r
866 #define __CLREX             __builtin_arm_clrex\r
867 \r
868 \r
869 /**\r
870   \brief   Signed Saturate\r
871   \details Saturates a signed value.\r
872   \param [in]  value  Value to be saturated\r
873   \param [in]    sat  Bit position to saturate to (1..32)\r
874   \return             Saturated value\r
875  */\r
876 /* #define __SSAT             __builtin_arm_ssat */\r
877 #define __SSAT(ARG1,ARG2) \\r
878 ({                          \\r
879   int32_t __RES, __ARG1 = (ARG1); \\r
880   __ASM ("ssat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \\r
881   __RES; \\r
882  })\r
883 \r
884 \r
885 /**\r
886   \brief   Unsigned Saturate\r
887   \details Saturates an unsigned value.\r
888   \param [in]  value  Value to be saturated\r
889   \param [in]    sat  Bit position to saturate to (0..31)\r
890   \return             Saturated value\r
891  */\r
892 #define __USAT             __builtin_arm_usat\r
893 #if 0\r
894 #define __USAT(ARG1,ARG2) \\r
895 ({                          \\r
896   uint32_t __RES, __ARG1 = (ARG1); \\r
897   __ASM ("usat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \\r
898   __RES; \\r
899  })\r
900 #endif\r
901 \r
902 \r
903 /**\r
904   \brief   Rotate Right with Extend (32 bit)\r
905   \details Moves each bit of a bitstring right by one bit.\r
906            The carry input is shifted in at the left end of the bitstring.\r
907   \param [in]    value  Value to rotate\r
908   \return               Rotated value\r
909  */\r
910 __attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value)\r
911 {\r
912   uint32_t result;\r
913 \r
914   __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\r
915   return(result);\r
916 }\r
917 \r
918 \r
919 /**\r
920   \brief   LDRT Unprivileged (8 bit)\r
921   \details Executes a Unprivileged LDRT instruction for 8 bit value.\r
922   \param [in]    ptr  Pointer to data\r
923   \return             value of type uint8_t at (*ptr)\r
924  */\r
925 __attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *ptr)\r
926 {\r
927     uint32_t result;\r
928 \r
929    __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) );\r
930    return ((uint8_t) result);    /* Add explicit type cast here */\r
931 }\r
932 \r
933 \r
934 /**\r
935   \brief   LDRT Unprivileged (16 bit)\r
936   \details Executes a Unprivileged LDRT instruction for 16 bit values.\r
937   \param [in]    ptr  Pointer to data\r
938   \return        value of type uint16_t at (*ptr)\r
939  */\r
940 __attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *ptr)\r
941 {\r
942     uint32_t result;\r
943 \r
944    __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) );\r
945    return ((uint16_t) result);    /* Add explicit type cast here */\r
946 }\r
947 \r
948 \r
949 /**\r
950   \brief   LDRT Unprivileged (32 bit)\r
951   \details Executes a Unprivileged LDRT instruction for 32 bit values.\r
952   \param [in]    ptr  Pointer to data\r
953   \return        value of type uint32_t at (*ptr)\r
954  */\r
955 __attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *ptr)\r
956 {\r
957     uint32_t result;\r
958 \r
959    __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) );\r
960    return(result);\r
961 }\r
962 \r
963 \r
964 /**\r
965   \brief   STRT Unprivileged (8 bit)\r
966   \details Executes a Unprivileged STRT instruction for 8 bit values.\r
967   \param [in]  value  Value to store\r
968   \param [in]    ptr  Pointer to location\r
969  */\r
970 __attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *ptr)\r
971 {\r
972    __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) );\r
973 }\r
974 \r
975 \r
976 /**\r
977   \brief   STRT Unprivileged (16 bit)\r
978   \details Executes a Unprivileged STRT instruction for 16 bit values.\r
979   \param [in]  value  Value to store\r
980   \param [in]    ptr  Pointer to location\r
981  */\r
982 __attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *ptr)\r
983 {\r
984    __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) );\r
985 }\r
986 \r
987 \r
988 /**\r
989   \brief   STRT Unprivileged (32 bit)\r
990   \details Executes a Unprivileged STRT instruction for 32 bit values.\r
991   \param [in]  value  Value to store\r
992   \param [in]    ptr  Pointer to location\r
993  */\r
994 __attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *ptr)\r
995 {\r
996    __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) );\r
997 }\r
998 \r
999 #endif /* ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M_MAIN__ == 1U) || (__ARM_ARCH_8M_BASE__ == 1U)) */\r
1000 \r
1001 \r
1002 #if ((__ARM_ARCH_8M_MAIN__ == 1U) || (__ARM_ARCH_8M_BASE__ == 1U))\r
1003 \r
1004 /**\r
1005   \brief   Load-Acquire (8 bit)\r
1006   \details Executes a LDAB instruction for 8 bit value.\r
1007   \param [in]    ptr  Pointer to data\r
1008   \return             value of type uint8_t at (*ptr)\r
1009  */\r
1010 __attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAB(volatile uint8_t *ptr)\r
1011 {\r
1012     uint32_t result;\r
1013 \r
1014    __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) );\r
1015    return ((uint8_t) result);\r
1016 }\r
1017 \r
1018 \r
1019 /**\r
1020   \brief   Load-Acquire (16 bit)\r
1021   \details Executes a LDAH instruction for 16 bit values.\r
1022   \param [in]    ptr  Pointer to data\r
1023   \return        value of type uint16_t at (*ptr)\r
1024  */\r
1025 __attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAH(volatile uint16_t *ptr)\r
1026 {\r
1027     uint32_t result;\r
1028 \r
1029    __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) );\r
1030    return ((uint16_t) result);\r
1031 }\r
1032 \r
1033 \r
1034 /**\r
1035   \brief   Load-Acquire (32 bit)\r
1036   \details Executes a LDA instruction for 32 bit values.\r
1037   \param [in]    ptr  Pointer to data\r
1038   \return        value of type uint32_t at (*ptr)\r
1039  */\r
1040 __attribute__((always_inline)) __STATIC_INLINE uint32_t __LDA(volatile uint32_t *ptr)\r
1041 {\r
1042     uint32_t result;\r
1043 \r
1044    __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) );\r
1045    return(result);\r
1046 }\r
1047 \r
1048 \r
1049 /**\r
1050   \brief   Store-Release (8 bit)\r
1051   \details Executes a STLB instruction for 8 bit values.\r
1052   \param [in]  value  Value to store\r
1053   \param [in]    ptr  Pointer to location\r
1054  */\r
1055 __attribute__((always_inline)) __STATIC_INLINE void __STLB(uint8_t value, volatile uint8_t *ptr)\r
1056 {\r
1057    __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) );\r
1058 }\r
1059 \r
1060 \r
1061 /**\r
1062   \brief   Store-Release (16 bit)\r
1063   \details Executes a STLH instruction for 16 bit values.\r
1064   \param [in]  value  Value to store\r
1065   \param [in]    ptr  Pointer to location\r
1066  */\r
1067 __attribute__((always_inline)) __STATIC_INLINE void __STLH(uint16_t value, volatile uint16_t *ptr)\r
1068 {\r
1069    __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) );\r
1070 }\r
1071 \r
1072 \r
1073 /**\r
1074   \brief   Store-Release (32 bit)\r
1075   \details Executes a STL instruction for 32 bit values.\r
1076   \param [in]  value  Value to store\r
1077   \param [in]    ptr  Pointer to location\r
1078  */\r
1079 __attribute__((always_inline)) __STATIC_INLINE void __STL(uint32_t value, volatile uint32_t *ptr)\r
1080 {\r
1081    __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) );\r
1082 }\r
1083 \r
1084 \r
1085 /**\r
1086   \brief   Load-Acquire Exclusive (8 bit)\r
1087   \details Executes a LDAB exclusive instruction for 8 bit value.\r
1088   \param [in]    ptr  Pointer to data\r
1089   \return             value of type uint8_t at (*ptr)\r
1090  */\r
1091 #define     __LDAEXB                 (uint8_t)__builtin_arm_ldaex\r
1092 \r
1093 \r
1094 /**\r
1095   \brief   Load-Acquire Exclusive (16 bit)\r
1096   \details Executes a LDAH exclusive instruction for 16 bit values.\r
1097   \param [in]    ptr  Pointer to data\r
1098   \return        value of type uint16_t at (*ptr)\r
1099  */\r
1100 #define     __LDAEXH                 (uint16_t)__builtin_arm_ldaex\r
1101 \r
1102 \r
1103 /**\r
1104   \brief   Load-Acquire Exclusive (32 bit)\r
1105   \details Executes a LDA exclusive instruction for 32 bit values.\r
1106   \param [in]    ptr  Pointer to data\r
1107   \return        value of type uint32_t at (*ptr)\r
1108  */\r
1109 #define     __LDAEX                  (uint32_t)__builtin_arm_ldaex\r
1110 \r
1111 \r
1112 /**\r
1113   \brief   Store-Release Exclusive (8 bit)\r
1114   \details Executes a STLB exclusive instruction for 8 bit values.\r
1115   \param [in]  value  Value to store\r
1116   \param [in]    ptr  Pointer to location\r
1117   \return          0  Function succeeded\r
1118   \return          1  Function failed\r
1119  */\r
1120 #define     __STLEXB                 (uint32_t)__builtin_arm_stlex\r
1121 \r
1122 \r
1123 /**\r
1124   \brief   Store-Release Exclusive (16 bit)\r
1125   \details Executes a STLH exclusive instruction for 16 bit values.\r
1126   \param [in]  value  Value to store\r
1127   \param [in]    ptr  Pointer to location\r
1128   \return          0  Function succeeded\r
1129   \return          1  Function failed\r
1130  */\r
1131 #define     __STLEXH                 (uint32_t)__builtin_arm_stlex\r
1132 \r
1133 \r
1134 /**\r
1135   \brief   Store-Release Exclusive (32 bit)\r
1136   \details Executes a STL exclusive instruction for 32 bit values.\r
1137   \param [in]  value  Value to store\r
1138   \param [in]    ptr  Pointer to location\r
1139   \return          0  Function succeeded\r
1140   \return          1  Function failed\r
1141  */\r
1142 #define     __STLEX                  (uint32_t)__builtin_arm_stlex\r
1143 \r
1144 #endif /* ((__ARM_ARCH_8M_MAIN__ == 1U) || (__ARM_ARCH_8M_BASE__ == 1U)) */\r
1145 \r
1146 /*@}*/ /* end of group CMSIS_Core_InstructionInterface */\r
1147 \r
1148 \r
1149 /* ###################  Compiler specific Intrinsics  ########################### */\r
1150 /** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics\r
1151   Access to dedicated SIMD instructions\r
1152   @{\r
1153 */\r
1154 \r
1155 #if (__ARM_FEATURE_DSP == 1U)                             /* ToDo ARMCLANG: This should be ARCH >= ARMv7-M + SIMD */\r
1156 \r
1157 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)\r
1158 {\r
1159   uint32_t result;\r
1160 \r
1161   __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1162   return(result);\r
1163 }\r
1164 \r
1165 __attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)\r
1166 {\r
1167   uint32_t result;\r
1168 \r
1169   __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1170   return(result);\r
1171 }\r
1172 \r
1173 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)\r
1174 {\r
1175   uint32_t result;\r
1176 \r
1177   __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1178   return(result);\r
1179 }\r
1180 \r
1181 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)\r
1182 {\r
1183   uint32_t result;\r
1184 \r
1185   __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1186   return(result);\r
1187 }\r
1188 \r
1189 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)\r
1190 {\r
1191   uint32_t result;\r
1192 \r
1193   __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1194   return(result);\r
1195 }\r
1196 \r
1197 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)\r
1198 {\r
1199   uint32_t result;\r
1200 \r
1201   __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1202   return(result);\r
1203 }\r
1204 \r
1205 \r
1206 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)\r
1207 {\r
1208   uint32_t result;\r
1209 \r
1210   __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1211   return(result);\r
1212 }\r
1213 \r
1214 __attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)\r
1215 {\r
1216   uint32_t result;\r
1217 \r
1218   __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1219   return(result);\r
1220 }\r
1221 \r
1222 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)\r
1223 {\r
1224   uint32_t result;\r
1225 \r
1226   __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1227   return(result);\r
1228 }\r
1229 \r
1230 __attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)\r
1231 {\r
1232   uint32_t result;\r
1233 \r
1234   __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1235   return(result);\r
1236 }\r
1237 \r
1238 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)\r
1239 {\r
1240   uint32_t result;\r
1241 \r
1242   __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1243   return(result);\r
1244 }\r
1245 \r
1246 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)\r
1247 {\r
1248   uint32_t result;\r
1249 \r
1250   __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1251   return(result);\r
1252 }\r
1253 \r
1254 \r
1255 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)\r
1256 {\r
1257   uint32_t result;\r
1258 \r
1259   __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1260   return(result);\r
1261 }\r
1262 \r
1263 __attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)\r
1264 {\r
1265   uint32_t result;\r
1266 \r
1267   __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1268   return(result);\r
1269 }\r
1270 \r
1271 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)\r
1272 {\r
1273   uint32_t result;\r
1274 \r
1275   __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1276   return(result);\r
1277 }\r
1278 \r
1279 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)\r
1280 {\r
1281   uint32_t result;\r
1282 \r
1283   __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1284   return(result);\r
1285 }\r
1286 \r
1287 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)\r
1288 {\r
1289   uint32_t result;\r
1290 \r
1291   __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1292   return(result);\r
1293 }\r
1294 \r
1295 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)\r
1296 {\r
1297   uint32_t result;\r
1298 \r
1299   __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1300   return(result);\r
1301 }\r
1302 \r
1303 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)\r
1304 {\r
1305   uint32_t result;\r
1306 \r
1307   __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1308   return(result);\r
1309 }\r
1310 \r
1311 __attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)\r
1312 {\r
1313   uint32_t result;\r
1314 \r
1315   __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1316   return(result);\r
1317 }\r
1318 \r
1319 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)\r
1320 {\r
1321   uint32_t result;\r
1322 \r
1323   __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1324   return(result);\r
1325 }\r
1326 \r
1327 __attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)\r
1328 {\r
1329   uint32_t result;\r
1330 \r
1331   __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1332   return(result);\r
1333 }\r
1334 \r
1335 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)\r
1336 {\r
1337   uint32_t result;\r
1338 \r
1339   __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1340   return(result);\r
1341 }\r
1342 \r
1343 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)\r
1344 {\r
1345   uint32_t result;\r
1346 \r
1347   __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1348   return(result);\r
1349 }\r
1350 \r
1351 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)\r
1352 {\r
1353   uint32_t result;\r
1354 \r
1355   __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1356   return(result);\r
1357 }\r
1358 \r
1359 __attribute__((always_inline)) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)\r
1360 {\r
1361   uint32_t result;\r
1362 \r
1363   __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1364   return(result);\r
1365 }\r
1366 \r
1367 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)\r
1368 {\r
1369   uint32_t result;\r
1370 \r
1371   __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1372   return(result);\r
1373 }\r
1374 \r
1375 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)\r
1376 {\r
1377   uint32_t result;\r
1378 \r
1379   __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1380   return(result);\r
1381 }\r
1382 \r
1383 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)\r
1384 {\r
1385   uint32_t result;\r
1386 \r
1387   __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1388   return(result);\r
1389 }\r
1390 \r
1391 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)\r
1392 {\r
1393   uint32_t result;\r
1394 \r
1395   __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1396   return(result);\r
1397 }\r
1398 \r
1399 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)\r
1400 {\r
1401   uint32_t result;\r
1402 \r
1403   __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1404   return(result);\r
1405 }\r
1406 \r
1407 __attribute__((always_inline)) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)\r
1408 {\r
1409   uint32_t result;\r
1410 \r
1411   __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1412   return(result);\r
1413 }\r
1414 \r
1415 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)\r
1416 {\r
1417   uint32_t result;\r
1418 \r
1419   __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1420   return(result);\r
1421 }\r
1422 \r
1423 __attribute__((always_inline)) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)\r
1424 {\r
1425   uint32_t result;\r
1426 \r
1427   __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1428   return(result);\r
1429 }\r
1430 \r
1431 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)\r
1432 {\r
1433   uint32_t result;\r
1434 \r
1435   __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1436   return(result);\r
1437 }\r
1438 \r
1439 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)\r
1440 {\r
1441   uint32_t result;\r
1442 \r
1443   __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1444   return(result);\r
1445 }\r
1446 \r
1447 __attribute__((always_inline)) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)\r
1448 {\r
1449   uint32_t result;\r
1450 \r
1451   __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1452   return(result);\r
1453 }\r
1454 \r
1455 __attribute__((always_inline)) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)\r
1456 {\r
1457   uint32_t result;\r
1458 \r
1459   __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );\r
1460   return(result);\r
1461 }\r
1462 \r
1463 #define __SSAT16(ARG1,ARG2) \\r
1464 ({                          \\r
1465   int32_t __RES, __ARG1 = (ARG1); \\r
1466   __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \\r
1467   __RES; \\r
1468  })\r
1469 \r
1470 #define __USAT16(ARG1,ARG2) \\r
1471 ({                          \\r
1472   uint32_t __RES, __ARG1 = (ARG1); \\r
1473   __ASM ("usat16 %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \\r
1474   __RES; \\r
1475  })\r
1476 \r
1477 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1)\r
1478 {\r
1479   uint32_t result;\r
1480 \r
1481   __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1));\r
1482   return(result);\r
1483 }\r
1484 \r
1485 __attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)\r
1486 {\r
1487   uint32_t result;\r
1488 \r
1489   __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1490   return(result);\r
1491 }\r
1492 \r
1493 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1)\r
1494 {\r
1495   uint32_t result;\r
1496 \r
1497   __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1));\r
1498   return(result);\r
1499 }\r
1500 \r
1501 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)\r
1502 {\r
1503   uint32_t result;\r
1504 \r
1505   __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1506   return(result);\r
1507 }\r
1508 \r
1509 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUAD  (uint32_t op1, uint32_t op2)\r
1510 {\r
1511   uint32_t result;\r
1512 \r
1513   __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1514   return(result);\r
1515 }\r
1516 \r
1517 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)\r
1518 {\r
1519   uint32_t result;\r
1520 \r
1521   __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1522   return(result);\r
1523 }\r
1524 \r
1525 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)\r
1526 {\r
1527   uint32_t result;\r
1528 \r
1529   __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );\r
1530   return(result);\r
1531 }\r
1532 \r
1533 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)\r
1534 {\r
1535   uint32_t result;\r
1536 \r
1537   __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );\r
1538   return(result);\r
1539 }\r
1540 \r
1541 __attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc)\r
1542 {\r
1543   union llreg_u{\r
1544     uint32_t w32[2];\r
1545     uint64_t w64;\r
1546   } llr;\r
1547   llr.w64 = acc;\r
1548 \r
1549 #ifndef __ARMEB__   /* Little endian */\r
1550   __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );\r
1551 #else               /* Big endian */\r
1552   __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );\r
1553 #endif\r
1554 \r
1555   return(llr.w64);\r
1556 }\r
1557 \r
1558 __attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc)\r
1559 {\r
1560   union llreg_u{\r
1561     uint32_t w32[2];\r
1562     uint64_t w64;\r
1563   } llr;\r
1564   llr.w64 = acc;\r
1565 \r
1566 #ifndef __ARMEB__   /* Little endian */\r
1567   __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );\r
1568 #else               /* Big endian */\r
1569   __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );\r
1570 #endif\r
1571 \r
1572   return(llr.w64);\r
1573 }\r
1574 \r
1575 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSD  (uint32_t op1, uint32_t op2)\r
1576 {\r
1577   uint32_t result;\r
1578 \r
1579   __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1580   return(result);\r
1581 }\r
1582 \r
1583 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)\r
1584 {\r
1585   uint32_t result;\r
1586 \r
1587   __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1588   return(result);\r
1589 }\r
1590 \r
1591 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)\r
1592 {\r
1593   uint32_t result;\r
1594 \r
1595   __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );\r
1596   return(result);\r
1597 }\r
1598 \r
1599 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)\r
1600 {\r
1601   uint32_t result;\r
1602 \r
1603   __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );\r
1604   return(result);\r
1605 }\r
1606 \r
1607 __attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc)\r
1608 {\r
1609   union llreg_u{\r
1610     uint32_t w32[2];\r
1611     uint64_t w64;\r
1612   } llr;\r
1613   llr.w64 = acc;\r
1614 \r
1615 #ifndef __ARMEB__   /* Little endian */\r
1616   __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );\r
1617 #else               /* Big endian */\r
1618   __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );\r
1619 #endif\r
1620 \r
1621   return(llr.w64);\r
1622 }\r
1623 \r
1624 __attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc)\r
1625 {\r
1626   union llreg_u{\r
1627     uint32_t w32[2];\r
1628     uint64_t w64;\r
1629   } llr;\r
1630   llr.w64 = acc;\r
1631 \r
1632 #ifndef __ARMEB__   /* Little endian */\r
1633   __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );\r
1634 #else               /* Big endian */\r
1635   __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );\r
1636 #endif\r
1637 \r
1638   return(llr.w64);\r
1639 }\r
1640 \r
1641 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SEL  (uint32_t op1, uint32_t op2)\r
1642 {\r
1643   uint32_t result;\r
1644 \r
1645   __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1646   return(result);\r
1647 }\r
1648 \r
1649 __attribute__((always_inline)) __STATIC_INLINE  int32_t __QADD( int32_t op1,  int32_t op2)\r
1650 {\r
1651   int32_t result;\r
1652 \r
1653   __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1654   return(result);\r
1655 }\r
1656 \r
1657 __attribute__((always_inline)) __STATIC_INLINE  int32_t __QSUB( int32_t op1,  int32_t op2)\r
1658 {\r
1659   int32_t result;\r
1660 \r
1661   __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );\r
1662   return(result);\r
1663 }\r
1664 \r
1665 #define __PKHBT(ARG1,ARG2,ARG3) \\r
1666 ({                          \\r
1667   uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\r
1668   __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2), "I" (ARG3)  ); \\r
1669   __RES; \\r
1670  })\r
1671 \r
1672 #define __PKHTB(ARG1,ARG2,ARG3) \\r
1673 ({                          \\r
1674   uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\r
1675   if (ARG3 == 0) \\r
1676     __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2)  ); \\r
1677   else \\r
1678     __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2), "I" (ARG3)  ); \\r
1679   __RES; \\r
1680  })\r
1681 \r
1682 __attribute__((always_inline)) __STATIC_INLINE uint32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)\r
1683 {\r
1684  int32_t result;\r
1685 \r
1686  __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r"  (op1), "r" (op2), "r" (op3) );\r
1687  return(result);\r
1688 }\r
1689 \r
1690 #endif /* (__ARM_FEATURE_DSP == 1U) */\r
1691 /*@} end of group CMSIS_SIMD_intrinsics */\r
1692 \r
1693 \r
1694 #endif /* __CMSIS_ARMCLANG_H */\r