Mercurial > hg > truffle
comparison src/cpu/x86/vm/templateInterpreter_x86_32.cpp @ 3284:286c498ae0d4
Merge
author | kvn |
---|---|
date | Fri, 29 Apr 2011 11:15:30 -0700 |
parents | 92add02409c9 |
children | 3d2ab563047a |
comparison
equal
deleted
inserted
replaced
3283:01fd6090fdd8 | 3284:286c498ae0d4 |
---|---|
774 } | 774 } |
775 return NULL; | 775 return NULL; |
776 | 776 |
777 } | 777 } |
778 | 778 |
779 // Method entry for java.lang.ref.Reference.get. | |
780 address InterpreterGenerator::generate_Reference_get_entry(void) { | |
781 #ifndef SERIALGC | |
782 // Code: _aload_0, _getfield, _areturn | |
783 // parameter size = 1 | |
784 // | |
785 // The code that gets generated by this routine is split into 2 parts: | |
786 // 1. The "intrinsified" code for G1 (or any SATB based GC), | |
787 // 2. The slow path - which is an expansion of the regular method entry. | |
788 // | |
789 // Notes:- | |
790 // * In the G1 code we do not check whether we need to block for | |
791 // a safepoint. If G1 is enabled then we must execute the specialized | |
792 // code for Reference.get (except when the Reference object is null) | |
793 // so that we can log the value in the referent field with an SATB | |
794 // update buffer. | |
795 // If the code for the getfield template is modified so that the | |
796 // G1 pre-barrier code is executed when the current method is | |
797 // Reference.get() then going through the normal method entry | |
798 // will be fine. | |
799 // * The G1 code below can, however, check the receiver object (the instance | |
800 // of java.lang.Reference) and jump to the slow path if null. If the | |
801 // Reference object is null then we obviously cannot fetch the referent | |
802 // and so we don't need to call the G1 pre-barrier. Thus we can use the | |
803 // regular method entry code to generate the NPE. | |
804 // | |
805 // This code is based on generate_accessor_enty. | |
806 | |
807 // rbx,: methodOop | |
808 // rcx: receiver (preserve for slow entry into asm interpreter) | |
809 | |
810 // rsi: senderSP must preserved for slow path, set SP to it on fast path | |
811 | |
812 address entry = __ pc(); | |
813 | |
814 const int referent_offset = java_lang_ref_Reference::referent_offset; | |
815 guarantee(referent_offset > 0, "referent offset not initialized"); | |
816 | |
817 if (UseG1GC) { | |
818 Label slow_path; | |
819 | |
820 // Check if local 0 != NULL | |
821 // If the receiver is null then it is OK to jump to the slow path. | |
822 __ movptr(rax, Address(rsp, wordSize)); | |
823 __ testptr(rax, rax); | |
824 __ jcc(Assembler::zero, slow_path); | |
825 | |
826 // rax: local 0 (must be preserved across the G1 barrier call) | |
827 // | |
828 // rbx: method (at this point it's scratch) | |
829 // rcx: receiver (at this point it's scratch) | |
830 // rdx: scratch | |
831 // rdi: scratch | |
832 // | |
833 // rsi: sender sp | |
834 | |
835 // Preserve the sender sp in case the pre-barrier | |
836 // calls the runtime | |
837 __ push(rsi); | |
838 | |
839 // Load the value of the referent field. | |
840 const Address field_address(rax, referent_offset); | |
841 __ movptr(rax, field_address); | |
842 | |
843 // Generate the G1 pre-barrier code to log the value of | |
844 // the referent field in an SATB buffer. | |
845 __ get_thread(rcx); | |
846 __ g1_write_barrier_pre(noreg /* obj */, | |
847 rax /* pre_val */, | |
848 rcx /* thread */, | |
849 rbx /* tmp */, | |
850 true /* tosca_save */, | |
851 true /* expand_call */); | |
852 | |
853 // _areturn | |
854 __ pop(rsi); // get sender sp | |
855 __ pop(rdi); // get return address | |
856 __ mov(rsp, rsi); // set sp to sender sp | |
857 __ jmp(rdi); | |
858 | |
859 __ bind(slow_path); | |
860 (void) generate_normal_entry(false); | |
861 | |
862 return entry; | |
863 } | |
864 #endif // SERIALGC | |
865 | |
866 // If G1 is not enabled then attempt to go through the accessor entry point | |
867 // Reference.get is an accessor | |
868 return generate_accessor_entry(); | |
869 } | |
870 | |
779 // | 871 // |
780 // Interpreter stub for calling a native method. (asm interpreter) | 872 // Interpreter stub for calling a native method. (asm interpreter) |
781 // This sets up a somewhat different looking stack for calling the native method | 873 // This sets up a somewhat different looking stack for calling the native method |
782 // than the typical interpreter frame setup. | 874 // than the typical interpreter frame setup. |
783 // | 875 // |
1442 case Interpreter::java_lang_math_tan : // fall thru | 1534 case Interpreter::java_lang_math_tan : // fall thru |
1443 case Interpreter::java_lang_math_abs : // fall thru | 1535 case Interpreter::java_lang_math_abs : // fall thru |
1444 case Interpreter::java_lang_math_log : // fall thru | 1536 case Interpreter::java_lang_math_log : // fall thru |
1445 case Interpreter::java_lang_math_log10 : // fall thru | 1537 case Interpreter::java_lang_math_log10 : // fall thru |
1446 case Interpreter::java_lang_math_sqrt : entry_point = ((InterpreterGenerator*)this)->generate_math_entry(kind); break; | 1538 case Interpreter::java_lang_math_sqrt : entry_point = ((InterpreterGenerator*)this)->generate_math_entry(kind); break; |
1539 case Interpreter::java_lang_ref_reference_get | |
1540 : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break; | |
1447 default : ShouldNotReachHere(); break; | 1541 default : ShouldNotReachHere(); break; |
1448 } | 1542 } |
1449 | 1543 |
1450 if (entry_point) return entry_point; | 1544 if (entry_point) return entry_point; |
1451 | 1545 |