< prev index next >

src/hotspot/cpu/arm/stubGenerator_arm.cpp

Print this page




 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();


< prev index next >