Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/gc_implementation/shenandoah/c1/shenandoahBarrierSetC1.cpp
38922 views
/*1* Copyright (c) 2018, 2020 Red Hat, Inc. All rights reserved.2*3* This code is free software; you can redistribute it and/or modify it4* under the terms of the GNU General Public License version 2 only, as5* published by the Free Software Foundation.6*7* This code is distributed in the hope that it will be useful, but WITHOUT8* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or9* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License10* version 2 for more details (a copy is included in the LICENSE file that11* accompanied this code).12*13* You should have received a copy of the GNU General Public License version14* 2 along with this work; if not, write to the Free Software Foundation,15* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.16*17* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA18* or visit www.oracle.com if you need additional information or have any19* questions.20*21*/2223#include "precompiled.hpp"24#include "c1/c1_LIRGenerator.hpp"25#include "c1/c1_IR.hpp"26#include "gc_implementation/g1/satbQueue.hpp"27#include "gc_implementation/shenandoah/shenandoahForwarding.hpp"28#include "gc_implementation/shenandoah/shenandoahHeap.inline.hpp"29#include "gc_implementation/shenandoah/shenandoahHeapRegion.hpp"30#include "gc_implementation/shenandoah/c1/shenandoahBarrierSetC1.hpp"3132#ifdef TARGET_ARCH_aarch6433#include "shenandoahBarrierSetAssembler_aarch64.hpp"34#endif35#ifdef TARGET_ARCH_x8636#include "shenandoahBarrierSetAssembler_x86.hpp"37#endif3839#ifdef ASSERT40#define __ gen->lir(__FILE__, __LINE__)->41#else42#define __ gen->lir()->43#endif4445void ShenandoahLoadReferenceBarrierStub::emit_code(LIR_Assembler* ce) {46ShenandoahBarrierSetAssembler* bs = ShenandoahBarrierSetAssembler::bsasm();47bs->gen_load_reference_barrier_stub(ce, this);48}4950ShenandoahBarrierSetC1* ShenandoahBarrierSetC1::bsc1() {51return ShenandoahBarrierSet::barrier_set()->bsc1();52}5354LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier(LIRGenerator* gen, LIR_Opr obj, LIR_Opr addr) {55if (ShenandoahLoadRefBarrier) {56return load_reference_barrier_impl(gen, obj, addr);57} else {58return obj;59}60}6162LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj, LIR_Opr addr) {63assert(ShenandoahLoadRefBarrier, "Should be enabled");64obj = ensure_in_register(gen, obj, T_OBJECT);65assert(obj->is_register(), "must be a register at this point");66addr = ensure_in_register(gen, addr, T_ADDRESS);67assert(addr->is_register(), "must be a register at this point");68LIR_Opr result = gen->result_register_for(obj->value_type());69__ move(obj, result);70LIR_Opr tmp1 = gen->new_register(T_ADDRESS);71LIR_Opr tmp2 = gen->new_register(T_ADDRESS);7273LIR_Opr thrd = gen->getThreadPointer();74LIR_Address* active_flag_addr =75new LIR_Address(thrd,76in_bytes(JavaThread::gc_state_offset()),77T_BYTE);78// Read and check the gc-state-flag.79LIR_Opr flag_val = gen->new_register(T_INT);80__ load(active_flag_addr, flag_val);81LIR_Opr mask = LIR_OprFact::intConst(ShenandoahHeap::HAS_FORWARDED |82ShenandoahHeap::EVACUATION);83LIR_Opr mask_reg = gen->new_register(T_INT);84__ move(mask, mask_reg);8586if (TwoOperandLIRForm) {87__ logical_and(flag_val, mask_reg, flag_val);88} else {89LIR_Opr masked_flag = gen->new_register(T_INT);90__ logical_and(flag_val, mask_reg, masked_flag);91flag_val = masked_flag;92}93__ cmp(lir_cond_notEqual, flag_val, LIR_OprFact::intConst(0));9495CodeStub* slow = new ShenandoahLoadReferenceBarrierStub(obj, addr, result, tmp1, tmp2);96__ branch(lir_cond_notEqual, T_INT, slow);97__ branch_destination(slow->continuation());9899return result;100}101102LIR_Opr ShenandoahBarrierSetC1::ensure_in_register(LIRGenerator* gen, LIR_Opr obj, BasicType type) {103if (!obj->is_register()) {104LIR_Opr obj_reg;105if (obj->is_constant()) {106obj_reg = gen->new_register(type);107__ move(obj, obj_reg);108} else {109obj_reg = gen->new_pointer_register();110__ leal(obj, obj_reg);111}112obj = obj_reg;113}114return obj;115}116117LIR_Opr ShenandoahBarrierSetC1::storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool patch) {118if (ShenandoahStoreValEnqueueBarrier) {119obj = ensure_in_register(gen, obj, T_OBJECT);120gen->G1SATBCardTableModRef_pre_barrier(LIR_OprFact::illegalOpr, obj, false, false, NULL);121}122return obj;123}124125LIR_Opr ShenandoahBarrierSetC1::resolve_address(LIRGenerator* gen, LIR_Address* addr, BasicType type, CodeEmitInfo* patch_emit_info) {126LIR_Opr addr_opr = LIR_OprFact::address(addr);127128LIR_Opr resolved_addr = gen->new_pointer_register();129if (patch_emit_info != NULL) {130__ leal(addr_opr, resolved_addr, lir_patch_normal, new CodeEmitInfo(patch_emit_info));131} else {132__ leal(addr_opr, resolved_addr);133}134return LIR_OprFact::address(new LIR_Address(resolved_addr, type));135}136137138