Go to the source code of this file.
|
| AO_INLINE void | AO_nop_write (void) |
| |
| AO_INLINE void | AO_nop_full (void) |
| |
| AO_INLINE AO_TS_VAL_t | AO_test_and_set (volatile AO_TS_t *addr) |
| |
| AO_INLINE AO_t | AO_fetch_and_add (volatile AO_t *p, AO_t incr) |
| |
| AO_INLINE AO_t | AO_fetch_and_add1 (volatile AO_t *p) |
| |
| AO_INLINE AO_t | AO_fetch_and_sub1 (volatile AO_t *p) |
| |
| AO_INLINE void | AO_and (volatile AO_t *p, AO_t value) |
| |
| AO_INLINE void | AO_or (volatile AO_t *p, AO_t value) |
| |
| AO_INLINE void | AO_xor (volatile AO_t *p, AO_t value) |
| |
| AO_INLINE unsigned char | AO_char_fetch_and_add (volatile unsigned char *p, unsigned char incr) |
| |
| AO_INLINE unsigned short | AO_short_fetch_and_add (volatile unsigned short *p, unsigned short incr) |
| |
| AO_INLINE int | AO_compare_and_swap (volatile AO_t *addr, AO_t old_val, AO_t new_val) |
| |
| AO_INLINE AO_t | AO_fetch_compare_and_swap (volatile AO_t *addr, AO_t old_val, AO_t new_val) |
| |
| AO_INLINE AO_double_t | AO_double_load (const volatile AO_double_t *addr) |
| |
| AO_INLINE void | AO_double_store (volatile AO_double_t *addr, AO_double_t new_val) |
| |
| AO_INLINE int | AO_double_compare_and_swap (volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) |
| |
◆ AO_ACCESS_CHECK_ALIGNED
| #define AO_ACCESS_CHECK_ALIGNED |
◆ AO_ACCESS_int_CHECK_ALIGNED
| #define AO_ACCESS_int_CHECK_ALIGNED |
◆ AO_ACCESS_short_CHECK_ALIGNED
| #define AO_ACCESS_short_CHECK_ALIGNED |
◆ AO_ARM_HAVE_DMB
◆ AO_ARM_HAVE_LDREX
| #define AO_ARM_HAVE_LDREX |
◆ AO_ARM_HAVE_LDREXBH
| #define AO_ARM_HAVE_LDREXBH |
◆ AO_ARM_HAVE_LDREXD
| #define AO_ARM_HAVE_LDREXD |
◆ AO_ARM_HAVE_SWP
◆ AO_BR_ALIGN
| #define AO_BR_ALIGN /* empty */ |
◆ AO_HAVE_and
◆ AO_HAVE_char_fetch_and_add
| #define AO_HAVE_char_fetch_and_add |
◆ AO_HAVE_compare_and_swap
| #define AO_HAVE_compare_and_swap |
◆ AO_HAVE_double_compare_and_swap
| #define AO_HAVE_double_compare_and_swap |
◆ AO_HAVE_double_load
| #define AO_HAVE_double_load |
◆ AO_HAVE_double_store
| #define AO_HAVE_double_store |
◆ AO_HAVE_fetch_and_add
| #define AO_HAVE_fetch_and_add |
◆ AO_HAVE_fetch_and_add1
| #define AO_HAVE_fetch_and_add1 |
◆ AO_HAVE_fetch_and_sub1
| #define AO_HAVE_fetch_and_sub1 |
◆ AO_HAVE_fetch_compare_and_swap
| #define AO_HAVE_fetch_compare_and_swap |
◆ AO_HAVE_nop_full
◆ AO_HAVE_nop_write
| #define AO_HAVE_nop_write |
◆ AO_HAVE_or
◆ AO_HAVE_short_fetch_and_add
| #define AO_HAVE_short_fetch_and_add |
◆ AO_HAVE_test_and_set
| #define AO_HAVE_test_and_set |
◆ AO_HAVE_xor
◆ AO_MASK_PTR
| #define AO_MASK_PTR |
( |
|
reg | ) |
/* empty */ |
◆ AO_T_IS_INT
◆ AO_THUMB_GO_ARM
| #define AO_THUMB_GO_ARM /* empty */ |
◆ AO_THUMB_RESTORE_MODE
| #define AO_THUMB_RESTORE_MODE /* empty */ |
◆ AO_THUMB_SWITCH_CLOBBERS
| #define AO_THUMB_SWITCH_CLOBBERS /* empty */ |
◆ AO_and()
Definition at line 410 of file gcc/arm.h.
411{
413
414 __asm__ __volatile__("@AO_and\n"
418 " ldrex %0, [%4]\n"
419 " and %1, %0, %3\n"
421 " strex %0, %1, [%4]\n"
422 " teq %0, #0\n"
423 " bne 1b\n"
426 : "r" (value), "r" (p)
428}
#define AO_THUMB_RESTORE_MODE
#define AO_THUMB_SWITCH_CLOBBERS
◆ AO_char_fetch_and_add()
| AO_INLINE unsigned char AO_char_fetch_and_add |
( |
volatile unsigned char * |
p, |
|
|
unsigned char |
incr |
|
) |
| |
Definition at line 478 of file gcc/arm.h.
479 {
481 int flag;
482
483 __asm__ __volatile__("@AO_char_fetch_and_add\n"
487 " ldrexb %0, [%5]\n"
488 " add %2, %0, %4\n"
490 " strexb %1, %2, [%5]\n"
491 " teq %1, #0\n"
492 " bne 1b\n"
494 :
"=&r" (
result),
"=&r" (flag),
"=&r" (
tmp),
"+m" (*p)
495 : "r" ((unsigned)incr), "r" (p)
497 return (
unsigned char)
result;
498 }
◆ AO_compare_and_swap()
Definition at line 529 of file gcc/arm.h.
530 {
532
533 __asm__ __volatile__("@AO_compare_and_swap\n"
536 "1: mov %0, #2\n"
538 " ldrex %1, [%3]\n"
539 " teq %1, %4\n"
541# ifdef __thumb2__
542
543
544 " it eq\n"
545# endif
546 " strexeq %0, %5, [%3]\n"
547 " teq %0, #1\n"
548 " beq 1b\n"
551 : "r"(addr), "r"(old_val), "r"(new_val)
554 }
◆ AO_double_compare_and_swap()
Definition at line 632 of file gcc/arm.h.
634 {
637
638 do {
639
640 __asm__ __volatile__("@AO_double_compare_and_swap\n"
642 " ldrexd %0, %H0, [%1]\n"
644 : "r"(addr)
645 );
647 break;
648 __asm__ __volatile__(
650 " strexd %0, %3, %H3, [%2]\n"
651 :
"=&r"(
result),
"+m"(*addr)
652 :
"r" (addr),
"r" (new_val.
AO_whole)
653 : "cc");
656 }
#define AO_EXPECT_FALSE(expr)
unsigned long long double_ptr_storage
double_ptr_storage AO_whole
◆ AO_double_load()
Definition at line 596 of file gcc/arm.h.
597 {
599
600
601 __asm__ __volatile__("@AO_double_load\n"
603 " ldrexd %0, %H0, [%1]"
605 : "r" (addr)
606 );
608 }
◆ AO_double_store()
Definition at line 612 of file gcc/arm.h.
613 {
615 int status;
616
617 do {
618
619 __asm__ __volatile__("@AO_double_store\n"
621 " ldrexd %0, %H0, [%3]\n"
623 " strexd %1, %4, %H4, [%3]"
624 :
"=&r" (old_val.
AO_whole),
"=&r" (status),
"+m" (*addr)
625 :
"r" (addr),
"r" (new_val.
AO_whole)
626 : "cc");
628 }
◆ AO_fetch_and_add()
Definition at line 338 of file gcc/arm.h.
339{
341 int flag;
342
343 __asm__ __volatile__("@AO_fetch_and_add\n"
347 " ldrex %0, [%5]\n"
348 " add %2, %0, %4\n"
350 " strex %1, %2, [%5]\n"
351 " teq %1, #0\n"
352 " bne 1b\n"
354 :
"=&r"(
result),
"=&r"(flag),
"=&r"(
tmp),
"+m"(*p)
355 : "r"(incr), "r"(p)
358}
◆ AO_fetch_and_add1()
Definition at line 362 of file gcc/arm.h.
363{
365 int flag;
366
367 __asm__ __volatile__("@AO_fetch_and_add1\n"
371 " ldrex %0, [%4]\n"
372 " add %1, %0, #1\n"
374 " strex %2, %1, [%4]\n"
375 " teq %2, #0\n"
376 " bne 1b\n"
378 :
"=&r"(
result),
"=&r"(
tmp),
"=&r"(flag),
"+m"(*p)
379 : "r"(p)
382}
◆ AO_fetch_and_sub1()
Definition at line 386 of file gcc/arm.h.
387{
389 int flag;
390
391 __asm__ __volatile__("@AO_fetch_and_sub1\n"
395 " ldrex %0, [%4]\n"
396 " sub %1, %0, #1\n"
398 " strex %2, %1, [%4]\n"
399 " teq %2, #0\n"
400 " bne 1b\n"
402 :
"=&r"(
result),
"=&r"(
tmp),
"=&r"(flag),
"+m"(*p)
403 : "r"(p)
406}
◆ AO_fetch_compare_and_swap()
Definition at line 559 of file gcc/arm.h.
560{
562 int flag;
563
564 __asm__ __volatile__("@AO_fetch_compare_and_swap\n"
567 "1: mov %0, #2\n"
569 " ldrex %1, [%3]\n"
570 " teq %1, %4\n"
572# ifdef __thumb2__
573 " it eq\n"
574# endif
575 " strexeq %0, %5, [%3]\n"
576 " teq %0, #1\n"
577 " beq 1b\n"
579 : "=&r"(flag), "=&r"(fetched_val), "+m"(*addr)
580 : "r"(addr), "r"(old_val), "r"(new_val)
582 return fetched_val;
583}
◆ AO_nop_full()
Definition at line 141 of file gcc/arm.h.
142 {
143
144 __asm__ __volatile__("dmb" : : : "memory");
145 }
◆ AO_nop_write()
Definition at line 105 of file gcc/arm.h.
106 {
107
108
109
110
111
112
113
114
115
116
117
118 __asm__ __volatile__("dmb ishst" : : : "memory");
119 }
◆ AO_or()
Definition at line 432 of file gcc/arm.h.
433{
435
436 __asm__ __volatile__("@AO_or\n"
440 " ldrex %0, [%4]\n"
441 " orr %1, %0, %3\n"
443 " strex %0, %1, [%4]\n"
444 " teq %0, #0\n"
445 " bne 1b\n"
448 : "r" (value), "r" (p)
450}
◆ AO_short_fetch_and_add()
| AO_INLINE unsigned short AO_short_fetch_and_add |
( |
volatile unsigned short * |
p, |
|
|
unsigned short |
incr |
|
) |
| |
Definition at line 502 of file gcc/arm.h.
503 {
505 int flag;
506
507 __asm__ __volatile__("@AO_short_fetch_and_add\n"
511 " ldrexh %0, [%5]\n"
512 " add %2, %0, %4\n"
514 " strexh %1, %2, [%5]\n"
515 " teq %1, #0\n"
516 " bne 1b\n"
518 :
"=&r" (
result),
"=&r" (flag),
"=&r" (
tmp),
"+m" (*p)
519 : "r" ((unsigned)incr), "r" (p)
521 return (
unsigned short)
result;
522 }
◆ AO_test_and_set()
Definition at line 314 of file gcc/arm.h.
315 {
317 int flag;
318
319 __asm__ __volatile__("@AO_test_and_set\n"
323 " ldrex %0, [%3]\n"
325 " strex %1, %4, [%3]\n"
326 " teq %1, #0\n"
327 " bne 1b\n"
329 : "=&r"(oldval), "=&r"(flag), "+m"(*addr)
330 : "r"(addr), "r"(1)
332 return oldval;
333 }
◆ AO_xor()
Definition at line 454 of file gcc/arm.h.
455{
457
458 __asm__ __volatile__("@AO_xor\n"
462 " ldrex %0, [%4]\n"
463 " eor %1, %0, %3\n"
465 " strex %0, %1, [%4]\n"
466 " teq %0, #0\n"
467 " bne 1b\n"
470 : "r" (value), "r" (p)
472}