< prev index next >

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Print this page




 549 
 550   // Support for jint atomic::xchg(jint exchange_value, volatile jint* dest)
 551   //
 552   // Arguments :
 553   //    c_rarg0: exchange_value
 554   //    c_rarg0: dest
 555   //
 556   // Result:
 557   //    *dest <- ex, return (orig *dest)
 558   address generate_atomic_xchg() {
 559     StubCodeMark mark(this, "StubRoutines", "atomic_xchg");
 560     address start = __ pc();
 561 
 562     __ movl(rax, c_rarg0); // Copy to eax we need a return value anyhow
 563     __ xchgl(rax, Address(c_rarg1, 0)); // automatic LOCK
 564     __ ret(0);
 565 
 566     return start;
 567   }
 568 
 569   // Support for intptr_t atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest)
 570   //
 571   // Arguments :
 572   //    c_rarg0: exchange_value
 573   //    c_rarg1: dest
 574   //
 575   // Result:
 576   //    *dest <- ex, return (orig *dest)
 577   address generate_atomic_xchg_ptr() {
 578     StubCodeMark mark(this, "StubRoutines", "atomic_xchg_ptr");
 579     address start = __ pc();
 580 
 581     __ movptr(rax, c_rarg0); // Copy to eax we need a return value anyhow
 582     __ xchgptr(rax, Address(c_rarg1, 0)); // automatic LOCK
 583     __ ret(0);
 584 
 585     return start;
 586   }
 587 
 588   // Support for jint atomic::atomic_cmpxchg(jint exchange_value, volatile jint* dest,
 589   //                                         jint compare_value)
 590   //
 591   // Arguments :
 592   //    c_rarg0: exchange_value
 593   //    c_rarg1: dest
 594   //    c_rarg2: compare_value
 595   //
 596   // Result:
 597   //    if ( compare_value == *dest ) {
 598   //       *dest = exchange_value


4981 
4982     // This platform-specific settings are needed by generate_call_stub()
4983     create_control_words();
4984 
4985     // entry points that exist in all platforms Note: This is code
4986     // that could be shared among different platforms - however the
4987     // benefit seems to be smaller than the disadvantage of having a
4988     // much more complicated generator structure. See also comment in
4989     // stubRoutines.hpp.
4990 
4991     StubRoutines::_forward_exception_entry = generate_forward_exception();
4992 
4993     StubRoutines::_call_stub_entry =
4994       generate_call_stub(StubRoutines::_call_stub_return_address);
4995 
4996     // is referenced by megamorphic call
4997     StubRoutines::_catch_exception_entry = generate_catch_exception();
4998 
4999     // atomic calls
5000     StubRoutines::_atomic_xchg_entry         = generate_atomic_xchg();
5001     StubRoutines::_atomic_xchg_ptr_entry     = generate_atomic_xchg_ptr();
5002     StubRoutines::_atomic_cmpxchg_entry      = generate_atomic_cmpxchg();
5003     StubRoutines::_atomic_cmpxchg_byte_entry = generate_atomic_cmpxchg_byte();
5004     StubRoutines::_atomic_cmpxchg_long_entry = generate_atomic_cmpxchg_long();
5005     StubRoutines::_atomic_add_entry          = generate_atomic_add();
5006     StubRoutines::_atomic_add_ptr_entry      = generate_atomic_add_ptr();
5007     StubRoutines::_fence_entry               = generate_orderaccess_fence();
5008 
5009     // platform dependent
5010     StubRoutines::x86::_get_previous_fp_entry = generate_get_previous_fp();
5011     StubRoutines::x86::_get_previous_sp_entry = generate_get_previous_sp();
5012 
5013     StubRoutines::x86::_verify_mxcsr_entry    = generate_verify_mxcsr();
5014 
5015     // Build this early so it's available for the interpreter.
5016     StubRoutines::_throw_StackOverflowError_entry =
5017       generate_throw_exception("StackOverflowError throw_exception",
5018                                CAST_FROM_FN_PTR(address,
5019                                                 SharedRuntime::
5020                                                 throw_StackOverflowError));
5021     StubRoutines::_throw_delayed_StackOverflowError_entry =




 549 
 550   // Support for jint atomic::xchg(jint exchange_value, volatile jint* dest)
 551   //
 552   // Arguments :
 553   //    c_rarg0: exchange_value
 554   //    c_rarg0: dest
 555   //
 556   // Result:
 557   //    *dest <- ex, return (orig *dest)
 558   address generate_atomic_xchg() {
 559     StubCodeMark mark(this, "StubRoutines", "atomic_xchg");
 560     address start = __ pc();
 561 
 562     __ movl(rax, c_rarg0); // Copy to eax we need a return value anyhow
 563     __ xchgl(rax, Address(c_rarg1, 0)); // automatic LOCK
 564     __ ret(0);
 565 
 566     return start;
 567   }
 568 
 569   // Support for intptr_t atomic::xchg_long(jlong exchange_value, volatile jlong* dest)
 570   //
 571   // Arguments :
 572   //    c_rarg0: exchange_value
 573   //    c_rarg1: dest
 574   //
 575   // Result:
 576   //    *dest <- ex, return (orig *dest)
 577   address generate_atomic_xchg_long() {
 578     StubCodeMark mark(this, "StubRoutines", "atomic_xchg_long");
 579     address start = __ pc();
 580 
 581     __ movptr(rax, c_rarg0); // Copy to eax we need a return value anyhow
 582     __ xchgptr(rax, Address(c_rarg1, 0)); // automatic LOCK
 583     __ ret(0);
 584 
 585     return start;
 586   }
 587 
 588   // Support for jint atomic::atomic_cmpxchg(jint exchange_value, volatile jint* dest,
 589   //                                         jint compare_value)
 590   //
 591   // Arguments :
 592   //    c_rarg0: exchange_value
 593   //    c_rarg1: dest
 594   //    c_rarg2: compare_value
 595   //
 596   // Result:
 597   //    if ( compare_value == *dest ) {
 598   //       *dest = exchange_value


