38#ifndef __CORE_CMINSTR_H
39#define __CORE_CMINSTR_H
48#if defined ( __CC_ARM )
51#if (__ARMCC_VERSION < 400677)
52 #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
92#define __ISB() __isb(0xF)
100#define __DSB() __dsb(0xF)
108#define __DMB() __dmb(0xF)
128#ifndef __NO_EMBEDDED_ASM
129__attribute__((section(
".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
143#ifndef __NO_EMBEDDED_ASM
144__attribute__((section(
".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
171#define __BKPT(value) __breakpoint(value)
174#if (__CORTEX_M >= 0x03)
193#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
203#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
213#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
225#define __STREXB(value, ptr) __strex(value, ptr)
237#define __STREXH(value, ptr) __strex(value, ptr)
249#define __STREXW(value, ptr) __strex(value, ptr)
257#define __CLREX __clrex
295#elif defined ( __ICCARM__ )
298#include <cmsis_iar.h>
301#elif defined ( __TMS470__ )
304#include <cmsis_ccs.h>
307#elif defined ( __GNUC__ )
313#if defined (__thumb__) && !defined (__thumb2__)
314#define __CMSIS_GCC_OUT_REG(r) "=l" (r)
315#define __CMSIS_GCC_USE_REG(r) "l" (r)
317#define __CMSIS_GCC_OUT_REG(r) "=r" (r)
318#define __CMSIS_GCC_USE_REG(r) "r" (r)
325__attribute__( ( always_inline ) ) __STATIC_INLINE
void __NOP(
void)
327 __ASM
volatile (
"nop");
336__attribute__( ( always_inline ) ) __STATIC_INLINE
void __WFI(
void)
338 __ASM
volatile (
"wfi");
347__attribute__( ( always_inline ) ) __STATIC_INLINE
void __WFE(
void)
349 __ASM
volatile (
"wfe");
357__attribute__( ( always_inline ) ) __STATIC_INLINE
void __SEV(
void)
359 __ASM
volatile (
"sev");
369__attribute__( ( always_inline ) ) __STATIC_INLINE
void __ISB(
void)
371 __ASM
volatile (
"isb");
380__attribute__( ( always_inline ) ) __STATIC_INLINE
void __DSB(
void)
382 __ASM
volatile (
"dsb");
391__attribute__( ( always_inline ) ) __STATIC_INLINE
void __DMB(
void)
393 __ASM
volatile (
"dmb");
404__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value)
406#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
407 return __builtin_bswap32(value);
411 __ASM
volatile (
"rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
424__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value)
428 __ASM
volatile (
"rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
440__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value)
442#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
443 return (
short)__builtin_bswap16(value);
447 __ASM
volatile (
"revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
461__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
463 return (op1 >> op2) | (op1 << (32 - op2));
475#define __BKPT(value) __ASM volatile ("bkpt "#value)
478#if (__CORTEX_M >= 0x03)
487__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
491 __ASM
volatile (
"rbit %0, %1" :
"=r" (result) :
"r" (value) );
503__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(
volatile uint8_t *addr)
507#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
508 __ASM
volatile (
"ldrexb %0, %1" :
"=r" (result) :
"Q" (*addr) );
513 __ASM
volatile (
"ldrexb %0, [%1]" :
"=r" (result) :
"r" (addr) :
"memory" );
526__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(
volatile uint16_t *addr)
530#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
531 __ASM
volatile (
"ldrexh %0, %1" :
"=r" (result) :
"Q" (*addr) );
536 __ASM
volatile (
"ldrexh %0, [%1]" :
"=r" (result) :
"r" (addr) :
"memory" );
549__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(
volatile uint32_t *addr)
553 __ASM
volatile (
"ldrex %0, %1" :
"=r" (result) :
"Q" (*addr) );
567__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value,
volatile uint8_t *addr)
571 __ASM
volatile (
"strexb %0, %2, %1" :
"=&r" (result),
"=Q" (*addr) :
"r" (value) );
585__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value,
volatile uint16_t *addr)
589 __ASM
volatile (
"strexh %0, %2, %1" :
"=&r" (result),
"=Q" (*addr) :
"r" (value) );
603__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value,
volatile uint32_t *addr)
607 __ASM
volatile (
"strex %0, %2, %1" :
"=&r" (result),
"=Q" (*addr) :
"r" (value) );
617__attribute__( ( always_inline ) ) __STATIC_INLINE
void __CLREX(
void)
619 __ASM
volatile (
"clrex" :::
"memory");
631#define __SSAT(ARG1,ARG2) \
633 uint32_t __RES, __ARG1 = (ARG1); \
634 __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
647#define __USAT(ARG1,ARG2) \
649 uint32_t __RES, __ARG1 = (ARG1); \
650 __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
662__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value)
666 __ASM
volatile (
"clz %0, %1" :
"=r" (result) :
"r" (value) );
675#elif defined ( __TASKING__ )