147 LIR_Opr masked_flag = gen->new_register(T_INT);
148 __ logical_and(flag_val, mask_reg, masked_flag);
149 flag_val = masked_flag;
150 }
151 __ cmp(lir_cond_notEqual, flag_val, LIR_OprFact::intConst(0));
152
153 CodeStub* slow = new ShenandoahLoadReferenceBarrierStub(obj, addr, result, tmp1, tmp2);
154 __ branch(lir_cond_notEqual, T_INT, slow);
155 __ branch_destination(slow->continuation());
156
157 return result;
158 }
159
160 LIR_Opr ShenandoahBarrierSetC1::ensure_in_register(LIRGenerator* gen, LIR_Opr obj, BasicType type) {
161 if (!obj->is_register()) {
162 LIR_Opr obj_reg;
163 if (obj->is_constant()) {
164 obj_reg = gen->new_register(type);
165 __ move(obj, obj_reg);
166 } else {
167 #ifdef AARCH64
168 // AArch64 expects double-size register.
169 obj_reg = gen->new_pointer_register();
170 #else
171 // x86 expects single-size register.
172 obj_reg = gen->new_register(type);
173 #endif
174 __ leal(obj, obj_reg);
175 }
176 obj = obj_reg;
177 }
178 return obj;
179 }
180
181 LIR_Opr ShenandoahBarrierSetC1::storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators) {
182 if (ShenandoahStoreValEnqueueBarrier) {
183 obj = ensure_in_register(gen, obj, T_OBJECT);
184 pre_barrier(gen, info, decorators, LIR_OprFact::illegalOpr, obj);
185 }
186 return obj;
187 }
188
189 void ShenandoahBarrierSetC1::store_at_resolved(LIRAccess& access, LIR_Opr value) {
190 if (access.is_oop()) {
191 if (ShenandoahSATBBarrier) {
192 pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), access.resolved_addr(), LIR_OprFact::illegalOpr /* pre_val */);
193 }
|
147 LIR_Opr masked_flag = gen->new_register(T_INT);
148 __ logical_and(flag_val, mask_reg, masked_flag);
149 flag_val = masked_flag;
150 }
151 __ cmp(lir_cond_notEqual, flag_val, LIR_OprFact::intConst(0));
152
153 CodeStub* slow = new ShenandoahLoadReferenceBarrierStub(obj, addr, result, tmp1, tmp2);
154 __ branch(lir_cond_notEqual, T_INT, slow);
155 __ branch_destination(slow->continuation());
156
157 return result;
158 }
159
160 LIR_Opr ShenandoahBarrierSetC1::ensure_in_register(LIRGenerator* gen, LIR_Opr obj, BasicType type) {
161 if (!obj->is_register()) {
162 LIR_Opr obj_reg;
163 if (obj->is_constant()) {
164 obj_reg = gen->new_register(type);
165 __ move(obj, obj_reg);
166 } else {
167 obj_reg = gen->new_pointer_register();
168 __ leal(obj, obj_reg);
169 }
170 obj = obj_reg;
171 }
172 return obj;
173 }
174
175 LIR_Opr ShenandoahBarrierSetC1::storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators) {
176 if (ShenandoahStoreValEnqueueBarrier) {
177 obj = ensure_in_register(gen, obj, T_OBJECT);
178 pre_barrier(gen, info, decorators, LIR_OprFact::illegalOpr, obj);
179 }
180 return obj;
181 }
182
183 void ShenandoahBarrierSetC1::store_at_resolved(LIRAccess& access, LIR_Opr value) {
184 if (access.is_oop()) {
185 if (ShenandoahSATBBarrier) {
186 pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), access.resolved_addr(), LIR_OprFact::illegalOpr /* pre_val */);
187 }
|