src/hotspot/cpu/s390/c1_Runtime1_s390.cpp
changeset 49164 7e958a8ebcd3
parent 49010 9010e596f391
child 49347 edb65305d3ac
equal deleted inserted replaced
49163:580bb0b85f63 49164:7e958a8ebcd3
     1 /*
     1 /*
     2  * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
     3  * Copyright (c) 2016 SAP SE. All rights reserved.
     3  * Copyright (c) 2016 SAP SE. All rights reserved.
     4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     5  *
     5  *
     6  * This code is free software; you can redistribute it and/or modify it
     6  * This code is free software; you can redistribute it and/or modify it
     7  * under the terms of the GNU General Public License version 2 only, as
     7  * under the terms of the GNU General Public License version 2 only, as
    25 
    25 
    26 #include "precompiled.hpp"
    26 #include "precompiled.hpp"
    27 #include "c1/c1_Defs.hpp"
    27 #include "c1/c1_Defs.hpp"
    28 #include "c1/c1_MacroAssembler.hpp"
    28 #include "c1/c1_MacroAssembler.hpp"
    29 #include "c1/c1_Runtime1.hpp"
    29 #include "c1/c1_Runtime1.hpp"
       
    30 #include "ci/ciUtilities.hpp"
       
    31 #include "gc/shared/cardTable.hpp"
       
    32 #include "gc/shared/cardTableModRefBS.hpp"
    30 #include "interpreter/interpreter.hpp"
    33 #include "interpreter/interpreter.hpp"
    31 #include "nativeInst_s390.hpp"
    34 #include "nativeInst_s390.hpp"
    32 #include "oops/compiledICHolder.hpp"
    35 #include "oops/compiledICHolder.hpp"
    33 #include "oops/oop.inline.hpp"
    36 #include "oops/oop.inline.hpp"
    34 #include "prims/jvmtiExport.hpp"
    37 #include "prims/jvmtiExport.hpp"
    38 #include "runtime/vframeArray.hpp"
    41 #include "runtime/vframeArray.hpp"
    39 #include "utilities/macros.hpp"
    42 #include "utilities/macros.hpp"
    40 #include "vmreg_s390.inline.hpp"
    43 #include "vmreg_s390.inline.hpp"
    41 #include "registerSaver_s390.hpp"
    44 #include "registerSaver_s390.hpp"
    42 #if INCLUDE_ALL_GCS
    45 #if INCLUDE_ALL_GCS
       
    46 #include "gc/g1/g1CardTable.hpp"
    43 #include "gc/g1/g1SATBCardTableModRefBS.hpp"
    47 #include "gc/g1/g1SATBCardTableModRefBS.hpp"
    44 #endif
    48 #endif
    45 
    49 
    46 // Implementation of StubAssembler
    50 // Implementation of StubAssembler
    47 
    51 
   843         Register addr_oop  = Z_R1_scratch;
   847         Register addr_oop  = Z_R1_scratch;
   844         Register addr_card = Z_R1_scratch;
   848         Register addr_card = Z_R1_scratch;
   845         Register r1        = Z_R6; // Must be saved/restored.
   849         Register r1        = Z_R6; // Must be saved/restored.
   846         Register r2        = Z_R7; // Must be saved/restored.
   850         Register r2        = Z_R7; // Must be saved/restored.
   847         Register cardtable = r1;   // Must be non-volatile, because it is used to save addr_card.
   851         Register cardtable = r1;   // Must be non-volatile, because it is used to save addr_card.
   848         jbyte* byte_map_base = ((CardTableModRefBS*)bs)->byte_map_base;
   852         jbyte* byte_map_base = ci_card_table_address();
   849 
   853 
   850         // Save registers used below (see assertion in G1PreBarrierStub::emit_code()).
   854         // Save registers used below (see assertion in G1PreBarrierStub::emit_code()).
   851         __ z_stg(r1, 0*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
   855         __ z_stg(r1, 0*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
   852 
   856 
   853         Label not_already_dirty, restart, refill, young_card;
   857         Label not_already_dirty, restart, refill, young_card;
   854 
   858 
   855         // Calculate address of card corresponding to the updated oop slot.
   859         // Calculate address of card corresponding to the updated oop slot.
   856         AddressLiteral rs(byte_map_base);
   860         AddressLiteral rs(byte_map_base);
   857         __ z_srlg(addr_card, addr_oop, CardTableModRefBS::card_shift);
   861         __ z_srlg(addr_card, addr_oop, CardTable::card_shift);
   858         addr_oop = noreg; // dead now
   862         addr_oop = noreg; // dead now
   859         __ load_const_optimized(cardtable, rs); // cardtable := <card table base>
   863         __ load_const_optimized(cardtable, rs); // cardtable := <card table base>
   860         __ z_agr(addr_card, cardtable); // addr_card := addr_oop>>card_shift + cardtable
   864         __ z_agr(addr_card, cardtable); // addr_card := addr_oop>>card_shift + cardtable
   861 
   865 
   862         __ z_cli(0, addr_card, (int)G1SATBCardTableModRefBS::g1_young_card_val());
   866         __ z_cli(0, addr_card, (int)G1CardTable::g1_young_card_val());
   863         __ z_bre(young_card);
   867         __ z_bre(young_card);
   864 
   868 
   865         __ z_sync(); // Required to support concurrent cleaning.
   869         __ z_sync(); // Required to support concurrent cleaning.
   866 
   870 
   867         __ z_cli(0, addr_card, (int)CardTableModRefBS::dirty_card_val());
   871         __ z_cli(0, addr_card, (int)CardTable::dirty_card_val());
   868         __ z_brne(not_already_dirty);
   872         __ z_brne(not_already_dirty);
   869 
   873 
   870         __ bind(young_card);
   874         __ bind(young_card);
   871         // We didn't take the branch, so we're already dirty: restore
   875         // We didn't take the branch, so we're already dirty: restore
   872         // used registers and return.
   876         // used registers and return.
   875 
   879 
   876         // Not dirty.
   880         // Not dirty.
   877         __ bind(not_already_dirty);
   881         __ bind(not_already_dirty);
   878 
   882 
   879         // First, dirty it: [addr_card] := 0
   883         // First, dirty it: [addr_card] := 0
   880         __ z_mvi(0, addr_card, CardTableModRefBS::dirty_card_val());
   884         __ z_mvi(0, addr_card, CardTable::dirty_card_val());
   881 
   885 
   882         Register idx = cardtable; // Must be non-volatile, because it is used to save addr_card.
   886         Register idx = cardtable; // Must be non-volatile, because it is used to save addr_card.
   883         Register buf = r2;
   887         Register buf = r2;
   884         cardtable = noreg; // now dead
   888         cardtable = noreg; // now dead
   885 
   889