< prev index next >

src/cpu/sparc/vm/templateInterpreterGenerator_sparc.cpp

Print this page
rev 12906 : [mq]: gc_interface

*** 22,31 **** --- 22,32 ---- * */ #include "precompiled.hpp" #include "asm/macroAssembler.hpp" + #include "gc/shared/barrierSetCodeGen.hpp" #include "interpreter/bytecodeHistogram.hpp" #include "interpreter/interpreter.hpp" #include "interpreter/interpreterRuntime.hpp" #include "interpreter/interp_masm.hpp" #include "interpreter/templateInterpreterGenerator.hpp"
*** 834,844 **** } // Method entry for java.lang.ref.Reference.get. address TemplateInterpreterGenerator::generate_Reference_get_entry(void) { - #if INCLUDE_ALL_GCS // Code: _aload_0, _getfield, _areturn // parameter size = 1 // // The code that gets generated by this routine is split into 2 parts: // 1. The "intrinsified" code for G1 (or any SATB based GC), --- 835,844 ----
*** 865,875 **** address entry = __ pc(); const int referent_offset = java_lang_ref_Reference::referent_offset; guarantee(referent_offset > 0, "referent offset not initialized"); - if (UseG1GC) { Label slow_path; // In the G1 code we don't check if we need to reach a safepoint. We // continue and the thread will safepoint at the next bytecode dispatch. --- 865,874 ----
*** 877,919 **** // If the receiver is null then it is OK to jump to the slow path. __ ld_ptr(Gargs, G0, Otos_i ); // get local 0 // check if local 0 == NULL and go the slow path __ cmp_and_brx_short(Otos_i, 0, Assembler::equal, Assembler::pn, slow_path); ! ! // Load the value of the referent field. ! if (Assembler::is_simm13(referent_offset)) { ! __ load_heap_oop(Otos_i, referent_offset, Otos_i); ! } else { ! __ set(referent_offset, G3_scratch); ! __ load_heap_oop(Otos_i, G3_scratch, Otos_i); ! } ! ! // Generate the G1 pre-barrier code to log the value of ! // the referent field in an SATB buffer. Note with ! // these parameters the pre-barrier does not generate ! // the load of the previous value ! ! __ g1_write_barrier_pre(noreg /* obj */, noreg /* index */, 0 /* offset */, ! Otos_i /* pre_val */, ! G3_scratch /* tmp */, ! true /* preserve_o_regs */); // _areturn __ retl(); // return from leaf routine __ delayed()->mov(O5_savedSP, SP); // Generate regular method entry __ bind(slow_path); __ jump_to_entry(Interpreter::entry_for_kind(Interpreter::zerolocals)); return entry; - } - #endif // INCLUDE_ALL_GCS - - // If G1 is not enabled then attempt to go through the accessor entry point - // Reference.get is an accessor - return NULL; } /** * Method entry for static native methods: * int java.util.zip.CRC32.update(int crc, int b) --- 876,897 ---- // If the receiver is null then it is OK to jump to the slow path. __ ld_ptr(Gargs, G0, Otos_i ); // get local 0 // check if local 0 == NULL and go the slow path __ cmp_and_brx_short(Otos_i, 0, Assembler::equal, Assembler::pn, slow_path); ! BarrierSetCodeGen *code_gen = Universe::heap()->barrier_set()->code_gen(); ! code_gen->load_at(_masm, ACCESS_ON_HEAP | GC_ACCESS_ON_WEAK, T_OBJECT, ! Otos_i, noreg, referent_offset, Otos_i, G3_scratch); // _areturn __ retl(); // return from leaf routine __ delayed()->mov(O5_savedSP, SP); // Generate regular method entry __ bind(slow_path); __ jump_to_entry(Interpreter::entry_for_kind(Interpreter::zerolocals)); return entry; } /** * Method entry for static native methods: * int java.util.zip.CRC32.update(int crc, int b)
*** 1434,1470 **** // If we have an oop result store it where it will be safe for any further gc // until we return now that we've released the handle it might be protected by { ! Label no_oop, store_result; __ set((intptr_t)AbstractInterpreter::result_handler(T_OBJECT), G3_scratch); __ cmp_and_brx_short(G3_scratch, Lscratch, Assembler::notEqual, Assembler::pt, no_oop); ! // Unbox oop result, e.g. JNIHandles::resolve value in O0. ! __ br_null(O0, false, Assembler::pn, store_result); // Use NULL as-is. ! __ delayed()->andcc(O0, JNIHandles::weak_tag_mask, G0); // Test for jweak ! __ brx(Assembler::zero, true, Assembler::pt, store_result); ! __ delayed()->ld_ptr(O0, 0, O0); // Maybe resolve (untagged) jobject. ! // Resolve jweak. ! __ ld_ptr(O0, -JNIHandles::weak_tag_value, O0); ! #if INCLUDE_ALL_GCS ! if (UseG1GC) { ! __ g1_write_barrier_pre(noreg /* obj */, ! noreg /* index */, ! 0 /* offset */, ! O0 /* pre_val */, ! G3_scratch /* tmp */, ! true /* preserve_o_regs */); ! } ! #endif // INCLUDE_ALL_GCS ! __ bind(store_result); // Store it where gc will look for it and result handler expects it. __ st_ptr(O0, FP, (frame::interpreter_frame_oop_temp_offset*wordSize) + STACK_BIAS); __ bind(no_oop); - } // handle exceptions (exception handling will handle unlocking!) { Label L; --- 1412,1430 ---- // If we have an oop result store it where it will be safe for any further gc // until we return now that we've released the handle it might be protected by { ! Label no_oop; __ set((intptr_t)AbstractInterpreter::result_handler(T_OBJECT), G3_scratch); __ cmp_and_brx_short(G3_scratch, Lscratch, Assembler::notEqual, Assembler::pt, no_oop); ! __ resolve_jobject(O0, G3_scratch); // Store it where gc will look for it and result handler expects it. __ st_ptr(O0, FP, (frame::interpreter_frame_oop_temp_offset*wordSize) + STACK_BIAS); __ bind(no_oop); } // handle exceptions (exception handling will handle unlocking!) { Label L;
< prev index next >