4981 
4982     // This platform-specific settings are needed by generate_call_stub()
4983     create_control_words();
4984 
4985     // entry points that exist in all platforms Note: This is code
4986     // that could be shared among different platforms - however the
4987     // benefit seems to be smaller than the disadvantage of having a
4988     // much more complicated generator structure. See also comment in
4989     // stubRoutines.hpp.
4990 
4991     StubRoutines::_forward_exception_entry = generate_forward_exception();
4992 
4993     StubRoutines::_call_stub_entry =
4994       generate_call_stub(StubRoutines::_call_stub_return_address);
4995 
4996     // is referenced by megamorphic call
4997     StubRoutines::_catch_exception_entry = generate_catch_exception();
4998 
4999     // atomic calls
5000     StubRoutines::_atomic_xchg_entry         = generate_atomic_xchg();
5001     StubRoutines::_atomic_xchg_long_entry    = generate_atomic_xchg_long();
5002     StubRoutines::_atomic_cmpxchg_entry      = generate_atomic_cmpxchg();
5003     StubRoutines::_atomic_cmpxchg_byte_entry = generate_atomic_cmpxchg_byte();
5004     StubRoutines::_atomic_cmpxchg_long_entry = generate_atomic_cmpxchg_long();
5005     StubRoutines::_atomic_add_entry          = generate_atomic_add();
5006     StubRoutines::_atomic_add_ptr_entry      = generate_atomic_add_ptr();
5007     StubRoutines::_fence_entry               = generate_orderaccess_fence();
5008 
5009     // platform dependent
5010     StubRoutines::x86::_get_previous_fp_entry = generate_get_previous_fp();
5011     StubRoutines::x86::_get_previous_sp_entry = generate_get_previous_sp();
5012 
5013     StubRoutines::x86::_verify_mxcsr_entry    = generate_verify_mxcsr();
5014 
5015     // Build this early so it's available for the interpreter.
5016     StubRoutines::_throw_StackOverflowError_entry =
5017       generate_throw_exception("StackOverflowError throw_exception",
5018                                CAST_FROM_FN_PTR(address,
5019                                                 SharedRuntime::
5020                                                 throw_StackOverflowError));
5021     StubRoutines::_throw_delayed_StackOverflowError_entry =


< prev index next >