Mercurial > hg > graal-compiler
comparison src/cpu/x86/vm/templateInterpreter_x86_64.cpp @ 3252:92add02409c9
Merge
author | jmasa |
---|---|
date | Fri, 08 Apr 2011 14:19:50 -0700 |
parents | 38fea01eb669 e1162778c1c8 |
children | 3d2ab563047a |
comparison
equal
deleted
inserted
replaced
2437:4f978fb6c81a | 3252:92add02409c9 |
---|---|
755 } | 755 } |
756 | 756 |
757 return entry_point; | 757 return entry_point; |
758 } | 758 } |
759 | 759 |
760 // Method entry for java.lang.ref.Reference.get. | |
761 address InterpreterGenerator::generate_Reference_get_entry(void) { | |
762 #ifndef SERIALGC | |
763 // Code: _aload_0, _getfield, _areturn | |
764 // parameter size = 1 | |
765 // | |
766 // The code that gets generated by this routine is split into 2 parts: | |
767 // 1. The "intrinsified" code for G1 (or any SATB based GC), | |
768 // 2. The slow path - which is an expansion of the regular method entry. | |
769 // | |
770 // Notes:- | |
771 // * In the G1 code we do not check whether we need to block for | |
772 // a safepoint. If G1 is enabled then we must execute the specialized | |
773 // code for Reference.get (except when the Reference object is null) | |
774 // so that we can log the value in the referent field with an SATB | |
775 // update buffer. | |
776 // If the code for the getfield template is modified so that the | |
777 // G1 pre-barrier code is executed when the current method is | |
778 // Reference.get() then going through the normal method entry | |
779 // will be fine. | |
780 // * The G1 code can, however, check the receiver object (the instance | |
781 // of java.lang.Reference) and jump to the slow path if null. If the | |
782 // Reference object is null then we obviously cannot fetch the referent | |
783 // and so we don't need to call the G1 pre-barrier. Thus we can use the | |
784 // regular method entry code to generate the NPE. | |
785 // | |
786 // This code is based on generate_accessor_enty. | |
787 // | |
788 // rbx: methodOop | |
789 | |
790 // r13: senderSP must preserve for slow path, set SP to it on fast path | |
791 | |
792 address entry = __ pc(); | |
793 | |
794 const int referent_offset = java_lang_ref_Reference::referent_offset; | |
795 guarantee(referent_offset > 0, "referent offset not initialized"); | |
796 | |
797 if (UseG1GC) { | |
798 Label slow_path; | |
799 // rbx: method | |
800 | |
801 // Check if local 0 != NULL | |
802 // If the receiver is null then it is OK to jump to the slow path. | |
803 __ movptr(rax, Address(rsp, wordSize)); | |
804 | |
805 __ testptr(rax, rax); | |
806 __ jcc(Assembler::zero, slow_path); | |
807 | |
808 // rax: local 0 | |
809 // rbx: method (but can be used as scratch now) | |
810 // rdx: scratch | |
811 // rdi: scratch | |
812 | |
813 // Generate the G1 pre-barrier code to log the value of | |
814 // the referent field in an SATB buffer. | |
815 | |
816 // Load the value of the referent field. | |
817 const Address field_address(rax, referent_offset); | |
818 __ load_heap_oop(rax, field_address); | |
819 | |
820 // Generate the G1 pre-barrier code to log the value of | |
821 // the referent field in an SATB buffer. | |
822 __ g1_write_barrier_pre(noreg /* obj */, | |
823 rax /* pre_val */, | |
824 r15_thread /* thread */, | |
825 rbx /* tmp */, | |
826 true /* tosca_live */, | |
827 true /* expand_call */); | |
828 | |
829 // _areturn | |
830 __ pop(rdi); // get return address | |
831 __ mov(rsp, r13); // set sp to sender sp | |
832 __ jmp(rdi); | |
833 __ ret(0); | |
834 | |
835 // generate a vanilla interpreter entry as the slow path | |
836 __ bind(slow_path); | |
837 (void) generate_normal_entry(false); | |
838 | |
839 return entry; | |
840 } | |
841 #endif // SERIALGC | |
842 | |
843 // If G1 is not enabled then attempt to go through the accessor entry point | |
844 // Reference.get is an accessor | |
845 return generate_accessor_entry(); | |
846 } | |
847 | |
848 | |
760 // Interpreter stub for calling a native method. (asm interpreter) | 849 // Interpreter stub for calling a native method. (asm interpreter) |
761 // This sets up a somewhat different looking stack for calling the | 850 // This sets up a somewhat different looking stack for calling the |
762 // native method than the typical interpreter frame setup. | 851 // native method than the typical interpreter frame setup. |
763 address InterpreterGenerator::generate_native_entry(bool synchronized) { | 852 address InterpreterGenerator::generate_native_entry(bool synchronized) { |
764 // determine code generation flags | 853 // determine code generation flags |
1461 case Interpreter::java_lang_math_tan : // fall thru | 1550 case Interpreter::java_lang_math_tan : // fall thru |
1462 case Interpreter::java_lang_math_abs : // fall thru | 1551 case Interpreter::java_lang_math_abs : // fall thru |
1463 case Interpreter::java_lang_math_log : // fall thru | 1552 case Interpreter::java_lang_math_log : // fall thru |
1464 case Interpreter::java_lang_math_log10 : // fall thru | 1553 case Interpreter::java_lang_math_log10 : // fall thru |
1465 case Interpreter::java_lang_math_sqrt : entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind); break; | 1554 case Interpreter::java_lang_math_sqrt : entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind); break; |
1555 case Interpreter::java_lang_ref_reference_get | |
1556 : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break; | |
1466 default : ShouldNotReachHere(); break; | 1557 default : ShouldNotReachHere(); break; |
1467 } | 1558 } |
1468 | 1559 |
1469 if (entry_point) { | 1560 if (entry_point) { |
1470 return entry_point; | 1561 return entry_point; |