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