518 __ membar(MEMBAR_ATOMIC_OP_PRE, prev);
519 __ bind(retry);
520 __ ldrex(prev, Address(dest));
521 __ strex(ok, newval, Address(dest));
522 __ cmp(ok, 0);
523 __ b(retry, ne);
524 __ mov (R0, prev);
525 __ membar(MEMBAR_ATOMIC_OP_POST, prev);
526 } else {
527 __ bind(retry);
528 __ ldr (prev, Address(dest));
529 __ atomic_cas_bool(prev, newval, dest, 0, noreg/*ignored*/);
530 __ b(retry, ne);
531 __ mov (R0, prev);
532 }
533 __ bx(LR);
534
535 return start;
536 }
537
538 // Support for jint Atomic::cmpxchg(jint exchange_value, volatile jint *dest, jint compare_value)
539 //
540 // Arguments :
541 //
542 // compare_value: R0
543 // exchange_value: R1
544 // dest: R2
545 //
546 // Results:
547 //
548 // R0: the value previously stored in dest
549 //
550 // Overwrites:
551 //
552 // R0, R1, R2, R3, Rtemp
553 //
554 address generate_atomic_cmpxchg() {
555 address start;
556
557 StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg");
558 start = __ pc();
|
518 __ membar(MEMBAR_ATOMIC_OP_PRE, prev);
519 __ bind(retry);
520 __ ldrex(prev, Address(dest));
521 __ strex(ok, newval, Address(dest));
522 __ cmp(ok, 0);
523 __ b(retry, ne);
524 __ mov (R0, prev);
525 __ membar(MEMBAR_ATOMIC_OP_POST, prev);
526 } else {
527 __ bind(retry);
528 __ ldr (prev, Address(dest));
529 __ atomic_cas_bool(prev, newval, dest, 0, noreg/*ignored*/);
530 __ b(retry, ne);
531 __ mov (R0, prev);
532 }
533 __ bx(LR);
534
535 return start;
536 }
537
538 // Support for jint Atomic::cmpxchg(volatile jint *dest, jint compare_value, jint exchange_value)
539 //
540 // Arguments :
541 //
542 // compare_value: R0
543 // exchange_value: R1
544 // dest: R2
545 //
546 // Results:
547 //
548 // R0: the value previously stored in dest
549 //
550 // Overwrites:
551 //
552 // R0, R1, R2, R3, Rtemp
553 //
554 address generate_atomic_cmpxchg() {
555 address start;
556
557 StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg");
558 start = __ pc();
|