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