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