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 |