6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "c1/c1_CodeStubs.hpp"
26 #include "c1/c1_LIRGenerator.hpp"
27 #include "gc/g1/c1/g1BarrierSetC1.hpp"
28 #include "gc/g1/g1BarrierSet.hpp"
29 #include "gc/g1/g1BarrierSetAssembler.hpp"
30 #include "gc/g1/g1HeapRegion.hpp"
31 #include "gc/g1/g1ThreadLocalData.hpp"
32 #include "utilities/macros.hpp"
33
34 #ifdef ASSERT
35 #define __ gen->lir(__FILE__, __LINE__)->
36 #else
37 #define __ gen->lir()->
38 #endif
39
40 void G1PreBarrierStub::emit_code(LIR_Assembler* ce) {
41 G1BarrierSetAssembler* bs = (G1BarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
42 bs->gen_pre_barrier_stub(ce, this);
43 }
44
45 void G1PostBarrierStub::emit_code(LIR_Assembler* ce) {
135 }
136 new_val = new_val_reg;
137 }
138 assert(new_val->is_register(), "must be a register at this point");
139
140 if (addr->is_address()) {
141 LIR_Address* address = addr->as_address_ptr();
142 LIR_Opr ptr = gen->new_pointer_register();
143 if (!address->index()->is_valid() && address->disp() == 0) {
144 __ move(address->base(), ptr);
145 } else {
146 assert(address->disp() != max_jint, "lea doesn't support patched addresses!");
147 __ leal(addr, ptr);
148 }
149 addr = ptr;
150 }
151 assert(addr->is_register(), "must be a register at this point");
152
153 LIR_Opr xor_res = gen->new_pointer_register();
154 LIR_Opr xor_shift_res = gen->new_pointer_register();
155 if (two_operand_lir_form) {
156 __ move(addr, xor_res);
157 __ logical_xor(xor_res, new_val, xor_res);
158 __ move(xor_res, xor_shift_res);
159 __ unsigned_shift_right(xor_shift_res,
160 LIR_OprFact::intConst(checked_cast<jint>(G1HeapRegion::LogOfHRGrainBytes)),
161 xor_shift_res,
162 LIR_Opr::illegalOpr());
163 } else {
164 __ logical_xor(addr, new_val, xor_res);
165 __ unsigned_shift_right(xor_res,
166 LIR_OprFact::intConst(checked_cast<jint>(G1HeapRegion::LogOfHRGrainBytes)),
167 xor_shift_res,
168 LIR_Opr::illegalOpr());
169 }
170
171 __ cmp(lir_cond_notEqual, xor_shift_res, LIR_OprFact::intptrConst(NULL_WORD));
172
173 CodeStub* slow = new G1PostBarrierStub(addr, new_val);
174 __ branch(lir_cond_notEqual, slow);
175 __ branch_destination(slow->continuation());
176 }
177
178 void G1BarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) {
179 DecoratorSet decorators = access.decorators();
180 bool is_weak = (decorators & ON_WEAK_OOP_REF) != 0;
181 bool is_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0;
182 bool is_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
183 LIRGenerator *gen = access.gen();
184
185 BarrierSetC1::load_at_resolved(access, result);
186
187 if (access.is_oop() && (is_weak || is_phantom || is_anonymous)) {
188 // Register the value in the referent field with the pre-barrier
|
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "c1/c1_CodeStubs.hpp"
26 #include "code/aotCodeCache.hpp"
27 #include "c1/c1_LIRGenerator.hpp"
28 #include "gc/g1/c1/g1BarrierSetC1.hpp"
29 #include "gc/g1/g1BarrierSet.hpp"
30 #include "gc/g1/g1BarrierSetAssembler.hpp"
31 #include "gc/g1/g1HeapRegion.hpp"
32 #include "gc/g1/g1ThreadLocalData.hpp"
33 #include "utilities/macros.hpp"
34
35 #ifdef ASSERT
36 #define __ gen->lir(__FILE__, __LINE__)->
37 #else
38 #define __ gen->lir()->
39 #endif
40
41 void G1PreBarrierStub::emit_code(LIR_Assembler* ce) {
42 G1BarrierSetAssembler* bs = (G1BarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
43 bs->gen_pre_barrier_stub(ce, this);
44 }
45
46 void G1PostBarrierStub::emit_code(LIR_Assembler* ce) {
136 }
137 new_val = new_val_reg;
138 }
139 assert(new_val->is_register(), "must be a register at this point");
140
141 if (addr->is_address()) {
142 LIR_Address* address = addr->as_address_ptr();
143 LIR_Opr ptr = gen->new_pointer_register();
144 if (!address->index()->is_valid() && address->disp() == 0) {
145 __ move(address->base(), ptr);
146 } else {
147 assert(address->disp() != max_jint, "lea doesn't support patched addresses!");
148 __ leal(addr, ptr);
149 }
150 addr = ptr;
151 }
152 assert(addr->is_register(), "must be a register at this point");
153
154 LIR_Opr xor_res = gen->new_pointer_register();
155 LIR_Opr xor_shift_res = gen->new_pointer_register();
156 #if INCLUDE_CDS
157 // we need to load the grain shift from the AOT Runtime
158 // Constants Area
159 LIR_Opr grain_shift_addr = LIR_OprFact::intptrConst(AOTRuntimeConstants::grain_shift_address());
160 LIR_Opr grain_shift_reg = gen->new_pointer_register();
161 LIR_Address* grain_shift_indirect = new LIR_Address(grain_shift_reg, 0, T_INT);
162 #ifdef X86
163 LIR_Opr grain_shift = gen->shiftCountOpr();
164 #else // X86
165 LIR_Opr grain_shift = gen->new_register(T_INT);
166 #endif // X86
167 #endif
168 if (two_operand_lir_form) {
169 __ move(addr, xor_res);
170 __ logical_xor(xor_res, new_val, xor_res);
171 #if INCLUDE_CDS
172 if (AOTCodeCache::is_on_for_dump()) {
173 __ move(grain_shift_addr, grain_shift_reg);
174 __ move(xor_res, xor_shift_res);
175 __ move(grain_shift_indirect, grain_shift);
176 __ unsigned_shift_right(xor_shift_res,
177 grain_shift,
178 xor_shift_res,
179 LIR_Opr::illegalOpr());
180 } else
181 #endif
182 {
183 __ move(xor_res, xor_shift_res);
184 __ unsigned_shift_right(xor_shift_res,
185 LIR_OprFact::intConst(checked_cast<jint>(G1HeapRegion::LogOfHRGrainBytes)),
186 xor_shift_res,
187 LIR_Opr::illegalOpr());
188 }
189 } else {
190 __ logical_xor(addr, new_val, xor_res);
191 #if INCLUDE_CDS
192 if (AOTCodeCache::is_on_for_dump()) {
193 __ move(grain_shift_addr, grain_shift_reg);
194 __ move(grain_shift_indirect, grain_shift);
195 __ unsigned_shift_right(xor_res,
196 grain_shift,
197 xor_shift_res,
198 LIR_Opr::illegalOpr());
199 } else
200 #endif
201 {
202 __ unsigned_shift_right(xor_res,
203 LIR_OprFact::intConst(checked_cast<jint>(G1HeapRegion::LogOfHRGrainBytes)),
204 xor_shift_res,
205 LIR_Opr::illegalOpr());
206 }
207 }
208
209 __ cmp(lir_cond_notEqual, xor_shift_res, LIR_OprFact::intptrConst(NULL_WORD));
210
211 CodeStub* slow = new G1PostBarrierStub(addr, new_val);
212 __ branch(lir_cond_notEqual, slow);
213 __ branch_destination(slow->continuation());
214 }
215
216 void G1BarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) {
217 DecoratorSet decorators = access.decorators();
218 bool is_weak = (decorators & ON_WEAK_OOP_REF) != 0;
219 bool is_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0;
220 bool is_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
221 LIRGenerator *gen = access.gen();
222
223 BarrierSetC1::load_at_resolved(access, result);
224
225 if (access.is_oop() && (is_weak || is_phantom || is_anonymous)) {
226 // Register the value in the referent field with the pre-barrier
|