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 =
|