- 论坛徽章:
- 0
|
回复 4# zhouzhenghui
太过复杂了,看不懂,谢谢!
AO_INLINE AO_t
475 AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
476 {
477 AO_t fetched_val;
478 int flag;
479
480 __asm__ __volatile__("@AO_fetch_compare_and_swap\n"
481 AO_THUMB_GO_ARM
482 "1: mov %0, #2\n" /* store a flag */
483 " ldrex %1, [%3]\n" /* get original */
484 " teq %1, %4\n" /* see if match */
485 # ifdef __thumb2__
486 " it eq\n"
487 # endif
488 " strexeq %0, %5, [%3]\n" /* store new one if matched */
489 " teq %0, #1\n"
490 " beq 1b\n" /* if update failed, repeat */
491 AO_THUMB_RESTORE_MODE
492 : "=&r"(flag), "=&r"(fetched_val), "+m"(*addr)
493 : "r"(addr), "r"(old_val), "r"(new_val)
494 : AO_THUMB_SWITCH_CLOBBERS "cc");
495 return fetched_val;
496 }
|
|