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