comparison src/cpu/sparc/vm/sharedRuntime_sparc.cpp @ 3442:f7d55ea6ee56

7045514: SPARC assembly code for JSR 292 ricochet frames Reviewed-by: kvn, jrose
author never
date Fri, 03 Jun 2011 22:31:43 -0700
parents 3d58a4983660
children 3d42f82cd811
comparison
equal deleted inserted replaced
3441:f56542cb325a 3442:f7d55ea6ee56
45 #include "shark/sharkCompiler.hpp" 45 #include "shark/sharkCompiler.hpp"
46 #endif 46 #endif
47 47
48 #define __ masm-> 48 #define __ masm->
49 49
50 #ifdef COMPILER2
51 UncommonTrapBlob* SharedRuntime::_uncommon_trap_blob;
52 #endif // COMPILER2
53
54 DeoptimizationBlob* SharedRuntime::_deopt_blob;
55 SafepointBlob* SharedRuntime::_polling_page_safepoint_handler_blob;
56 SafepointBlob* SharedRuntime::_polling_page_return_handler_blob;
57 RuntimeStub* SharedRuntime::_wrong_method_blob;
58 RuntimeStub* SharedRuntime::_ic_miss_blob;
59 RuntimeStub* SharedRuntime::_resolve_opt_virtual_call_blob;
60 RuntimeStub* SharedRuntime::_resolve_virtual_call_blob;
61 RuntimeStub* SharedRuntime::_resolve_static_call_blob;
62 50
63 class RegisterSaver { 51 class RegisterSaver {
64 52
65 // Used for saving volatile registers. This is Gregs, Fregs, I/L/O. 53 // Used for saving volatile registers. This is Gregs, Fregs, I/L/O.
66 // The Oregs are problematic. In the 32bit build the compiler can 54 // The Oregs are problematic. In the 32bit build the compiler can
3490 // the adjusted FP off to the GC stack-crawler: this will modify the caller's 3478 // the adjusted FP off to the GC stack-crawler: this will modify the caller's
3491 // SP and mess up HIS OopMaps. So we first adjust the caller's SP, then save 3479 // SP and mess up HIS OopMaps. So we first adjust the caller's SP, then save
3492 // the 64-bit %o's, then do a save, then fixup the caller's SP (our FP). 3480 // the 64-bit %o's, then do a save, then fixup the caller's SP (our FP).
3493 // Tricky, tricky, tricky... 3481 // Tricky, tricky, tricky...
3494 3482
3495 static SafepointBlob* generate_handler_blob(address call_ptr, bool cause_return) { 3483 SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, bool cause_return) {
3496 assert (StubRoutines::forward_exception_entry() != NULL, "must be generated before"); 3484 assert (StubRoutines::forward_exception_entry() != NULL, "must be generated before");
3497 3485
3498 // allocate space for the code 3486 // allocate space for the code
3499 ResourceMark rm; 3487 ResourceMark rm;
3500 // setup code generation tools 3488 // setup code generation tools
3585 // Generate a stub that calls into vm to find out the proper destination 3573 // Generate a stub that calls into vm to find out the proper destination
3586 // of a java call. All the argument registers are live at this point 3574 // of a java call. All the argument registers are live at this point
3587 // but since this is generic code we don't know what they are and the caller 3575 // but since this is generic code we don't know what they are and the caller
3588 // must do any gc of the args. 3576 // must do any gc of the args.
3589 // 3577 //
3590 static RuntimeStub* generate_resolve_blob(address destination, const char* name) { 3578 RuntimeStub* SharedRuntime::generate_resolve_blob(address destination, const char* name) {
3591 assert (StubRoutines::forward_exception_entry() != NULL, "must be generated before"); 3579 assert (StubRoutines::forward_exception_entry() != NULL, "must be generated before");
3592 3580
3593 // allocate space for the code 3581 // allocate space for the code
3594 ResourceMark rm; 3582 ResourceMark rm;
3595 // setup code generation tools 3583 // setup code generation tools
3675 3663
3676 // return the blob 3664 // return the blob
3677 // frame_size_words or bytes?? 3665 // frame_size_words or bytes??
3678 return RuntimeStub::new_runtime_stub(name, &buffer, frame_complete, frame_size_words, oop_maps, true); 3666 return RuntimeStub::new_runtime_stub(name, &buffer, frame_complete, frame_size_words, oop_maps, true);
3679 } 3667 }
3680
3681 void SharedRuntime::generate_stubs() {
3682
3683 _wrong_method_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method),
3684 "wrong_method_stub");
3685
3686 _ic_miss_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method_ic_miss),
3687 "ic_miss_stub");
3688
3689 _resolve_opt_virtual_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_opt_virtual_call_C),
3690 "resolve_opt_virtual_call");
3691
3692 _resolve_virtual_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_virtual_call_C),
3693 "resolve_virtual_call");
3694
3695 _resolve_static_call_blob = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_static_call_C),
3696 "resolve_static_call");
3697
3698 _polling_page_safepoint_handler_blob =
3699 generate_handler_blob(CAST_FROM_FN_PTR(address,
3700 SafepointSynchronize::handle_polling_page_exception), false);
3701
3702 _polling_page_return_handler_blob =
3703 generate_handler_blob(CAST_FROM_FN_PTR(address,
3704 SafepointSynchronize::handle_polling_page_exception), true);
3705
3706 generate_deopt_blob();
3707
3708 #ifdef COMPILER2
3709 generate_uncommon_trap_blob();
3710 #endif // COMPILER2
3711 }