comparison src/cpu/sparc/vm/templateInterpreter_sparc.cpp @ 3284:286c498ae0d4

Merge
author kvn
date Fri, 29 Apr 2011 11:15:30 -0700
parents e1162778c1c8
children 2e038ad0c1d0
comparison
equal deleted inserted replaced
3283:01fd6090fdd8 3284:286c498ae0d4
759 __ bind(slow_path); 759 __ bind(slow_path);
760 (void) generate_normal_entry(false); 760 (void) generate_normal_entry(false);
761 return entry; 761 return entry;
762 } 762 }
763 return NULL; 763 return NULL;
764 }
765
766 // Method entry for java.lang.ref.Reference.get.
767 address InterpreterGenerator::generate_Reference_get_entry(void) {
768 #ifndef SERIALGC
769 // Code: _aload_0, _getfield, _areturn
770 // parameter size = 1
771 //
772 // The code that gets generated by this routine is split into 2 parts:
773 // 1. The "intrinsified" code for G1 (or any SATB based GC),
774 // 2. The slow path - which is an expansion of the regular method entry.
775 //
776 // Notes:-
777 // * In the G1 code we do not check whether we need to block for
778 // a safepoint. If G1 is enabled then we must execute the specialized
779 // code for Reference.get (except when the Reference object is null)
780 // so that we can log the value in the referent field with an SATB
781 // update buffer.
782 // If the code for the getfield template is modified so that the
783 // G1 pre-barrier code is executed when the current method is
784 // Reference.get() then going through the normal method entry
785 // will be fine.
786 // * The G1 code can, however, check the receiver object (the instance
787 // of java.lang.Reference) and jump to the slow path if null. If the
788 // Reference object is null then we obviously cannot fetch the referent
789 // and so we don't need to call the G1 pre-barrier. Thus we can use the
790 // regular method entry code to generate the NPE.
791 //
792 // This code is based on generate_accessor_enty.
793
794 address entry = __ pc();
795
796 const int referent_offset = java_lang_ref_Reference::referent_offset;
797 guarantee(referent_offset > 0, "referent offset not initialized");
798
799 if (UseG1GC) {
800 Label slow_path;
801
802 // In the G1 code we don't check if we need to reach a safepoint. We
803 // continue and the thread will safepoint at the next bytecode dispatch.
804
805 // Check if local 0 != NULL
806 // If the receiver is null then it is OK to jump to the slow path.
807 __ ld_ptr(Gargs, G0, Otos_i ); // get local 0
808 __ tst(Otos_i); // check if local 0 == NULL and go the slow path
809 __ brx(Assembler::zero, false, Assembler::pn, slow_path);
810 __ delayed()->nop();
811
812
813 // Load the value of the referent field.
814 if (Assembler::is_simm13(referent_offset)) {
815 __ load_heap_oop(Otos_i, referent_offset, Otos_i);
816 } else {
817 __ set(referent_offset, G3_scratch);
818 __ load_heap_oop(Otos_i, G3_scratch, Otos_i);
819 }
820
821 // Generate the G1 pre-barrier code to log the value of
822 // the referent field in an SATB buffer. Note with
823 // these parameters the pre-barrier does not generate
824 // the load of the previous value
825
826 __ g1_write_barrier_pre(noreg /* obj */, noreg /* index */, 0 /* offset */,
827 Otos_i /* pre_val */,
828 G3_scratch /* tmp */,
829 true /* preserve_o_regs */);
830
831 // _areturn
832 __ retl(); // return from leaf routine
833 __ delayed()->mov(O5_savedSP, SP);
834
835 // Generate regular method entry
836 __ bind(slow_path);
837 (void) generate_normal_entry(false);
838 return entry;
839 }
840 #endif // SERIALGC
841
842 // If G1 is not enabled then attempt to go through the accessor entry point
843 // Reference.get is an accessor
844 return generate_accessor_entry();
764 } 845 }
765 846
766 // 847 //
767 // Interpreter stub for calling a native method. (asm interpreter) 848 // Interpreter stub for calling a native method. (asm interpreter)
768 // This sets up a somewhat different looking stack for calling the native method 849 // This sets up a somewhat different looking stack for calling the native method