< prev index next > src/hotspot/cpu/x86/stubGenerator_x86_64.cpp
Print this page
__ jmp(rbx);
return start;
}
- // Implementation of jint atomic_xchg(jint add_value, volatile jint* dest)
- // used by Atomic::xchg(volatile jint* dest, jint exchange_value)
- //
- // Arguments :
- // c_rarg0: exchange_value
- // c_rarg0: dest
- //
- // Result:
- // *dest <- ex, return (orig *dest)
- address generate_atomic_xchg() {
- StubCodeMark mark(this, "StubRoutines", "atomic_xchg");
- address start = __ pc();
-
- __ movl(rax, c_rarg0); // Copy to eax we need a return value anyhow
- __ xchgl(rax, Address(c_rarg1, 0)); // automatic LOCK
- __ ret(0);
-
- return start;
- }
-
- // Implementation of intptr_t atomic_xchg(jlong add_value, volatile jlong* dest)
- // used by Atomic::xchg(volatile jlong* dest, jlong exchange_value)
- //
- // Arguments :
- // c_rarg0: exchange_value
- // c_rarg1: dest
- //
- // Result:
- // *dest <- ex, return (orig *dest)
- address generate_atomic_xchg_long() {
- StubCodeMark mark(this, "StubRoutines", "atomic_xchg_long");
- address start = __ pc();
-
- __ movptr(rax, c_rarg0); // Copy to eax we need a return value anyhow
- __ xchgptr(rax, Address(c_rarg1, 0)); // automatic LOCK
- __ ret(0);
-
- return start;
- }
-
- // Support for jint atomic::atomic_cmpxchg(jint exchange_value, volatile jint* dest,
- // jint compare_value)
- //
- // Arguments :
- // c_rarg0: exchange_value
- // c_rarg1: dest
- // c_rarg2: compare_value
- //
- // Result:
- // if ( compare_value == *dest ) {
- // *dest = exchange_value
- // return compare_value;
- // else
- // return *dest;
- address generate_atomic_cmpxchg() {
- StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg");
- address start = __ pc();
-
- __ movl(rax, c_rarg2);
- __ lock();
- __ cmpxchgl(c_rarg0, Address(c_rarg1, 0));
- __ ret(0);
-
- return start;
- }
-
- // Support for int8_t atomic::atomic_cmpxchg(int8_t exchange_value, volatile int8_t* dest,
- // int8_t compare_value)
- //
- // Arguments :
- // c_rarg0: exchange_value
- // c_rarg1: dest
- // c_rarg2: compare_value
- //
- // Result:
- // if ( compare_value == *dest ) {
- // *dest = exchange_value
- // return compare_value;
- // else
- // return *dest;
- address generate_atomic_cmpxchg_byte() {
- StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg_byte");
- address start = __ pc();
-
- __ movsbq(rax, c_rarg2);
- __ lock();
- __ cmpxchgb(c_rarg0, Address(c_rarg1, 0));
- __ ret(0);
-
- return start;
- }
-
- // Support for int64_t atomic::atomic_cmpxchg(int64_t exchange_value,
- // volatile int64_t* dest,
- // int64_t compare_value)
- // Arguments :
- // c_rarg0: exchange_value
- // c_rarg1: dest
- // c_rarg2: compare_value
- //
- // Result:
- // if ( compare_value == *dest ) {
- // *dest = exchange_value
- // return compare_value;
- // else
- // return *dest;
- address generate_atomic_cmpxchg_long() {
- StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg_long");
- address start = __ pc();
-
- __ movq(rax, c_rarg2);
- __ lock();
- __ cmpxchgq(c_rarg0, Address(c_rarg1, 0));
- __ ret(0);
-
- return start;
- }
-
- // Implementation of jint atomic_add(jint add_value, volatile jint* dest)
- // used by Atomic::add(volatile jint* dest, jint add_value)
- //
- // Arguments :
- // c_rarg0: add_value
- // c_rarg1: dest
- //
- // Result:
- // *dest += add_value
- // return *dest;
- address generate_atomic_add() {
- StubCodeMark mark(this, "StubRoutines", "atomic_add");
- address start = __ pc();
-
- __ movl(rax, c_rarg0);
- __ lock();
- __ xaddl(Address(c_rarg1, 0), c_rarg0);
- __ addl(rax, c_rarg0);
- __ ret(0);
-
- return start;
- }
-
- // Implementation of intptr_t atomic_add(intptr_t add_value, volatile intptr_t* dest)
- // used by Atomic::add(volatile intptr_t* dest, intptr_t add_value)
- //
- // Arguments :
- // c_rarg0: add_value
- // c_rarg1: dest
- //
- // Result:
- // *dest += add_value
- // return *dest;
- address generate_atomic_add_long() {
- StubCodeMark mark(this, "StubRoutines", "atomic_add_long");
- address start = __ pc();
-
- __ movptr(rax, c_rarg0); // Copy to eax we need a return value anyhow
- __ lock();
- __ xaddptr(Address(c_rarg1, 0), c_rarg0);
- __ addptr(rax, c_rarg0);
- __ ret(0);
-
- return start;
- }
-
// Support for intptr_t OrderAccess::fence()
//
// Arguments :
//
// Result:
// is referenced by megamorphic call
StubRoutines::_catch_exception_entry = generate_catch_exception();
// atomic calls
- StubRoutines::_atomic_xchg_entry = generate_atomic_xchg();
- StubRoutines::_atomic_xchg_long_entry = generate_atomic_xchg_long();
- StubRoutines::_atomic_cmpxchg_entry = generate_atomic_cmpxchg();
- StubRoutines::_atomic_cmpxchg_byte_entry = generate_atomic_cmpxchg_byte();
- StubRoutines::_atomic_cmpxchg_long_entry = generate_atomic_cmpxchg_long();
- StubRoutines::_atomic_add_entry = generate_atomic_add();
- StubRoutines::_atomic_add_long_entry = generate_atomic_add_long();
StubRoutines::_fence_entry = generate_orderaccess_fence();
// platform dependent
StubRoutines::x86::_get_previous_fp_entry = generate_get_previous_fp();
StubRoutines::x86::_get_previous_sp_entry = generate_get_previous_sp();
< prev index next >