Robobo
core_cmInstr.h
Go to the documentation of this file.
1 /**************************************************************************/
24 #ifndef __CORE_CMINSTR_H
25 #define __CORE_CMINSTR_H
26 
27 
28 /* ########################## Core Instruction Access ######################### */
34 #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
35 /* ARM armcc specific functions */
36 
37 #if (__ARMCC_VERSION < 400677)
38  #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
39 #endif
40 
41 
46 #define __NOP __nop
47 
48 
54 #define __WFI __wfi
55 
56 
62 #define __WFE __wfe
63 
64 
69 #define __SEV __sev
70 
71 
78 #define __ISB() __isb(0xF)
79 
80 
86 #define __DSB() __dsb(0xF)
87 
88 
94 #define __DMB() __dmb(0xF)
95 
96 
104 #define __REV __rev
105 
106 
114 static __INLINE __ASM uint32_t __REV16(uint32_t value)
115 {
116  rev16 r0, r0
117  bx lr
118 }
119 
120 
128 static __INLINE __ASM int32_t __REVSH(int32_t value)
129 {
130  revsh r0, r0
131  bx lr
132 }
133 
134 
135 #if (__CORTEX_M >= 0x03)
136 
144 #define __RBIT __rbit
145 
146 
154 #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
155 
156 
164 #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
165 
166 
174 #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
175 
176 
186 #define __STREXB(value, ptr) __strex(value, ptr)
187 
188 
198 #define __STREXH(value, ptr) __strex(value, ptr)
199 
200 
210 #define __STREXW(value, ptr) __strex(value, ptr)
211 
212 
218 #define __CLREX __clrex
219 
220 
229 #define __SSAT __ssat
230 
231 
240 #define __USAT __usat
241 
242 
250 #define __CLZ __clz
251 
252 #endif /* (__CORTEX_M >= 0x03) */
253 
254 
255 
256 #elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
257 /* IAR iccarm specific functions */
258 
259 #include <cmsis_iar.h>
260 
261 
262 #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
263 /* GNU gcc specific functions */
264 
269 __attribute__( ( always_inline ) ) static __INLINE void __NOP(void)
270 {
271  __ASM volatile ("nop");
272 }
273 
274 
280 __attribute__( ( always_inline ) ) static __INLINE void __WFI(void)
281 {
282  __ASM volatile ("wfi");
283 }
284 
285 
291 __attribute__( ( always_inline ) ) static __INLINE void __WFE(void)
292 {
293  __ASM volatile ("wfe");
294 }
295 
296 
301 __attribute__( ( always_inline ) ) static __INLINE void __SEV(void)
302 {
303  __ASM volatile ("sev");
304 }
305 
306 
313 __attribute__( ( always_inline ) ) static __INLINE void __ISB(void)
314 {
315  __ASM volatile ("isb");
316 }
317 
318 
324 __attribute__( ( always_inline ) ) static __INLINE void __DSB(void)
325 {
326  __ASM volatile ("dsb");
327 }
328 
329 
335 __attribute__( ( always_inline ) ) static __INLINE void __DMB(void)
336 {
337  __ASM volatile ("dmb");
338 }
339 
340 
348 __attribute__( ( always_inline ) ) static __INLINE uint32_t __REV(uint32_t value)
349 {
350  uint32_t result;
351 
352  __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );
353  return(result);
354 }
355 
356 
364 __attribute__( ( always_inline ) ) static __INLINE uint32_t __REV16(uint32_t value)
365 {
366  uint32_t result;
367 
368  __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );
369  return(result);
370 }
371 
372 
380 __attribute__( ( always_inline ) ) static __INLINE int32_t __REVSH(int32_t value)
381 {
382  uint32_t result;
383 
384  __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );
385  return(result);
386 }
387 
388 
389 #if (__CORTEX_M >= 0x03)
390 
398 __attribute__( ( always_inline ) ) static __INLINE uint32_t __RBIT(uint32_t value)
399 {
400  uint32_t result;
401 
402  __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
403  return(result);
404 }
405 
406 
414 __attribute__( ( always_inline ) ) static __INLINE uint8_t __LDREXB(volatile uint8_t *addr)
415 {
416  uint8_t result;
417 
418  __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );
419  return(result);
420 }
421 
422 
430 __attribute__( ( always_inline ) ) static __INLINE uint16_t __LDREXH(volatile uint16_t *addr)
431 {
432  uint16_t result;
433 
434  __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );
435  return(result);
436 }
437 
438 
446 __attribute__( ( always_inline ) ) static __INLINE uint32_t __LDREXW(volatile uint32_t *addr)
447 {
448  uint32_t result;
449 
450  __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );
451  return(result);
452 }
453 
454 
464 __attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
465 {
466  uint32_t result;
467 
468  __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
469  return(result);
470 }
471 
472 
482 __attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
483 {
484  uint32_t result;
485 
486  __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
487  return(result);
488 }
489 
490 
500 __attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
501 {
502  uint32_t result;
503 
504  __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
505  return(result);
506 }
507 
508 
514 __attribute__( ( always_inline ) ) static __INLINE void __CLREX(void)
515 {
516  __ASM volatile ("clrex");
517 }
518 
519 
528 #define __SSAT(ARG1,ARG2) \
529 ({ \
530  uint32_t __RES, __ARG1 = (ARG1); \
531  __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
532  __RES; \
533  })
534 
535 
544 #define __USAT(ARG1,ARG2) \
545 ({ \
546  uint32_t __RES, __ARG1 = (ARG1); \
547  __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
548  __RES; \
549  })
550 
551 
559 __attribute__( ( always_inline ) ) static __INLINE uint8_t __CLZ(uint32_t value)
560 {
561  uint8_t result;
562 
563  __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) );
564  return(result);
565 }
566 
567 #endif /* (__CORTEX_M >= 0x03) */
568 
569 
570 
571 
572 #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
573 /* TASKING carm specific functions */
574 
575 /*
576  * The CMSIS functions have been implemented as intrinsics in the compiler.
577  * Please use "carm -?i" to get an up to date list of all intrinsics,
578  * Including the CMSIS ones.
579  */
580 
581 #endif
582  /* end of group CMSIS_Core_InstructionInterface */
584 
585 #endif /* __CORE_CMINSTR_H */
struct emac_rx_descriptor __attribute__((packed, aligned(8))) emac_rx_descriptor_t
union emac_rx_addr addr
Definition: emac.h:123