xref: /btstack/port/stm32-l451-miromico-sx1280/Drivers/CMSIS/Include/cmsis_armcc.h (revision 2fd737d36a1de5d778cacc671d4b4d8c4f3fed82)
1*2fd737d3SMatthias Ringwald /**************************************************************************//**
2*2fd737d3SMatthias Ringwald  * @file     cmsis_armcc.h
3*2fd737d3SMatthias Ringwald  * @brief    CMSIS compiler ARMCC (Arm Compiler 5) header file
4*2fd737d3SMatthias Ringwald  * @version  V5.0.4
5*2fd737d3SMatthias Ringwald  * @date     10. January 2018
6*2fd737d3SMatthias Ringwald  ******************************************************************************/
7*2fd737d3SMatthias Ringwald /*
8*2fd737d3SMatthias Ringwald  * Copyright (c) 2009-2018 Arm Limited. All rights reserved.
9*2fd737d3SMatthias Ringwald  *
10*2fd737d3SMatthias Ringwald  * SPDX-License-Identifier: Apache-2.0
11*2fd737d3SMatthias Ringwald  *
12*2fd737d3SMatthias Ringwald  * Licensed under the Apache License, Version 2.0 (the License); you may
13*2fd737d3SMatthias Ringwald  * not use this file except in compliance with the License.
14*2fd737d3SMatthias Ringwald  * You may obtain a copy of the License at
15*2fd737d3SMatthias Ringwald  *
16*2fd737d3SMatthias Ringwald  * www.apache.org/licenses/LICENSE-2.0
17*2fd737d3SMatthias Ringwald  *
18*2fd737d3SMatthias Ringwald  * Unless required by applicable law or agreed to in writing, software
19*2fd737d3SMatthias Ringwald  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
20*2fd737d3SMatthias Ringwald  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21*2fd737d3SMatthias Ringwald  * See the License for the specific language governing permissions and
22*2fd737d3SMatthias Ringwald  * limitations under the License.
23*2fd737d3SMatthias Ringwald  */
24*2fd737d3SMatthias Ringwald 
25*2fd737d3SMatthias Ringwald #ifndef __CMSIS_ARMCC_H
26*2fd737d3SMatthias Ringwald #define __CMSIS_ARMCC_H
27*2fd737d3SMatthias Ringwald 
28*2fd737d3SMatthias Ringwald 
29*2fd737d3SMatthias Ringwald #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677)
30*2fd737d3SMatthias Ringwald   #error "Please use Arm Compiler Toolchain V4.0.677 or later!"
31*2fd737d3SMatthias Ringwald #endif
32*2fd737d3SMatthias Ringwald 
33*2fd737d3SMatthias Ringwald /* CMSIS compiler control architecture macros */
34*2fd737d3SMatthias Ringwald #if ((defined (__TARGET_ARCH_6_M  ) && (__TARGET_ARCH_6_M   == 1)) || \
35*2fd737d3SMatthias Ringwald      (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M  == 1))   )
36*2fd737d3SMatthias Ringwald   #define __ARM_ARCH_6M__           1
37*2fd737d3SMatthias Ringwald #endif
38*2fd737d3SMatthias Ringwald 
39*2fd737d3SMatthias Ringwald #if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M  == 1))
40*2fd737d3SMatthias Ringwald   #define __ARM_ARCH_7M__           1
41*2fd737d3SMatthias Ringwald #endif
42*2fd737d3SMatthias Ringwald 
43*2fd737d3SMatthias Ringwald #if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1))
44*2fd737d3SMatthias Ringwald   #define __ARM_ARCH_7EM__          1
45*2fd737d3SMatthias Ringwald #endif
46*2fd737d3SMatthias Ringwald 
47*2fd737d3SMatthias Ringwald   /* __ARM_ARCH_8M_BASE__  not applicable */
48*2fd737d3SMatthias Ringwald   /* __ARM_ARCH_8M_MAIN__  not applicable */
49*2fd737d3SMatthias Ringwald 
50*2fd737d3SMatthias Ringwald 
51*2fd737d3SMatthias Ringwald /* CMSIS compiler specific defines */
52*2fd737d3SMatthias Ringwald #ifndef   __ASM
53*2fd737d3SMatthias Ringwald   #define __ASM                                  __asm
54*2fd737d3SMatthias Ringwald #endif
55*2fd737d3SMatthias Ringwald #ifndef   __INLINE
56*2fd737d3SMatthias Ringwald   #define __INLINE                               __inline
57*2fd737d3SMatthias Ringwald #endif
58*2fd737d3SMatthias Ringwald #ifndef   __STATIC_INLINE
59*2fd737d3SMatthias Ringwald   #define __STATIC_INLINE                        static __inline
60*2fd737d3SMatthias Ringwald #endif
61*2fd737d3SMatthias Ringwald #ifndef   __STATIC_FORCEINLINE
62*2fd737d3SMatthias Ringwald   #define __STATIC_FORCEINLINE                   static __forceinline
63*2fd737d3SMatthias Ringwald #endif
64*2fd737d3SMatthias Ringwald #ifndef   __NO_RETURN
65*2fd737d3SMatthias Ringwald   #define __NO_RETURN                            __declspec(noreturn)
66*2fd737d3SMatthias Ringwald #endif
67*2fd737d3SMatthias Ringwald #ifndef   __USED
68*2fd737d3SMatthias Ringwald   #define __USED                                 __attribute__((used))
69*2fd737d3SMatthias Ringwald #endif
70*2fd737d3SMatthias Ringwald #ifndef   __WEAK
71*2fd737d3SMatthias Ringwald   #define __WEAK                                 __attribute__((weak))
72*2fd737d3SMatthias Ringwald #endif
73*2fd737d3SMatthias Ringwald #ifndef   __PACKED
74*2fd737d3SMatthias Ringwald   #define __PACKED                               __attribute__((packed))
75*2fd737d3SMatthias Ringwald #endif
76*2fd737d3SMatthias Ringwald #ifndef   __PACKED_STRUCT
77*2fd737d3SMatthias Ringwald   #define __PACKED_STRUCT                        __packed struct
78*2fd737d3SMatthias Ringwald #endif
79*2fd737d3SMatthias Ringwald #ifndef   __PACKED_UNION
80*2fd737d3SMatthias Ringwald   #define __PACKED_UNION                         __packed union
81*2fd737d3SMatthias Ringwald #endif
82*2fd737d3SMatthias Ringwald #ifndef   __UNALIGNED_UINT32        /* deprecated */
83*2fd737d3SMatthias Ringwald   #define __UNALIGNED_UINT32(x)                  (*((__packed uint32_t *)(x)))
84*2fd737d3SMatthias Ringwald #endif
85*2fd737d3SMatthias Ringwald #ifndef   __UNALIGNED_UINT16_WRITE
86*2fd737d3SMatthias Ringwald   #define __UNALIGNED_UINT16_WRITE(addr, val)    ((*((__packed uint16_t *)(addr))) = (val))
87*2fd737d3SMatthias Ringwald #endif
88*2fd737d3SMatthias Ringwald #ifndef   __UNALIGNED_UINT16_READ
89*2fd737d3SMatthias Ringwald   #define __UNALIGNED_UINT16_READ(addr)          (*((const __packed uint16_t *)(addr)))
90*2fd737d3SMatthias Ringwald #endif
91*2fd737d3SMatthias Ringwald #ifndef   __UNALIGNED_UINT32_WRITE
92*2fd737d3SMatthias Ringwald   #define __UNALIGNED_UINT32_WRITE(addr, val)    ((*((__packed uint32_t *)(addr))) = (val))
93*2fd737d3SMatthias Ringwald #endif
94*2fd737d3SMatthias Ringwald #ifndef   __UNALIGNED_UINT32_READ
95*2fd737d3SMatthias Ringwald   #define __UNALIGNED_UINT32_READ(addr)          (*((const __packed uint32_t *)(addr)))
96*2fd737d3SMatthias Ringwald #endif
97*2fd737d3SMatthias Ringwald #ifndef   __ALIGNED
98*2fd737d3SMatthias Ringwald   #define __ALIGNED(x)                           __attribute__((aligned(x)))
99*2fd737d3SMatthias Ringwald #endif
100*2fd737d3SMatthias Ringwald #ifndef   __RESTRICT
101*2fd737d3SMatthias Ringwald   #define __RESTRICT                             __restrict
102*2fd737d3SMatthias Ringwald #endif
103*2fd737d3SMatthias Ringwald 
104*2fd737d3SMatthias Ringwald /* ###########################  Core Function Access  ########################### */
105*2fd737d3SMatthias Ringwald /** \ingroup  CMSIS_Core_FunctionInterface
106*2fd737d3SMatthias Ringwald     \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
107*2fd737d3SMatthias Ringwald   @{
108*2fd737d3SMatthias Ringwald  */
109*2fd737d3SMatthias Ringwald 
110*2fd737d3SMatthias Ringwald /**
111*2fd737d3SMatthias Ringwald   \brief   Enable IRQ Interrupts
112*2fd737d3SMatthias Ringwald   \details Enables IRQ interrupts by clearing the I-bit in the CPSR.
113*2fd737d3SMatthias Ringwald            Can only be executed in Privileged modes.
114*2fd737d3SMatthias Ringwald  */
115*2fd737d3SMatthias Ringwald /* intrinsic void __enable_irq();     */
116*2fd737d3SMatthias Ringwald 
117*2fd737d3SMatthias Ringwald 
118*2fd737d3SMatthias Ringwald /**
119*2fd737d3SMatthias Ringwald   \brief   Disable IRQ Interrupts
120*2fd737d3SMatthias Ringwald   \details Disables IRQ interrupts by setting the I-bit in the CPSR.
121*2fd737d3SMatthias Ringwald            Can only be executed in Privileged modes.
122*2fd737d3SMatthias Ringwald  */
123*2fd737d3SMatthias Ringwald /* intrinsic void __disable_irq();    */
124*2fd737d3SMatthias Ringwald 
125*2fd737d3SMatthias Ringwald /**
126*2fd737d3SMatthias Ringwald   \brief   Get Control Register
127*2fd737d3SMatthias Ringwald   \details Returns the content of the Control Register.
128*2fd737d3SMatthias Ringwald   \return               Control Register value
129*2fd737d3SMatthias Ringwald  */
__get_CONTROL(void)130*2fd737d3SMatthias Ringwald __STATIC_INLINE uint32_t __get_CONTROL(void)
131*2fd737d3SMatthias Ringwald {
132*2fd737d3SMatthias Ringwald   register uint32_t __regControl         __ASM("control");
133*2fd737d3SMatthias Ringwald   return(__regControl);
134*2fd737d3SMatthias Ringwald }
135*2fd737d3SMatthias Ringwald 
136*2fd737d3SMatthias Ringwald 
137*2fd737d3SMatthias Ringwald /**
138*2fd737d3SMatthias Ringwald   \brief   Set Control Register
139*2fd737d3SMatthias Ringwald   \details Writes the given value to the Control Register.
140*2fd737d3SMatthias Ringwald   \param [in]    control  Control Register value to set
141*2fd737d3SMatthias Ringwald  */
__set_CONTROL(uint32_t control)142*2fd737d3SMatthias Ringwald __STATIC_INLINE void __set_CONTROL(uint32_t control)
143*2fd737d3SMatthias Ringwald {
144*2fd737d3SMatthias Ringwald   register uint32_t __regControl         __ASM("control");
145*2fd737d3SMatthias Ringwald   __regControl = control;
146*2fd737d3SMatthias Ringwald }
147*2fd737d3SMatthias Ringwald 
148*2fd737d3SMatthias Ringwald 
149*2fd737d3SMatthias Ringwald /**
150*2fd737d3SMatthias Ringwald   \brief   Get IPSR Register
151*2fd737d3SMatthias Ringwald   \details Returns the content of the IPSR Register.
152*2fd737d3SMatthias Ringwald   \return               IPSR Register value
153*2fd737d3SMatthias Ringwald  */
__get_IPSR(void)154*2fd737d3SMatthias Ringwald __STATIC_INLINE uint32_t __get_IPSR(void)
155*2fd737d3SMatthias Ringwald {
156*2fd737d3SMatthias Ringwald   register uint32_t __regIPSR          __ASM("ipsr");
157*2fd737d3SMatthias Ringwald   return(__regIPSR);
158*2fd737d3SMatthias Ringwald }
159*2fd737d3SMatthias Ringwald 
160*2fd737d3SMatthias Ringwald 
161*2fd737d3SMatthias Ringwald /**
162*2fd737d3SMatthias Ringwald   \brief   Get APSR Register
163*2fd737d3SMatthias Ringwald   \details Returns the content of the APSR Register.
164*2fd737d3SMatthias Ringwald   \return               APSR Register value
165*2fd737d3SMatthias Ringwald  */
__get_APSR(void)166*2fd737d3SMatthias Ringwald __STATIC_INLINE uint32_t __get_APSR(void)
167*2fd737d3SMatthias Ringwald {
168*2fd737d3SMatthias Ringwald   register uint32_t __regAPSR          __ASM("apsr");
169*2fd737d3SMatthias Ringwald   return(__regAPSR);
170*2fd737d3SMatthias Ringwald }
171*2fd737d3SMatthias Ringwald 
172*2fd737d3SMatthias Ringwald 
173*2fd737d3SMatthias Ringwald /**
174*2fd737d3SMatthias Ringwald   \brief   Get xPSR Register
175*2fd737d3SMatthias Ringwald   \details Returns the content of the xPSR Register.
176*2fd737d3SMatthias Ringwald   \return               xPSR Register value
177*2fd737d3SMatthias Ringwald  */
__get_xPSR(void)178*2fd737d3SMatthias Ringwald __STATIC_INLINE uint32_t __get_xPSR(void)
179*2fd737d3SMatthias Ringwald {
180*2fd737d3SMatthias Ringwald   register uint32_t __regXPSR          __ASM("xpsr");
181*2fd737d3SMatthias Ringwald   return(__regXPSR);
182*2fd737d3SMatthias Ringwald }
183*2fd737d3SMatthias Ringwald 
184*2fd737d3SMatthias Ringwald 
185*2fd737d3SMatthias Ringwald /**
186*2fd737d3SMatthias Ringwald   \brief   Get Process Stack Pointer
187*2fd737d3SMatthias Ringwald   \details Returns the current value of the Process Stack Pointer (PSP).
188*2fd737d3SMatthias Ringwald   \return               PSP Register value
189*2fd737d3SMatthias Ringwald  */
__get_PSP(void)190*2fd737d3SMatthias Ringwald __STATIC_INLINE uint32_t __get_PSP(void)
191*2fd737d3SMatthias Ringwald {
192*2fd737d3SMatthias Ringwald   register uint32_t __regProcessStackPointer  __ASM("psp");
193*2fd737d3SMatthias Ringwald   return(__regProcessStackPointer);
194*2fd737d3SMatthias Ringwald }
195*2fd737d3SMatthias Ringwald 
196*2fd737d3SMatthias Ringwald 
197*2fd737d3SMatthias Ringwald /**
198*2fd737d3SMatthias Ringwald   \brief   Set Process Stack Pointer
199*2fd737d3SMatthias Ringwald   \details Assigns the given value to the Process Stack Pointer (PSP).
200*2fd737d3SMatthias Ringwald   \param [in]    topOfProcStack  Process Stack Pointer value to set
201*2fd737d3SMatthias Ringwald  */
__set_PSP(uint32_t topOfProcStack)202*2fd737d3SMatthias Ringwald __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
203*2fd737d3SMatthias Ringwald {
204*2fd737d3SMatthias Ringwald   register uint32_t __regProcessStackPointer  __ASM("psp");
205*2fd737d3SMatthias Ringwald   __regProcessStackPointer = topOfProcStack;
206*2fd737d3SMatthias Ringwald }
207*2fd737d3SMatthias Ringwald 
208*2fd737d3SMatthias Ringwald 
209*2fd737d3SMatthias Ringwald /**
210*2fd737d3SMatthias Ringwald   \brief   Get Main Stack Pointer
211*2fd737d3SMatthias Ringwald   \details Returns the current value of the Main Stack Pointer (MSP).
212*2fd737d3SMatthias Ringwald   \return               MSP Register value
213*2fd737d3SMatthias Ringwald  */
__get_MSP(void)214*2fd737d3SMatthias Ringwald __STATIC_INLINE uint32_t __get_MSP(void)
215*2fd737d3SMatthias Ringwald {
216*2fd737d3SMatthias Ringwald   register uint32_t __regMainStackPointer     __ASM("msp");
217*2fd737d3SMatthias Ringwald   return(__regMainStackPointer);
218*2fd737d3SMatthias Ringwald }
219*2fd737d3SMatthias Ringwald 
220*2fd737d3SMatthias Ringwald 
221*2fd737d3SMatthias Ringwald /**
222*2fd737d3SMatthias Ringwald   \brief   Set Main Stack Pointer
223*2fd737d3SMatthias Ringwald   \details Assigns the given value to the Main Stack Pointer (MSP).
224*2fd737d3SMatthias Ringwald   \param [in]    topOfMainStack  Main Stack Pointer value to set
225*2fd737d3SMatthias Ringwald  */
__set_MSP(uint32_t topOfMainStack)226*2fd737d3SMatthias Ringwald __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
227*2fd737d3SMatthias Ringwald {
228*2fd737d3SMatthias Ringwald   register uint32_t __regMainStackPointer     __ASM("msp");
229*2fd737d3SMatthias Ringwald   __regMainStackPointer = topOfMainStack;
230*2fd737d3SMatthias Ringwald }
231*2fd737d3SMatthias Ringwald 
232*2fd737d3SMatthias Ringwald 
233*2fd737d3SMatthias Ringwald /**
234*2fd737d3SMatthias Ringwald   \brief   Get Priority Mask
235*2fd737d3SMatthias Ringwald   \details Returns the current state of the priority mask bit from the Priority Mask Register.
236*2fd737d3SMatthias Ringwald   \return               Priority Mask value
237*2fd737d3SMatthias Ringwald  */
__get_PRIMASK(void)238*2fd737d3SMatthias Ringwald __STATIC_INLINE uint32_t __get_PRIMASK(void)
239*2fd737d3SMatthias Ringwald {
240*2fd737d3SMatthias Ringwald   register uint32_t __regPriMask         __ASM("primask");
241*2fd737d3SMatthias Ringwald   return(__regPriMask);
242*2fd737d3SMatthias Ringwald }
243*2fd737d3SMatthias Ringwald 
244*2fd737d3SMatthias Ringwald 
245*2fd737d3SMatthias Ringwald /**
246*2fd737d3SMatthias Ringwald   \brief   Set Priority Mask
247*2fd737d3SMatthias Ringwald   \details Assigns the given value to the Priority Mask Register.
248*2fd737d3SMatthias Ringwald   \param [in]    priMask  Priority Mask
249*2fd737d3SMatthias Ringwald  */
__set_PRIMASK(uint32_t priMask)250*2fd737d3SMatthias Ringwald __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
251*2fd737d3SMatthias Ringwald {
252*2fd737d3SMatthias Ringwald   register uint32_t __regPriMask         __ASM("primask");
253*2fd737d3SMatthias Ringwald   __regPriMask = (priMask);
254*2fd737d3SMatthias Ringwald }
255*2fd737d3SMatthias Ringwald 
256*2fd737d3SMatthias Ringwald 
257*2fd737d3SMatthias Ringwald #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \
258*2fd737d3SMatthias Ringwald      (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     )
259*2fd737d3SMatthias Ringwald 
260*2fd737d3SMatthias Ringwald /**
261*2fd737d3SMatthias Ringwald   \brief   Enable FIQ
262*2fd737d3SMatthias Ringwald   \details Enables FIQ interrupts by clearing the F-bit in the CPSR.
263*2fd737d3SMatthias Ringwald            Can only be executed in Privileged modes.
264*2fd737d3SMatthias Ringwald  */
265*2fd737d3SMatthias Ringwald #define __enable_fault_irq                __enable_fiq
266*2fd737d3SMatthias Ringwald 
267*2fd737d3SMatthias Ringwald 
268*2fd737d3SMatthias Ringwald /**
269*2fd737d3SMatthias Ringwald   \brief   Disable FIQ
270*2fd737d3SMatthias Ringwald   \details Disables FIQ interrupts by setting the F-bit in the CPSR.
271*2fd737d3SMatthias Ringwald            Can only be executed in Privileged modes.
272*2fd737d3SMatthias Ringwald  */
273*2fd737d3SMatthias Ringwald #define __disable_fault_irq               __disable_fiq
274*2fd737d3SMatthias Ringwald 
275*2fd737d3SMatthias Ringwald 
276*2fd737d3SMatthias Ringwald /**
277*2fd737d3SMatthias Ringwald   \brief   Get Base Priority
278*2fd737d3SMatthias Ringwald   \details Returns the current value of the Base Priority register.
279*2fd737d3SMatthias Ringwald   \return               Base Priority register value
280*2fd737d3SMatthias Ringwald  */
__get_BASEPRI(void)281*2fd737d3SMatthias Ringwald __STATIC_INLINE uint32_t  __get_BASEPRI(void)
282*2fd737d3SMatthias Ringwald {
283*2fd737d3SMatthias Ringwald   register uint32_t __regBasePri         __ASM("basepri");
284*2fd737d3SMatthias Ringwald   return(__regBasePri);
285*2fd737d3SMatthias Ringwald }
286*2fd737d3SMatthias Ringwald 
287*2fd737d3SMatthias Ringwald 
288*2fd737d3SMatthias Ringwald /**
289*2fd737d3SMatthias Ringwald   \brief   Set Base Priority
290*2fd737d3SMatthias Ringwald   \details Assigns the given value to the Base Priority register.
291*2fd737d3SMatthias Ringwald   \param [in]    basePri  Base Priority value to set
292*2fd737d3SMatthias Ringwald  */
__set_BASEPRI(uint32_t basePri)293*2fd737d3SMatthias Ringwald __STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
294*2fd737d3SMatthias Ringwald {
295*2fd737d3SMatthias Ringwald   register uint32_t __regBasePri         __ASM("basepri");
296*2fd737d3SMatthias Ringwald   __regBasePri = (basePri & 0xFFU);
297*2fd737d3SMatthias Ringwald }
298*2fd737d3SMatthias Ringwald 
299*2fd737d3SMatthias Ringwald 
300*2fd737d3SMatthias Ringwald /**
301*2fd737d3SMatthias Ringwald   \brief   Set Base Priority with condition
302*2fd737d3SMatthias Ringwald   \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,
303*2fd737d3SMatthias Ringwald            or the new value increases the BASEPRI priority level.
304*2fd737d3SMatthias Ringwald   \param [in]    basePri  Base Priority value to set
305*2fd737d3SMatthias Ringwald  */
__set_BASEPRI_MAX(uint32_t basePri)306*2fd737d3SMatthias Ringwald __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri)
307*2fd737d3SMatthias Ringwald {
308*2fd737d3SMatthias Ringwald   register uint32_t __regBasePriMax      __ASM("basepri_max");
309*2fd737d3SMatthias Ringwald   __regBasePriMax = (basePri & 0xFFU);
310*2fd737d3SMatthias Ringwald }
311*2fd737d3SMatthias Ringwald 
312*2fd737d3SMatthias Ringwald 
313*2fd737d3SMatthias Ringwald /**
314*2fd737d3SMatthias Ringwald   \brief   Get Fault Mask
315*2fd737d3SMatthias Ringwald   \details Returns the current value of the Fault Mask register.
316*2fd737d3SMatthias Ringwald   \return               Fault Mask register value
317*2fd737d3SMatthias Ringwald  */
__get_FAULTMASK(void)318*2fd737d3SMatthias Ringwald __STATIC_INLINE uint32_t __get_FAULTMASK(void)
319*2fd737d3SMatthias Ringwald {
320*2fd737d3SMatthias Ringwald   register uint32_t __regFaultMask       __ASM("faultmask");
321*2fd737d3SMatthias Ringwald   return(__regFaultMask);
322*2fd737d3SMatthias Ringwald }
323*2fd737d3SMatthias Ringwald 
324*2fd737d3SMatthias Ringwald 
325*2fd737d3SMatthias Ringwald /**
326*2fd737d3SMatthias Ringwald   \brief   Set Fault Mask
327*2fd737d3SMatthias Ringwald   \details Assigns the given value to the Fault Mask register.
328*2fd737d3SMatthias Ringwald   \param [in]    faultMask  Fault Mask value to set
329*2fd737d3SMatthias Ringwald  */
__set_FAULTMASK(uint32_t faultMask)330*2fd737d3SMatthias Ringwald __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
331*2fd737d3SMatthias Ringwald {
332*2fd737d3SMatthias Ringwald   register uint32_t __regFaultMask       __ASM("faultmask");
333*2fd737d3SMatthias Ringwald   __regFaultMask = (faultMask & (uint32_t)1U);
334*2fd737d3SMatthias Ringwald }
335*2fd737d3SMatthias Ringwald 
336*2fd737d3SMatthias Ringwald #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \
337*2fd737d3SMatthias Ringwald            (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */
338*2fd737d3SMatthias Ringwald 
339*2fd737d3SMatthias Ringwald 
340*2fd737d3SMatthias Ringwald /**
341*2fd737d3SMatthias Ringwald   \brief   Get FPSCR
342*2fd737d3SMatthias Ringwald   \details Returns the current value of the Floating Point Status/Control register.
343*2fd737d3SMatthias Ringwald   \return               Floating Point Status/Control register value
344*2fd737d3SMatthias Ringwald  */
__get_FPSCR(void)345*2fd737d3SMatthias Ringwald __STATIC_INLINE uint32_t __get_FPSCR(void)
346*2fd737d3SMatthias Ringwald {
347*2fd737d3SMatthias Ringwald #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
348*2fd737d3SMatthias Ringwald      (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )
349*2fd737d3SMatthias Ringwald   register uint32_t __regfpscr         __ASM("fpscr");
350*2fd737d3SMatthias Ringwald   return(__regfpscr);
351*2fd737d3SMatthias Ringwald #else
352*2fd737d3SMatthias Ringwald    return(0U);
353*2fd737d3SMatthias Ringwald #endif
354*2fd737d3SMatthias Ringwald }
355*2fd737d3SMatthias Ringwald 
356*2fd737d3SMatthias Ringwald 
357*2fd737d3SMatthias Ringwald /**
358*2fd737d3SMatthias Ringwald   \brief   Set FPSCR
359*2fd737d3SMatthias Ringwald   \details Assigns the given value to the Floating Point Status/Control register.
360*2fd737d3SMatthias Ringwald   \param [in]    fpscr  Floating Point Status/Control value to set
361*2fd737d3SMatthias Ringwald  */
__set_FPSCR(uint32_t fpscr)362*2fd737d3SMatthias Ringwald __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
363*2fd737d3SMatthias Ringwald {
364*2fd737d3SMatthias Ringwald #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
365*2fd737d3SMatthias Ringwald      (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )
366*2fd737d3SMatthias Ringwald   register uint32_t __regfpscr         __ASM("fpscr");
367*2fd737d3SMatthias Ringwald   __regfpscr = (fpscr);
368*2fd737d3SMatthias Ringwald #else
369*2fd737d3SMatthias Ringwald   (void)fpscr;
370*2fd737d3SMatthias Ringwald #endif
371*2fd737d3SMatthias Ringwald }
372*2fd737d3SMatthias Ringwald 
373*2fd737d3SMatthias Ringwald 
374*2fd737d3SMatthias Ringwald /*@} end of CMSIS_Core_RegAccFunctions */
375*2fd737d3SMatthias Ringwald 
376*2fd737d3SMatthias Ringwald 
377*2fd737d3SMatthias Ringwald /* ##########################  Core Instruction Access  ######################### */
378*2fd737d3SMatthias Ringwald /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
379*2fd737d3SMatthias Ringwald   Access to dedicated instructions
380*2fd737d3SMatthias Ringwald   @{
381*2fd737d3SMatthias Ringwald */
382*2fd737d3SMatthias Ringwald 
383*2fd737d3SMatthias Ringwald /**
384*2fd737d3SMatthias Ringwald   \brief   No Operation
385*2fd737d3SMatthias Ringwald   \details No Operation does nothing. This instruction can be used for code alignment purposes.
386*2fd737d3SMatthias Ringwald  */
387*2fd737d3SMatthias Ringwald #define __NOP                             __nop
388*2fd737d3SMatthias Ringwald 
389*2fd737d3SMatthias Ringwald 
390*2fd737d3SMatthias Ringwald /**
391*2fd737d3SMatthias Ringwald   \brief   Wait For Interrupt
392*2fd737d3SMatthias Ringwald   \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.
393*2fd737d3SMatthias Ringwald  */
394*2fd737d3SMatthias Ringwald #define __WFI                             __wfi
395*2fd737d3SMatthias Ringwald 
396*2fd737d3SMatthias Ringwald 
397*2fd737d3SMatthias Ringwald /**
398*2fd737d3SMatthias Ringwald   \brief   Wait For Event
399*2fd737d3SMatthias Ringwald   \details Wait For Event is a hint instruction that permits the processor to enter
400*2fd737d3SMatthias Ringwald            a low-power state until one of a number of events occurs.
401*2fd737d3SMatthias Ringwald  */
402*2fd737d3SMatthias Ringwald #define __WFE                             __wfe
403*2fd737d3SMatthias Ringwald 
404*2fd737d3SMatthias Ringwald 
405*2fd737d3SMatthias Ringwald /**
406*2fd737d3SMatthias Ringwald   \brief   Send Event
407*2fd737d3SMatthias Ringwald   \details Send Event is a hint instruction. It causes an event to be signaled to the CPU.
408*2fd737d3SMatthias Ringwald  */
409*2fd737d3SMatthias Ringwald #define __SEV                             __sev
410*2fd737d3SMatthias Ringwald 
411*2fd737d3SMatthias Ringwald 
412*2fd737d3SMatthias Ringwald /**
413*2fd737d3SMatthias Ringwald   \brief   Instruction Synchronization Barrier
414*2fd737d3SMatthias Ringwald   \details Instruction Synchronization Barrier flushes the pipeline in the processor,
415*2fd737d3SMatthias Ringwald            so that all instructions following the ISB are fetched from cache or memory,
416*2fd737d3SMatthias Ringwald            after the instruction has been completed.
417*2fd737d3SMatthias Ringwald  */
418*2fd737d3SMatthias Ringwald #define __ISB() do {\
419*2fd737d3SMatthias Ringwald                    __schedule_barrier();\
420*2fd737d3SMatthias Ringwald                    __isb(0xF);\
421*2fd737d3SMatthias Ringwald                    __schedule_barrier();\
422*2fd737d3SMatthias Ringwald                 } while (0U)
423*2fd737d3SMatthias Ringwald 
424*2fd737d3SMatthias Ringwald /**
425*2fd737d3SMatthias Ringwald   \brief   Data Synchronization Barrier
426*2fd737d3SMatthias Ringwald   \details Acts as a special kind of Data Memory Barrier.
427*2fd737d3SMatthias Ringwald            It completes when all explicit memory accesses before this instruction complete.
428*2fd737d3SMatthias Ringwald  */
429*2fd737d3SMatthias Ringwald #define __DSB() do {\
430*2fd737d3SMatthias Ringwald                    __schedule_barrier();\
431*2fd737d3SMatthias Ringwald                    __dsb(0xF);\
432*2fd737d3SMatthias Ringwald                    __schedule_barrier();\
433*2fd737d3SMatthias Ringwald                 } while (0U)
434*2fd737d3SMatthias Ringwald 
435*2fd737d3SMatthias Ringwald /**
436*2fd737d3SMatthias Ringwald   \brief   Data Memory Barrier
437*2fd737d3SMatthias Ringwald   \details Ensures the apparent order of the explicit memory operations before
438*2fd737d3SMatthias Ringwald            and after the instruction, without ensuring their completion.
439*2fd737d3SMatthias Ringwald  */
440*2fd737d3SMatthias Ringwald #define __DMB() do {\
441*2fd737d3SMatthias Ringwald                    __schedule_barrier();\
442*2fd737d3SMatthias Ringwald                    __dmb(0xF);\
443*2fd737d3SMatthias Ringwald                    __schedule_barrier();\
444*2fd737d3SMatthias Ringwald                 } while (0U)
445*2fd737d3SMatthias Ringwald 
446*2fd737d3SMatthias Ringwald 
447*2fd737d3SMatthias Ringwald /**
448*2fd737d3SMatthias Ringwald   \brief   Reverse byte order (32 bit)
449*2fd737d3SMatthias Ringwald   \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
450*2fd737d3SMatthias Ringwald   \param [in]    value  Value to reverse
451*2fd737d3SMatthias Ringwald   \return               Reversed value
452*2fd737d3SMatthias Ringwald  */
453*2fd737d3SMatthias Ringwald #define __REV                             __rev
454*2fd737d3SMatthias Ringwald 
455*2fd737d3SMatthias Ringwald 
456*2fd737d3SMatthias Ringwald /**
457*2fd737d3SMatthias Ringwald   \brief   Reverse byte order (16 bit)
458*2fd737d3SMatthias Ringwald   \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
459*2fd737d3SMatthias Ringwald   \param [in]    value  Value to reverse
460*2fd737d3SMatthias Ringwald   \return               Reversed value
461*2fd737d3SMatthias Ringwald  */
462*2fd737d3SMatthias Ringwald #ifndef __NO_EMBEDDED_ASM
__REV16(uint32_t value)463*2fd737d3SMatthias Ringwald __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
464*2fd737d3SMatthias Ringwald {
465*2fd737d3SMatthias Ringwald   rev16 r0, r0
466*2fd737d3SMatthias Ringwald   bx lr
467*2fd737d3SMatthias Ringwald }
468*2fd737d3SMatthias Ringwald #endif
469*2fd737d3SMatthias Ringwald 
470*2fd737d3SMatthias Ringwald 
471*2fd737d3SMatthias Ringwald /**
472*2fd737d3SMatthias Ringwald   \brief   Reverse byte order (16 bit)
473*2fd737d3SMatthias Ringwald   \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
474*2fd737d3SMatthias Ringwald   \param [in]    value  Value to reverse
475*2fd737d3SMatthias Ringwald   \return               Reversed value
476*2fd737d3SMatthias Ringwald  */
477*2fd737d3SMatthias Ringwald #ifndef __NO_EMBEDDED_ASM
__REVSH(int16_t value)478*2fd737d3SMatthias Ringwald __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)
479*2fd737d3SMatthias Ringwald {
480*2fd737d3SMatthias Ringwald   revsh r0, r0
481*2fd737d3SMatthias Ringwald   bx lr
482*2fd737d3SMatthias Ringwald }
483*2fd737d3SMatthias Ringwald #endif
484*2fd737d3SMatthias Ringwald 
485*2fd737d3SMatthias Ringwald 
486*2fd737d3SMatthias Ringwald /**
487*2fd737d3SMatthias Ringwald   \brief   Rotate Right in unsigned value (32 bit)
488*2fd737d3SMatthias Ringwald   \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
489*2fd737d3SMatthias Ringwald   \param [in]    op1  Value to rotate
490*2fd737d3SMatthias Ringwald   \param [in]    op2  Number of Bits to rotate
491*2fd737d3SMatthias Ringwald   \return               Rotated value
492*2fd737d3SMatthias Ringwald  */
493*2fd737d3SMatthias Ringwald #define __ROR                             __ror
494*2fd737d3SMatthias Ringwald 
495*2fd737d3SMatthias Ringwald 
496*2fd737d3SMatthias Ringwald /**
497*2fd737d3SMatthias Ringwald   \brief   Breakpoint
498*2fd737d3SMatthias Ringwald   \details Causes the processor to enter Debug state.
499*2fd737d3SMatthias Ringwald            Debug tools can use this to investigate system state when the instruction at a particular address is reached.
500*2fd737d3SMatthias Ringwald   \param [in]    value  is ignored by the processor.
501*2fd737d3SMatthias Ringwald                  If required, a debugger can use it to store additional information about the breakpoint.
502*2fd737d3SMatthias Ringwald  */
503*2fd737d3SMatthias Ringwald #define __BKPT(value)                       __breakpoint(value)
504*2fd737d3SMatthias Ringwald 
505*2fd737d3SMatthias Ringwald 
506*2fd737d3SMatthias Ringwald /**
507*2fd737d3SMatthias Ringwald   \brief   Reverse bit order of value
508*2fd737d3SMatthias Ringwald   \details Reverses the bit order of the given value.
509*2fd737d3SMatthias Ringwald   \param [in]    value  Value to reverse
510*2fd737d3SMatthias Ringwald   \return               Reversed value
511*2fd737d3SMatthias Ringwald  */
512*2fd737d3SMatthias Ringwald #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \
513*2fd737d3SMatthias Ringwald      (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     )
514*2fd737d3SMatthias Ringwald   #define __RBIT                          __rbit
515*2fd737d3SMatthias Ringwald #else
__RBIT(uint32_t value)516*2fd737d3SMatthias Ringwald __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
517*2fd737d3SMatthias Ringwald {
518*2fd737d3SMatthias Ringwald   uint32_t result;
519*2fd737d3SMatthias Ringwald   uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */
520*2fd737d3SMatthias Ringwald 
521*2fd737d3SMatthias Ringwald   result = value;                      /* r will be reversed bits of v; first get LSB of v */
522*2fd737d3SMatthias Ringwald   for (value >>= 1U; value != 0U; value >>= 1U)
523*2fd737d3SMatthias Ringwald   {
524*2fd737d3SMatthias Ringwald     result <<= 1U;
525*2fd737d3SMatthias Ringwald     result |= value & 1U;
526*2fd737d3SMatthias Ringwald     s--;
527*2fd737d3SMatthias Ringwald   }
528*2fd737d3SMatthias Ringwald   result <<= s;                        /* shift when v's highest bits are zero */
529*2fd737d3SMatthias Ringwald   return result;
530*2fd737d3SMatthias Ringwald }
531*2fd737d3SMatthias Ringwald #endif
532*2fd737d3SMatthias Ringwald 
533*2fd737d3SMatthias Ringwald 
534*2fd737d3SMatthias Ringwald /**
535*2fd737d3SMatthias Ringwald   \brief   Count leading zeros
536*2fd737d3SMatthias Ringwald   \details Counts the number of leading zeros of a data value.
537*2fd737d3SMatthias Ringwald   \param [in]  value  Value to count the leading zeros
538*2fd737d3SMatthias Ringwald   \return             number of leading zeros in value
539*2fd737d3SMatthias Ringwald  */
540*2fd737d3SMatthias Ringwald #define __CLZ                             __clz
541*2fd737d3SMatthias Ringwald 
542*2fd737d3SMatthias Ringwald 
543*2fd737d3SMatthias Ringwald #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \
544*2fd737d3SMatthias Ringwald      (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     )
545*2fd737d3SMatthias Ringwald 
546*2fd737d3SMatthias Ringwald /**
547*2fd737d3SMatthias Ringwald   \brief   LDR Exclusive (8 bit)
548*2fd737d3SMatthias Ringwald   \details Executes a exclusive LDR instruction for 8 bit value.
549*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to data
550*2fd737d3SMatthias Ringwald   \return             value of type uint8_t at (*ptr)
551*2fd737d3SMatthias Ringwald  */
552*2fd737d3SMatthias Ringwald #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
553*2fd737d3SMatthias Ringwald   #define __LDREXB(ptr)                                                        ((uint8_t ) __ldrex(ptr))
554*2fd737d3SMatthias Ringwald #else
555*2fd737d3SMatthias Ringwald   #define __LDREXB(ptr)          _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr))  _Pragma("pop")
556*2fd737d3SMatthias Ringwald #endif
557*2fd737d3SMatthias Ringwald 
558*2fd737d3SMatthias Ringwald 
559*2fd737d3SMatthias Ringwald /**
560*2fd737d3SMatthias Ringwald   \brief   LDR Exclusive (16 bit)
561*2fd737d3SMatthias Ringwald   \details Executes a exclusive LDR instruction for 16 bit values.
562*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to data
563*2fd737d3SMatthias Ringwald   \return        value of type uint16_t at (*ptr)
564*2fd737d3SMatthias Ringwald  */
565*2fd737d3SMatthias Ringwald #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
566*2fd737d3SMatthias Ringwald   #define __LDREXH(ptr)                                                        ((uint16_t) __ldrex(ptr))
567*2fd737d3SMatthias Ringwald #else
568*2fd737d3SMatthias Ringwald   #define __LDREXH(ptr)          _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr))  _Pragma("pop")
569*2fd737d3SMatthias Ringwald #endif
570*2fd737d3SMatthias Ringwald 
571*2fd737d3SMatthias Ringwald 
572*2fd737d3SMatthias Ringwald /**
573*2fd737d3SMatthias Ringwald   \brief   LDR Exclusive (32 bit)
574*2fd737d3SMatthias Ringwald   \details Executes a exclusive LDR instruction for 32 bit values.
575*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to data
576*2fd737d3SMatthias Ringwald   \return        value of type uint32_t at (*ptr)
577*2fd737d3SMatthias Ringwald  */
578*2fd737d3SMatthias Ringwald #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
579*2fd737d3SMatthias Ringwald   #define __LDREXW(ptr)                                                        ((uint32_t ) __ldrex(ptr))
580*2fd737d3SMatthias Ringwald #else
581*2fd737d3SMatthias Ringwald   #define __LDREXW(ptr)          _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr))  _Pragma("pop")
582*2fd737d3SMatthias Ringwald #endif
583*2fd737d3SMatthias Ringwald 
584*2fd737d3SMatthias Ringwald 
585*2fd737d3SMatthias Ringwald /**
586*2fd737d3SMatthias Ringwald   \brief   STR Exclusive (8 bit)
587*2fd737d3SMatthias Ringwald   \details Executes a exclusive STR instruction for 8 bit values.
588*2fd737d3SMatthias Ringwald   \param [in]  value  Value to store
589*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to location
590*2fd737d3SMatthias Ringwald   \return          0  Function succeeded
591*2fd737d3SMatthias Ringwald   \return          1  Function failed
592*2fd737d3SMatthias Ringwald  */
593*2fd737d3SMatthias Ringwald #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
594*2fd737d3SMatthias Ringwald   #define __STREXB(value, ptr)                                                 __strex(value, ptr)
595*2fd737d3SMatthias Ringwald #else
596*2fd737d3SMatthias Ringwald   #define __STREXB(value, ptr)   _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr)        _Pragma("pop")
597*2fd737d3SMatthias Ringwald #endif
598*2fd737d3SMatthias Ringwald 
599*2fd737d3SMatthias Ringwald 
600*2fd737d3SMatthias Ringwald /**
601*2fd737d3SMatthias Ringwald   \brief   STR Exclusive (16 bit)
602*2fd737d3SMatthias Ringwald   \details Executes a exclusive STR instruction for 16 bit values.
603*2fd737d3SMatthias Ringwald   \param [in]  value  Value to store
604*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to location
605*2fd737d3SMatthias Ringwald   \return          0  Function succeeded
606*2fd737d3SMatthias Ringwald   \return          1  Function failed
607*2fd737d3SMatthias Ringwald  */
608*2fd737d3SMatthias Ringwald #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
609*2fd737d3SMatthias Ringwald   #define __STREXH(value, ptr)                                                 __strex(value, ptr)
610*2fd737d3SMatthias Ringwald #else
611*2fd737d3SMatthias Ringwald   #define __STREXH(value, ptr)   _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr)        _Pragma("pop")
612*2fd737d3SMatthias Ringwald #endif
613*2fd737d3SMatthias Ringwald 
614*2fd737d3SMatthias Ringwald 
615*2fd737d3SMatthias Ringwald /**
616*2fd737d3SMatthias Ringwald   \brief   STR Exclusive (32 bit)
617*2fd737d3SMatthias Ringwald   \details Executes a exclusive STR instruction for 32 bit values.
618*2fd737d3SMatthias Ringwald   \param [in]  value  Value to store
619*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to location
620*2fd737d3SMatthias Ringwald   \return          0  Function succeeded
621*2fd737d3SMatthias Ringwald   \return          1  Function failed
622*2fd737d3SMatthias Ringwald  */
623*2fd737d3SMatthias Ringwald #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
624*2fd737d3SMatthias Ringwald   #define __STREXW(value, ptr)                                                 __strex(value, ptr)
625*2fd737d3SMatthias Ringwald #else
626*2fd737d3SMatthias Ringwald   #define __STREXW(value, ptr)   _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr)        _Pragma("pop")
627*2fd737d3SMatthias Ringwald #endif
628*2fd737d3SMatthias Ringwald 
629*2fd737d3SMatthias Ringwald 
630*2fd737d3SMatthias Ringwald /**
631*2fd737d3SMatthias Ringwald   \brief   Remove the exclusive lock
632*2fd737d3SMatthias Ringwald   \details Removes the exclusive lock which is created by LDREX.
633*2fd737d3SMatthias Ringwald  */
634*2fd737d3SMatthias Ringwald #define __CLREX                           __clrex
635*2fd737d3SMatthias Ringwald 
636*2fd737d3SMatthias Ringwald 
637*2fd737d3SMatthias Ringwald /**
638*2fd737d3SMatthias Ringwald   \brief   Signed Saturate
639*2fd737d3SMatthias Ringwald   \details Saturates a signed value.
640*2fd737d3SMatthias Ringwald   \param [in]  value  Value to be saturated
641*2fd737d3SMatthias Ringwald   \param [in]    sat  Bit position to saturate to (1..32)
642*2fd737d3SMatthias Ringwald   \return             Saturated value
643*2fd737d3SMatthias Ringwald  */
644*2fd737d3SMatthias Ringwald #define __SSAT                            __ssat
645*2fd737d3SMatthias Ringwald 
646*2fd737d3SMatthias Ringwald 
647*2fd737d3SMatthias Ringwald /**
648*2fd737d3SMatthias Ringwald   \brief   Unsigned Saturate
649*2fd737d3SMatthias Ringwald   \details Saturates an unsigned value.
650*2fd737d3SMatthias Ringwald   \param [in]  value  Value to be saturated
651*2fd737d3SMatthias Ringwald   \param [in]    sat  Bit position to saturate to (0..31)
652*2fd737d3SMatthias Ringwald   \return             Saturated value
653*2fd737d3SMatthias Ringwald  */
654*2fd737d3SMatthias Ringwald #define __USAT                            __usat
655*2fd737d3SMatthias Ringwald 
656*2fd737d3SMatthias Ringwald 
657*2fd737d3SMatthias Ringwald /**
658*2fd737d3SMatthias Ringwald   \brief   Rotate Right with Extend (32 bit)
659*2fd737d3SMatthias Ringwald   \details Moves each bit of a bitstring right by one bit.
660*2fd737d3SMatthias Ringwald            The carry input is shifted in at the left end of the bitstring.
661*2fd737d3SMatthias Ringwald   \param [in]    value  Value to rotate
662*2fd737d3SMatthias Ringwald   \return               Rotated value
663*2fd737d3SMatthias Ringwald  */
664*2fd737d3SMatthias Ringwald #ifndef __NO_EMBEDDED_ASM
__RRX(uint32_t value)665*2fd737d3SMatthias Ringwald __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
666*2fd737d3SMatthias Ringwald {
667*2fd737d3SMatthias Ringwald   rrx r0, r0
668*2fd737d3SMatthias Ringwald   bx lr
669*2fd737d3SMatthias Ringwald }
670*2fd737d3SMatthias Ringwald #endif
671*2fd737d3SMatthias Ringwald 
672*2fd737d3SMatthias Ringwald 
673*2fd737d3SMatthias Ringwald /**
674*2fd737d3SMatthias Ringwald   \brief   LDRT Unprivileged (8 bit)
675*2fd737d3SMatthias Ringwald   \details Executes a Unprivileged LDRT instruction for 8 bit value.
676*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to data
677*2fd737d3SMatthias Ringwald   \return             value of type uint8_t at (*ptr)
678*2fd737d3SMatthias Ringwald  */
679*2fd737d3SMatthias Ringwald #define __LDRBT(ptr)                      ((uint8_t )  __ldrt(ptr))
680*2fd737d3SMatthias Ringwald 
681*2fd737d3SMatthias Ringwald 
682*2fd737d3SMatthias Ringwald /**
683*2fd737d3SMatthias Ringwald   \brief   LDRT Unprivileged (16 bit)
684*2fd737d3SMatthias Ringwald   \details Executes a Unprivileged LDRT instruction for 16 bit values.
685*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to data
686*2fd737d3SMatthias Ringwald   \return        value of type uint16_t at (*ptr)
687*2fd737d3SMatthias Ringwald  */
688*2fd737d3SMatthias Ringwald #define __LDRHT(ptr)                      ((uint16_t)  __ldrt(ptr))
689*2fd737d3SMatthias Ringwald 
690*2fd737d3SMatthias Ringwald 
691*2fd737d3SMatthias Ringwald /**
692*2fd737d3SMatthias Ringwald   \brief   LDRT Unprivileged (32 bit)
693*2fd737d3SMatthias Ringwald   \details Executes a Unprivileged LDRT instruction for 32 bit values.
694*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to data
695*2fd737d3SMatthias Ringwald   \return        value of type uint32_t at (*ptr)
696*2fd737d3SMatthias Ringwald  */
697*2fd737d3SMatthias Ringwald #define __LDRT(ptr)                       ((uint32_t ) __ldrt(ptr))
698*2fd737d3SMatthias Ringwald 
699*2fd737d3SMatthias Ringwald 
700*2fd737d3SMatthias Ringwald /**
701*2fd737d3SMatthias Ringwald   \brief   STRT Unprivileged (8 bit)
702*2fd737d3SMatthias Ringwald   \details Executes a Unprivileged STRT instruction for 8 bit values.
703*2fd737d3SMatthias Ringwald   \param [in]  value  Value to store
704*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to location
705*2fd737d3SMatthias Ringwald  */
706*2fd737d3SMatthias Ringwald #define __STRBT(value, ptr)               __strt(value, ptr)
707*2fd737d3SMatthias Ringwald 
708*2fd737d3SMatthias Ringwald 
709*2fd737d3SMatthias Ringwald /**
710*2fd737d3SMatthias Ringwald   \brief   STRT Unprivileged (16 bit)
711*2fd737d3SMatthias Ringwald   \details Executes a Unprivileged STRT instruction for 16 bit values.
712*2fd737d3SMatthias Ringwald   \param [in]  value  Value to store
713*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to location
714*2fd737d3SMatthias Ringwald  */
715*2fd737d3SMatthias Ringwald #define __STRHT(value, ptr)               __strt(value, ptr)
716*2fd737d3SMatthias Ringwald 
717*2fd737d3SMatthias Ringwald 
718*2fd737d3SMatthias Ringwald /**
719*2fd737d3SMatthias Ringwald   \brief   STRT Unprivileged (32 bit)
720*2fd737d3SMatthias Ringwald   \details Executes a Unprivileged STRT instruction for 32 bit values.
721*2fd737d3SMatthias Ringwald   \param [in]  value  Value to store
722*2fd737d3SMatthias Ringwald   \param [in]    ptr  Pointer to location
723*2fd737d3SMatthias Ringwald  */
724*2fd737d3SMatthias Ringwald #define __STRT(value, ptr)                __strt(value, ptr)
725*2fd737d3SMatthias Ringwald 
726*2fd737d3SMatthias Ringwald #else  /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \
727*2fd737d3SMatthias Ringwald            (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */
728*2fd737d3SMatthias Ringwald 
729*2fd737d3SMatthias Ringwald /**
730*2fd737d3SMatthias Ringwald   \brief   Signed Saturate
731*2fd737d3SMatthias Ringwald   \details Saturates a signed value.
732*2fd737d3SMatthias Ringwald   \param [in]  value  Value to be saturated
733*2fd737d3SMatthias Ringwald   \param [in]    sat  Bit position to saturate to (1..32)
734*2fd737d3SMatthias Ringwald   \return             Saturated value
735*2fd737d3SMatthias Ringwald  */
__SSAT(int32_t val,uint32_t sat)736*2fd737d3SMatthias Ringwald __attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat)
737*2fd737d3SMatthias Ringwald {
738*2fd737d3SMatthias Ringwald   if ((sat >= 1U) && (sat <= 32U))
739*2fd737d3SMatthias Ringwald   {
740*2fd737d3SMatthias Ringwald     const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
741*2fd737d3SMatthias Ringwald     const int32_t min = -1 - max ;
742*2fd737d3SMatthias Ringwald     if (val > max)
743*2fd737d3SMatthias Ringwald     {
744*2fd737d3SMatthias Ringwald       return max;
745*2fd737d3SMatthias Ringwald     }
746*2fd737d3SMatthias Ringwald     else if (val < min)
747*2fd737d3SMatthias Ringwald     {
748*2fd737d3SMatthias Ringwald       return min;
749*2fd737d3SMatthias Ringwald     }
750*2fd737d3SMatthias Ringwald   }
751*2fd737d3SMatthias Ringwald   return val;
752*2fd737d3SMatthias Ringwald }
753*2fd737d3SMatthias Ringwald 
754*2fd737d3SMatthias Ringwald /**
755*2fd737d3SMatthias Ringwald   \brief   Unsigned Saturate
756*2fd737d3SMatthias Ringwald   \details Saturates an unsigned value.
757*2fd737d3SMatthias Ringwald   \param [in]  value  Value to be saturated
758*2fd737d3SMatthias Ringwald   \param [in]    sat  Bit position to saturate to (0..31)
759*2fd737d3SMatthias Ringwald   \return             Saturated value
760*2fd737d3SMatthias Ringwald  */
__USAT(int32_t val,uint32_t sat)761*2fd737d3SMatthias Ringwald __attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat)
762*2fd737d3SMatthias Ringwald {
763*2fd737d3SMatthias Ringwald   if (sat <= 31U)
764*2fd737d3SMatthias Ringwald   {
765*2fd737d3SMatthias Ringwald     const uint32_t max = ((1U << sat) - 1U);
766*2fd737d3SMatthias Ringwald     if (val > (int32_t)max)
767*2fd737d3SMatthias Ringwald     {
768*2fd737d3SMatthias Ringwald       return max;
769*2fd737d3SMatthias Ringwald     }
770*2fd737d3SMatthias Ringwald     else if (val < 0)
771*2fd737d3SMatthias Ringwald     {
772*2fd737d3SMatthias Ringwald       return 0U;
773*2fd737d3SMatthias Ringwald     }
774*2fd737d3SMatthias Ringwald   }
775*2fd737d3SMatthias Ringwald   return (uint32_t)val;
776*2fd737d3SMatthias Ringwald }
777*2fd737d3SMatthias Ringwald 
778*2fd737d3SMatthias Ringwald #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \
779*2fd737d3SMatthias Ringwald            (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */
780*2fd737d3SMatthias Ringwald 
781*2fd737d3SMatthias Ringwald /*@}*/ /* end of group CMSIS_Core_InstructionInterface */
782*2fd737d3SMatthias Ringwald 
783*2fd737d3SMatthias Ringwald 
784*2fd737d3SMatthias Ringwald /* ###################  Compiler specific Intrinsics  ########################### */
785*2fd737d3SMatthias Ringwald /** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
786*2fd737d3SMatthias Ringwald   Access to dedicated SIMD instructions
787*2fd737d3SMatthias Ringwald   @{
788*2fd737d3SMatthias Ringwald */
789*2fd737d3SMatthias Ringwald 
790*2fd737d3SMatthias Ringwald #if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     )
791*2fd737d3SMatthias Ringwald 
792*2fd737d3SMatthias Ringwald #define __SADD8                           __sadd8
793*2fd737d3SMatthias Ringwald #define __QADD8                           __qadd8
794*2fd737d3SMatthias Ringwald #define __SHADD8                          __shadd8
795*2fd737d3SMatthias Ringwald #define __UADD8                           __uadd8
796*2fd737d3SMatthias Ringwald #define __UQADD8                          __uqadd8
797*2fd737d3SMatthias Ringwald #define __UHADD8                          __uhadd8
798*2fd737d3SMatthias Ringwald #define __SSUB8                           __ssub8
799*2fd737d3SMatthias Ringwald #define __QSUB8                           __qsub8
800*2fd737d3SMatthias Ringwald #define __SHSUB8                          __shsub8
801*2fd737d3SMatthias Ringwald #define __USUB8                           __usub8
802*2fd737d3SMatthias Ringwald #define __UQSUB8                          __uqsub8
803*2fd737d3SMatthias Ringwald #define __UHSUB8                          __uhsub8
804*2fd737d3SMatthias Ringwald #define __SADD16                          __sadd16
805*2fd737d3SMatthias Ringwald #define __QADD16                          __qadd16
806*2fd737d3SMatthias Ringwald #define __SHADD16                         __shadd16
807*2fd737d3SMatthias Ringwald #define __UADD16                          __uadd16
808*2fd737d3SMatthias Ringwald #define __UQADD16                         __uqadd16
809*2fd737d3SMatthias Ringwald #define __UHADD16                         __uhadd16
810*2fd737d3SMatthias Ringwald #define __SSUB16                          __ssub16
811*2fd737d3SMatthias Ringwald #define __QSUB16                          __qsub16
812*2fd737d3SMatthias Ringwald #define __SHSUB16                         __shsub16
813*2fd737d3SMatthias Ringwald #define __USUB16                          __usub16
814*2fd737d3SMatthias Ringwald #define __UQSUB16                         __uqsub16
815*2fd737d3SMatthias Ringwald #define __UHSUB16                         __uhsub16
816*2fd737d3SMatthias Ringwald #define __SASX                            __sasx
817*2fd737d3SMatthias Ringwald #define __QASX                            __qasx
818*2fd737d3SMatthias Ringwald #define __SHASX                           __shasx
819*2fd737d3SMatthias Ringwald #define __UASX                            __uasx
820*2fd737d3SMatthias Ringwald #define __UQASX                           __uqasx
821*2fd737d3SMatthias Ringwald #define __UHASX                           __uhasx
822*2fd737d3SMatthias Ringwald #define __SSAX                            __ssax
823*2fd737d3SMatthias Ringwald #define __QSAX                            __qsax
824*2fd737d3SMatthias Ringwald #define __SHSAX                           __shsax
825*2fd737d3SMatthias Ringwald #define __USAX                            __usax
826*2fd737d3SMatthias Ringwald #define __UQSAX                           __uqsax
827*2fd737d3SMatthias Ringwald #define __UHSAX                           __uhsax
828*2fd737d3SMatthias Ringwald #define __USAD8                           __usad8
829*2fd737d3SMatthias Ringwald #define __USADA8                          __usada8
830*2fd737d3SMatthias Ringwald #define __SSAT16                          __ssat16
831*2fd737d3SMatthias Ringwald #define __USAT16                          __usat16
832*2fd737d3SMatthias Ringwald #define __UXTB16                          __uxtb16
833*2fd737d3SMatthias Ringwald #define __UXTAB16                         __uxtab16
834*2fd737d3SMatthias Ringwald #define __SXTB16                          __sxtb16
835*2fd737d3SMatthias Ringwald #define __SXTAB16                         __sxtab16
836*2fd737d3SMatthias Ringwald #define __SMUAD                           __smuad
837*2fd737d3SMatthias Ringwald #define __SMUADX                          __smuadx
838*2fd737d3SMatthias Ringwald #define __SMLAD                           __smlad
839*2fd737d3SMatthias Ringwald #define __SMLADX                          __smladx
840*2fd737d3SMatthias Ringwald #define __SMLALD                          __smlald
841*2fd737d3SMatthias Ringwald #define __SMLALDX                         __smlaldx
842*2fd737d3SMatthias Ringwald #define __SMUSD                           __smusd
843*2fd737d3SMatthias Ringwald #define __SMUSDX                          __smusdx
844*2fd737d3SMatthias Ringwald #define __SMLSD                           __smlsd
845*2fd737d3SMatthias Ringwald #define __SMLSDX                          __smlsdx
846*2fd737d3SMatthias Ringwald #define __SMLSLD                          __smlsld
847*2fd737d3SMatthias Ringwald #define __SMLSLDX                         __smlsldx
848*2fd737d3SMatthias Ringwald #define __SEL                             __sel
849*2fd737d3SMatthias Ringwald #define __QADD                            __qadd
850*2fd737d3SMatthias Ringwald #define __QSUB                            __qsub
851*2fd737d3SMatthias Ringwald 
852*2fd737d3SMatthias Ringwald #define __PKHBT(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0x0000FFFFUL) |  \
853*2fd737d3SMatthias Ringwald                                            ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL)  )
854*2fd737d3SMatthias Ringwald 
855*2fd737d3SMatthias Ringwald #define __PKHTB(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0xFFFF0000UL) |  \
856*2fd737d3SMatthias Ringwald                                            ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL)  )
857*2fd737d3SMatthias Ringwald 
858*2fd737d3SMatthias Ringwald #define __SMMLA(ARG1,ARG2,ARG3)          ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
859*2fd737d3SMatthias Ringwald                                                       ((int64_t)(ARG3) << 32U)     ) >> 32U))
860*2fd737d3SMatthias Ringwald 
861*2fd737d3SMatthias Ringwald #endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */
862*2fd737d3SMatthias Ringwald /*@} end of group CMSIS_SIMD_intrinsics */
863*2fd737d3SMatthias Ringwald 
864*2fd737d3SMatthias Ringwald 
865*2fd737d3SMatthias Ringwald #endif /* __CMSIS_ARMCC_H */
866